@testmuai/kane-cli 0.8.11 → 0.8.13

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 (226) hide show
  1. package/dist/{ChatSurface-YFJDAXOG.js → ChatSurface-B6ZIO3JL.js} +1 -1
  2. package/dist/{ChromeProfilePicker-PUCZN6WU.js → ChromeProfilePicker-QSICCUMV.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-JAIB5MHS.js → CliFeedbackPrompt-LLLNSKW2.js} +1 -1
  4. package/dist/{CliUploadProgress-53LQMQJD.js → CliUploadProgress-N5IY66T2.js} +1 -1
  5. package/dist/{ConfigView-7HFP4OXS.js → ConfigView-UQIRPENS.js} +1 -1
  6. package/dist/EvidenceViewOffer-AZRAILJQ.js +2 -0
  7. package/dist/FolderPicker-OJFR7AKZ.js +2 -0
  8. package/dist/{InfoBox-62YG3YNQ.js → InfoBox-ZGSLEOPE.js} +1 -1
  9. package/dist/{LinksBox-6NS3GHWO.js → LinksBox-JFT44YUK.js} +1 -1
  10. package/dist/{ProfilesView-HIKK2HPC.js → ProfilesView-WZSPK3HF.js} +1 -1
  11. package/dist/{ProjectPicker-2CJMO5TD.js → ProjectPicker-SBBGVF4L.js} +1 -1
  12. package/dist/{SaveSessionPrompt-4DTPZSXD.js → SaveSessionPrompt-F3563T3C.js} +1 -1
  13. package/dist/SingleShotApp-72D5VVLE.js +2 -0
  14. package/dist/{SummaryBox-A6LKKQXJ.js → SummaryBox-6N6NESLI.js} +1 -1
  15. package/dist/TestMdRunView-4OA52DA2.js +2 -0
  16. package/dist/{TestrunEvidenceTable-7SCCTZPH.js → TestrunEvidenceTable-JLJBJ76Q.js} +1 -1
  17. package/dist/{WhoamiView-PDMQ6F5N.js → WhoamiView-PNVUCWLB.js} +1 -1
  18. package/dist/{app-download-K2ELUXWR.js → app-download-NNB52ZRJ.js} +1 -1
  19. package/dist/{auth-5WJSFLCP.js → auth-JIDDELKY.js} +1 -1
  20. package/dist/{binary-QVQRWQFK.js → binary-LXYAW7WQ.js} +1 -1
  21. package/dist/{bind-5WELCZ4S.js → bind-F36JFHUK.js} +3 -3
  22. package/dist/{bootstrap-3LNHRDQH.js → bootstrap-THOC3SS7.js} +1 -1
  23. package/dist/bridge-KMDML2NB.js +2 -0
  24. package/dist/{changelog-TK6DWFVW.js → changelog-BSMZXLTG.js} +1 -1
  25. package/dist/{chat-committer-MAW25ICC.js → chat-committer-RAOIL2T6.js} +1 -1
  26. package/dist/chat-controller-YJCNU76T.js +2 -0
  27. package/dist/chunk-2X3TANEV.js +2 -0
  28. package/dist/chunk-33GXXC2L.js +2 -0
  29. package/dist/{chunk-X6WB2QTT.js → chunk-3FXNQTCE.js} +1 -1
  30. package/dist/{chunk-NVRXDLJN.js → chunk-3M2D7UUI.js} +1 -1
  31. package/dist/{chunk-WRVDIZAI.js → chunk-3SP4JVDN.js} +2 -2
  32. package/dist/{chunk-A4BDLZOD.js → chunk-477DYMXZ.js} +1 -1
  33. package/dist/{chunk-2ZBY2GME.js → chunk-4PARDPK2.js} +1 -1
  34. package/dist/{chunk-T4OJX2GZ.js → chunk-4WOVHRI2.js} +1 -1
  35. package/dist/{chunk-3D7VYEDP.js → chunk-54JZ6VEW.js} +1 -1
  36. package/dist/{chunk-QHSF2CXK.js → chunk-5G22NOZK.js} +1 -1
  37. package/dist/{chunk-HFRMJP2P.js → chunk-6AZNGOLH.js} +1 -1
  38. package/dist/{chunk-FYLMTZ3J.js → chunk-6FCPS2VT.js} +1 -1
  39. package/dist/{chunk-NLSR2IFN.js → chunk-6IAA644J.js} +1 -1
  40. package/dist/{chunk-CABRAZOL.js → chunk-6J635CRI.js} +1 -1
  41. package/dist/{chunk-3PMEHGH3.js → chunk-7GUFVQOQ.js} +1 -1
  42. package/dist/{chunk-M3Q7IQMS.js → chunk-7KIIM6H7.js} +1 -1
  43. package/dist/{chunk-7P3JGF2X.js → chunk-AGRUULPT.js} +1 -1
  44. package/dist/{chunk-GSNGC7HI.js → chunk-AIVOYTYQ.js} +1 -1
  45. package/dist/{chunk-A76UL3EN.js → chunk-AQWTK6IN.js} +1 -1
  46. package/dist/{chunk-5NBT5IVT.js → chunk-ARU6KAGY.js} +1 -1
  47. package/dist/{chunk-XYSFPVJX.js → chunk-BJAHVN2F.js} +1 -1
  48. package/dist/{chunk-B7TJIUKZ.js → chunk-BTBUIL4Q.js} +1 -1
  49. package/dist/{chunk-OZMYKG6E.js → chunk-BZTWTYQQ.js} +1 -1
  50. package/dist/{chunk-AXW3WDFO.js → chunk-CAO3XRA2.js} +1 -1
  51. package/dist/{chunk-2QSG5ZG6.js → chunk-CUSTYILP.js} +1 -1
  52. package/dist/{chunk-4AZ7IG2A.js → chunk-D4G3SEBU.js} +1 -1
  53. package/dist/chunk-DHJSM5DT.js +2 -0
  54. package/dist/chunk-DIM5X2FR.js +52 -0
  55. package/dist/{chunk-URLZULC7.js → chunk-DMLYUTS4.js} +1 -1
  56. package/dist/{chunk-TB2CCKL7.js → chunk-DXFMELKC.js} +1 -1
  57. package/dist/{chunk-OKBEMFAW.js → chunk-EEFZXZTZ.js} +1 -1
  58. package/dist/{chunk-DP7GPS6S.js → chunk-EV64VI66.js} +1 -1
  59. package/dist/{chunk-CBLUNSF4.js → chunk-EXLXV5OU.js} +1 -1
  60. package/dist/{chunk-4SXJKDHO.js → chunk-F5AI3UVS.js} +2 -2
  61. package/dist/{chunk-NYUMJDCE.js → chunk-FE6XRABM.js} +1 -1
  62. package/dist/{chunk-HJBORIFP.js → chunk-FNIL4G3V.js} +3 -3
  63. package/dist/{chunk-4VZRBBLF.js → chunk-FUP4AP6J.js} +12 -12
  64. package/dist/{chunk-5LEO463W.js → chunk-GILD6RGH.js} +1 -1
  65. package/dist/{chunk-SNKFWPEM.js → chunk-I27YRAGO.js} +2 -2
  66. package/dist/{chunk-OC7TJTQG.js → chunk-I75FRXKE.js} +1 -1
  67. package/dist/{chunk-B7K5WOOU.js → chunk-IVQX3AKL.js} +1 -1
  68. package/dist/{chunk-ZES42R57.js → chunk-IWVA37B6.js} +1 -1
  69. package/dist/{chunk-W4IRHQGO.js → chunk-IZU5ND2C.js} +1 -1
  70. package/dist/{chunk-G5ZGEZCA.js → chunk-J2UN2AHO.js} +1 -1
  71. package/dist/chunk-J3Q63NFG.js +2 -0
  72. package/dist/{chunk-2E55VQYA.js → chunk-JX2CAVX6.js} +1 -1
  73. package/dist/{chunk-4FXSDPQW.js → chunk-K2UEVCIJ.js} +1 -1
  74. package/dist/{chunk-ASK4AZFC.js → chunk-K4SULRBL.js} +1 -1
  75. package/dist/{chunk-Z6GMZOVL.js → chunk-K6RAOZHP.js} +3 -3
  76. package/dist/{chunk-S63XGGBE.js → chunk-KAZGHWGK.js} +1 -1
  77. package/dist/{chunk-Z4QLCWLB.js → chunk-KGKJU27A.js} +1 -1
  78. package/dist/{chunk-NP3VGFZM.js → chunk-KO3FL2XW.js} +1 -1
  79. package/dist/{chunk-VUOAFV27.js → chunk-KSLJOUH4.js} +1 -1
  80. package/dist/{chunk-DHWS7SLT.js → chunk-KV5BOFPK.js} +2 -2
  81. package/dist/{chunk-W7NI6JCF.js → chunk-KXUTO5WC.js} +1 -1
  82. package/dist/{chunk-CQKKDIKA.js → chunk-L32DKFRQ.js} +1 -1
  83. package/dist/{chunk-XB7EMX6J.js → chunk-LAQBCZ5A.js} +1 -1
  84. package/dist/{chunk-O7RB4X6I.js → chunk-LPDBTGO5.js} +2 -2
  85. package/dist/{chunk-F7R6A6P5.js → chunk-LWQNRZH3.js} +1 -1
  86. package/dist/{chunk-QIRZBOKA.js → chunk-MCKBJIBB.js} +1 -1
  87. package/dist/chunk-MXDWS7S4.js +368 -0
  88. package/dist/{chunk-OGJ6ZSLC.js → chunk-N2I23ANS.js} +1 -1
  89. package/dist/{chunk-6GH4DRKR.js → chunk-N7Z7BQYO.js} +1 -1
  90. package/dist/{chunk-FIODM24X.js → chunk-NM76SG3S.js} +1 -1
  91. package/dist/{chunk-4VYWTTT4.js → chunk-NU45ROHH.js} +2 -2
  92. package/dist/{chunk-BE4FBVKY.js → chunk-NUWOQS6L.js} +1 -1
  93. package/dist/{chunk-YELGHSVH.js → chunk-O5U6EAL3.js} +1 -1
  94. package/dist/{chunk-YSNBXUM6.js → chunk-OHK6V7JX.js} +1 -1
  95. package/dist/{chunk-KRL2BDI5.js → chunk-OTMAFCZK.js} +2 -2
  96. package/dist/{chunk-47WY2637.js → chunk-P5MJMM3X.js} +58 -57
  97. package/dist/{chunk-CL3AMEK6.js → chunk-PUM5J56E.js} +1 -1
  98. package/dist/{chunk-3FJNTRAS.js → chunk-PWRIG6UB.js} +1 -1
  99. package/dist/{chunk-Y4ODYIOP.js → chunk-PYQS5ST6.js} +1 -1
  100. package/dist/{chunk-GV5BX2IQ.js → chunk-Q4YAJJPP.js} +1 -1
  101. package/dist/{chunk-VGLY4HWA.js → chunk-QD2BUO5M.js} +1 -1
  102. package/dist/{chunk-IX4FH5W6.js → chunk-RN5ERSV2.js} +1 -1
  103. package/dist/{chunk-6DOS5CJ5.js → chunk-SEKJZOKW.js} +1 -1
  104. package/dist/{chunk-YQ4MRF57.js → chunk-T7DGNWI2.js} +4 -4
  105. package/dist/{chunk-K6BWPGBO.js → chunk-TDNM22BQ.js} +1 -1
  106. package/dist/{chunk-7HUJVIMO.js → chunk-TMRLBSIA.js} +2 -2
  107. package/dist/{chunk-FQRWYXFG.js → chunk-TXZ66K4Q.js} +1 -1
  108. package/dist/{chunk-GMXM4WHF.js → chunk-UF4JZXEE.js} +1 -1
  109. package/dist/{chunk-TYRTD5DD.js → chunk-UH2ZTX4E.js} +1 -1
  110. package/dist/{chunk-JAO7TZBV.js → chunk-UZCSVEWP.js} +1 -1
  111. package/dist/{chunk-7B7OSHPX.js → chunk-VJ3ES3RR.js} +1 -1
  112. package/dist/{chunk-CRPBARFG.js → chunk-VYMMGWVO.js} +1 -1
  113. package/dist/chunk-W2UYUV47.js +27 -0
  114. package/dist/{chunk-R4EGL7VM.js → chunk-W3Z7AZNT.js} +1 -1
  115. package/dist/{chunk-HULEZ3D3.js → chunk-WIAZN7G4.js} +1 -1
  116. package/dist/chunk-WUV3FJ7C.js +11 -0
  117. package/dist/{chunk-DJJO4IHY.js → chunk-XAM5E27U.js} +1 -1
  118. package/dist/{chunk-OKCULEBD.js → chunk-XH2KDLZO.js} +1 -1
  119. package/dist/{chunk-TSW5A7W3.js → chunk-XL6HDWM3.js} +1 -1
  120. package/dist/{chunk-OXHMUZJV.js → chunk-XMTSHHYQ.js} +1 -1
  121. package/dist/{chunk-ZMJD3CI7.js → chunk-XS3HIVNS.js} +1 -1
  122. package/dist/{chunk-DLJIML73.js → chunk-YEZYO5QH.js} +1 -1
  123. package/dist/{chunk-7KRCBN6X.js → chunk-ZOSY2PJM.js} +1 -1
  124. package/dist/{committer-42AFWMEX.js → committer-C6UCDYMC.js} +1 -1
  125. package/dist/{config-KU2UICMC.js → config-BCGD2FEX.js} +1 -1
  126. package/dist/{controller-client-OB4WD2C4.js → controller-client-ZF5IXRUV.js} +1 -1
  127. package/dist/{cover-cmd-HAOBK2IC.js → cover-cmd-5LPHIOSI.js} +1 -1
  128. package/dist/{credentials-BEC4I5SE.js → credentials-YNH5BU2Z.js} +1 -1
  129. package/dist/{deps-bundle-EY5T7OH3.js → deps-bundle-LOFI4DAJ.js} +1 -1
  130. package/dist/{deps-resolve-MPLFFCZZ.js → deps-resolve-GA6IPHVZ.js} +1 -1
  131. package/dist/design-committer-UPC6NZUF.js +2 -0
  132. package/dist/dispatch-FRCPK3AZ.js +2 -0
  133. package/dist/{doctor-JBXA6WNL.js → doctor-W5TQBYB5.js} +1 -1
  134. package/dist/docx-convert-BIV5T7F5.js +1 -1
  135. package/dist/{dossier-WSWXZAPL.js → dossier-Y6TJWFZU.js} +1 -1
  136. package/dist/{evidence-MJV3PY2J.js → evidence-FHO36EEV.js} +1 -1
  137. package/dist/evolve-cmd-6RXLKERE.js +2 -0
  138. package/dist/explain-3HAZY7Q6.js +2 -0
  139. package/dist/{explain-cmd-BXFR5DB6.js → explain-cmd-RMJPXD4U.js} +1 -1
  140. package/dist/{explain-cmd-IRQ2YX5L.js → explain-cmd-XCRO4AS6.js} +1 -1
  141. package/dist/{extract-bind-PPMY4FFA.js → extract-bind-BFJPRNPQ.js} +3 -3
  142. package/dist/{extract-cmd-RHVLPNQB.js → extract-cmd-7FKQJNS7.js} +2 -2
  143. package/dist/{feeder-52VBZY3R.js → feeder-IOR3XRNF.js} +1 -1
  144. package/dist/{gaps-cmd-MSDGU6OU.js → gaps-cmd-FDJ3PT4C.js} +1 -1
  145. package/dist/{generate-headless-NSK32S53.js → generate-headless-OBMB5CSB.js} +2 -2
  146. package/dist/index.js +183 -119
  147. package/dist/ingest-TTUQ7UDK.js +2 -0
  148. package/dist/ingest-cmd-AV66Q5LC.js +2 -0
  149. package/dist/install-SFJ2FFQ6.js +2 -0
  150. package/dist/{interactive-bind-4FNW3OYT.js → interactive-bind-N5AQB26T.js} +4 -4
  151. package/dist/{lifecycle-cmd-HYNG5KH6.js → lifecycle-cmd-KSMETBPP.js} +1 -1
  152. package/dist/{list-cmd-Y4WEOT3E.js → list-cmd-V3HJ5K4O.js} +1 -1
  153. package/dist/list-commands-SH4HPFI4.js +2 -0
  154. package/dist/{logical-ids-N3UZACB4.js → logical-ids-MLXAH45L.js} +1 -1
  155. package/dist/login-flow-ODVWEPRU.js +2 -0
  156. package/dist/{maintenance-cmd-UJNH47SG.js → maintenance-cmd-VFYGKY3X.js} +1 -1
  157. package/dist/{mobile-prompts-SJZVJWSB.js → mobile-prompts-UZTRJ3L7.js} +1 -1
  158. package/dist/objective-variable-gate-3VUXNDCZ.js +2 -0
  159. package/dist/{persist-recorded-session-FWBAOQEF.js → persist-recorded-session-QMRY4DOF.js} +1 -1
  160. package/dist/{phase-seed-2WI7KUYO.js → phase-seed-BMOSAA74.js} +1 -1
  161. package/dist/pipeline-5FHWZAXK.js +2 -0
  162. package/dist/prepare-target-UJEY2FSR.js +2 -0
  163. package/dist/readmodel-TDRFVDVI.js +2 -0
  164. package/dist/reconcile-cmd-2QHZML2L.js +2 -0
  165. package/dist/{reconcile-deps-GMQA6ULT.js → reconcile-deps-ZBWUY3SM.js} +2 -2
  166. package/dist/{reconcile-engine-XLLYS5ZB.js → reconcile-engine-YC4RQYF2.js} +1 -1
  167. package/dist/{recording-banner-CQBXZMT3.js → recording-banner-7E75ERQJ.js} +1 -1
  168. package/dist/{records-EW4PIJ5W.js → records-JLS63SDI.js} +1 -1
  169. package/dist/registry-JJTRUPH7.js +2 -0
  170. package/dist/{require-project-folder-K3E3QIOZ.js → require-project-folder-LBUYWQOF.js} +1 -1
  171. package/dist/{resolve-run-intent-3CENNCF3.js → resolve-run-intent-GHISMXLZ.js} +1 -1
  172. package/dist/{resolver-PSNP72H4.js → resolver-7JC5VZ4S.js} +1 -1
  173. package/dist/{revert-RXHWWUMQ.js → revert-PRR3D4XM.js} +1 -1
  174. package/dist/{review-cmd-JUOWTME4.js → review-cmd-SAGIKWEW.js} +1 -1
  175. package/dist/run-43ACVPJK.js +2 -0
  176. package/dist/run-EOTOXNQO.js +2 -0
  177. package/dist/{run-test-md-XBM6RMCI.js → run-test-md-5LPCKCW7.js} +2 -2
  178. package/dist/{sessions-cmd-PGE6LP2W.js → sessions-cmd-VDQGRBEM.js} +1 -1
  179. package/dist/{skill-installer-FBOPYFYS.js → skill-installer-YQPZZB7I.js} +1 -1
  180. package/dist/{spawner-URQ5OAY7.js → spawner-X2FOOONV.js} +1 -1
  181. package/dist/{structured-answers-BZWJUX22.js → structured-answers-YAVW65G4.js} +1 -1
  182. package/dist/tcg-generate-V4QRNEZV.js +2 -0
  183. package/dist/testmd-actions-2UMU3QMV.js +2 -0
  184. package/dist/testmd-sync-UBXDLWYD.js +2 -0
  185. package/dist/token-refresh-NL5AM446.js +2 -0
  186. package/dist/{validate-basic-BXBHTTTO.js → validate-basic-GTSVZFQI.js} +1 -1
  187. package/dist/variable-receipt-IHQAYWMZ.js +2 -0
  188. package/dist/verdicts-QU6W3TUF.js +2 -0
  189. package/dist/{version-check-BGHE3LAK.js → version-check-IPEPJZDX.js} +1 -1
  190. package/dist/{view-cmd-XD5ENSML.js → view-cmd-SXXNDZIC.js} +1 -1
  191. package/dist/{walk-session-EYBUURRA.js → walk-session-7JVB4Z5S.js} +1 -1
  192. package/dist/{with-telemetry-L3SO6J3L.js → with-telemetry-LRI7H6DH.js} +1 -1
  193. package/package.json +11 -11
  194. package/dist/EvidenceViewOffer-2T2ZGHIF.js +0 -2
  195. package/dist/FolderPicker-LTQW4YNR.js +0 -2
  196. package/dist/SingleShotApp-KXZF5ZJM.js +0 -2
  197. package/dist/TestMdRunView-6X6W5YAP.js +0 -2
  198. package/dist/bridge-WFSSMJ57.js +0 -2
  199. package/dist/chat-controller-6GW2HSJP.js +0 -2
  200. package/dist/chunk-2KQF6WLX.js +0 -363
  201. package/dist/chunk-DEUDRSU7.js +0 -2
  202. package/dist/chunk-DPUV6OSP.js +0 -2
  203. package/dist/chunk-JJJREAFQ.js +0 -2
  204. package/dist/chunk-M7CGNE2D.js +0 -37
  205. package/dist/chunk-NGASEXVA.js +0 -27
  206. package/dist/design-committer-2BQVZPO4.js +0 -2
  207. package/dist/dispatch-NE35HS5F.js +0 -2
  208. package/dist/evolve-cmd-I4Z6IPIM.js +0 -2
  209. package/dist/explain-O3A2HZWD.js +0 -2
  210. package/dist/ingest-WTPY2VLS.js +0 -2
  211. package/dist/ingest-cmd-GOPW3SNF.js +0 -2
  212. package/dist/install-BDHZVEY4.js +0 -2
  213. package/dist/list-commands-CJCEW7MQ.js +0 -2
  214. package/dist/login-flow-DLG2WHSZ.js +0 -2
  215. package/dist/pipeline-B2TYZBMB.js +0 -2
  216. package/dist/prepare-target-JGVB7OKC.js +0 -2
  217. package/dist/readmodel-YDLGQDMH.js +0 -2
  218. package/dist/reconcile-cmd-6ILIXD3U.js +0 -2
  219. package/dist/registry-AA5YIO5Y.js +0 -2
  220. package/dist/run-6CMGGU2W.js +0 -2
  221. package/dist/run-PZIYMD35.js +0 -2
  222. package/dist/tcg-generate-BPLQ7WJ5.js +0 -2
  223. package/dist/testmd-actions-WJS2YM7B.js +0 -2
  224. package/dist/testmd-sync-TPUBEORI.js +0 -2
  225. package/dist/token-refresh-IT4LVE2H.js +0 -2
  226. package/dist/verdicts-J5MJHUGG.js +0 -2
package/dist/index.js CHANGED
@@ -1,103 +1,158 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
3
- import{c as ln}from"./chunk-2E55VQYA.js";import{a as mo,b as po,c as yo,d as Ei,e as Ti,f as Ai}from"./chunk-HJBORIFP.js";import"./chunk-3MSXQU2C.js";import"./chunk-QIRZBOKA.js";import"./chunk-7B7OSHPX.js";import"./chunk-IX4FH5W6.js";import{a as Fi,b as Li}from"./chunk-ULGZPRKU.js";import{b as Vi}from"./chunk-TSW5A7W3.js";import{a as Ni,b as Ui}from"./chunk-M7CGNE2D.js";import{b as Bi}from"./chunk-JAO7TZBV.js";import{a as Oi,b as $i,c as Di,d as Mi,f as ji,h as cn}from"./chunk-ZMJD3CI7.js";import{f as Hi,g as Wi,i as qi}from"./chunk-DHWS7SLT.js";import{a as Kn,b as Pi}from"./chunk-CQKKDIKA.js";import"./chunk-FQRWYXFG.js";import{a as si}from"./chunk-DJJO4IHY.js";import{A as Bn,B as Hn,C as Wn,D as ki,E as _i,F as xi,G as Si,I as sn,J as Ii,K as qn,a as Et,b as Fn,c as Ln,d as _o,e as xo,f as So,g as Ro,h as Go,i as Jo,j as zo,k as Xo,l as Qo,m as Zo,n as on,o as li,p as ci,q as di,r as ui,s as mi,t as pi,u as fi,v as hi,w as bi,x as vi,y as wi,z as yi}from"./chunk-47WY2637.js";import{a as ei,b as ti}from"./chunk-NGASEXVA.js";import{b as ri}from"./chunk-WRVDIZAI.js";import{a as Rt,b as Ve}from"./chunk-B7TJIUKZ.js";import"./chunk-W7NI6JCF.js";import"./chunk-OZMYKG6E.js";import"./chunk-WD52ZNQY.js";import{a as Ri,d as an}from"./chunk-CL3AMEK6.js";import{a as be}from"./chunk-7P3JGF2X.js";import"./chunk-5LEO463W.js";import"./chunk-TB2CCKL7.js";import"./chunk-4AZ7IG2A.js";import{d as ai}from"./chunk-BHSHGWBL.js";import"./chunk-S3DAAAE5.js";import{b as gi}from"./chunk-OGJ6ZSLC.js";import"./chunk-CABRAZOL.js";import"./chunk-PDXZROJM.js";import{c as Ci}from"./chunk-5DT7PIGB.js";import"./chunk-ASK4AZFC.js";import{G as Ko,H as Yo,I as en,J as tn,K as ht,Q as nn,e as Se,h as Mo,l as No,o as Fo,p as Lo,q as Vo,r as Uo,s as Zt,x as Bo,y as Ho,z as Wo}from"./chunk-O7RB4X6I.js";import"./chunk-QQ5MHSSY.js";import{b as Re,c as gt,d as jo}from"./chunk-5GUD3CIH.js";import"./chunk-4FXSDPQW.js";import"./chunk-YMLC55J4.js";import"./chunk-NP3VGFZM.js";import{a as pt,b as ft,d as Qt,e as Un}from"./chunk-EHN5HTUD.js";import"./chunk-NVGBE2DR.js";import{a as We}from"./chunk-CH273NAE.js";import{a as ni}from"./chunk-NYUMJDCE.js";import"./chunk-OC7TJTQG.js";import"./chunk-CBLUNSF4.js";import{c as Tt}from"./chunk-W4IRHQGO.js";import{a as oi}from"./chunk-F7R6A6P5.js";import{b as Ae,r as At}from"./chunk-T4OJX2GZ.js";import"./chunk-NBXYL2JT.js";import"./chunk-KRL2BDI5.js";import{a as Jt,b as mt,c as Nn}from"./chunk-VZ7KXRXB.js";import{a as Yr,b as Gr,c as Jr,d as Vn,e as rn,f as ii}from"./chunk-GMXM4WHF.js";import{a as Ao,b as Po,c as Oo,d as $o,e as Do}from"./chunk-Y4ODYIOP.js";import{a as Co,c as Io,d as Eo,e as To}from"./chunk-AXW3WDFO.js";import{a as Kr}from"./chunk-A4BDLZOD.js";import"./chunk-5Y2G4NC7.js";import"./chunk-P7YZ3PU3.js";import"./chunk-TDPWFYTJ.js";import{a as Te}from"./chunk-7KRCBN6X.js";import"./chunk-GSNGC7HI.js";import"./chunk-4PMZ5FCD.js";import"./chunk-KBM3XHAM.js";import{a as ko}from"./chunk-2YEHV2CX.js";import"./chunk-IDX3TOPY.js";import"./chunk-BKM2LWU2.js";import"./chunk-CRPBARFG.js";import{C as qo}from"./chunk-R4EGL7VM.js";import"./chunk-JQW2QFSX.js";import"./chunk-FYLMTZ3J.js";import"./chunk-TYRTD5DD.js";import"./chunk-OXHMUZJV.js";import"./chunk-DBIBROYW.js";import"./chunk-IAHKTEET.js";import"./chunk-AKX4VRRR.js";import"./chunk-UD7KKHPW.js";import{f as co,j as uo}from"./chunk-JJJREAFQ.js";import"./chunk-3PMEHGH3.js";import"./chunk-VGLY4HWA.js";import"./chunk-M3Q7IQMS.js";import"./chunk-YCCUBQY4.js";import"./chunk-FIODM24X.js";import{a as go,b as ho,f as bo,g as vo,h as Xt}from"./chunk-2ZBY2GME.js";import{a as Gt}from"./chunk-BPMSNGXQ.js";import{a as zt,b as nt,c as fo}from"./chunk-VE3SUJMA.js";import{a as wo}from"./chunk-URLZULC7.js";import"./chunk-RFHMDQXZ.js";import{a as Qr,b as Zr,d as eo}from"./chunk-OKCULEBD.js";import{e as Xr}from"./chunk-4VZRBBLF.js";import"./chunk-MMBBQ4OZ.js";import{j as Wt}from"./chunk-4VYWTTT4.js";import"./chunk-MSGW4JDG.js";import{a as qt,b as Kt,c as Yt}from"./chunk-TZXXJWHA.js";import{f as to,j as no,k as ro,n as ut,o as oo,p as Mn,q as io,r as k,s as It,t as so,u as jn,v as ao}from"./chunk-RSSOJ3L2.js";import"./chunk-5EOX4MEY.js";import"./chunk-3FJNTRAS.js";import{h as lo}from"./chunk-TAOHYWEO.js";import"./chunk-YSNBXUM6.js";import"./chunk-GV5BX2IQ.js";import"./chunk-5NBT5IVT.js";import{a as zr}from"./chunk-Z7S3IWUX.js";import"./chunk-4JOD47QI.js";import"./chunk-K6BWPGBO.js";import"./chunk-XB7EMX6J.js";import{a as ce}from"./chunk-BE4FBVKY.js";import{a as Ht}from"./chunk-DPUV6OSP.js";import{a as Dn}from"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import{c as Ut}from"./chunk-EYOCNMUM.js";import{a as pe}from"./chunk-NVRXDLJN.js";import"./chunk-6DOS5CJ5.js";import"./chunk-A76UL3EN.js";import{a as Ee,b as Z,i as qr,j as $n,x as K}from"./chunk-DEUDRSU7.js";import{a as tt,b as Bt}from"./chunk-DFS4RMVP.js";import{a as dt}from"./chunk-HCBYKLMW.js";import{a as se,b as q,c as et,i as On,j as Vt}from"./chunk-C44QQJR4.js";import{a as Ct}from"./chunk-6YGTRKDT.js";import{a as St,c as Ze,e as Ie}from"./chunk-UR6MHSHU.js";var Pt=Ze(Gn=>{"use strict";var dn=class extends Error{constructor(e,n,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=n,this.exitCode=e,this.nestedError=void 0}},Yn=class extends dn{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};Gn.CommanderError=dn;Gn.InvalidArgumentError=Yn});var un=Ze(zn=>{"use strict";var{InvalidArgumentError:cl}=Pt(),Jn=class{constructor(e,n){switch(this.description=n||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,n){return n===this.defaultValue||!Array.isArray(n)?[e]:n.concat(e)}default(e,n){return this.defaultValue=e,this.defaultValueDescription=n,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new cl(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function dl(t){let e=t.name()+(t.variadic===!0?"...":"");return t.required?"<"+e+">":"["+e+"]"}zn.Argument=Jn;zn.humanReadableArgName=dl});var Qn=Ze(Ji=>{"use strict";var{humanReadableArgName:ul}=un(),Xn=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let n=e.commands.filter(o=>!o._hidden),i=e._getHelpCommand();return i&&!i._hidden&&n.push(i),this.sortSubcommands&&n.sort((o,r)=>o.name().localeCompare(r.name())),n}compareOptions(e,n){let i=o=>o.short?o.short.replace(/^-/,""):o.long.replace(/^--/,"");return i(e).localeCompare(i(n))}visibleOptions(e){let n=e.options.filter(o=>!o.hidden),i=e._getHelpOption();if(i&&!i.hidden){let o=i.short&&e._findOption(i.short),r=i.long&&e._findOption(i.long);!o&&!r?n.push(i):i.long&&!r?n.push(e.createOption(i.long,i.description)):i.short&&!o&&n.push(e.createOption(i.short,i.description))}return this.sortOptions&&n.sort(this.compareOptions),n}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let n=[];for(let i=e.parent;i;i=i.parent){let o=i.options.filter(r=>!r.hidden);n.push(...o)}return this.sortOptions&&n.sort(this.compareOptions),n}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(n=>{n.description=n.description||e._argsDescription[n.name()]||""}),e.registeredArguments.find(n=>n.description)?e.registeredArguments:[]}subcommandTerm(e){let n=e.registeredArguments.map(i=>ul(i)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(n?" "+n:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,n){return n.visibleCommands(e).reduce((i,o)=>Math.max(i,n.subcommandTerm(o).length),0)}longestOptionTermLength(e,n){return n.visibleOptions(e).reduce((i,o)=>Math.max(i,n.optionTerm(o).length),0)}longestGlobalOptionTermLength(e,n){return n.visibleGlobalOptions(e).reduce((i,o)=>Math.max(i,n.optionTerm(o).length),0)}longestArgumentTermLength(e,n){return n.visibleArguments(e).reduce((i,o)=>Math.max(i,n.argumentTerm(o).length),0)}commandUsage(e){let n=e._name;e._aliases[0]&&(n=n+"|"+e._aliases[0]);let i="";for(let o=e.parent;o;o=o.parent)i=o.name()+" "+i;return i+n+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let n=[];return e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&n.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&n.push(`env: ${e.envVar}`),n.length>0?`${e.description} (${n.join(", ")})`:e.description}argumentDescription(e){let n=[];if(e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),n.length>0){let i=`(${n.join(", ")})`;return e.description?`${e.description} ${i}`:i}return e.description}formatHelp(e,n){let i=n.padWidth(e,n),o=n.helpWidth||80,r=2,a=2;function s(d,y){if(y){let _=`${d.padEnd(i+a)}${y}`;return n.wrap(_,o-r,i+a)}return d}function l(d){return d.join(`
4
- `).replace(/^/gm," ".repeat(r))}let u=[`Usage: ${n.commandUsage(e)}`,""],c=n.commandDescription(e);c.length>0&&(u=u.concat([n.wrap(c,o,0),""]));let m=n.visibleArguments(e).map(d=>s(n.argumentTerm(d),n.argumentDescription(d)));m.length>0&&(u=u.concat(["Arguments:",l(m),""]));let p=n.visibleOptions(e).map(d=>s(n.optionTerm(d),n.optionDescription(d)));if(p.length>0&&(u=u.concat(["Options:",l(p),""])),this.showGlobalOptions){let d=n.visibleGlobalOptions(e).map(y=>s(n.optionTerm(y),n.optionDescription(y)));d.length>0&&(u=u.concat(["Global Options:",l(d),""]))}let g=n.visibleCommands(e).map(d=>s(n.subcommandTerm(d),n.subcommandDescription(d)));return g.length>0&&(u=u.concat(["Commands:",l(g),""])),u.join(`
3
+ import{a as No,b as jo,c as Wo,d as rs,e as os,f as ss}from"./chunk-FNIL4G3V.js";import"./chunk-3MSXQU2C.js";import"./chunk-MCKBJIBB.js";import"./chunk-VJ3ES3RR.js";import{c as hn}from"./chunk-JX2CAVX6.js";import"./chunk-RN5ERSV2.js";import{a as ks,b as _s}from"./chunk-ULGZPRKU.js";import{b as xs}from"./chunk-XL6HDWM3.js";import{a as fs,b as gs,c as hs,d as vs,e as bs,f as ws,g as ys,h as Cs}from"./chunk-DIM5X2FR.js";import{b as Ss}from"./chunk-UZCSVEWP.js";import{a as ls,b as cs,c as ds,d as us,e as ms,f as ps,h as vn}from"./chunk-XS3HIVNS.js";import{f as sr,g as ar,i as Es}from"./chunk-KV5BOFPK.js";import{a as ir,b as as}from"./chunk-L32DKFRQ.js";import"./chunk-TXZ66K4Q.js";import{a as Ai}from"./chunk-XAM5E27U.js";import{A as tr,B as nr,C as rr,D as qi,E as Ki,F as Yi,G as Ji,I as fn,J as ns,K as or,a as ot,b as Xn,c as Qn,d as Ko,e as Yo,f as Jo,g as Zo,h as bi,i as wi,j as yi,k as ki,l as _i,m as xi,n as pn,o as $i,p as Di,q as Oi,r as Mi,s as Ni,t as ji,u as Fi,v as Li,w as Ui,x as Bi,y as Hi,z as Wi}from"./chunk-P5MJMM3X.js";import{c as ts}from"./chunk-5DT7PIGB.js";import{a as Ci,b as Si}from"./chunk-W2UYUV47.js";import{b as Ii}from"./chunk-3SP4JVDN.js";import{a as jt,b as Le}from"./chunk-BTBUIL4Q.js";import"./chunk-KXUTO5WC.js";import"./chunk-BZTWTYQQ.js";import"./chunk-WD52ZNQY.js";import{a as is,d as gn}from"./chunk-PUM5J56E.js";import{a as ve}from"./chunk-AGRUULPT.js";import"./chunk-GILD6RGH.js";import"./chunk-DXFMELKC.js";import"./chunk-D4G3SEBU.js";import{d as Pi}from"./chunk-BHSHGWBL.js";import"./chunk-S3DAAAE5.js";import{b as Vi}from"./chunk-N2I23ANS.js";import"./chunk-6J635CRI.js";import"./chunk-PDXZROJM.js";import{b as Zi,c as es}from"./chunk-WUV3FJ7C.js";import{b as Gi,c as zi,h as Xi,j as Qi}from"./chunk-J3Q63NFG.js";import"./chunk-K4SULRBL.js";import{G as hi,H as vi,I as cn,J as dn,K as xt,Q as un,e as Se,h as ii,l as ai,o as li,p as ci,q as di,r as ui,s as ln,x as mi,y as pi,z as fi}from"./chunk-LPDBTGO5.js";import"./chunk-QQ5MHSSY.js";import{b as Te,c as _t,d as si}from"./chunk-5GUD3CIH.js";import"./chunk-K2UEVCIJ.js";import"./chunk-YMLC55J4.js";import"./chunk-KO3FL2XW.js";import"./chunk-NVGBE2DR.js";import{a as yt,b as kt,d as an,e as er}from"./chunk-EHN5HTUD.js";import{a as qe}from"./chunk-CH273NAE.js";import{a as Ei}from"./chunk-FE6XRABM.js";import"./chunk-I75FRXKE.js";import"./chunk-EXLXV5OU.js";import{c as Nt}from"./chunk-IZU5ND2C.js";import{a as Ri}from"./chunk-LWQNRZH3.js";import{b as Ae,r as st}from"./chunk-4WOVHRI2.js";import"./chunk-NBXYL2JT.js";import"./chunk-OTMAFCZK.js";import{a as rn,b as wt,c as zn}from"./chunk-VZ7KXRXB.js";import{a as fo,b as go,c as ho,d as Zn,e as mn,f as Ti}from"./chunk-UF4JZXEE.js";import{a as ei,b as ti,c as ni,d as ri,e as oi}from"./chunk-PYQS5ST6.js";import{a as Go,c as zo,d as Xo,e as Qo}from"./chunk-CAO3XRA2.js";import{a as po}from"./chunk-477DYMXZ.js";import"./chunk-5Y2G4NC7.js";import"./chunk-P7YZ3PU3.js";import"./chunk-TDPWFYTJ.js";import{a as Re}from"./chunk-ZOSY2PJM.js";import"./chunk-AIVOYTYQ.js";import"./chunk-4PMZ5FCD.js";import"./chunk-KBM3XHAM.js";import{a as qo}from"./chunk-2YEHV2CX.js";import"./chunk-IDX3TOPY.js";import"./chunk-BKM2LWU2.js";import"./chunk-VYMMGWVO.js";import{C as gi}from"./chunk-W3Z7AZNT.js";import"./chunk-JQW2QFSX.js";import"./chunk-6FCPS2VT.js";import"./chunk-UH2ZTX4E.js";import"./chunk-XMTSHHYQ.js";import"./chunk-DBIBROYW.js";import"./chunk-AKX4VRRR.js";import"./chunk-IAHKTEET.js";import"./chunk-UD7KKHPW.js";import{c as Po,d as $o,e as Do,i as Oo,m as Mo}from"./chunk-2X3TANEV.js";import"./chunk-7GUFVQOQ.js";import"./chunk-QD2BUO5M.js";import"./chunk-7KIIM6H7.js";import"./chunk-YCCUBQY4.js";import"./chunk-NM76SG3S.js";import{a as Vo,b as Lo,f as Uo,g as Bo,h as sn}from"./chunk-4PARDPK2.js";import{a as nn}from"./chunk-BPMSNGXQ.js";import{a as on,b as it,c as Fo}from"./chunk-VE3SUJMA.js";import{a as Ho}from"./chunk-DMLYUTS4.js";import"./chunk-RFHMDQXZ.js";import{a as yo,b as ko,d as _o}from"./chunk-XH2KDLZO.js";import{e as wo}from"./chunk-FUP4AP6J.js";import{a as bo}from"./chunk-MMBBQ4OZ.js";import{j as Qt}from"./chunk-NU45ROHH.js";import"./chunk-MSGW4JDG.js";import{a as Zt,b as en,c as tn}from"./chunk-TZXXJWHA.js";import{f as xo,j as Co,k as So,n as bt,o as Eo,p as Jn,q as Io,r as x,s as Ot,t as Ro,u as Gn,v as To}from"./chunk-RSSOJ3L2.js";import"./chunk-5EOX4MEY.js";import{b as Mt}from"./chunk-PWRIG6UB.js";import{h as Ao}from"./chunk-TAOHYWEO.js";import"./chunk-OHK6V7JX.js";import"./chunk-Q4YAJJPP.js";import"./chunk-ARU6KAGY.js";import{a as vo}from"./chunk-Z7S3IWUX.js";import"./chunk-4JOD47QI.js";import"./chunk-TDNM22BQ.js";import"./chunk-LAQBCZ5A.js";import{a as oe}from"./chunk-NUWOQS6L.js";import{a as vt}from"./chunk-DHJSM5DT.js";import{a as Yn}from"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-E47GFYXA.js";import{c as zt}from"./chunk-EYOCNMUM.js";import{a as de}from"./chunk-3M2D7UUI.js";import"./chunk-SEKJZOKW.js";import"./chunk-AQWTK6IN.js";import{a as ye,b as J,i as mo,j as qn,p as Kn,y as Y}from"./chunk-33GXXC2L.js";import{a as rt,b as Xt}from"./chunk-DFS4RMVP.js";import{a as ht}from"./chunk-HCBYKLMW.js";import{a as ae,b as K,c as nt,i as Wn,j as Gt}from"./chunk-C44QQJR4.js";import{a as Dt}from"./chunk-6YGTRKDT.js";import{a as $t,c as tt,e as Ie}from"./chunk-UR6MHSHU.js";var Ft=tt(cr=>{"use strict";var bn=class extends Error{constructor(e,n,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=n,this.exitCode=e,this.nestedError=void 0}},lr=class extends bn{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};cr.CommanderError=bn;cr.InvalidArgumentError=lr});var wn=tt(ur=>{"use strict";var{InvalidArgumentError:uc}=Ft(),dr=class{constructor(e,n){switch(this.description=n||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,n){return n===this.defaultValue||!Array.isArray(n)?[e]:n.concat(e)}default(e,n){return this.defaultValue=e,this.defaultValueDescription=n,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new uc(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function mc(t){let e=t.name()+(t.variadic===!0?"...":"");return t.required?"<"+e+">":"["+e+"]"}ur.Argument=dr;ur.humanReadableArgName=mc});var pr=tt(As=>{"use strict";var{humanReadableArgName:pc}=wn(),mr=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let n=e.commands.filter(o=>!o._hidden),i=e._getHelpCommand();return i&&!i._hidden&&n.push(i),this.sortSubcommands&&n.sort((o,r)=>o.name().localeCompare(r.name())),n}compareOptions(e,n){let i=o=>o.short?o.short.replace(/^-/,""):o.long.replace(/^--/,"");return i(e).localeCompare(i(n))}visibleOptions(e){let n=e.options.filter(o=>!o.hidden),i=e._getHelpOption();if(i&&!i.hidden){let o=i.short&&e._findOption(i.short),r=i.long&&e._findOption(i.long);!o&&!r?n.push(i):i.long&&!r?n.push(e.createOption(i.long,i.description)):i.short&&!o&&n.push(e.createOption(i.short,i.description))}return this.sortOptions&&n.sort(this.compareOptions),n}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let n=[];for(let i=e.parent;i;i=i.parent){let o=i.options.filter(r=>!r.hidden);n.push(...o)}return this.sortOptions&&n.sort(this.compareOptions),n}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(n=>{n.description=n.description||e._argsDescription[n.name()]||""}),e.registeredArguments.find(n=>n.description)?e.registeredArguments:[]}subcommandTerm(e){let n=e.registeredArguments.map(i=>pc(i)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(n?" "+n:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,n){return n.visibleCommands(e).reduce((i,o)=>Math.max(i,n.subcommandTerm(o).length),0)}longestOptionTermLength(e,n){return n.visibleOptions(e).reduce((i,o)=>Math.max(i,n.optionTerm(o).length),0)}longestGlobalOptionTermLength(e,n){return n.visibleGlobalOptions(e).reduce((i,o)=>Math.max(i,n.optionTerm(o).length),0)}longestArgumentTermLength(e,n){return n.visibleArguments(e).reduce((i,o)=>Math.max(i,n.argumentTerm(o).length),0)}commandUsage(e){let n=e._name;e._aliases[0]&&(n=n+"|"+e._aliases[0]);let i="";for(let o=e.parent;o;o=o.parent)i=o.name()+" "+i;return i+n+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let n=[];return e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&n.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&n.push(`env: ${e.envVar}`),n.length>0?`${e.description} (${n.join(", ")})`:e.description}argumentDescription(e){let n=[];if(e.argChoices&&n.push(`choices: ${e.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),e.defaultValue!==void 0&&n.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),n.length>0){let i=`(${n.join(", ")})`;return e.description?`${e.description} ${i}`:i}return e.description}formatHelp(e,n){let i=n.padWidth(e,n),o=n.helpWidth||80,r=2,a=2;function s(d,h){if(h){let k=`${d.padEnd(i+a)}${h}`;return n.wrap(k,o-r,i+a)}return d}function l(d){return d.join(`
4
+ `).replace(/^/gm," ".repeat(r))}let u=[`Usage: ${n.commandUsage(e)}`,""],c=n.commandDescription(e);c.length>0&&(u=u.concat([n.wrap(c,o,0),""]));let m=n.visibleArguments(e).map(d=>s(n.argumentTerm(d),n.argumentDescription(d)));m.length>0&&(u=u.concat(["Arguments:",l(m),""]));let p=n.visibleOptions(e).map(d=>s(n.optionTerm(d),n.optionDescription(d)));if(p.length>0&&(u=u.concat(["Options:",l(p),""])),this.showGlobalOptions){let d=n.visibleGlobalOptions(e).map(h=>s(n.optionTerm(h),n.optionDescription(h)));d.length>0&&(u=u.concat(["Global Options:",l(d),""]))}let g=n.visibleCommands(e).map(d=>s(n.subcommandTerm(d),n.subcommandDescription(d)));return g.length>0&&(u=u.concat(["Commands:",l(g),""])),u.join(`
5
5
  `)}padWidth(e,n){return Math.max(n.longestOptionTermLength(e,n),n.longestGlobalOptionTermLength(e,n),n.longestSubcommandTermLength(e,n),n.longestArgumentTermLength(e,n))}wrap(e,n,i,o=40){let r=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",a=new RegExp(`[\\n][${r}]+`);if(e.match(a))return e;let s=n-i;if(s<o)return e;let l=e.slice(0,i),u=e.slice(i).replace(`\r
6
6
  `,`
7
7
  `),c=" ".repeat(i),p="\\s\u200B",g=new RegExp(`
8
- |.{1,${s-1}}([${p}]|$)|[^${p}]+?([${p}]|$)`,"g"),d=u.match(g)||[];return l+d.map((y,_)=>y===`
9
- `?"":(_>0?c:"")+y.trimEnd()).join(`
10
- `)}};Ji.Help=Xn});var nr=Ze(tr=>{"use strict";var{InvalidArgumentError:ml}=Pt(),Zn=class{constructor(e,n){this.flags=e,this.description=n||"",this.required=e.includes("<"),this.optional=e.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let i=fl(e);this.short=i.shortFlag,this.long=i.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(e,n){return this.defaultValue=e,this.defaultValueDescription=n,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let n=e;return typeof e=="string"&&(n={[e]:!0}),this.implied=Object.assign(this.implied||{},n),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_concatValue(e,n){return n===this.defaultValue||!Array.isArray(n)?[e]:n.concat(e)}choices(e){return this.argChoices=e.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new ml(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return pl(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},er=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(n=>{n.negate?this.negativeOptions.set(n.attributeName(),n):this.positiveOptions.set(n.attributeName(),n)}),this.negativeOptions.forEach((n,i)=>{this.positiveOptions.has(i)&&this.dualOptions.add(i)})}valueFromOption(e,n){let i=n.attributeName();if(!this.dualOptions.has(i))return!0;let o=this.negativeOptions.get(i).presetArg,r=o!==void 0?o:!1;return n.negate===(r===e)}};function pl(t){return t.split("-").reduce((e,n)=>e+n[0].toUpperCase()+n.slice(1))}function fl(t){let e,n,i=t.split(/[ |,]+/);return i.length>1&&!/^[[<]/.test(i[1])&&(e=i.shift()),n=i.shift(),!e&&/^-[^-]$/.test(n)&&(e=n,n=void 0),{shortFlag:e,longFlag:n}}tr.Option=Zn;tr.DualOptions=er});var Xi=Ze(zi=>{"use strict";function gl(t,e){if(Math.abs(t.length-e.length)>3)return Math.max(t.length,e.length);let n=[];for(let i=0;i<=t.length;i++)n[i]=[i];for(let i=0;i<=e.length;i++)n[0][i]=i;for(let i=1;i<=e.length;i++)for(let o=1;o<=t.length;o++){let r=1;t[o-1]===e[i-1]?r=0:r=1,n[o][i]=Math.min(n[o-1][i]+1,n[o][i-1]+1,n[o-1][i-1]+r),o>1&&i>1&&t[o-1]===e[i-2]&&t[o-2]===e[i-1]&&(n[o][i]=Math.min(n[o][i],n[o-2][i-2]+1))}return n[t.length][e.length]}function hl(t,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let n=t.startsWith("--");n&&(t=t.slice(2),e=e.map(a=>a.slice(2)));let i=[],o=3,r=.4;return e.forEach(a=>{if(a.length<=1)return;let s=gl(t,a),l=Math.max(t.length,a.length);(l-s)/l>r&&(s<o?(o=s,i=[a]):s===o&&i.push(a))}),i.sort((a,s)=>a.localeCompare(s)),n&&(i=i.map(a=>`--${a}`)),i.length>1?`
8
+ |.{1,${s-1}}([${p}]|$)|[^${p}]+?([${p}]|$)`,"g"),d=u.match(g)||[];return l+d.map((h,k)=>h===`
9
+ `?"":(k>0?c:"")+h.trimEnd()).join(`
10
+ `)}};As.Help=mr});var vr=tt(hr=>{"use strict";var{InvalidArgumentError:fc}=Ft(),fr=class{constructor(e,n){this.flags=e,this.description=n||"",this.required=e.includes("<"),this.optional=e.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let i=hc(e);this.short=i.shortFlag,this.long=i.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(e,n){return this.defaultValue=e,this.defaultValueDescription=n,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let n=e;return typeof e=="string"&&(n={[e]:!0}),this.implied=Object.assign(this.implied||{},n),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_concatValue(e,n){return n===this.defaultValue||!Array.isArray(n)?[e]:n.concat(e)}choices(e){return this.argChoices=e.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new fc(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return gc(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},gr=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(n=>{n.negate?this.negativeOptions.set(n.attributeName(),n):this.positiveOptions.set(n.attributeName(),n)}),this.negativeOptions.forEach((n,i)=>{this.positiveOptions.has(i)&&this.dualOptions.add(i)})}valueFromOption(e,n){let i=n.attributeName();if(!this.dualOptions.has(i))return!0;let o=this.negativeOptions.get(i).presetArg,r=o!==void 0?o:!1;return n.negate===(r===e)}};function gc(t){return t.split("-").reduce((e,n)=>e+n[0].toUpperCase()+n.slice(1))}function hc(t){let e,n,i=t.split(/[ |,]+/);return i.length>1&&!/^[[<]/.test(i[1])&&(e=i.shift()),n=i.shift(),!e&&/^-[^-]$/.test(n)&&(e=n,n=void 0),{shortFlag:e,longFlag:n}}hr.Option=fr;hr.DualOptions=gr});var $s=tt(Ps=>{"use strict";function vc(t,e){if(Math.abs(t.length-e.length)>3)return Math.max(t.length,e.length);let n=[];for(let i=0;i<=t.length;i++)n[i]=[i];for(let i=0;i<=e.length;i++)n[0][i]=i;for(let i=1;i<=e.length;i++)for(let o=1;o<=t.length;o++){let r=1;t[o-1]===e[i-1]?r=0:r=1,n[o][i]=Math.min(n[o-1][i]+1,n[o][i-1]+1,n[o-1][i-1]+r),o>1&&i>1&&t[o-1]===e[i-2]&&t[o-2]===e[i-1]&&(n[o][i]=Math.min(n[o][i],n[o-2][i-2]+1))}return n[t.length][e.length]}function bc(t,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let n=t.startsWith("--");n&&(t=t.slice(2),e=e.map(a=>a.slice(2)));let i=[],o=3,r=.4;return e.forEach(a=>{if(a.length<=1)return;let s=vc(t,a),l=Math.max(t.length,a.length);(l-s)/l>r&&(s<o?(o=s,i=[a]):s===o&&i.push(a))}),i.sort((a,s)=>a.localeCompare(s)),n&&(i=i.map(a=>`--${a}`)),i.length>1?`
11
11
  (Did you mean one of ${i.join(", ")}?)`:i.length===1?`
12
- (Did you mean ${i[0]}?)`:""}zi.suggestSimilar=hl});var ns=Ze(ts=>{"use strict";var bl=St("events").EventEmitter,rr=St("child_process"),qe=St("path"),or=St("fs"),re=St("process"),{Argument:vl,humanReadableArgName:wl}=un(),{CommanderError:ir}=Pt(),{Help:yl}=Qn(),{Option:Qi,DualOptions:kl}=nr(),{suggestSimilar:Zi}=Xi(),sr=class t extends bl{constructor(e){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=e||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:n=>re.stdout.write(n),writeErr:n=>re.stderr.write(n),getOutHelpWidth:()=>re.stdout.isTTY?re.stdout.columns:void 0,getErrHelpWidth:()=>re.stderr.isTTY?re.stderr.columns:void 0,outputError:(n,i)=>i(n)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(e){return this._outputConfiguration=e._outputConfiguration,this._helpOption=e._helpOption,this._helpCommand=e._helpCommand,this._helpConfiguration=e._helpConfiguration,this._exitCallback=e._exitCallback,this._storeOptionsAsProperties=e._storeOptionsAsProperties,this._combineFlagAndOptionalValue=e._combineFlagAndOptionalValue,this._allowExcessArguments=e._allowExcessArguments,this._enablePositionalOptions=e._enablePositionalOptions,this._showHelpAfterError=e._showHelpAfterError,this._showSuggestionAfterError=e._showSuggestionAfterError,this}_getCommandAndAncestors(){let e=[];for(let n=this;n;n=n.parent)e.push(n);return e}command(e,n,i){let o=n,r=i;typeof o=="object"&&o!==null&&(r=o,o=null),r=r||{};let[,a,s]=e.match(/([^ ]+) *(.*)/),l=this.createCommand(a);return o&&(l.description(o),l._executableHandler=!0),r.isDefault&&(this._defaultCommandName=l._name),l._hidden=!!(r.noHelp||r.hidden),l._executableFile=r.executableFile||null,s&&l.arguments(s),this._registerCommand(l),l.parent=this,l.copyInheritedSettings(this),o?this:l}createCommand(e){return new t(e)}createHelp(){return Object.assign(new yl,this.configureHelp())}configureHelp(e){return e===void 0?this._helpConfiguration:(this._helpConfiguration=e,this)}configureOutput(e){return e===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,e),this)}showHelpAfterError(e=!0){return typeof e!="string"&&(e=!!e),this._showHelpAfterError=e,this}showSuggestionAfterError(e=!0){return this._showSuggestionAfterError=!!e,this}addCommand(e,n){if(!e._name)throw new Error(`Command passed to .addCommand() must have a name
13
- - specify the name in Command constructor or using .name()`);return n=n||{},n.isDefault&&(this._defaultCommandName=e._name),(n.noHelp||n.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,n){return new vl(e,n)}argument(e,n,i,o){let r=this.createArgument(e,n);return typeof i=="function"?r.default(o).argParser(i):r.default(i),this.addArgument(r),this}arguments(e){return e.trim().split(/ +/).forEach(n=>{this.argument(n)}),this}addArgument(e){let n=this.registeredArguments.slice(-1)[0];if(n&&n.variadic)throw new Error(`only the last argument can be variadic '${n.name()}'`);if(e.required&&e.defaultValue!==void 0&&e.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${e.name()}'`);return this.registeredArguments.push(e),this}helpCommand(e,n){if(typeof e=="boolean")return this._addImplicitHelpCommand=e,this;e=e??"help [command]";let[,i,o]=e.match(/([^ ]+) *(.*)/),r=n??"display help for command",a=this.createCommand(i);return a.helpOption(!1),o&&a.arguments(o),r&&a.description(r),this._addImplicitHelpCommand=!0,this._helpCommand=a,this}addHelpCommand(e,n){return typeof e!="object"?(this.helpCommand(e,n),this):(this._addImplicitHelpCommand=!0,this._helpCommand=e,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(e,n){let i=["preSubcommand","preAction","postAction"];if(!i.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
14
- Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(n):this._lifeCycleHooks[e]=[n],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=n=>{if(n.code!=="commander.executeSubCommandAsync")throw n},this}_exit(e,n,i){this._exitCallback&&this._exitCallback(new ir(e,n,i)),re.exit(e)}action(e){let n=i=>{let o=this.registeredArguments.length,r=i.slice(0,o);return this._storeOptionsAsProperties?r[o]=this:r[o]=this.opts(),r.push(this),e.apply(this,r)};return this._actionHandler=n,this}createOption(e,n){return new Qi(e,n)}_callParseArg(e,n,i,o){try{return e.parseArg(n,i)}catch(r){if(r.code==="commander.invalidArgument"){let a=`${o} ${r.message}`;this.error(a,{exitCode:r.exitCode,code:r.code})}throw r}}_registerOption(e){let n=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(n){let i=e.long&&this._findOption(e.long)?e.long:e.short;throw new Error(`Cannot add option '${e.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${i}'
15
- - already used by option '${n.flags}'`)}this.options.push(e)}_registerCommand(e){let n=o=>[o.name()].concat(o.aliases()),i=n(e).find(o=>this._findCommand(o));if(i){let o=n(this._findCommand(i)).join("|"),r=n(e).join("|");throw new Error(`cannot add command '${r}' as already have command '${o}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let n=e.name(),i=e.attributeName();if(e.negate){let r=e.long.replace(/^--no-/,"--");this._findOption(r)||this.setOptionValueWithSource(i,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(i,e.defaultValue,"default");let o=(r,a,s)=>{r==null&&e.presetArg!==void 0&&(r=e.presetArg);let l=this.getOptionValue(i);r!==null&&e.parseArg?r=this._callParseArg(e,r,l,a):r!==null&&e.variadic&&(r=e._concatValue(r,l)),r==null&&(e.negate?r=!1:e.isBoolean()||e.optional?r=!0:r=""),this.setOptionValueWithSource(i,r,s)};return this.on("option:"+n,r=>{let a=`error: option '${e.flags}' argument '${r}' is invalid.`;o(r,a,"cli")}),e.envVar&&this.on("optionEnv:"+n,r=>{let a=`error: option '${e.flags}' value '${r}' from env '${e.envVar}' is invalid.`;o(r,a,"env")}),this}_optionEx(e,n,i,o,r){if(typeof n=="object"&&n instanceof Qi)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let a=this.createOption(n,i);if(a.makeOptionMandatory(!!e.mandatory),typeof o=="function")a.default(r).argParser(o);else if(o instanceof RegExp){let s=o;o=(l,u)=>{let c=s.exec(l);return c?c[0]:u},a.default(r).argParser(o)}else a.default(o);return this.addOption(a)}option(e,n,i,o){return this._optionEx({},e,n,i,o)}requiredOption(e,n,i,o){return this._optionEx({mandatory:!0},e,n,i,o)}combineFlagAndOptionalValue(e=!0){return this._combineFlagAndOptionalValue=!!e,this}allowUnknownOption(e=!0){return this._allowUnknownOption=!!e,this}allowExcessArguments(e=!0){return this._allowExcessArguments=!!e,this}enablePositionalOptions(e=!0){return this._enablePositionalOptions=!!e,this}passThroughOptions(e=!0){return this._passThroughOptions=!!e,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(e=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!e,this}getOptionValue(e){return this._storeOptionsAsProperties?this[e]:this._optionValues[e]}setOptionValue(e,n){return this.setOptionValueWithSource(e,n,void 0)}setOptionValueWithSource(e,n,i){return this._storeOptionsAsProperties?this[e]=n:this._optionValues[e]=n,this._optionValueSources[e]=i,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let n;return this._getCommandAndAncestors().forEach(i=>{i.getOptionValueSource(e)!==void 0&&(n=i.getOptionValueSource(e))}),n}_prepareUserArgs(e,n){if(e!==void 0&&!Array.isArray(e))throw new Error("first parameter to parse must be array or undefined");if(n=n||{},e===void 0&&n.from===void 0){re.versions?.electron&&(n.from="electron");let o=re.execArgv??[];(o.includes("-e")||o.includes("--eval")||o.includes("-p")||o.includes("--print"))&&(n.from="eval")}e===void 0&&(e=re.argv),this.rawArgs=e.slice();let i;switch(n.from){case void 0:case"node":this._scriptPath=e[1],i=e.slice(2);break;case"electron":re.defaultApp?(this._scriptPath=e[1],i=e.slice(2)):i=e.slice(1);break;case"user":i=e.slice(0);break;case"eval":i=e.slice(1);break;default:throw new Error(`unexpected parse option { from: '${n.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",i}parse(e,n){let i=this._prepareUserArgs(e,n);return this._parseCommand([],i),this}async parseAsync(e,n){let i=this._prepareUserArgs(e,n);return await this._parseCommand([],i),this}_executeSubCommand(e,n){n=n.slice();let i=!1,o=[".js",".ts",".tsx",".mjs",".cjs"];function r(c,m){let p=qe.resolve(c,m);if(or.existsSync(p))return p;if(o.includes(qe.extname(m)))return;let g=o.find(d=>or.existsSync(`${p}${d}`));if(g)return`${p}${g}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let a=e._executableFile||`${this._name}-${e._name}`,s=this._executableDir||"";if(this._scriptPath){let c;try{c=or.realpathSync(this._scriptPath)}catch{c=this._scriptPath}s=qe.resolve(qe.dirname(c),s)}if(s){let c=r(s,a);if(!c&&!e._executableFile&&this._scriptPath){let m=qe.basename(this._scriptPath,qe.extname(this._scriptPath));m!==this._name&&(c=r(s,`${m}-${e._name}`))}a=c||a}i=o.includes(qe.extname(a));let l;re.platform!=="win32"?i?(n.unshift(a),n=es(re.execArgv).concat(n),l=rr.spawn(re.argv[0],n,{stdio:"inherit"})):l=rr.spawn(a,n,{stdio:"inherit"}):(n.unshift(a),n=es(re.execArgv).concat(n),l=rr.spawn(re.execPath,n,{stdio:"inherit"})),l.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(m=>{re.on(m,()=>{l.killed===!1&&l.exitCode===null&&l.kill(m)})});let u=this._exitCallback;l.on("close",c=>{c=c??1,u?u(new ir(c,"commander.executeSubCommandAsync","(close)")):re.exit(c)}),l.on("error",c=>{if(c.code==="ENOENT"){let m=s?`searched for local subcommand relative to directory '${s}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",p=`'${a}' does not exist
12
+ (Did you mean ${i[0]}?)`:""}Ps.suggestSimilar=bc});var js=tt(Ns=>{"use strict";var wc=$t("events").EventEmitter,br=$t("child_process"),Ke=$t("path"),wr=$t("fs"),re=$t("process"),{Argument:yc,humanReadableArgName:kc}=wn(),{CommanderError:yr}=Ft(),{Help:_c}=pr(),{Option:Ds,DualOptions:xc}=vr(),{suggestSimilar:Os}=$s(),kr=class t extends wc{constructor(e){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=e||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:n=>re.stdout.write(n),writeErr:n=>re.stderr.write(n),getOutHelpWidth:()=>re.stdout.isTTY?re.stdout.columns:void 0,getErrHelpWidth:()=>re.stderr.isTTY?re.stderr.columns:void 0,outputError:(n,i)=>i(n)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(e){return this._outputConfiguration=e._outputConfiguration,this._helpOption=e._helpOption,this._helpCommand=e._helpCommand,this._helpConfiguration=e._helpConfiguration,this._exitCallback=e._exitCallback,this._storeOptionsAsProperties=e._storeOptionsAsProperties,this._combineFlagAndOptionalValue=e._combineFlagAndOptionalValue,this._allowExcessArguments=e._allowExcessArguments,this._enablePositionalOptions=e._enablePositionalOptions,this._showHelpAfterError=e._showHelpAfterError,this._showSuggestionAfterError=e._showSuggestionAfterError,this}_getCommandAndAncestors(){let e=[];for(let n=this;n;n=n.parent)e.push(n);return e}command(e,n,i){let o=n,r=i;typeof o=="object"&&o!==null&&(r=o,o=null),r=r||{};let[,a,s]=e.match(/([^ ]+) *(.*)/),l=this.createCommand(a);return o&&(l.description(o),l._executableHandler=!0),r.isDefault&&(this._defaultCommandName=l._name),l._hidden=!!(r.noHelp||r.hidden),l._executableFile=r.executableFile||null,s&&l.arguments(s),this._registerCommand(l),l.parent=this,l.copyInheritedSettings(this),o?this:l}createCommand(e){return new t(e)}createHelp(){return Object.assign(new _c,this.configureHelp())}configureHelp(e){return e===void 0?this._helpConfiguration:(this._helpConfiguration=e,this)}configureOutput(e){return e===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,e),this)}showHelpAfterError(e=!0){return typeof e!="string"&&(e=!!e),this._showHelpAfterError=e,this}showSuggestionAfterError(e=!0){return this._showSuggestionAfterError=!!e,this}addCommand(e,n){if(!e._name)throw new Error(`Command passed to .addCommand() must have a name
13
+ - specify the name in Command constructor or using .name()`);return n=n||{},n.isDefault&&(this._defaultCommandName=e._name),(n.noHelp||n.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,n){return new yc(e,n)}argument(e,n,i,o){let r=this.createArgument(e,n);return typeof i=="function"?r.default(o).argParser(i):r.default(i),this.addArgument(r),this}arguments(e){return e.trim().split(/ +/).forEach(n=>{this.argument(n)}),this}addArgument(e){let n=this.registeredArguments.slice(-1)[0];if(n&&n.variadic)throw new Error(`only the last argument can be variadic '${n.name()}'`);if(e.required&&e.defaultValue!==void 0&&e.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${e.name()}'`);return this.registeredArguments.push(e),this}helpCommand(e,n){if(typeof e=="boolean")return this._addImplicitHelpCommand=e,this;e=e??"help [command]";let[,i,o]=e.match(/([^ ]+) *(.*)/),r=n??"display help for command",a=this.createCommand(i);return a.helpOption(!1),o&&a.arguments(o),r&&a.description(r),this._addImplicitHelpCommand=!0,this._helpCommand=a,this}addHelpCommand(e,n){return typeof e!="object"?(this.helpCommand(e,n),this):(this._addImplicitHelpCommand=!0,this._helpCommand=e,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(e,n){let i=["preSubcommand","preAction","postAction"];if(!i.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
14
+ Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(n):this._lifeCycleHooks[e]=[n],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=n=>{if(n.code!=="commander.executeSubCommandAsync")throw n},this}_exit(e,n,i){this._exitCallback&&this._exitCallback(new yr(e,n,i)),re.exit(e)}action(e){let n=i=>{let o=this.registeredArguments.length,r=i.slice(0,o);return this._storeOptionsAsProperties?r[o]=this:r[o]=this.opts(),r.push(this),e.apply(this,r)};return this._actionHandler=n,this}createOption(e,n){return new Ds(e,n)}_callParseArg(e,n,i,o){try{return e.parseArg(n,i)}catch(r){if(r.code==="commander.invalidArgument"){let a=`${o} ${r.message}`;this.error(a,{exitCode:r.exitCode,code:r.code})}throw r}}_registerOption(e){let n=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(n){let i=e.long&&this._findOption(e.long)?e.long:e.short;throw new Error(`Cannot add option '${e.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${i}'
15
+ - already used by option '${n.flags}'`)}this.options.push(e)}_registerCommand(e){let n=o=>[o.name()].concat(o.aliases()),i=n(e).find(o=>this._findCommand(o));if(i){let o=n(this._findCommand(i)).join("|"),r=n(e).join("|");throw new Error(`cannot add command '${r}' as already have command '${o}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let n=e.name(),i=e.attributeName();if(e.negate){let r=e.long.replace(/^--no-/,"--");this._findOption(r)||this.setOptionValueWithSource(i,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(i,e.defaultValue,"default");let o=(r,a,s)=>{r==null&&e.presetArg!==void 0&&(r=e.presetArg);let l=this.getOptionValue(i);r!==null&&e.parseArg?r=this._callParseArg(e,r,l,a):r!==null&&e.variadic&&(r=e._concatValue(r,l)),r==null&&(e.negate?r=!1:e.isBoolean()||e.optional?r=!0:r=""),this.setOptionValueWithSource(i,r,s)};return this.on("option:"+n,r=>{let a=`error: option '${e.flags}' argument '${r}' is invalid.`;o(r,a,"cli")}),e.envVar&&this.on("optionEnv:"+n,r=>{let a=`error: option '${e.flags}' value '${r}' from env '${e.envVar}' is invalid.`;o(r,a,"env")}),this}_optionEx(e,n,i,o,r){if(typeof n=="object"&&n instanceof Ds)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let a=this.createOption(n,i);if(a.makeOptionMandatory(!!e.mandatory),typeof o=="function")a.default(r).argParser(o);else if(o instanceof RegExp){let s=o;o=(l,u)=>{let c=s.exec(l);return c?c[0]:u},a.default(r).argParser(o)}else a.default(o);return this.addOption(a)}option(e,n,i,o){return this._optionEx({},e,n,i,o)}requiredOption(e,n,i,o){return this._optionEx({mandatory:!0},e,n,i,o)}combineFlagAndOptionalValue(e=!0){return this._combineFlagAndOptionalValue=!!e,this}allowUnknownOption(e=!0){return this._allowUnknownOption=!!e,this}allowExcessArguments(e=!0){return this._allowExcessArguments=!!e,this}enablePositionalOptions(e=!0){return this._enablePositionalOptions=!!e,this}passThroughOptions(e=!0){return this._passThroughOptions=!!e,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(e=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!e,this}getOptionValue(e){return this._storeOptionsAsProperties?this[e]:this._optionValues[e]}setOptionValue(e,n){return this.setOptionValueWithSource(e,n,void 0)}setOptionValueWithSource(e,n,i){return this._storeOptionsAsProperties?this[e]=n:this._optionValues[e]=n,this._optionValueSources[e]=i,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let n;return this._getCommandAndAncestors().forEach(i=>{i.getOptionValueSource(e)!==void 0&&(n=i.getOptionValueSource(e))}),n}_prepareUserArgs(e,n){if(e!==void 0&&!Array.isArray(e))throw new Error("first parameter to parse must be array or undefined");if(n=n||{},e===void 0&&n.from===void 0){re.versions?.electron&&(n.from="electron");let o=re.execArgv??[];(o.includes("-e")||o.includes("--eval")||o.includes("-p")||o.includes("--print"))&&(n.from="eval")}e===void 0&&(e=re.argv),this.rawArgs=e.slice();let i;switch(n.from){case void 0:case"node":this._scriptPath=e[1],i=e.slice(2);break;case"electron":re.defaultApp?(this._scriptPath=e[1],i=e.slice(2)):i=e.slice(1);break;case"user":i=e.slice(0);break;case"eval":i=e.slice(1);break;default:throw new Error(`unexpected parse option { from: '${n.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",i}parse(e,n){let i=this._prepareUserArgs(e,n);return this._parseCommand([],i),this}async parseAsync(e,n){let i=this._prepareUserArgs(e,n);return await this._parseCommand([],i),this}_executeSubCommand(e,n){n=n.slice();let i=!1,o=[".js",".ts",".tsx",".mjs",".cjs"];function r(c,m){let p=Ke.resolve(c,m);if(wr.existsSync(p))return p;if(o.includes(Ke.extname(m)))return;let g=o.find(d=>wr.existsSync(`${p}${d}`));if(g)return`${p}${g}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let a=e._executableFile||`${this._name}-${e._name}`,s=this._executableDir||"";if(this._scriptPath){let c;try{c=wr.realpathSync(this._scriptPath)}catch{c=this._scriptPath}s=Ke.resolve(Ke.dirname(c),s)}if(s){let c=r(s,a);if(!c&&!e._executableFile&&this._scriptPath){let m=Ke.basename(this._scriptPath,Ke.extname(this._scriptPath));m!==this._name&&(c=r(s,`${m}-${e._name}`))}a=c||a}i=o.includes(Ke.extname(a));let l;re.platform!=="win32"?i?(n.unshift(a),n=Ms(re.execArgv).concat(n),l=br.spawn(re.argv[0],n,{stdio:"inherit"})):l=br.spawn(a,n,{stdio:"inherit"}):(n.unshift(a),n=Ms(re.execArgv).concat(n),l=br.spawn(re.execPath,n,{stdio:"inherit"})),l.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(m=>{re.on(m,()=>{l.killed===!1&&l.exitCode===null&&l.kill(m)})});let u=this._exitCallback;l.on("close",c=>{c=c??1,u?u(new yr(c,"commander.executeSubCommandAsync","(close)")):re.exit(c)}),l.on("error",c=>{if(c.code==="ENOENT"){let m=s?`searched for local subcommand relative to directory '${s}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",p=`'${a}' does not exist
16
16
  - if '${e._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
17
17
  - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
18
- - ${m}`;throw new Error(p)}else if(c.code==="EACCES")throw new Error(`'${a}' not executable`);if(!u)re.exit(1);else{let m=new ir(1,"commander.executeSubCommandAsync","(error)");m.nestedError=c,u(m)}}),this.runningCommand=l}_dispatchSubcommand(e,n,i){let o=this._findCommand(e);o||this.help({error:!0});let r;return r=this._chainOrCallSubCommandHook(r,o,"preSubcommand"),r=this._chainOrCall(r,()=>{if(o._executableHandler)this._executeSubCommand(o,n.concat(i));else return o._parseCommand(n,i)}),r}_dispatchHelpCommand(e){e||this.help();let n=this._findCommand(e);return n&&!n._executableHandler&&n.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,n)=>{e.required&&this.args[n]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(i,o,r)=>{let a=o;if(o!==null&&i.parseArg){let s=`error: command-argument value '${o}' is invalid for argument '${i.name()}'.`;a=this._callParseArg(i,o,r,s)}return a};this._checkNumberOfArguments();let n=[];this.registeredArguments.forEach((i,o)=>{let r=i.defaultValue;i.variadic?o<this.args.length?(r=this.args.slice(o),i.parseArg&&(r=r.reduce((a,s)=>e(i,s,a),i.defaultValue))):r===void 0&&(r=[]):o<this.args.length&&(r=this.args[o],i.parseArg&&(r=e(i,r,i.defaultValue))),n[o]=r}),this.processedArgs=n}_chainOrCall(e,n){return e&&e.then&&typeof e.then=="function"?e.then(()=>n()):n()}_chainOrCallHooks(e,n){let i=e,o=[];return this._getCommandAndAncestors().reverse().filter(r=>r._lifeCycleHooks[n]!==void 0).forEach(r=>{r._lifeCycleHooks[n].forEach(a=>{o.push({hookedCommand:r,callback:a})})}),n==="postAction"&&o.reverse(),o.forEach(r=>{i=this._chainOrCall(i,()=>r.callback(r.hookedCommand,this))}),i}_chainOrCallSubCommandHook(e,n,i){let o=e;return this._lifeCycleHooks[i]!==void 0&&this._lifeCycleHooks[i].forEach(r=>{o=this._chainOrCall(o,()=>r(this,n))}),o}_parseCommand(e,n){let i=this.parseOptions(n);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(i.operands),n=i.unknown,this.args=e.concat(n),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),n);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(n),this._dispatchSubcommand(this._defaultCommandName,e,n);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(i.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=()=>{i.unknown.length>0&&this.unknownOption(i.unknown[0])},r=`command:${this.name()}`;if(this._actionHandler){o(),this._processArguments();let a;return a=this._chainOrCallHooks(a,"preAction"),a=this._chainOrCall(a,()=>this._actionHandler(this.processedArgs)),this.parent&&(a=this._chainOrCall(a,()=>{this.parent.emit(r,e,n)})),a=this._chainOrCallHooks(a,"postAction"),a}if(this.parent&&this.parent.listenerCount(r))o(),this._processArguments(),this.parent.emit(r,e,n);else if(e.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",e,n);this.listenerCount("command:*")?this.emit("command:*",e,n):this.commands.length?this.unknownCommand():(o(),this._processArguments())}else this.commands.length?(o(),this.help({error:!0})):(o(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(n=>n._name===e||n._aliases.includes(e))}_findOption(e){return this.options.find(n=>n.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(n=>{n.mandatory&&e.getOptionValue(n.attributeName())===void 0&&e.missingMandatoryOptionValue(n)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(i=>{let o=i.attributeName();return this.getOptionValue(o)===void 0?!1:this.getOptionValueSource(o)!=="default"});e.filter(i=>i.conflictsWith.length>0).forEach(i=>{let o=e.find(r=>i.conflictsWith.includes(r.attributeName()));o&&this._conflictingOption(i,o)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let n=[],i=[],o=n,r=e.slice();function a(l){return l.length>1&&l[0]==="-"}let s=null;for(;r.length;){let l=r.shift();if(l==="--"){o===i&&o.push(l),o.push(...r);break}if(s&&!a(l)){this.emit(`option:${s.name()}`,l);continue}if(s=null,a(l)){let u=this._findOption(l);if(u){if(u.required){let c=r.shift();c===void 0&&this.optionMissingArgument(u),this.emit(`option:${u.name()}`,c)}else if(u.optional){let c=null;r.length>0&&!a(r[0])&&(c=r.shift()),this.emit(`option:${u.name()}`,c)}else this.emit(`option:${u.name()}`);s=u.variadic?u:null;continue}}if(l.length>2&&l[0]==="-"&&l[1]!=="-"){let u=this._findOption(`-${l[1]}`);if(u){u.required||u.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${u.name()}`,l.slice(2)):(this.emit(`option:${u.name()}`),r.unshift(`-${l.slice(2)}`));continue}}if(/^--[^=]+=/.test(l)){let u=l.indexOf("="),c=this._findOption(l.slice(0,u));if(c&&(c.required||c.optional)){this.emit(`option:${c.name()}`,l.slice(u+1));continue}}if(a(l)&&(o=i),(this._enablePositionalOptions||this._passThroughOptions)&&n.length===0&&i.length===0){if(this._findCommand(l)){n.push(l),r.length>0&&i.push(...r);break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){n.push(l),r.length>0&&n.push(...r);break}else if(this._defaultCommandName){i.push(l),r.length>0&&i.push(...r);break}}if(this._passThroughOptions){o.push(l),r.length>0&&o.push(...r);break}o.push(l)}return{operands:n,unknown:i}}opts(){if(this._storeOptionsAsProperties){let e={},n=this.options.length;for(let i=0;i<n;i++){let o=this.options[i].attributeName();e[o]=o===this._versionOptionName?this._version:this[o]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,n)=>Object.assign(e,n.opts()),{})}error(e,n){this._outputConfiguration.outputError(`${e}
18
+ - ${m}`;throw new Error(p)}else if(c.code==="EACCES")throw new Error(`'${a}' not executable`);if(!u)re.exit(1);else{let m=new yr(1,"commander.executeSubCommandAsync","(error)");m.nestedError=c,u(m)}}),this.runningCommand=l}_dispatchSubcommand(e,n,i){let o=this._findCommand(e);o||this.help({error:!0});let r;return r=this._chainOrCallSubCommandHook(r,o,"preSubcommand"),r=this._chainOrCall(r,()=>{if(o._executableHandler)this._executeSubCommand(o,n.concat(i));else return o._parseCommand(n,i)}),r}_dispatchHelpCommand(e){e||this.help();let n=this._findCommand(e);return n&&!n._executableHandler&&n.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,n)=>{e.required&&this.args[n]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(i,o,r)=>{let a=o;if(o!==null&&i.parseArg){let s=`error: command-argument value '${o}' is invalid for argument '${i.name()}'.`;a=this._callParseArg(i,o,r,s)}return a};this._checkNumberOfArguments();let n=[];this.registeredArguments.forEach((i,o)=>{let r=i.defaultValue;i.variadic?o<this.args.length?(r=this.args.slice(o),i.parseArg&&(r=r.reduce((a,s)=>e(i,s,a),i.defaultValue))):r===void 0&&(r=[]):o<this.args.length&&(r=this.args[o],i.parseArg&&(r=e(i,r,i.defaultValue))),n[o]=r}),this.processedArgs=n}_chainOrCall(e,n){return e&&e.then&&typeof e.then=="function"?e.then(()=>n()):n()}_chainOrCallHooks(e,n){let i=e,o=[];return this._getCommandAndAncestors().reverse().filter(r=>r._lifeCycleHooks[n]!==void 0).forEach(r=>{r._lifeCycleHooks[n].forEach(a=>{o.push({hookedCommand:r,callback:a})})}),n==="postAction"&&o.reverse(),o.forEach(r=>{i=this._chainOrCall(i,()=>r.callback(r.hookedCommand,this))}),i}_chainOrCallSubCommandHook(e,n,i){let o=e;return this._lifeCycleHooks[i]!==void 0&&this._lifeCycleHooks[i].forEach(r=>{o=this._chainOrCall(o,()=>r(this,n))}),o}_parseCommand(e,n){let i=this.parseOptions(n);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(i.operands),n=i.unknown,this.args=e.concat(n),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),n);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(n),this._dispatchSubcommand(this._defaultCommandName,e,n);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(i.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=()=>{i.unknown.length>0&&this.unknownOption(i.unknown[0])},r=`command:${this.name()}`;if(this._actionHandler){o(),this._processArguments();let a;return a=this._chainOrCallHooks(a,"preAction"),a=this._chainOrCall(a,()=>this._actionHandler(this.processedArgs)),this.parent&&(a=this._chainOrCall(a,()=>{this.parent.emit(r,e,n)})),a=this._chainOrCallHooks(a,"postAction"),a}if(this.parent&&this.parent.listenerCount(r))o(),this._processArguments(),this.parent.emit(r,e,n);else if(e.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",e,n);this.listenerCount("command:*")?this.emit("command:*",e,n):this.commands.length?this.unknownCommand():(o(),this._processArguments())}else this.commands.length?(o(),this.help({error:!0})):(o(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(n=>n._name===e||n._aliases.includes(e))}_findOption(e){return this.options.find(n=>n.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(n=>{n.mandatory&&e.getOptionValue(n.attributeName())===void 0&&e.missingMandatoryOptionValue(n)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(i=>{let o=i.attributeName();return this.getOptionValue(o)===void 0?!1:this.getOptionValueSource(o)!=="default"});e.filter(i=>i.conflictsWith.length>0).forEach(i=>{let o=e.find(r=>i.conflictsWith.includes(r.attributeName()));o&&this._conflictingOption(i,o)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let n=[],i=[],o=n,r=e.slice();function a(l){return l.length>1&&l[0]==="-"}let s=null;for(;r.length;){let l=r.shift();if(l==="--"){o===i&&o.push(l),o.push(...r);break}if(s&&!a(l)){this.emit(`option:${s.name()}`,l);continue}if(s=null,a(l)){let u=this._findOption(l);if(u){if(u.required){let c=r.shift();c===void 0&&this.optionMissingArgument(u),this.emit(`option:${u.name()}`,c)}else if(u.optional){let c=null;r.length>0&&!a(r[0])&&(c=r.shift()),this.emit(`option:${u.name()}`,c)}else this.emit(`option:${u.name()}`);s=u.variadic?u:null;continue}}if(l.length>2&&l[0]==="-"&&l[1]!=="-"){let u=this._findOption(`-${l[1]}`);if(u){u.required||u.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${u.name()}`,l.slice(2)):(this.emit(`option:${u.name()}`),r.unshift(`-${l.slice(2)}`));continue}}if(/^--[^=]+=/.test(l)){let u=l.indexOf("="),c=this._findOption(l.slice(0,u));if(c&&(c.required||c.optional)){this.emit(`option:${c.name()}`,l.slice(u+1));continue}}if(a(l)&&(o=i),(this._enablePositionalOptions||this._passThroughOptions)&&n.length===0&&i.length===0){if(this._findCommand(l)){n.push(l),r.length>0&&i.push(...r);break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){n.push(l),r.length>0&&n.push(...r);break}else if(this._defaultCommandName){i.push(l),r.length>0&&i.push(...r);break}}if(this._passThroughOptions){o.push(l),r.length>0&&o.push(...r);break}o.push(l)}return{operands:n,unknown:i}}opts(){if(this._storeOptionsAsProperties){let e={},n=this.options.length;for(let i=0;i<n;i++){let o=this.options[i].attributeName();e[o]=o===this._versionOptionName?this._version:this[o]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,n)=>Object.assign(e,n.opts()),{})}error(e,n){this._outputConfiguration.outputError(`${e}
19
19
  `,this._outputConfiguration.writeErr),typeof this._showHelpAfterError=="string"?this._outputConfiguration.writeErr(`${this._showHelpAfterError}
20
20
  `):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
21
- `),this.outputHelp({error:!0}));let i=n||{},o=i.exitCode||1,r=i.code||"commander.error";this._exit(o,r,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in re.env){let n=e.attributeName();(this.getOptionValue(n)===void 0||["default","config","env"].includes(this.getOptionValueSource(n)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,re.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new kl(this.options),n=i=>this.getOptionValue(i)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(i));this.options.filter(i=>i.implied!==void 0&&n(i.attributeName())&&e.valueFromOption(this.getOptionValue(i.attributeName()),i)).forEach(i=>{Object.keys(i.implied).filter(o=>!n(o)).forEach(o=>{this.setOptionValueWithSource(o,i.implied[o],"implied")})})}missingArgument(e){let n=`error: missing required argument '${e}'`;this.error(n,{code:"commander.missingArgument"})}optionMissingArgument(e){let n=`error: option '${e.flags}' argument missing`;this.error(n,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let n=`error: required option '${e.flags}' not specified`;this.error(n,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,n){let i=a=>{let s=a.attributeName(),l=this.getOptionValue(s),u=this.options.find(m=>m.negate&&s===m.attributeName()),c=this.options.find(m=>!m.negate&&s===m.attributeName());return u&&(u.presetArg===void 0&&l===!1||u.presetArg!==void 0&&l===u.presetArg)?u:c||a},o=a=>{let s=i(a),l=s.attributeName();return this.getOptionValueSource(l)==="env"?`environment variable '${s.envVar}'`:`option '${s.flags}'`},r=`error: ${o(e)} cannot be used with ${o(n)}`;this.error(r,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let n="";if(e.startsWith("--")&&this._showSuggestionAfterError){let o=[],r=this;do{let a=r.createHelp().visibleOptions(r).filter(s=>s.long).map(s=>s.long);o=o.concat(a),r=r.parent}while(r&&!r._enablePositionalOptions);n=Zi(e,o)}let i=`error: unknown option '${e}'${n}`;this.error(i,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let n=this.registeredArguments.length,i=n===1?"":"s",r=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${n} argument${i} but got ${e.length}.`;this.error(r,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],n="";if(this._showSuggestionAfterError){let o=[];this.createHelp().visibleCommands(this).forEach(r=>{o.push(r.name()),r.alias()&&o.push(r.alias())}),n=Zi(e,o)}let i=`error: unknown command '${e}'${n}`;this.error(i,{code:"commander.unknownCommand"})}version(e,n,i){if(e===void 0)return this._version;this._version=e,n=n||"-V, --version",i=i||"output the version number";let o=this.createOption(n,i);return this._versionOptionName=o.attributeName(),this._registerOption(o),this.on("option:"+o.name(),()=>{this._outputConfiguration.writeOut(`${e}
22
- `),this._exit(0,"commander.version",e)}),this}description(e,n){return e===void 0&&n===void 0?this._description:(this._description=e,n&&(this._argsDescription=n),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let n=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(n=this.commands[this.commands.length-1]),e===n._name)throw new Error("Command alias can't be the same as its name");let i=this.parent?._findCommand(e);if(i){let o=[i.name()].concat(i.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${o}'`)}return n._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(n=>this.alias(n)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let n=this.registeredArguments.map(i=>wl(i));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?n:[]).join(" ")}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}nameFromFilename(e){return this._name=qe.basename(e,qe.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let n=this.createHelp();return n.helpWidth===void 0&&(n.helpWidth=e&&e.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth()),n.formatHelp(this,n)}_getHelpContext(e){e=e||{};let n={error:!!e.error},i;return n.error?i=o=>this._outputConfiguration.writeErr(o):i=o=>this._outputConfiguration.writeOut(o),n.write=e.write||i,n.command=this,n}outputHelp(e){let n;typeof e=="function"&&(n=e,e=void 0);let i=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(r=>r.emit("beforeAllHelp",i)),this.emit("beforeHelp",i);let o=this.helpInformation(i);if(n&&(o=n(o),typeof o!="string"&&!Buffer.isBuffer(o)))throw new Error("outputHelp callback must return a string or a Buffer");i.write(o),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",i),this._getCommandAndAncestors().forEach(r=>r.emit("afterAllHelp",i))}helpOption(e,n){return typeof e=="boolean"?(e?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(e=e??"-h, --help",n=n??"display help for command",this._helpOption=this.createOption(e,n),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this}help(e){this.outputHelp(e);let n=re.exitCode||0;n===0&&e&&typeof e!="function"&&e.error&&(n=1),this._exit(n,"commander.help","(outputHelp)")}addHelpText(e,n){let i=["beforeAll","before","after","afterAll"];if(!i.includes(e))throw new Error(`Unexpected value for position to addHelpText.
21
+ `),this.outputHelp({error:!0}));let i=n||{},o=i.exitCode||1,r=i.code||"commander.error";this._exit(o,r,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in re.env){let n=e.attributeName();(this.getOptionValue(n)===void 0||["default","config","env"].includes(this.getOptionValueSource(n)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,re.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new xc(this.options),n=i=>this.getOptionValue(i)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(i));this.options.filter(i=>i.implied!==void 0&&n(i.attributeName())&&e.valueFromOption(this.getOptionValue(i.attributeName()),i)).forEach(i=>{Object.keys(i.implied).filter(o=>!n(o)).forEach(o=>{this.setOptionValueWithSource(o,i.implied[o],"implied")})})}missingArgument(e){let n=`error: missing required argument '${e}'`;this.error(n,{code:"commander.missingArgument"})}optionMissingArgument(e){let n=`error: option '${e.flags}' argument missing`;this.error(n,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let n=`error: required option '${e.flags}' not specified`;this.error(n,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,n){let i=a=>{let s=a.attributeName(),l=this.getOptionValue(s),u=this.options.find(m=>m.negate&&s===m.attributeName()),c=this.options.find(m=>!m.negate&&s===m.attributeName());return u&&(u.presetArg===void 0&&l===!1||u.presetArg!==void 0&&l===u.presetArg)?u:c||a},o=a=>{let s=i(a),l=s.attributeName();return this.getOptionValueSource(l)==="env"?`environment variable '${s.envVar}'`:`option '${s.flags}'`},r=`error: ${o(e)} cannot be used with ${o(n)}`;this.error(r,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let n="";if(e.startsWith("--")&&this._showSuggestionAfterError){let o=[],r=this;do{let a=r.createHelp().visibleOptions(r).filter(s=>s.long).map(s=>s.long);o=o.concat(a),r=r.parent}while(r&&!r._enablePositionalOptions);n=Os(e,o)}let i=`error: unknown option '${e}'${n}`;this.error(i,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let n=this.registeredArguments.length,i=n===1?"":"s",r=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${n} argument${i} but got ${e.length}.`;this.error(r,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],n="";if(this._showSuggestionAfterError){let o=[];this.createHelp().visibleCommands(this).forEach(r=>{o.push(r.name()),r.alias()&&o.push(r.alias())}),n=Os(e,o)}let i=`error: unknown command '${e}'${n}`;this.error(i,{code:"commander.unknownCommand"})}version(e,n,i){if(e===void 0)return this._version;this._version=e,n=n||"-V, --version",i=i||"output the version number";let o=this.createOption(n,i);return this._versionOptionName=o.attributeName(),this._registerOption(o),this.on("option:"+o.name(),()=>{this._outputConfiguration.writeOut(`${e}
22
+ `),this._exit(0,"commander.version",e)}),this}description(e,n){return e===void 0&&n===void 0?this._description:(this._description=e,n&&(this._argsDescription=n),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let n=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(n=this.commands[this.commands.length-1]),e===n._name)throw new Error("Command alias can't be the same as its name");let i=this.parent?._findCommand(e);if(i){let o=[i.name()].concat(i.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${o}'`)}return n._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(n=>this.alias(n)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let n=this.registeredArguments.map(i=>kc(i));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?n:[]).join(" ")}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}nameFromFilename(e){return this._name=Ke.basename(e,Ke.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let n=this.createHelp();return n.helpWidth===void 0&&(n.helpWidth=e&&e.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth()),n.formatHelp(this,n)}_getHelpContext(e){e=e||{};let n={error:!!e.error},i;return n.error?i=o=>this._outputConfiguration.writeErr(o):i=o=>this._outputConfiguration.writeOut(o),n.write=e.write||i,n.command=this,n}outputHelp(e){let n;typeof e=="function"&&(n=e,e=void 0);let i=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(r=>r.emit("beforeAllHelp",i)),this.emit("beforeHelp",i);let o=this.helpInformation(i);if(n&&(o=n(o),typeof o!="string"&&!Buffer.isBuffer(o)))throw new Error("outputHelp callback must return a string or a Buffer");i.write(o),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",i),this._getCommandAndAncestors().forEach(r=>r.emit("afterAllHelp",i))}helpOption(e,n){return typeof e=="boolean"?(e?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(e=e??"-h, --help",n=n??"display help for command",this._helpOption=this.createOption(e,n),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this}help(e){this.outputHelp(e);let n=re.exitCode||0;n===0&&e&&typeof e!="function"&&e.error&&(n=1),this._exit(n,"commander.help","(outputHelp)")}addHelpText(e,n){let i=["beforeAll","before","after","afterAll"];if(!i.includes(e))throw new Error(`Unexpected value for position to addHelpText.
23
23
  Expecting one of '${i.join("', '")}'`);let o=`${e}Help`;return this.on(o,r=>{let a;typeof n=="function"?a=n({error:r.error,command:r.command}):a=n,a&&r.write(`${a}
24
- `)}),this}_outputHelpIfRequested(e){let n=this._getHelpOption();n&&e.find(o=>n.is(o))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function es(t){return t.map(e=>{if(!e.startsWith("--inspect"))return e;let n,i="127.0.0.1",o="9229",r;return(r=e.match(/^(--inspect(-brk)?)$/))!==null?n=r[1]:(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(n=r[1],/^\d+$/.test(r[3])?o=r[3]:i=r[3]):(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(n=r[1],i=r[3],o=r[4]),n&&o!=="0"?`${n}=${i}:${parseInt(o)+1}`:e})}ts.Command=sr});var ss=Ze(Pe=>{"use strict";var{Argument:rs}=un(),{Command:ar}=ns(),{CommanderError:_l,InvalidArgumentError:os}=Pt(),{Help:xl}=Qn(),{Option:is}=nr();Pe.program=new ar;Pe.createCommand=t=>new ar(t);Pe.createOption=(t,e)=>new is(t,e);Pe.createArgument=(t,e)=>new rs(t,e);Pe.Command=ar;Pe.Option=is;Pe.Argument=rs;Pe.Help=xl;Pe.CommanderError=_l;Pe.InvalidArgumentError=os;Pe.InvalidOptionArgumentError=os});var Nt=Ie(Ct(),1);import de from"process";import*as ll from"tls";function Ki(){let t=ll;if(!(typeof t.getCACertificates!="function"||typeof t.setDefaultCACertificates!="function"))try{let e=o=>typeof o=="string",n=t.getCACertificates("default").filter(e),i=t.getCACertificates("system").filter(e);t.setDefaultCACertificates([...new Set([...n,...i])])}catch{}}var Yi=!1;function Gi(){if(!Yi)try{if(typeof process.emitWarning!="function")return;let t=process.emitWarning.bind(process),e=((n,...i)=>{let o=typeof n=="string"?n:n?.message??"";if(!((typeof i[0]=="string"?i[0]:typeof n=="object"&&n?n.name:void 0)==="ExperimentalWarning"&&o.includes("buffer.File")))return t(n,...i)});process.emitWarning=e,Yi=!0}catch{}}var as=Ie(ss(),1),{program:Jd,createCommand:zd,createArgument:Xd,createOption:Qd,CommanderError:Zd,InvalidArgumentError:ls,InvalidOptionArgumentError:eu,Command:rt,Argument:tu,Option:Y,Help:nu}=as.default;import{basename as Td,join as je,resolve as Rd}from"path";var Er=Ie(Ct(),1);var ye=Ie(Ct(),1);var Ge=Ie(dt(),1);function cs({steps:t,bifurcationInfo:e,perFlowMetadata:n}){return!e||e.isSingleFlow||!n||n.length<=1?null:(0,Ge.jsx)(se,{flexDirection:"column",children:n.map((i,o)=>{let r=t[o],a=r?.children??[],s=a.filter(g=>g.status==="passed").length,l=a.filter(g=>g.status==="failed").length,u=s+l,c=a.reduce((g,d)=>g+(d.duration??0),0),m=r?.status==="failed"?"failed":"passed",p=e.flows[o]??r?.objective??`Flow ${o+1}`;return(0,Ge.jsxs)(se,{flexDirection:"column",marginTop:o>0?1:0,children:[(0,Ge.jsxs)(se,{marginLeft:1,children:[(0,Ge.jsx)(q,{color:K.purple,bold:!0,children:"Flow "+(o+1)+": "}),(0,Ge.jsx)(q,{color:K.purple,children:p})]}),(0,Ge.jsx)(rn,{status:m,summary:i?.summary??"",duration:c,steps:u,stepsPassed:s,stepsFailed:l,reason:i?.error_message??void 0,creditsConsumed:i?.credits_consumed??void 0})]},`flow-summary-${o}`)})})}var ae=Ie(dt(),1);function ds({config:t,spawnOpts:e,cancelRef:n,banner:i,describeContext:o,onComplete:r,onStepEnd:a,onReasoning:s,onStepComplete:l}){let{exit:u}=Vt(),{append:c}=Bt(),{describe:m,onDescribe:p,creditsRef:g}=Ei({resolve:()=>o??null,hostIsTTY:()=>!!process.stderr.isTTY}),d=Do(a,void 0,s,l,p),y=(0,ye.useRef)(!1),_=(0,ye.useRef)(!1),[b,v]=(0,ye.useState)("");(0,ye.useEffect)(()=>{y.current||(y.current=!0,d.startRun(t,e))},[t,e,d]),(0,ye.useEffect)(()=>{n&&(n.current=()=>d.cancelRun())},[n,d]),(0,ye.useEffect)(()=>{d.isRunning||m.stop()},[d.isRunning,m.stop]);let E=(0,ye.useRef)(0);On((C,w)=>{w.ctrl&&C==="c"&&(d.isRunning?(E.current++,E.current>=2?u():d.cancelRun()):u())}),On((C,w)=>{d.askingUser&&(w.return?(d.sendAnswer(b),v("")):w.backspace||w.delete?v(I=>I.slice(0,-1)):C&&!w.ctrl&&!w.meta&&v(I=>I+C))},{isActive:!!d.askingUser}),(0,ye.useEffect)(()=>{if(!d.isRunning&&d.lastRunEnd&&!_.current){_.current=!0;let{passed:C,failed:w,total:I}=Vn(d.steps),j=d.bifurcationInfo;r({lastRunEnd:d.lastRunEnd,stepsPassed:C,stepsFailed:w,stepsTotal:I,hadError:!1,bifurcationFlows:j&&!j.isSingleFlow?j.flows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u())}},[d.isRunning,d.lastRunEnd,d.steps,d.shutdownRunner,r,u]),(0,ye.useEffect)(()=>{d.runError&&!d.isRunning&&!_.current&&(_.current=!0,r({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u()))},[d.runError,d.isRunning,d.shutdownRunner,r,u]);let P=d.lastRunEnd?(()=>{let{passed:C,failed:w,total:I}=Vn(d.steps);return{status:d.lastRunEnd.status,duration:d.lastRunEnd.duration??0,summary:d.lastRunEnd.summary??"",stepsPassed:C,stepsFailed:w,stepsTotal:I,reason:d.lastRunEnd.reason,finalState:d.lastRunEnd.final_state,creditsConsumed:(d.lastRunEnd.credits_consumed??0)+g.current}})():null,f=(0,ye.useRef)(!1);return(0,ye.useEffect)(()=>{f.current||!i||(f.current=!0,c((0,ae.jsxs)(se,{flexDirection:"column",marginBottom:1,children:[(0,ae.jsxs)(se,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,ae.jsx)(q,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,ae.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,ae.jsx)(q,{color:K.orange,children:i.model}),(0,ae.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,ae.jsx)(q,{color:K.dim,children:i.auth})]}),i.status?.map((C,w)=>(0,ae.jsx)(q,{color:K.dim,children:C},w))]})))},[]),(0,ae.jsxs)(se,{flexDirection:"column",children:[(()=>{let C=Jr({isRunning:d.isRunning,bifurcationInfo:d.bifurcationInfo,steps:d.steps,cmInitCounts:d.cmInitCounts,replayInfo:d.replayInfo});return C?(0,ae.jsx)(Gr,{label:C.label,hasBifurcation:C.hasBifurcation}):null})(),d.steps.length>0&&(0,ae.jsx)(Yr,{steps:d.steps,bifurcated:!!d.bifurcationInfo&&!d.bifurcationInfo.isSingleFlow,flows:d.bifurcationInfo?.flows,cmInitCounts:d.cmInitCounts,staticSteps:!0,onStepCommit:c,describe:m.text,describeVisible:m.visible,describeRevealing:m.revealing}),d.askingUser&&(0,ae.jsxs)(se,{flexDirection:"column",marginTop:1,children:[(0,ae.jsxs)(q,{color:K.orange,children:['Agent is asking: "',d.askingUser,'"']}),(0,ae.jsxs)(q,{children:["> ",b,"\u2588"]})]}),d.runError&&(0,ae.jsx)(ii,{message:d.runError,code:"RUNNER_ERROR"}),P&&d.lastRunEnd&&(0,ae.jsx)(cs,{steps:d.steps,bifurcationInfo:d.bifurcationInfo,perFlowMetadata:d.lastRunEnd.per_flow_metadata??[]}),P&&(0,ae.jsx)(rn,{status:P.status==="passed"?"passed":"failed",summary:P.summary??"",duration:P.duration,steps:P.stepsTotal,stepsPassed:P.stepsPassed,stepsFailed:P.stepsFailed,reason:P.reason,creditsConsumed:P.creditsConsumed})]})}import{createInterface as Sl}from"readline";function ot(t){process.stdout.write(JSON.stringify(t)+`
25
- `)}async function us(t,e,n){let i=Co();if(!i)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");let o=Eo({environment:e?.environment,mode:e?.mode,assertionMode:e?.assertionMode,finalValidation:e?.finalValidation,username:t.username,accessKey:t.access_key,sessionId:t.session_id});t.device?.platform&&await Io(o,t.device);let r=new Ao({env:o,runner:i,log:e?.log,sessionId:t.session_id}),a={...Po(t),headless:t.headless??!1},s={...t};delete s.run_id,To(s,{environment:e?.environment});let l=`run-${t.run_index}`;an().then(b=>{b&&ot({type:"update_available",current:b.current,latest:b.latest,severity:b.severity})}).catch(()=>{}),ln().then(b=>{b&&ot({type:"skill_update_available",current:b.current,latest:b.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let u=Sl({input:process.stdin});u.on("line",b=>{try{let v=JSON.parse(b);v.type==="user_response"?r.sendUserResponse(v.answer??""):v.type==="cancel"&&r.cancel(l)}catch{}}),await r.start(a);let c=null,m=!1,p=0,g=null,d=0,y=!1,_=Oo();for await(let b of r.run(l,"author",s))switch(_=$o(_,b),b.type){case"run_start":y&&d++;break;case"step_start":{let v=b;n?.onStepLog?.("STEP_START",`Step ${v.index} started`,{index:v.index,objective:v.objective,child_id:v.child_id});let E={step:v.index+1,status:"running",remark:v.objective??`Step ${v.index+1}`};v.child_id&&(E.child_id=v.child_id),ot(E);break}case"step_event":b.event==="reasoning"&&b.detail&&b.detail!=="reasoning"&&n?.onReasoning?.(b.detail),n?.onStepLog?.("STEP_EVENT",`Step ${b.index} ${b.event}`,{index:b.index,phase:b.event,action_type:b.action_type,detail:b.detail,child_id:b.child_id});break;case"step_end":{let v=b;n?.onStepLog?.("STEP_END",`Step ${v.index} ${v.status}`,{index:v.index,status:v.status,duration:v.duration,summary:v.summary,child_id:v.child_id}),n?.onStepComplete?.(),p++;let E={step:v.index+1,status:v.status==="passed"?"done":"failed",remark:v.summary??""};v.child_id&&(E.child_id=v.child_id),ot(E);let P=y?Math.max(0,d-1):0,f=typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0;n?.onStepEnd?.(v.index,P,v.child_id,f);break}case"bifurcation":{let v=b,E=v.flows??[],P=v.count??E.length;(v.is_single_flow??P<=1)||(g=E,y=!0,d=0),ot({type:"bifurcation",flows:E,count:P});break}case"ask_user":{let v=b;ot({type:"ask_user",question:v.question,step_index:v.step_index,...v.options?{options:v.options}:{}});break}case"run_end":{c=b;break}case"error":{m=!0,ot({type:"error",message:b.message});break}default:break}return u.close(),await r.shutdown(),{lastRunEnd:c,stepsTotal:p,hadError:m,bifurcationFlows:g,evidence:_}}function ms(t){return!!(t.target||t.deviceName||t.osVersion||t.app||t.cdpEndpoint||t.wsEndpoint||t.cft||t.url)}function ps(t){return t.kind!=="mismatch"?null:t.suggested==="mobile"?"classification: objective looks mobile; run stays on web \u2014 pass --target emulator|simulator to run on a device":"classification: objective looks web; run stays on the device \u2014 pass --target desktop to run on web"}var fs=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function mn(t=process.stderr){if(!t.isTTY)return{onProgress:i=>t.write(`${i}
26
- `),done:()=>{}};let e=0,n=!1;return{onProgress:i=>{n=!0,e=(e+1)%fs.length,t.write(`\r\x1B[2K${fs[e]} ${i}`)},done:()=>{n&&t.write(`
27
- `),n=!1}}}var gs=["emulator","simulator"];function hs(t){t.command("doctor").description("Check the mobile tooling this machine needs for one target: emulator or simulator").option("--target <target>","Which toolchain to check: emulator | simulator (required)").option("--install","Download or repair the managed deps bundle for that target").action(async e=>{if(!e.target){process.stderr.write(["error: --target is required \u2014 say which toolchain to check."," kane-cli doctor --target emulator"," kane-cli doctor --target simulator"].join(`
24
+ `)}),this}_outputHelpIfRequested(e){let n=this._getHelpOption();n&&e.find(o=>n.is(o))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Ms(t){return t.map(e=>{if(!e.startsWith("--inspect"))return e;let n,i="127.0.0.1",o="9229",r;return(r=e.match(/^(--inspect(-brk)?)$/))!==null?n=r[1]:(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(n=r[1],/^\d+$/.test(r[3])?o=r[3]:i=r[3]):(r=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(n=r[1],i=r[3],o=r[4]),n&&o!=="0"?`${n}=${i}:${parseInt(o)+1}`:e})}Ns.Command=kr});var Us=tt(Pe=>{"use strict";var{Argument:Fs}=wn(),{Command:_r}=js(),{CommanderError:Cc,InvalidArgumentError:Vs}=Ft(),{Help:Sc}=pr(),{Option:Ls}=vr();Pe.program=new _r;Pe.createCommand=t=>new _r(t);Pe.createOption=(t,e)=>new Ls(t,e);Pe.createArgument=(t,e)=>new Fs(t,e);Pe.Command=_r;Pe.Option=Ls;Pe.Argument=Fs;Pe.Help=Sc;Pe.CommanderError=Cc;Pe.InvalidArgumentError=Vs;Pe.InvalidOptionArgumentError=Vs});var Kt=Ie(Dt(),1);import ue from"process";import*as dc from"tls";function Is(){let t=dc;if(!(typeof t.getCACertificates!="function"||typeof t.setDefaultCACertificates!="function"))try{let e=o=>typeof o=="string",n=t.getCACertificates("default").filter(e),i=t.getCACertificates("system").filter(e);t.setDefaultCACertificates([...new Set([...n,...i])])}catch{}}var Rs=!1;function Ts(){if(!Rs)try{if(typeof process.emitWarning!="function")return;let t=process.emitWarning.bind(process),e=((n,...i)=>{let o=typeof n=="string"?n:n?.message??"";if(!((typeof i[0]=="string"?i[0]:typeof n=="object"&&n?n.name:void 0)==="ExperimentalWarning"&&o.includes("buffer.File")))return t(n,...i)});process.emitWarning=e,Rs=!0}catch{}}var Bs=Ie(Us(),1),{program:Pm,createCommand:$m,createArgument:Dm,createOption:Om,CommanderError:Mm,InvalidArgumentError:Hs,InvalidOptionArgumentError:Nm,Command:at,Argument:jm,Option:W,Help:Fm}=Bs.default;import{basename as dm,join as $e,resolve as um}from"path";var Yr=Ie(Dt(),1);var ke=Ie(Dt(),1);var ze=Ie(ht(),1);function Ws({steps:t,bifurcationInfo:e,perFlowMetadata:n}){return!e||e.isSingleFlow||!n||n.length<=1?null:(0,ze.jsx)(ae,{flexDirection:"column",children:n.map((i,o)=>{let r=t[o],a=r?.children??[],s=a.filter(g=>g.status==="passed").length,l=a.filter(g=>g.status==="failed").length,u=s+l,c=a.reduce((g,d)=>g+(d.duration??0),0),m=r?.status==="failed"?"failed":"passed",p=e.flows[o]??r?.objective??`Flow ${o+1}`;return(0,ze.jsxs)(ae,{flexDirection:"column",marginTop:o>0?1:0,children:[(0,ze.jsxs)(ae,{marginLeft:1,children:[(0,ze.jsx)(K,{color:Y.purple,bold:!0,children:"Flow "+(o+1)+": "}),(0,ze.jsx)(K,{color:Y.purple,children:p})]}),(0,ze.jsx)(mn,{status:m,summary:i?.summary??"",duration:c,steps:u,stepsPassed:s,stepsFailed:l,reason:i?.error_message??void 0,creditsConsumed:i?.credits_consumed??void 0})]},`flow-summary-${o}`)})})}var le=Ie(ht(),1);function qs({config:t,spawnOpts:e,cancelRef:n,banner:i,describeContext:o,onComplete:r,onStepEnd:a,onReasoning:s,onStepComplete:l}){let{exit:u}=Gt(),{append:c}=Xt(),{describe:m,onDescribe:p,creditsRef:g}=rs({resolve:()=>o??null,hostIsTTY:()=>!!process.stderr.isTTY}),d=oi(a,void 0,s,l,p),h=(0,ke.useRef)(!1),k=(0,ke.useRef)(!1),[b,v]=(0,ke.useState)("");(0,ke.useEffect)(()=>{h.current||(h.current=!0,d.startRun(t,e))},[t,e,d]),(0,ke.useEffect)(()=>{n&&(n.current=()=>d.cancelRun())},[n,d]),(0,ke.useEffect)(()=>{d.isRunning||m.stop()},[d.isRunning,m.stop]);let _=(0,ke.useRef)(0);Wn((S,y)=>{y.ctrl&&S==="c"&&(d.isRunning?(_.current++,_.current>=2?u():d.cancelRun()):u())}),Wn((S,y)=>{d.askingUser&&(y.return?(d.sendAnswer(b),v("")):y.backspace||y.delete?v(R=>R.slice(0,-1)):S&&!y.ctrl&&!y.meta&&v(R=>R+S))},{isActive:!!d.askingUser}),(0,ke.useEffect)(()=>{if(!d.isRunning&&d.lastRunEnd&&!k.current){k.current=!0;let{passed:S,failed:y,total:R}=Zn(d.steps),N=d.bifurcationInfo;r({lastRunEnd:d.lastRunEnd,stepsPassed:S,stepsFailed:y,stepsTotal:R,hadError:!1,bifurcationFlows:N&&!N.isSingleFlow?N.flows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u())}},[d.isRunning,d.lastRunEnd,d.steps,d.shutdownRunner,r,u]),(0,ke.useEffect)(()=>{d.runError&&!d.isRunning&&!k.current&&(k.current=!0,r({lastRunEnd:null,stepsPassed:0,stepsFailed:0,stepsTotal:0,hadError:!0,bifurcationFlows:null,describeCredits:g.current,evidence:d.getEvidenceState()}),d.shutdownRunner().finally(()=>u()))},[d.runError,d.isRunning,d.shutdownRunner,r,u]);let P=d.lastRunEnd?(()=>{let{passed:S,failed:y,total:R}=Zn(d.steps);return{status:d.lastRunEnd.status,duration:d.lastRunEnd.duration??0,summary:d.lastRunEnd.summary??"",stepsPassed:S,stepsFailed:y,stepsTotal:R,reason:d.lastRunEnd.reason,finalState:d.lastRunEnd.final_state,creditsConsumed:(d.lastRunEnd.credits_consumed??0)+g.current}})():null,f=(0,ke.useRef)(!1);return(0,ke.useEffect)(()=>{f.current||!i||(f.current=!0,c((0,le.jsxs)(ae,{flexDirection:"column",marginBottom:1,children:[(0,le.jsxs)(ae,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,le.jsx)(K,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,le.jsx)(K,{color:Y.dim,children:" \u2502 "}),(0,le.jsx)(K,{color:Y.orange,children:i.model}),(0,le.jsx)(K,{color:Y.dim,children:" \u2502 "}),(0,le.jsx)(K,{color:Y.dim,children:i.auth})]}),i.status?.map((S,y)=>(0,le.jsx)(K,{color:Y.dim,children:S},y))]})))},[]),(0,le.jsxs)(ae,{flexDirection:"column",children:[(()=>{let S=ho({isRunning:d.isRunning,bifurcationInfo:d.bifurcationInfo,steps:d.steps,cmInitCounts:d.cmInitCounts,replayInfo:d.replayInfo});return S?(0,le.jsx)(go,{label:S.label,hasBifurcation:S.hasBifurcation}):null})(),d.steps.length>0&&(0,le.jsx)(fo,{steps:d.steps,bifurcated:!!d.bifurcationInfo&&!d.bifurcationInfo.isSingleFlow,flows:d.bifurcationInfo?.flows,cmInitCounts:d.cmInitCounts,staticSteps:!0,onStepCommit:c,describe:m.text,describeVisible:m.visible,describeRevealing:m.revealing}),d.askingUser&&(0,le.jsxs)(ae,{flexDirection:"column",marginTop:1,children:[(0,le.jsxs)(K,{color:Y.orange,children:['Agent is asking: "',d.askingUser,'"']}),(0,le.jsxs)(K,{children:["> ",b,"\u2588"]})]}),d.runError&&(0,le.jsx)(Ti,{message:d.runError,code:"RUNNER_ERROR"}),P&&d.lastRunEnd&&(0,le.jsx)(Ws,{steps:d.steps,bifurcationInfo:d.bifurcationInfo,perFlowMetadata:d.lastRunEnd.per_flow_metadata??[]}),P&&(0,le.jsx)(mn,{status:P.status==="passed"?"passed":"failed",summary:P.summary??"",duration:P.duration,steps:P.stepsTotal,stepsPassed:P.stepsPassed,stepsFailed:P.stepsFailed,reason:P.reason,creditsConsumed:P.creditsConsumed})]})}import{createInterface as Ec}from"readline";function lt(t){process.stdout.write(JSON.stringify(t)+`
25
+ `)}async function Ks(t,e,n){let i=Go();if(!i)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");let o=Xo({environment:e?.environment,mode:e?.mode,assertionMode:e?.assertionMode,finalValidation:e?.finalValidation,username:t.username,accessKey:t.access_key,sessionId:t.session_id});t.device?.platform&&await zo(o,t.device);let r=new ei({env:o,runner:i,log:e?.log,sessionId:t.session_id}),a={...ti(t),headless:t.headless??!1},s={...t};delete s.run_id,Qo(s,{environment:e?.environment});let l=`run-${t.run_index}`;gn().then(b=>{b&&lt({type:"update_available",current:b.current,latest:b.latest,severity:b.severity})}).catch(()=>{}),hn().then(b=>{b&&lt({type:"skill_update_available",current:b.current,latest:b.latestCompatible,install_cmd:"kane-cli install skill"})}).catch(()=>{});let u=Ec({input:process.stdin});u.on("line",b=>{try{let v=JSON.parse(b);v.type==="user_response"?r.sendUserResponse(v.answer??""):v.type==="cancel"&&r.cancel(l)}catch{}}),await r.start(a);let c=null,m=!1,p=0,g=null,d=0,h=!1,k=ni();for await(let b of r.run(l,"author",s))switch(k=ri(k,b),b.type){case"run_start":h&&d++;break;case"step_start":{let v=b;n?.onStepLog?.("STEP_START",`Step ${v.index} started`,{index:v.index,objective:v.objective,child_id:v.child_id});let _={step:v.index+1,status:"running",remark:v.objective??`Step ${v.index+1}`};v.child_id&&(_.child_id=v.child_id),lt(_);break}case"step_event":b.event==="reasoning"&&b.detail&&b.detail!=="reasoning"&&n?.onReasoning?.(b.detail),n?.onStepLog?.("STEP_EVENT",`Step ${b.index} ${b.event}`,{index:b.index,phase:b.event,action_type:b.action_type,detail:b.detail,child_id:b.child_id});break;case"step_end":{let v=b;n?.onStepLog?.("STEP_END",`Step ${v.index} ${v.status}`,{index:v.index,status:v.status,duration:v.duration,summary:v.summary,child_id:v.child_id}),n?.onStepComplete?.(),p++;let _={step:v.index+1,status:v.status==="passed"?"done":"failed",remark:v.summary??""};v.child_id&&(_.child_id=v.child_id),lt(_);let P=h?Math.max(0,d-1):0,f=typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0;n?.onStepEnd?.(v.index,P,v.child_id,f);break}case"bifurcation":{let v=b,_=v.flows??[],P=v.count??_.length;(v.is_single_flow??P<=1)||(g=_,h=!0,d=0),lt({type:"bifurcation",flows:_,count:P});break}case"ask_user":{let v=b;lt({type:"ask_user",question:v.question,step_index:v.step_index,...v.options?{options:v.options}:{}});break}case"run_end":{c=b;break}case"error":{m=!0,lt({type:"error",message:b.message});break}default:break}return u.close(),await r.shutdown(),{lastRunEnd:c,stepsTotal:p,hadError:m,bifurcationFlows:g,evidence:k}}function Ys(t){return!!(t.target||t.deviceName||t.osVersion||t.app||t.cdpEndpoint||t.wsEndpoint||t.cft||t.url)}function Js(t){return t.kind!=="mismatch"?null:t.suggested==="mobile"?"classification: objective looks mobile; run stays on web \u2014 pass --target emulator|simulator to run on a device":"classification: objective looks web; run stays on the device \u2014 pass --target desktop to run on web"}var Gs=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function yn(t=process.stderr){if(!t.isTTY)return{onProgress:i=>t.write(`${i}
26
+ `),done:()=>{}};let e=0,n=!1;return{onProgress:i=>{n=!0,e=(e+1)%Gs.length,t.write(`\r\x1B[2K${Gs[e]} ${i}`)},done:()=>{n&&t.write(`
27
+ `),n=!1}}}var zs=["emulator","simulator"];function Xs(t){t.command("doctor").description("Check the mobile tooling this machine needs for one target: emulator or simulator").option("--target <target>","Which toolchain to check: emulator | simulator (required)").option("--install","Download or repair the managed deps bundle for that target").action(async e=>{if(!e.target){process.stderr.write(["error: --target is required \u2014 say which toolchain to check."," kane-cli doctor --target emulator"," kane-cli doctor --target simulator"].join(`
28
28
  `)+`
29
- `),process.exitCode=2;return}let n=e.target.toLowerCase();if(!gs.includes(n)){process.stderr.write(`error: unknown target '${e.target}' \u2014 supported values: ${gs.join(", ")}
30
- `),process.exitCode=2;return}if(e.install){let o=mn();try{await Wt().ensure(n,{automatic:!(process.stdin.isTTY&&process.stdout.isTTY),approved:!0,onProgress:o.onProgress})}catch(r){o.done(),process.stderr.write(`error: ${r instanceof Error?r.message:String(r)}
31
- `),process.exitCode=2;return}o.done()}let i=await Qr(Ut(n));process.stdout.write(`${Zr(i)}
32
- `),process.exitCode=eo(i)})}var bs=new Set(["apps","balance","changelog","config","context","cover","design","devices","doctor","evidence","feedback","folders","generate","help","install","login","logout","maintain","plugin","profiles","projects","run","testmd","testrun","whoami"]),vs=new Set(["apps","devices","doctor"]);function lr(t){return t?bs:new Set([...bs].filter(e=>!vs.has(e)))}function Cl(t,e){if(t===e)return 0;if(t.length===0)return e.length;if(e.length===0)return t.length;let n=new Array(e.length+1),i=new Array(e.length+1);for(let o=0;o<=e.length;o++)n[o]=o;for(let o=1;o<=t.length;o++){i[0]=o;for(let r=1;r<=e.length;r++){let a=t[o-1]===e[r-1]?0:1;i[r]=Math.min(n[r]+1,i[r-1]+1,n[r-1]+a)}[n,i]=[i,n]}return n[e.length]}function Il(t,e){let n=t.toLowerCase(),i=[...e],o=[];for(let r of i){let a=r.toLowerCase();a!==n&&a.startsWith(n)&&o.push({name:r,distance:0})}if(o.length===0)for(let r of i){let a=r.toLowerCase();if(a===n)continue;let s=Cl(n,a);s<=2&&o.push({name:r,distance:s})}return o.sort((r,a)=>r.distance-a.distance||r.name.localeCompare(a.name)),o.slice(0,3).map(r=>r.name)}function ws(t,e){if(!e.hostSupportsMobile&&vs.has(t))return{message:`error: ${e.mobileMessage}
33
- `,exitCode:2};let n=lr(e.hostSupportsMobile);return{message:El(t,Il(t,n)),exitCode:2}}var cr=new Set(["set-device-name","set-os-version","set-app","set-auto-grant-permissions","set-auto-accept-alerts"]);function ys(t,e){return!e.hostSupportsMobile&&cr.has(t)?{message:`error: ${e.mobileMessage}
34
- `,exitCode:2}:null}function El(t,e){let n=e.length>0?` \u2014 did you mean ${e.map(i=>`'${i}'`).join(" or ")}?`:"";return`error: unknown command '${t}'${n}
29
+ `),process.exitCode=2;return}let n=e.target.toLowerCase();if(!zs.includes(n)){process.stderr.write(`error: unknown target '${e.target}' \u2014 supported values: ${zs.join(", ")}
30
+ `),process.exitCode=2;return}if(e.install){let o=yn();try{await Qt().ensure(n,{automatic:!(process.stdin.isTTY&&process.stdout.isTTY),approved:!0,onProgress:o.onProgress})}catch(r){o.done(),process.stderr.write(`error: ${r instanceof Error?r.message:String(r)}
31
+ `),process.exitCode=2;return}o.done()}let i=await yo(zt(n));process.stdout.write(`${ko(i)}
32
+ `),process.exitCode=_o(i)})}function Vt(t,e){if(t===e)return 0;if(t.length===0)return e.length;if(e.length===0)return t.length;let n=new Array(e.length+1),i=new Array(e.length+1);for(let o=0;o<=e.length;o++)n[o]=o;for(let o=1;o<=t.length;o++){i[0]=o;for(let r=1;r<=e.length;r++){let a=t[o-1]===e[r-1]?0:1;i[r]=Math.min(n[r]+1,i[r-1]+1,n[r-1]+a)}[n,i]=[i,n]}return n[e.length]}var Ic=2,Rc=3,Qs=new Set(["apps","balance","changelog","config","context","cover","design","devices","doctor","evidence","feedback","folders","generate","help","install","login","logout","maintain","plugin","profiles","projects","run","testmd","testrun","whoami"]),Zs=new Set(["doctor"]);function xr(t){return t?Qs:new Set([...Qs].filter(e=>!Zs.has(e)))}function Tc(t,e){let n=t.toLowerCase(),i=[...e],o=[];for(let r of i){let a=r.toLowerCase();a!==n&&a.startsWith(n)&&o.push({name:r,distance:0})}if(o.length===0)for(let r of i){let a=r.toLowerCase();if(a===n)continue;let s=Vt(n,a);s<=Ic&&o.push({name:r,distance:s})}return o.sort((r,a)=>r.distance-a.distance||r.name.localeCompare(a.name)),o.slice(0,Rc).map(r=>r.name)}function ea(t,e){if(!e.hostSupportsMobile&&Zs.has(t))return{message:`error: ${e.mobileMessage}
33
+ `,exitCode:2};let n=xr(e.hostSupportsMobile);return{message:Ac(t,Tc(t,n)),exitCode:2}}var Cr=new Set(["set-device-name","set-os-version","set-app","set-auto-grant-permissions","set-auto-accept-alerts"]);function ta(t,e){return!e.hostSupportsMobile&&Cr.has(t)?{message:`error: ${e.mobileMessage}
34
+ `,exitCode:2}:null}function Ac(t,e){let n=e.length>0?` \u2014 did you mean ${e.map(i=>`'${i}'`).join(" or ")}?`:"";return`error: unknown command '${t}'${n}
35
35
 
36
36
  Run an objective with: kane-cli run "<objective>"
37
37
  List all commands: kane-cli --help
38
- `}import{join as Tl}from"path";function ks(t){let e=t.command("testmd").description("Manage test.md files (run, list, status, delete, export, sync)").action(async()=>{process.stdin.isTTY||(process.stderr.write(`error: testmd requires a sub-action in non-TTY mode (run | list | status | delete | export | sync)
39
- `),process.exit(2));let{runListTui:n,resolveCurrentOrgId:i}=await import("./testmd-actions-WJS2YM7B.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await n(o.orgId))});Al(e),Pl(e),Ol(e),$l(e),Dl(e),Ml(e)}function Rl(t,e){return e.concat(t)}function Al(t){t.command("run <path>").description("Run a test from a *_test.md file").option("--url <url>","Start URL for the first step (overrides frontmatter url: and config default_url)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Max agent steps","50").option("--timeout <seconds>","Kill after N seconds").option("--cdp-endpoint <url>","Connect to existing Chrome via CDP").option("--ws-endpoint <url>","Playwright WebSocket endpoint").option("--global-context <file>",`Override global context (default: ${Tl(Z,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new Y("--model <name>","Model override").hideHelp()).option("--variables <json>","Inline variables JSON").option("--variables-file <path>","Load variables from file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new Y("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: action | testing").option("--assertion-mode <mode>","Assertion mode: dom (default \u2014 DOM extraction & assertions, vision fallback) | visual (vision only)").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint. Overrides config (default: off)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new Y("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when the first step has no start URL (frontmatter url:/--url still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code-export language (python|javascript)").option("--name <name>","Persist session under this name").option("--target <name>","Where to run: desktop | emulator | simulator (default: the file's `target:`, else desktop)").option("--device-name <name>","Which device, when the target is mobile: the name as `kane-cli devices list` shows it. The OS version comes from --os-version or the file's os_version:").option("--os-version <version>","The device's OS version (e.g. 17.5, 14). Alone = re-version the file's device (or any device on that version)").option("--app <path|AppId>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads. Overrides the file's `app:`").option("--skip-code-validation","Skip post-codegen validation").option("--no-skip-code-validation","Force post-codegen validation").option("--on-lock-conflict <mode>","lock conflict policy: readonly|fail|wait",e=>{if(e!=="readonly"&&e!=="fail"&&e!=="wait")throw new Error(`--on-lock-conflict must be readonly|fail|wait, got: ${e}`);return e}).option("--push","always commit at end-of-run (no retry semantics)").option("--no-adaptive-heal","disable adaptive heal \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").addOption(new Y("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new Y("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--author","re-author every step in place on the test's existing identity and commit a new version (a never-authored test takes the first-run path)").addOption(new Y("--no-evidence-publish","skip the replay evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).addOption(new Y("--no-testmd-sync","skip the testmd bundle push before the commit \u2014 the caller owns the bundle for that commit").hideHelp()).option("--bug-detection <mode>","detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`. Authoring steps only \u2014 replay failures always investigate.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).action(async(e,n)=>{let{retiredRetryFlagsNotice:i}=await import("./replay-policy-A62KXE6Y.js"),o=i(n);o&&process.stderr.write(o+`
40
- `);let{runTestMdFile:r}=await import("./run-test-md-XBM6RMCI.js"),a=await r(e,n);process.exit(a)})}function Pl(t){t.command("list").description("List *_test.md files in the working directory (recursive)").option("--root <dir>","Root directory to scan (default: cwd)").option("--ignore <name>","Skip a directory by name (repeatable)",Rl,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-WJS2YM7B.js"),o=await i({json:!!e.json});o.ok||process.exit(o.code),process.exit(await n(e,o.orgId))})}function Ol(t){t.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-WJS2YM7B.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await n(e,o.orgId))})}function $l(t){t.command("delete <path>").description("Remove output-<stem>/ and the *_test.md source file (TMS untouched)").option("--yes","Skip confirmation prompt (required in non-TTY)").action(async(e,n)=>{let{runDeleteAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-WJS2YM7B.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,!!n.yes,r.orgId))})}function Dl(t){t.command("export <path>").description("Generate standalone test code (Playwright)").option("--language <lang>","python|javascript (falls back to tui-config)").option("--output <dir>","Override output dir (default: output-<stem>/playwright-<lang>-code/)").option("--force","Overwrite an existing local export").action(async(e,n)=>{let{runExportAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-WJS2YM7B.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,n,r.orgId))})}function Ml(t){t.command("sync <path>").description("Zip the testmd + imports + replay outputs and push {commit_id}-testmd.zip to cloud").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,n)=>{let{runSyncAction:i,resolveSyncAuth:o}=await import("./testmd-actions-WJS2YM7B.js"),r=await o(n);r.ok||process.exit(r.code),process.exit(await i(e,r))})}function _s(t){let e=t.command("context").description("Assurance context graph (.context/): ingest sources, extract use-cases, list nodes").action((n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("ingest <src...>").description("Land source files into .context/ and extract them \u2014 the one-flow entry. On a TTY this continues into the interactive extract chat; --mode ci or piped stdin lands only").option("--as <id>","Ingest AS this existing source id \u2014 a new VERSION: moves its head, dependents go stale (single file only)").option("--mode <mode>","interactive | agent | ci | override \u2014 how the extraction runs. ci (and headless without --mode) lands only").option("--plan","Extraction stops after the proposal \u2014 print it, commit nothing").option("--force","Extract even if the landed snapshot was already extracted").option("--trust <dial>","Extraction trust dial: auto (default) | hold (headless only)").action(async(n,i)=>{let{ingestCommand:o}=await import("./ingest-cmd-GOPW3SNF.js");process.exit(await o(n,i))}),e.command("extract").description("Interactively extract use-cases from ingested sources via the context agent").option("--plan","Stop after the proposal \u2014 print it, commit nothing").option("--apply <path>","NOT IMPLEMENTED YET \u2014 will commit a saved --plan proposal (refuses loudly today)").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Re-extract sources even if their current snapshot was already extracted").option("--resume <sid>","Resume a paused session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--source <id>","Extract exactly this ingested source \u2014 the explicit path for su-conv-* conversation sources, which the default sweep skips").option("--queued","(removed) the queue is gone \u2014 extract sweeps every pending source by default; this flag refuses with guidance for one release").option("--trust <dial>","Per-run trust dial: auto (new items commit derived into review \u2014 the default everywhere) | hold (everything new HELD; headless only \u2014 refused under interactive). ci refuses the flag entirely").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").option("--with-source <ref>","With --resume: land this file/URL FIRST and set the pending questions aside \u2014 the agent reads the source, narrates what it settled, and re-asks what's still open").action(async n=>{let{extractCommand:i}=await import("./extract-cmd-RHVLPNQB.js");process.exit(await i(n))}),e.command("sessions [action] [sid]").description("List resumable sessions; `sessions show <sid>` prints pending questions + assumed defaults; `sessions clean [sid]` GCs expired/named ones").option("--all","clean: remove ALL sessions (incl. corrupt), not just expired").option("--json","JSON output").action(async(n,i,o)=>{let{sessionsCommand:r}=await import("./sessions-cmd-PGE6LP2W.js");process.exit(await be("sessions",()=>r(n,o,i)))}),e.command("fsck").description("Verify the full commit chain and check the derived projection for drift").option("--json","Print the full structured report as one JSON object (issues carry code + detail + ecids)").action(async n=>{let{fsckCommand:i}=await import("./maintenance-cmd-UJNH47SG.js");process.exit(await be("fsck",o=>i(o,n)))}),e.command("locks",{hidden:!0}).description("Show held context/UC locks and waiters (read-only)").option("--json","Machine output (plain array, no NDJSON envelope \u2014 not a room verb)").action(async n=>{let{runLocksCommand:i}=await import("./locks-cmd-CSVSWY2Y.js"),{contextDir:o}=await import("./paths-JCYX6UWL.js");process.exit(i(o(process.cwd()),n,r=>process.stdout.write(r+`
41
- `)))}),e.command("rebuild").description("Wipe .context/derived and rebuild it from the verified commit chain").option("--yes","Skip the confirmation prompt (required when headless)").action(async n=>{let{rebuildCommand:i}=await import("./maintenance-cmd-UJNH47SG.js");process.exit(await be("rebuild",()=>i(n),{write:!0}))}),e.command("list").description("List context graph nodes").option("--type <t>","Filter by node label (source | usecase)").option("--inferred","Only derived (unreviewed) nodes").option("--stale","Only stale/orphaned nodes").option("--all","Include superseded node versions").option("--json","JSON output").action(async n=>{let{listCommand:i}=await import("./list-cmd-Y4WEOT3E.js");process.exit(await be("list",()=>i(n)))}),e.command("view").description("Render the context graph as an interactive HTML page and open it in the browser (snapshot)").option("--out <path>","Write the HTML to <path> instead of a temp file").option("--open","Force-open the browser even when non-TTY (piped)").option("--no-open","Write the file but do not open the browser").option("--json","Print the computed view payload as JSON and exit (no HTML)").action(async n=>{let{viewCommand:i}=await import("./view-cmd-XD5ENSML.js");process.exit(await be("view",()=>i(n)))}),e.command("retire <source_id>").description("Retire a source (head \u2192 null + tombstone record); reversible via revert").option("--reason <text>","Why this source is being retired").option("--yes","Skip the confirmation prompt (required when headless)").action(async(n,i)=>{let{retireCommand:o}=await import("./lifecycle-cmd-HYNG5KH6.js");process.exit(await be("retire",()=>o(n,i),{write:!0}))}),e.command("name [ref] [slug]").description("Assign a stable kebab-case name to a node (ref = cid or existing slug); --backfill assigns logical ids to all unnamed live nodes").option("--backfill","assign label-prefixed logical ids (uc-/sc-/ac-/t-\u2026) to every live unnamed node").option("--yes","Skip the --backfill confirmation prompt (required when headless)").action(async(n,i,o)=>{let{nameCommand:r,nameBackfillCommand:a}=await import("./lifecycle-cmd-HYNG5KH6.js");o.backfill&&process.exit(await be("namebackfill",()=>a(o))),(!n||!i)&&(process.stderr.write(`usage: kane-cli context name <ref> <slug> | kane-cli context name --backfill
42
- `),process.exit(2)),process.exit(await be("name",()=>r(n,i),{write:!0}))}),e.command("revert <seq>").description("Invert a record's effects via a compensation record \u2014 history is never rewritten").option("--reason <text>","Why this record is being reverted").option("--yes","Skip the confirmation prompt (required when headless)").action(async(n,i)=>{let{revertCommand:o}=await import("./lifecycle-cmd-HYNG5KH6.js");process.exit(await be("revert",()=>o(n,i),{write:!0}))}),e.command("review").description("Walk a review queue; verdicts land as ONE batched record").option("--queue <q>","derived (default) | skipped | archived | drift").option("--json","NDJSON output (drift listing + --verdicts outcomes)").option("--verdicts <file>",'headless verdict input: JSON array of {"ref", "resolution", ...} \u2014 atomic, works with or without a TTY').option("--allow-archive","Apply archives headlessly (requires --because; refused under --mode ci)").option("--because <reason>","audit reason stamped on headless archives (required with --allow-archive)").option("--mode <m>","agent | ci \u2014 ci refuses archives under ANY flag").option("--approve <refs...>","structured verdict: approve these refs (temp_ref/cid/logical id)").option("--skip <refs...>","structured verdict: skip these refs (no fact \u2014 stays queued)").option("--defer <refs...>","structured verdict: defer these refs (no fact \u2014 stays queued)").action(async n=>{let{reviewCommand:i}=await import("./review-cmd-JUOWTME4.js");process.exit(await be("review",()=>i(n)))}),e.command("explain <ref>").description("Replay the recorded reasoning + lineage for a node (no model call)").option("--json","JSON output").action(async(n,i)=>{let{explainCommand:o}=await import("./explain-cmd-BXFR5DB6.js");process.exit(await be("explain",()=>o(n,i)))})}function xs(t){let e=t.command("design").description("Test design engine: turn a committed use-case into ACs, scenarios, and 1:1 tests").action((n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("tests").description("Design the assurance for ONE committed use-case (conversational; chat is the default)").option("--use-case <ref>","The use-case to design \u2014 logical id (uc-\u2026) or cid (optional with --resume: the session remembers it)").option("--max <n>","Budget ceiling: max scenario+test pairs (NO ceiling when omitted \u2014 the agent estimates and asks)",n=>Number(n)).option("--strength <s>","Manual covering-array strength override: pairwise | 3-wise").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Redesign a use-case that already has a live design (supersedes its scenario+test pairs)").option("--resume <sid>","Resume a paused design session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--plan","Transcription only \u2014 print each finalize payload, commit nothing").option("--allow-unreviewed","Design against an unreviewed use-case without approving it first").option("--phase <name>","Enter the design at this phase (grounding | acs | scenarios | wiring | tests), re-seeded from committed prior phases").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").action(async n=>{let{designTestsCommand:i}=await import("./bind-5WELCZ4S.js");process.exit(await i(n))}),e.command("explain <ref>").description("Replay WHY a designed item looks the way it does \u2014 sidecar + recorded judgements, zero fresh AI").action(async n=>{let{designExplainCommand:i}=await import("./explain-cmd-IRQ2YX5L.js");process.exit(await i(n))})}function Ss(t){let e=t.command("maintain").description("Keep the assurance suite true as sources change: reconcile").action((n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("evolve [ref]").description("Re-design the parent use-case of a test/scenario/AC/use-case \u2014 unaffected items are preserved verbatim; reports the pair diff").option("--from-stale","Evolve every use-case with stale designed entities (deduped, per-UC confirm)").option("--because <reason>","Re-design a FRESH target anyway \u2014 the reason becomes the change delta and lands in provenance").action(async(n,i)=>{let{evolveCommand:o}=await import("./evolve-cmd-I4Z6IPIM.js");process.exit(await o(n,i))}),e.command("reconcile").description("Reconcile a changed source: the head lands, extraction runs over the change, and every proposed change HOLDS as a review card \u2014 approve / reject / defer, nothing commits without your verdict (the in-chat review is the TTY default)").option("--from <file>","The NEW version of the source document (a file path)").option("--source-id <id>","The EXISTING source this file succeeds \u2014 its head moves; see `kane-cli context list --type source`").option("--plan","Preview: the head-move lands (the change fact), everything else is STAGED into the stored plan \u2014 nothing suite-side commits").option("--apply [path]","Walk a STORED plan (REMOVE stays plan-only). Bare = the latest plan behind an approval prompt; a path picks one; with --from it recomputes live").option("--mode <mode>","interactive | agent | ci | override \u2014 TTY defaults to the in-chat card review; headless requires one").action(async n=>{let{reconcileCommand:i}=await import("./reconcile-cmd-6ILIXD3U.js");process.exit(await i(n))})}function Cs(t){t.command("cover").description("Two-axis coverage: depth proven by an evidence pack + completeness owed by the live graph").enablePositionalOptions().option("--from <pack>","Evidence pack to read (dir, sealed file, or execution id; default: newest in .testmuai/evidence)").option("--json","Machine-readable output").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2});let{coverCommand:o}=await import("./cover-cmd-HAOBK2IC.js");process.exit(await be("cover",()=>o(n)))}).command("gaps [uc]").description("Dual-axis coverage ribbon \u2014 designed \xD7 proven from the live graph; pass a use-case id for its full dossier").option("--stage <stage>","design | cover | all (default all)").option("--top <n>","Bound pending rows per use-case in the --json document (table output is never truncated)",n=>Number(n)).option("--rollup <rollup>","Proven-axis formula: lenient | strict (default lenient)").option("--json","Machine-readable nested document").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(n,i)=>{let{gapsCommand:o}=await import("./gaps-cmd-MSDGU6OU.js");process.exit(await be("gaps",()=>o(n,i)))})}var Sr=Ie(Ct(),1);var De=Ie(Ct(),1);function Es(t){return{members:t.map(e=>({...e,status:"pending"})),summary:null,done:null}}function Is(t,e){return typeof e!="string"||e.length===0?!1:e===t.relPath||e.endsWith("/"+t.relPath)}function jl(t){return t==="passed"?"passed":"failed"}function Ts(t,e){switch(e.type){case"testrun_member_start":case"testrun_authored_member_start":return{...t,members:t.members.map(n=>Is(n,e.path)?{...n,status:"running"}:n)};case"testrun_member_end":case"testrun_authored_member_end":return{...t,members:t.members.map(n=>Is(n,e.path)?{...n,status:jl(e.status),durationS:e.duration_s}:n)};case"testrun_summary":return{...t,summary:{execution:e.execution??null,authored:e.authored??[],totals:e.totals,durationS:e.duration_s,upload:e.upload,cancelled:!!e.cancelled}};case"testrun_done":return{...t,done:{executionId:e.execution_id,overallStatus:e.overall_status}};default:return t}}var W=Ie(dt(),1);function As(t){return t<60?`${t.toFixed(1)}s`:`${Math.floor(t/60)}m ${Math.round(t%60)}s`}function Rs({member:t}){let e=t.status==="running",n=t.status==="passed",i=t.status==="failed",o=t.durationS!=null?As(t.durationS):"";return(0,W.jsxs)(se,{children:[(0,W.jsx)(se,{width:3,children:e?(0,W.jsx)(Kr,{}):n?(0,W.jsx)(q,{color:K.green,bold:!0,children:"\u2713"}):i?(0,W.jsx)(q,{color:K.red,bold:!0,children:"\u2717"}):(0,W.jsx)(q,{color:K.muted,children:"\u25CB"})}),(0,W.jsxs)(se,{flexGrow:1,children:[(0,W.jsx)(q,{color:i?K.red:K.dim,children:t.relPath}),t.memberClass==="author"&&(0,W.jsx)(q,{color:K.purple,children:" authoring"})]}),(0,W.jsx)(se,{width:8,justifyContent:"flex-end",children:(0,W.jsx)(q,{color:K.dim,children:o})})]})}function Nl({summary:t}){let e=t.totals,n=t.cancelled?"cancelled":e.failed>0||e.broken>0?"failed":"passed",i=n==="cancelled"?K.orange:n==="passed"?K.green:K.red,o=n==="cancelled"?"!":n==="passed"?"\u2713":"\u2717",r=n.toUpperCase(),a=`${e.passed} passed \xB7 ${e.failed} failed \xB7 ${e.broken} broken \xB7 ${e.skipped} skipped \xB7 ${e.authored} authored`;return(0,W.jsx)(se,{flexDirection:"column",marginTop:1,children:(0,W.jsxs)(se,{borderStyle:"round",borderColor:i,flexDirection:"column",paddingX:2,paddingY:1,children:[(0,W.jsxs)(q,{bold:!0,color:i,children:[o," ",r]}),(0,W.jsx)(q,{color:K.dim,children:a}),t.execution&&(0,W.jsxs)(q,{color:K.dim,children:["execution ",t.execution.id,": ",t.execution.status]}),t.authored.length>0&&(0,W.jsxs)(q,{color:K.dim,children:["authored: ",t.authored.length," test(s)"]}),(0,W.jsxs)(q,{color:K.dim,children:[As(t.durationS)," \xB7 upload: ",t.upload]})]})})}function Ps({members:t,title:e,env:n,dispatchRef:i,onDone:o}){let{exit:r}=Vt(),{append:a}=Bt(),[s,l]=(0,De.useState)(()=>Es(t)),[u,c]=(0,De.useState)(()=>new Set),m=(0,De.useRef)(!1),p=(0,De.useRef)(!1);(0,De.useEffect)(()=>(i.current=d=>l(y=>Ts(y,d)),()=>{i.current=null}),[]),(0,De.useEffect)(()=>{p.current||(p.current=!0,a((0,W.jsxs)(se,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,W.jsx)(q,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,W.jsx)(q,{color:K.dim,children:" \u2502 "}),(0,W.jsx)(q,{color:K.dim,children:`testrun \xB7 ${e} \xB7 ${n}`})]})))},[]),(0,De.useEffect)(()=>{let d=s.members.filter(y=>(y.status==="passed"||y.status==="failed")&&!u.has(y.relPath));if(d.length!==0){for(let y of d)a((0,W.jsx)(Rs,{member:y},y.relPath));c(y=>{let _=new Set(y);for(let b of d)_.add(b.relPath);return _})}},[s.members,u,a]),(0,De.useEffect)(()=>{s.done&&!m.current&&(m.current=!0,o?.(),r())},[s.done,r,o]);let g=s.members.filter(d=>!u.has(d.relPath));return(0,W.jsxs)(se,{flexDirection:"column",children:[g.length>0&&(0,W.jsx)(se,{flexDirection:"column",children:g.map(d=>(0,W.jsx)(Rs,{member:d},d.relPath))}),s.summary&&(0,W.jsx)(Nl,{summary:s.summary})]})}import{existsSync as Ll}from"fs";import{resolve as Vl,relative as Ul}from"path";import{existsSync as Fl}from"fs";import{relative as Os}from"path";var fe=class extends Error{};function $s(t,e){let n=We(t);if(!Fl(n))throw new fe(`--from-context needs an assurance store at ${n} \u2014 run the design flow there first, or run from the project root that holds .context`);let i=qo(n),o=Pi(Kn(t)),r=[];for(let a of e){let s=a.trim();if(!s)continue;let l=i.resolve(s);if(!l)throw new fe(`--from-context: unknown id '${s}' \u2014 it does not resolve in the assurance graph`);if(i.superseded.has(l.tip))throw new fe(`--from-context: '${s}' is tombstoned (retired with no live successor) \u2014 redesign the suite or select a live test id`);let u=i.getNode(l.tip);if(u?.label!=="test")throw new fe(`--from-context: '${s}' is a ${u?.label??"unknown"} node, not a test \u2014 only test ids select members`);let c=s.toLowerCase(),m=o.get(c)??o.get(s)??[];if(m.length===0)throw new fe(`--from-context: '${s}' has no minted test file under ${Kn(t)} \u2014 re-run the design for this suite, or restore the deleted file`);if(m.length>1)throw new fe(`--from-context: '${s}' is claimed by ${m.length} files (${m.map(p=>Os(t,p)).join(", ")}) \u2014 remove the duplicates`);r.push({path:m[0],relPath:Os(t,m[0]),contextId:c})}return r}async function Ds(t){let e=t.cwd??process.cwd(),n=t.fromContext?.length?$s(e,t.fromContext):[],i;if(t.paths&&t.paths.length>0||n.length>0){let a=(t.paths??[]).map(s=>{let l=Vl(e,s);if(!Ll(l)||!l.endsWith("_test.md"))throw new fe(`not a *_test.md file: ${s}`);return{path:l,relPath:Ul(e,l)}});i=[...n,...a]}else i=(await ei({root:e})).results.map(s=>({path:s.path,relPath:s.relPath}));if(t.match){let a;try{a=new RegExp(t.match)}catch(s){throw new fe(`invalid --match regex: ${s instanceof Error?s.message:s}`)}i=i.filter(s=>a.test(s.relPath))}let o=new Set,r=[];for(let a of i){if(o.has(a.path))continue;o.add(a.path);let s=ti(a.path);r.push({...a,tags:s.tags,...s.mobileTarget?{mobile:!0,platform:s.mobileTarget.platform}:{}})}if(t.tags&&t.tags.length>0){let a=new Set(t.tags.map(s=>s.toLowerCase()));return r.filter(s=>s.tags.some(l=>a.has(l))).sort((s,l)=>s.relPath.localeCompare(l.relPath))}return r.sort((a,s)=>a.relPath.localeCompare(s.relPath))}import{readFileSync as Bl}from"fs";import{join as Hl}from"path";function Ms(t){try{return JSON.parse(Bl(Hl(Ae(t),".internal","meta.json"),"utf8"))}catch{return null}}var bt=t=>typeof t=="string"&&t?t:void 0;function js(t,e={}){let n=[],i,o,r;for(let s of t){if(s.mobile&&(r??=(e.host??qt)().supported,!r)){n.push({...s,memberClass:bt(Ms(s.path)?.test_id)?"replay":"author",failure:"mobile_host_unsupported"});continue}let l=Ms(s.path);if(!l){n.push({...s,memberClass:"author"});continue}let u={testcaseId:bt(l.testcase_id),folderId:bt(l.folder_id),commitId:bt(l.commit_id),sessionName:bt(l.session_name)},c=bt(l.test_id),m=typeof l.org_id=="string"?l.org_id:void 0,p=typeof l.project_id=="string"?l.project_id:void 0,g=c?"replay":"author";if(i===void 0&&m&&(i=m),o===void 0&&p&&(o=p),m&&i&&m!==i){n.push({...s,...u,testId:c,orgId:m,projectId:p,memberClass:g,failure:"org_mismatch"});continue}if(p&&o&&p!==o){n.push({...s,...u,testId:c,orgId:m,projectId:p,memberClass:g,failure:"project_mismatch"});continue}n.push({...s,...u,testId:c,orgId:m,projectId:p,memberClass:g})}let a=n.length>0&&n.every(s=>!s.failure);return{checks:n,valid:a,orgId:i,projectId:o}}function Wl(t){return t.tags?.length?`testrun --tags ${t.tags.join(",")}`:t.match?`testrun --match ${t.match}`:t.paths?.length?`testrun ${t.paths.length} paths`:"testrun"}async function Ns(t,e={}){let n=await Ds(t),i=js(n,e),o=Number(t.parallel??1),r=Number.isFinite(o)&&o>=1?Math.floor(o):1;if(r>1&&n.some(a=>a.mobile))throw new fe("Mobile tests can only run one at a time on your local device. Please remove --parallel and try again.");if(t.deviceOverride&&new Set(n.filter(s=>s.mobile&&s.platform).map(s=>s.platform)).size>1)throw new fe("--device-name/--os-version name ONE device, but this selection has both emulator and simulator members \u2014 no device can serve both. Select one platform (--match/--tags) or drop the override.");return{...i,parallel:r,parallelClamped:!1,onFailure:t.onFailure??"continue",title:t.name??Wl(t)}}import{basename as ql,join as Ks}from"path";import{readFileSync as Gs,existsSync as Kl}from"fs";import{promises as Ot}from"fs";import{existsSync as $t}from"fs";import{join as Je}from"path";async function dr(t){let e=t.status??"skipped",n=Je(t.packDir,"tests",t.testId),i=Je(n,"steps"),o=Je(n,"logs");await Ot.mkdir(i,{recursive:!0});let r=Je(i,".keep");$t(r)||await Ot.writeFile(r,""),await Ot.mkdir(o,{recursive:!0});let a=Je(o,"testrun.log");$t(a)||await Ot.writeFile(a,t.reason+`
43
- `);let s=Je(n,t.definition.path);$t(s)||await Ot.writeFile(s,t.definition.content);let l=Je(o,"meta.yaml");if(!$t(l)){let c=await Bo(o);await Uo(t.packDir,t.testId,Lo(c))}let u=Je(n,"result.yaml");$t(u)||await Vo(t.packDir,t.testId,Fo({testId:t.testId,status:e,definitionPath:t.definition.path,externalId:Mo(t.externalIdInput),tags:t.tags,environment:{},steps:[]}))}async function pn(t,e,n){let i=[],o=new Array(t.length).fill(!1),r=0,a=!1,s,l=!1,u=()=>{i.length<t.length&&(l=!0)};n.signal&&(n.signal.aborted?u():n.signal.addEventListener("abort",u,{once:!0}));async function c(){for(;;){if(a||n.signal?.aborted||r>=t.length)return;let p=r++,g=t[p];o[p]=!0;try{n.onStart?.(g);let d=await e(g);i.push({item:g,result:d}),n.onEnd?.(g,d),n.failFast&&n.isFailure(d)&&(a=!0)}catch(d){s=s??d,a=!0}}}let m=Math.max(1,Math.min(n.parallel,t.length));try{await Promise.all(Array.from({length:m},()=>c()))}finally{n.signal?.removeEventListener("abort",u)}if(s)throw s;return{done:i,skipped:t.filter((p,g)=>!o[g]),cancelled:l}}function Fs(t){return{type:"testrun_plan",members:t.checks.map(e=>({path:e.path,test_id:e.testId,tags:e.tags,...e.mobile?{mobile:!0}:{},...e.contextId?{context_id:e.contextId}:{},...e.failure?{failure:e.failure}:{}})),valid:t.valid,parallel:t.parallel,...t.parallelClamped?{parallel_clamped:!0}:{}}}function Ls(t,e){return{type:"testrun_start",execution_id:t,members:e.checks.map(n=>n.relPath),parallel:e.parallel}}function Vs(t){return{type:"testrun_member_start",path:t.path,test_id:t.testId,...t.contextId?{context_id:t.contextId}:{}}}function Us(t,e){return{type:"testrun_member_end",path:t.path,test_id:t.testId,status:e.overallStatus,duration_s:e.durationS,...t.contextId?{context_id:t.contextId}:{}}}function Bs(t){return{type:"testrun_authored_member_start",path:t.path}}function Hs(t){return{type:"testrun_authored_member_end",path:t.relPath,...t.testId?{test_id:t.testId}:{},status:t.overallStatus,duration_s:t.durationS}}function vt(t,e){return{type:"testrun_evidence_ingest",status:t.ok?"ok":"failed",evidence_id:e,...t.stage?{stage:t.stage}:{}}}function fn(t){return{type:"testrun_summary",execution:t.execution,authored:t.authored,totals:t.totals,duration_s:t.durationS,upload:t.upload,cancelled:t.cancelled,...t.remote?{remote:t.remote}:{}}}function wt(t,e){return{type:"testrun_done",execution_id:t,overall_status:e}}function Ws(t){return{type:"remote_start",backend:t.backend,env:t.env}}function qs(t){return{type:"remote_dispatched",job_id:t.jobId,job_url:t.jobUrl}}function ze(t){return{type:"reconcile_merge_degraded",code:"RECONCILE_MERGE_DEGRADED",reason:t.reason,...t.detail?{detail:t.detail}:{},...t.excludedPack?{excluded_pack:t.excludedPack}:{},...t.standaloneIds?{standalone_execution_ids:t.standaloneIds}:{}}}function Dt(t){return{type:"remote_import_tape",path:t.path,status:t.status,...t.reason?{reason:t.reason}:{},...t.dispatchCommit?{dispatch_commit:t.dispatchCommit}:{},...t.gridCommit?{grid_commit:t.gridCommit}:{},...t.localCommit?{local_commit:t.localCommit}:{}}}function Ke(t){return{type:"remote_exec_sync",code:{skipped:"REMOTE_EXEC_SYNC_SKIPPED",warning:"REMOTE_EXEC_SYNC_WARNING",failed:"REMOTE_EXEC_SYNC_FAILED"}[t.status],status:t.status,reason:t.reason,...t.detail?{detail:t.detail}:{},...t.executionId?{execution_id:t.executionId}:{}}}function ur(t){return{type:"remote_coverage",code:{skipped:"REMOTE_COVERAGE_SKIPPED",failed:"REMOTE_COVERAGE_FAILED"}[t.status],status:t.status,reason:t.reason,...t.detail?{detail:t.detail}:{}}}function gn(t){return{type:"remote_error",code:t.code,detail:t.detail}}function Mt(t){return{type:"remote_done",status:t.status,exit:t.exit,job_id:t.jobId,sessions_path:t.sessionsPath}}var yt=t=>t.overallStatus==="failed"||t.overallStatus==="broken"||t.overallStatus==="interrupted";function Ys(t){try{return Gs(t,"utf8")}catch{return""}}async function Js(t,e){let n=e.cwd??process.cwd(),i=Date.now(),o=gt();e.onExecutionId?.(o);let r=f=>({execution_id:o,test_id:f.testId,testcase_id:f.testcaseId,project_id:f.projectId,folder_id:f.folderId,org_id:f.orgId,commit_id:f.commitId,session_name:f.sessionName,user_name:e.operator?.userName,user_email:e.operator?.userEmail}),a=await No({execution_id:o,title:t.title,started:new Date().toISOString(),producerVersion:Ee,run_kind:"author",origin:"testrun",pid:process.pid},n);e.emit(Ls(o,t));let s=[...new Set(t.checks.flatMap(f=>f.tags))];e.log?.("info","TESTRUN_START","Testrun started",{execution_id:o,member_count:t.checks.length,parallel:t.parallel,on_failure:t.onFailure,tags:s});let l=0,u=t.checks.map(f=>({key:f.path,value:f})),c=await pn(u,f=>e.executeMember(f.value,l++),{parallel:t.parallel,failFast:t.onFailure==="fail-fast",isFailure:yt,signal:e.signal,onStart:f=>e.emit(Vs(f.value)),onEnd:(f,C)=>{e.emit(Us(f.value,C)),e.log?.("info","TESTRUN_MEMBER_END","Testrun member ended",{execution_id:o,member_test_id:f.value.testId??Se(f.value.relPath),status:C.overallStatus,result_code:C.resultCode??null,duration_s:C.durationS,run_kind:C.runKind})}}),m=c.done.find(f=>yt(f.result));for(let f of c.skipped)await dr({packDir:a,testId:Se(f.value.relPath),definition:{path:"test.md",content:Ys(f.value.path)},externalIdInput:r(f.value),tags:f.value.tags,reason:c.cancelled?"skipped: testrun cancelled":`skipped: fail-fast after ${m?ql(m.item.value.path):"failure"}`});let p=new Map(c.done.map(f=>[f.item.value.relPath,f.result]));for(let f of t.checks){let C=Se(f.relPath);if(Kl(Ks(a,"tests",C,"result.yaml")))continue;let w=p.get(f.relPath);await dr({packDir:a,testId:C,definition:{path:"test.md",content:Ys(f.path)},externalIdInput:r(f),tags:f.tags,reason:`member ended '${w?.overallStatus??"broken"}' before writing its result (chrome-slot failure or pre-run crash \u2014 see member session logs)`,status:"broken"}),w&&!yt(w)&&(w.overallStatus="broken",w.exitCode=2)}let g=c.done.flatMap(f=>f.result.pendingInvestigations??[]);if(g.length>0){e.emit({type:"testrun_investigations_wait",count:g.length});let f=g.map(I=>I.exited),C,w=!1;try{await Promise.race([Promise.allSettled(f),new Promise(I=>{C=setTimeout(()=>{w=!0,I()},e.investigationTimeoutMs??12e4)})])}finally{clearTimeout(C)}if(w){for(let j of g)try{j.cancel()}catch{}let I;try{await Promise.race([Promise.allSettled(f),new Promise(j=>{I=setTimeout(j,15e3)})])}finally{clearTimeout(I)}}}try{let f=I=>I==="passed"||I==="failed"||I==="skipped"?I:"broken",C=I=>{try{let j=mt(Gs(Ks(a,"tests",I,"result.yaml"),"utf8"));return en(j.steps??[])}catch{return[]}},w=tn({cwd:n,members:c.done.map(I=>({path:I.item.value.path,verdict:f(I.result.overallStatus),acs:C(I.result.testId),executionId:o,startedAt:new Date().toISOString(),durationMs:Math.round(I.result.durationS*1e3),mode:"testrun",local:!e.shouldPublish}))});for(let I of w.warnings)e.log?.("warn","TESTRUN_EXEC_SYNC_WARNING",I,{execution_id:o})}catch(f){e.log?.("warn","TESTRUN_EXEC_SYNC_FAILED","Testrun exec-sync failed",{execution_id:o,error:String(f)})}try{let f=(e.coverageWriter??ht)(a,We(n));f.status==="skipped"&&e.log?.("warn","TESTRUN_COVERAGE_SKIPPED",`Testrun coverage/usecases.yaml not written: ${f.reason}`,{execution_id:o,reason:f.reason})}catch(f){e.log?.("warn","TESTRUN_COVERAGE_WRITER_THREW","Testrun coverage writer threw",{execution_id:o,error:String(f)})}let d=await ft(a,new Date().toISOString()),y;try{let f=await pt(Re(o,n),"L1");y=f.valid,f.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed testrun pack failed L1 validation",{execution_id:o,first_code:String(f.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(f){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Testrun pack validation threw",{execution_id:o,error:String(f)})}let _="skipped";if(e.shouldPublish&&!c.cancelled&&e.publish){let f=t.checks[0],C=await e.publish({testId:f.testId,sessionId:o,executionId:o,sealedPackPath:Re(o,n),projectId:t.projectId});_=C.ok?"ok":"failed",e.emit(vt(C,o))}else e.shouldPublish&&c.cancelled&&e.log?.("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:"cancel"});let b=new Map(c.done.map(f=>[f.item.value.path,f.result]));for(let f of t.checks){let C=b.get(f.path);await Zt(Ae(f.path),{execution_id:o,run_kind:C?.runKind??"author",status:C?yt(C)?C.overallStatus==="failed"?"failed":"broken":"passed":"skipped",valid:y,uploaded:_==="ok",at:new Date().toISOString()})}let v={tests:t.checks.length,passed:c.done.filter(f=>!yt(f.result)).length,failed:c.done.filter(f=>f.result.overallStatus==="failed").length,broken:c.done.filter(f=>["broken","interrupted"].includes(f.result.overallStatus)).length,skipped:c.skipped.length};e.log?.("info","TESTRUN_SUMMARY","Testrun summary",{execution_id:o,totals:{passed:v.passed,failed:v.failed,broken:v.broken,skipped:v.skipped},upload:_});let E=c.done.some(f=>yt(f.result)),P=c.cancelled?3:E?1:0;return e.log?.("info","TESTRUN_DONE","Testrun done",{execution_id:o,exit_code:P}),{exitCode:P,executionId:o,totals:v,upload:_}}import{readFileSync as Yl}from"fs";function zs(t,e){if(t.mobile)return e;let{deviceName:n,osVersion:i,...o}=e;return o}function Gl(t,e){return{testId:t,overallStatus:e.overallStatus,exitCode:e.exitCode,durationS:e.durationS??0,runKind:Ii(!!e.anyAuthorStepRan),resultCode:e.resultCode??null,...e.pendingInvestigations?.length?{pendingInvestigations:e.pendingInvestigations}:{}}}function Xs(t){let e=t.cdpEndpoint!==void 0?{...t.passThroughOpts,cdpEndpoint:t.cdpEndpoint}:{...t.passThroughOpts};return{path:t.abs,cwd:t.cwd,opts:e,isAgent:!0,disableAskUser:!0,resolved:t.cdpEndpoint!==void 0?{...t.resolved,chrome:{...t.resolved.chrome,cdp_endpoint:t.cdpEndpoint}}:t.resolved,resolvedAuth:t.resolvedAuth,cliOverrides:{},environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:t.session,skipGlobalRemoteLogger:!0,evidenceAttach:t.attach,suppressEvidenceOffer:!0,onFatalExit:n=>{throw new Error(`project/folder gate failed: ${n.split(`
44
- `)[0]}`)},signal:t.signal}}async function mr(t,e,n,i,o=qn){let r=Se(t.relPath),a=Date.now();try{let s=await Ko.attach({packDir:n.packDir,testId:r,definition:{path:"test.md",content:Yl(t.path,"utf8")},cwd:n.cwd}),l=zs(t,n.passThroughOpts),u=Xs({abs:t.path,cwd:n.cwd,resolved:At(t.path),resolvedAuth:n.resolvedAuth,environment:n.environment,envConfig:n.envConfig,profile:n.profile,model:n.model,creds:n.creds,configStore:n.configStore,session:new Tt,passThroughOpts:l,...e?{cdpEndpoint:e.cdpEndpoint}:{},attach:s,signal:n.signal}),{host:c,lifecycle:m}=i(t),p=()=>{try{m.cleanup("runner","testrun cancelled")}catch{}};n.signal?.addEventListener("abort",p);try{let g=await o(u,c,m);return Gl(r,g)}finally{n.signal?.removeEventListener("abort",p)}}catch(s){return process.stderr.write(`member ${t.relPath} broken: ${s.message}
45
- `),{testId:r,overallStatus:"broken",exitCode:2,durationS:(Date.now()-a)/1e3,runKind:"replay"}}finally{e?.release()}}async function pr(t,e,n,i,o=qn){let r=Date.now();try{let a=zs(t,n.passThroughOpts),s=Xs({abs:t.path,cwd:n.cwd,resolved:At(t.path),resolvedAuth:n.resolvedAuth,environment:n.environment,envConfig:n.envConfig,profile:n.profile,model:n.model,creds:n.creds,configStore:n.configStore,session:new Tt,passThroughOpts:a,...e?{cdpEndpoint:e.cdpEndpoint}:{},attach:void 0,signal:n.signal}),{host:l,lifecycle:u}=i(t),c=()=>{try{u.cleanup("runner","testrun cancelled")}catch{}};n.signal?.addEventListener("abort",c);try{let m=await o(s,l,u);return{relPath:t.relPath,testId:m.ownPack?.testId,testcaseId:m.ownPack?.testcaseId,commitId:m.ownPack?.commitId,executionId:m.ownPack?.executionId,overallStatus:m.overallStatus,exitCode:m.exitCode,durationS:m.durationS??0,published:m.ownPack?m.ownPack.published?"yes":"no":"unknown"}}finally{n.signal?.removeEventListener("abort",c)}}catch(a){return process.stderr.write(`author member ${t.relPath} broken: ${a.message}
46
- `),{relPath:t.relPath,overallStatus:"broken",exitCode:2,durationS:(Date.now()-r)/1e3,published:"no"}}finally{e?.release()}}var Jl=t=>t.overallStatus==="failed"||t.overallStatus==="broken"||t.overallStatus==="interrupted";async function Qs(t,e){if(t.length===0)return{results:[],cancelled:!1,skipped:[]};let n=0,i=t.map(r=>({key:r.path,value:r})),o=await pn(i,r=>e.executeAuthorMember(r.value,n++),{parallel:e.parallel,failFast:!1,isFailure:Jl,signal:e.signal,onStart:r=>e.emit(Bs(r.value)),onEnd:(r,a)=>e.emit(Hs(a))});return{results:o.done.map(r=>r.result),cancelled:o.cancelled,skipped:o.skipped.map(r=>r.value)}}import{mkdtempSync as zl,rmSync as Xl}from"fs";import{tmpdir as Ql}from"os";import{join as Zl}from"path";function Zs(t){let e=Promise.resolve(),n=new Map,i=r=>{try{Xl(r,{recursive:!0,force:!0})}catch{}};function o(r){let a=e.then(async()=>{if(n.has(r))throw new Error(`chrome slot ${r} already acquired (one acquire per worker index)`);let s=zl(Zl(Ql(),"kane-testrun-chrome-")),l;try{l=await t.launch({userDataDir:s,width:t.width,height:t.height,headless:t.headless})}catch(u){throw i(s),u}return n.set(r,{chrome:l,dataDir:s}),{cdpEndpoint:l.cdpEndpoint,release(){let u=n.get(r);if(u){n.delete(r);try{u.chrome.kill()}catch{}i(u.dataDir)}}}});return e=a.catch(()=>{}),a}return{acquire:o,killAll(){for(let[,r]of n){try{r.chrome.kill()}catch{}i(r.dataDir)}n.clear()}}}function ea(){let t=new Map;return{register(e,n){t.set(e,n)},deregister(e){t.delete(e)},cleanup(e,n){let i=t.get(e);if(i){t.delete(e);try{i()}catch{}}},remoteLogger:null}}import{EventEmitter as ec}from"events";import{Writable as tc}from"stream";function nc(){return new tc({write(t,e,n){n()}})}function rc(){let t=new ec;return Object.assign(t,{isTTY:!0,setEncoding(){},setRawMode(e){return t},ref(){return t},unref(){return t},read(){return null}}),t}function ta(){let t=process.env.KANE_TESTRUN_MEMBER_DEBUG;return t==="1"||t==="true"}function na(){return{...si({isAgent:!0,log:()=>{},stdout:ta()?process.stderr:nc(),stdin:rc()}),onAgentEvent:ta()?e=>{process.stderr.write(`[member] ${JSON.stringify(e)}
47
- `)}:()=>{},onLockState:()=>{},onAdaptiveHeal:()=>{}}}import{randomUUID as Kc}from"crypto";import{appendFileSync as Yc}from"fs";import{join as Gc,relative as Jc}from"path";import{execFileSync as oc}from"child_process";function fr(t,e){return`project conflict: this profile is configured for project ${t}, but the selected members were authored in project ${e}.
38
+ `}import{join as Pc}from"path";function na(t){let e=t.command("testmd").description("Manage test.md files (run, list, status, delete, export, sync)").action(async()=>{process.stdin.isTTY||(process.stderr.write(`error: testmd requires a sub-action in non-TTY mode (run | list | status | delete | export | sync)
39
+ `),process.exit(2));let{runListTui:n,resolveCurrentOrgId:i}=await import("./testmd-actions-2UMU3QMV.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await n(o.orgId))});Dc(e),Oc(e),Mc(e),Nc(e),jc(e),Fc(e)}function $c(t,e){return e.concat(t)}function Dc(t){t.command("run <path>").description("Run a test from a *_test.md file").option("--url <url>","Start URL for the first step (overrides frontmatter url: and config default_url)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Max agent steps","50").option("--timeout <seconds>","Kill after N seconds").option("--cdp-endpoint <url>","Connect to existing Chrome via CDP").option("--ws-endpoint <url>","Playwright WebSocket endpoint").option("--global-context <file>",`Override global context (default: ${Pc(J,"global-memory.md")})`).option("--local-context <file>","Override local context (default: .testmuai/context.md in cwd)").addOption(new W("--model <name>","Model override").hideHelp()).option("--variables <json>","Inline variables JSON").option("--variables-file <path>","Load variables from file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new W("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: action | testing").option("--assertion-mode <mode>","Assertion mode: dom (default \u2014 DOM extraction & assertions, vision fallback) | visual (vision only)").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint. Overrides config (default: off)").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").addOption(new W("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when the first step has no start URL (frontmatter url:/--url still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code-export language (python|javascript)").option("--name <name>","Persist session under this name").option("--target <name>","Where to run: desktop | emulator | simulator (default: the file's `target:`, else desktop)").option("--device-name <name>","Which device, when the target is mobile: the name as `kane-cli devices list` shows it. The OS version comes from --os-version or the file's os_version:").option("--os-version <version>","The device's OS version (e.g. 17.5, 14). Alone = re-version the file's device (or any device on that version)").option("--app <path|AppId>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads. Overrides the file's `app:`").option("--skip-code-validation","Skip post-codegen validation").option("--no-skip-code-validation","Force post-codegen validation").option("--on-lock-conflict <mode>","lock conflict policy: readonly|fail|wait",e=>{if(e!=="readonly"&&e!=="fail"&&e!=="wait")throw new Error(`--on-lock-conflict must be readonly|fail|wait, got: ${e}`);return e}).option("--push","always commit at end-of-run (no retry semantics)").option("--no-adaptive-heal","disable adaptive heal \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").addOption(new W("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new W("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--author","re-author every step in place on the test's existing identity and commit a new version (a never-authored test takes the first-run path)").addOption(new W("--no-evidence-publish","skip the replay evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).addOption(new W("--no-testmd-sync","skip the testmd bundle push before the commit \u2014 the caller owns the bundle for that commit").hideHelp()).option("--bug-detection <mode>","detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`. Authoring steps only \u2014 replay failures always investigate.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).action(async(e,n)=>{let{retiredRetryFlagsNotice:i}=await import("./replay-policy-A62KXE6Y.js"),o=i(n);o&&process.stderr.write(o+`
40
+ `);let{runTestMdFile:r}=await import("./run-test-md-5LPCKCW7.js"),a=await r(e,n);process.exit(a)})}function Oc(t){t.command("list").description("List *_test.md files in the working directory (recursive)").option("--root <dir>","Root directory to scan (default: cwd)").option("--ignore <name>","Skip a directory by name (repeatable)",$c,[]).option("--json","Force NDJSON output even on TTY").action(async e=>{let{runListAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-2UMU3QMV.js"),o=await i({json:!!e.json});o.ok||process.exit(o.code),process.exit(await n(e,o.orgId))})}function Mc(t){t.command("status <path>").description("Print local meta.json for a *_test.md (no live TMS check in v1)").action(async e=>{let{runStatusAction:n,resolveCurrentOrgId:i}=await import("./testmd-actions-2UMU3QMV.js"),o=await i({});o.ok||process.exit(o.code),process.exit(await n(e,o.orgId))})}function Nc(t){t.command("delete <path>").description("Remove output-<stem>/ and the *_test.md source file (TMS untouched)").option("--yes","Skip confirmation prompt (required in non-TTY)").action(async(e,n)=>{let{runDeleteAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-2UMU3QMV.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,!!n.yes,r.orgId))})}function jc(t){t.command("export <path>").description("Generate standalone test code (Playwright)").option("--language <lang>","python|javascript (falls back to tui-config)").option("--output <dir>","Override output dir (default: output-<stem>/playwright-<lang>-code/)").option("--force","Overwrite an existing local export").action(async(e,n)=>{let{runExportAction:i,resolveCurrentOrgId:o}=await import("./testmd-actions-2UMU3QMV.js"),r=await o({});r.ok||process.exit(r.code),process.exit(await i(e,n,r.orgId))})}function Fc(t){t.command("sync <path>").description("Zip the testmd + imports + replay outputs and push {commit_id}-testmd.zip to cloud").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,n)=>{let{runSyncAction:i,resolveSyncAuth:o}=await import("./testmd-actions-2UMU3QMV.js"),r=await o(n);r.ok||process.exit(r.code),process.exit(await i(e,r))})}function ra(t){let e=t.command("context").description("Assurance context graph (.context/): ingest sources, extract use-cases, list nodes").action((n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("ingest <src...>").description("Land source files into .context/ and extract them \u2014 the one-flow entry. On a TTY this continues into the interactive extract chat; --mode ci or piped stdin lands only").option("--as <id>","Ingest AS this existing source id \u2014 a new VERSION: moves its head, dependents go stale (single file only)").option("--mode <mode>","interactive | agent | ci | override \u2014 how the extraction runs. ci (and headless without --mode) lands only").option("--plan","Extraction stops after the proposal \u2014 print it, commit nothing").option("--force","Extract even if the landed snapshot was already extracted").option("--trust <dial>","Extraction trust dial: auto (default) | hold (headless only)").action(async(n,i)=>{let{ingestCommand:o}=await import("./ingest-cmd-AV66Q5LC.js");process.exit(await o(n,i))}),e.command("extract").description("Interactively extract use-cases from ingested sources via the context agent").option("--plan","Stop after the proposal \u2014 print it, commit nothing").option("--apply <path>","NOT IMPLEMENTED YET \u2014 will commit a saved --plan proposal (refuses loudly today)").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Re-extract sources even if their current snapshot was already extracted").option("--resume <sid>","Resume a paused session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--source <id>","Extract exactly this ingested source \u2014 the explicit path for su-conv-* conversation sources, which the default sweep skips").option("--queued","(removed) the queue is gone \u2014 extract sweeps every pending source by default; this flag refuses with guidance for one release").option("--trust <dial>","Per-run trust dial: auto (new items commit derived into review \u2014 the default everywhere) | hold (everything new HELD; headless only \u2014 refused under interactive). ci refuses the flag entirely").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").option("--with-source <ref>","With --resume: land this file/URL FIRST and set the pending questions aside \u2014 the agent reads the source, narrates what it settled, and re-asks what's still open").action(async n=>{let{extractCommand:i}=await import("./extract-cmd-7FKQJNS7.js");process.exit(await i(n))}),e.command("sessions [action] [sid]").description("List resumable sessions; `sessions show <sid>` prints pending questions + assumed defaults; `sessions clean [sid]` GCs expired/named ones").option("--all","clean: remove ALL sessions (incl. corrupt), not just expired").option("--json","JSON output").action(async(n,i,o)=>{let{sessionsCommand:r}=await import("./sessions-cmd-VDQGRBEM.js");process.exit(await ve("sessions",()=>r(n,o,i)))}),e.command("fsck").description("Verify the full commit chain and check the derived projection for drift").option("--json","Print the full structured report as one JSON object (issues carry code + detail + ecids)").action(async n=>{let{fsckCommand:i}=await import("./maintenance-cmd-VFYGKY3X.js");process.exit(await ve("fsck",o=>i(o,n)))}),e.command("locks",{hidden:!0}).description("Show held context/UC locks and waiters (read-only)").option("--json","Machine output (plain array, no NDJSON envelope \u2014 not a room verb)").action(async n=>{let{runLocksCommand:i}=await import("./locks-cmd-CSVSWY2Y.js"),{contextDir:o}=await import("./paths-JCYX6UWL.js");process.exit(i(o(process.cwd()),n,r=>process.stdout.write(r+`
41
+ `)))}),e.command("rebuild").description("Wipe .context/derived and rebuild it from the verified commit chain").option("--yes","Skip the confirmation prompt (required when headless)").action(async n=>{let{rebuildCommand:i}=await import("./maintenance-cmd-VFYGKY3X.js");process.exit(await ve("rebuild",()=>i(n),{write:!0}))}),e.command("list").description("List context graph nodes").option("--type <t>","Filter by node label (source | usecase)").option("--inferred","Only derived (unreviewed) nodes").option("--stale","Only stale/orphaned nodes").option("--all","Include superseded node versions").option("--json","JSON output").action(async n=>{let{listCommand:i}=await import("./list-cmd-V3HJ5K4O.js");process.exit(await ve("list",()=>i(n)))}),e.command("view").description("Render the context graph as an interactive HTML page and open it in the browser (snapshot)").option("--out <path>","Write the HTML to <path> instead of a temp file").option("--open","Force-open the browser even when non-TTY (piped)").option("--no-open","Write the file but do not open the browser").option("--json","Print the computed view payload as JSON and exit (no HTML)").action(async n=>{let{viewCommand:i}=await import("./view-cmd-SXXNDZIC.js");process.exit(await ve("view",()=>i(n)))}),e.command("retire <source_id>").description("Retire a source (head \u2192 null + tombstone record); reversible via revert").option("--reason <text>","Why this source is being retired").option("--yes","Skip the confirmation prompt (required when headless)").action(async(n,i)=>{let{retireCommand:o}=await import("./lifecycle-cmd-KSMETBPP.js");process.exit(await ve("retire",()=>o(n,i),{write:!0}))}),e.command("name [ref] [slug]").description("Assign a stable kebab-case name to a node (ref = cid or existing slug); --backfill assigns logical ids to all unnamed live nodes").option("--backfill","assign label-prefixed logical ids (uc-/sc-/ac-/t-\u2026) to every live unnamed node").option("--yes","Skip the --backfill confirmation prompt (required when headless)").action(async(n,i,o)=>{let{nameCommand:r,nameBackfillCommand:a}=await import("./lifecycle-cmd-KSMETBPP.js");o.backfill&&process.exit(await ve("namebackfill",()=>a(o))),(!n||!i)&&(process.stderr.write(`usage: kane-cli context name <ref> <slug> | kane-cli context name --backfill
42
+ `),process.exit(2)),process.exit(await ve("name",()=>r(n,i),{write:!0}))}),e.command("revert <seq>").description("Invert a record's effects via a compensation record \u2014 history is never rewritten").option("--reason <text>","Why this record is being reverted").option("--yes","Skip the confirmation prompt (required when headless)").action(async(n,i)=>{let{revertCommand:o}=await import("./lifecycle-cmd-KSMETBPP.js");process.exit(await ve("revert",()=>o(n,i),{write:!0}))}),e.command("review").description("Walk a review queue; verdicts land as ONE batched record").option("--queue <q>","derived (default) | skipped | archived | drift").option("--json","NDJSON output (drift listing + --verdicts outcomes)").option("--verdicts <file>",'headless verdict input: JSON array of {"ref", "resolution", ...} \u2014 atomic, works with or without a TTY').option("--allow-archive","Apply archives headlessly (requires --because; refused under --mode ci)").option("--because <reason>","audit reason stamped on headless archives (required with --allow-archive)").option("--mode <m>","agent | ci \u2014 ci refuses archives under ANY flag").option("--approve <refs...>","structured verdict: approve these refs (temp_ref/cid/logical id)").option("--skip <refs...>","structured verdict: skip these refs (no fact \u2014 stays queued)").option("--defer <refs...>","structured verdict: defer these refs (no fact \u2014 stays queued)").action(async n=>{let{reviewCommand:i}=await import("./review-cmd-SAGIKWEW.js");process.exit(await ve("review",()=>i(n)))}),e.command("explain <ref>").description("Replay the recorded reasoning + lineage for a node (no model call)").option("--json","JSON output").action(async(n,i)=>{let{explainCommand:o}=await import("./explain-cmd-RMJPXD4U.js");process.exit(await ve("explain",()=>o(n,i)))})}function oa(t){let e=t.command("design").description("Test design engine: turn a committed use-case into ACs, scenarios, and 1:1 tests").action((n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("tests").description("Design the assurance for ONE committed use-case (conversational; chat is the default)").option("--use-case <ref>","The use-case to design \u2014 logical id (uc-\u2026) or cid (optional with --resume: the session remembers it)").option("--max <n>","Budget ceiling: max scenario+test pairs (NO ceiling when omitted \u2014 the agent estimates and asks)",n=>Number(n)).option("--strength <s>","Manual covering-array strength override: pairwise | 3-wise").option("--mode <mode>","Ask policy: interactive | agent | ci | override. TTY defaults to interactive chat; REQUIRED when headless").option("--force","Redesign a use-case that already has a live design (supersedes its scenario+test pairs)").option("--resume <sid>","Resume a paused design session (state under .context/sessions/)").option("--message <text>","With --resume: answer the pending questions (or steer) in plain words \u2014 the agent maps your statement itself").option("--plan","Transcription only \u2014 print each finalize payload, commit nothing").option("--allow-unreviewed","Design against an unreviewed use-case without approving it first").option("--phase <name>","Enter the design at this phase (grounding | acs | scenarios | wiring | tests), re-seeded from committed prior phases").option("--answer <pairs...>","With --resume --mode agent: answer a pending question/panel BY ID \u2014 <qid-or-panelId>=<option number (1-based) or free text>, repeatable").action(async n=>{let{designTestsCommand:i}=await import("./bind-F36JFHUK.js");process.exit(await i(n))}),e.command("explain <ref>").description("Replay WHY a designed item looks the way it does \u2014 sidecar + recorded judgements, zero fresh AI").action(async n=>{let{designExplainCommand:i}=await import("./explain-cmd-XCRO4AS6.js");process.exit(await i(n))})}function ia(t){let e=t.command("maintain").description("Keep the assurance suite true as sources change: reconcile").action((n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2}),i.help()});e.command("evolve [ref]").description("Re-design the parent use-case of a test/scenario/AC/use-case \u2014 unaffected items are preserved verbatim; reports the pair diff").option("--from-stale","Evolve every use-case with stale designed entities (deduped, per-UC confirm)").option("--because <reason>","Re-design a FRESH target anyway \u2014 the reason becomes the change delta and lands in provenance").action(async(n,i)=>{let{evolveCommand:o}=await import("./evolve-cmd-6RXLKERE.js");process.exit(await o(n,i))}),e.command("reconcile").description("Reconcile a changed source: the head lands, extraction runs over the change, and every proposed change HOLDS as a review card \u2014 approve / reject / defer, nothing commits without your verdict (the in-chat review is the TTY default)").option("--from <file>","The NEW version of the source document (a file path)").option("--source-id <id>","The EXISTING source this file succeeds \u2014 its head moves; see `kane-cli context list --type source`").option("--plan","Preview: the head-move lands (the change fact), everything else is STAGED into the stored plan \u2014 nothing suite-side commits").option("--apply [path]","Walk a STORED plan (REMOVE stays plan-only). Bare = the latest plan behind an approval prompt; a path picks one; with --from it recomputes live").option("--mode <mode>","interactive | agent | ci | override \u2014 TTY defaults to the in-chat card review; headless requires one").action(async n=>{let{reconcileCommand:i}=await import("./reconcile-cmd-2QHZML2L.js");process.exit(await i(n))})}function sa(t){t.command("cover").description("Two-axis coverage: depth proven by an evidence pack + completeness owed by the live graph").enablePositionalOptions().option("--from <pack>","Evidence pack to read (dir, sealed file, or execution id; default: newest in .testmuai/evidence)").option("--json","Machine-readable output").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(n,i)=>{i.args.length>0&&i.error(`error: unknown command '${i.args[0]}'`,{exitCode:2});let{coverCommand:o}=await import("./cover-cmd-5LPHIOSI.js");process.exit(await ve("cover",()=>o(n)))}).command("gaps [uc]").description("Dual-axis coverage ribbon \u2014 designed \xD7 proven from the live graph; pass a use-case id for its full dossier").option("--stage <stage>","design | cover | all (default all)").option("--top <n>","Bound pending rows per use-case in the --json document (table output is never truncated)",n=>Number(n)).option("--rollup <rollup>","Proven-axis formula: lenient | strict (default lenient)").option("--json","Machine-readable nested document").option("--mode <mode>","interactive | agent | ci \u2014 agent/ci ride the NDJSON envelope (done-last + next)").action(async(n,i)=>{let{gapsCommand:o}=await import("./gaps-cmd-FDJ3PT4C.js");process.exit(await ve("gaps",()=>o(n,i)))})}var Hr=Ie(Dt(),1);var Me=Ie(Dt(),1);function la(t){return{members:t.map(e=>({...e,status:"pending"})),summary:null,done:null}}function aa(t,e){return typeof e!="string"||e.length===0?!1:e===t.relPath||e.endsWith("/"+t.relPath)}function Vc(t){return t==="passed"?"passed":"failed"}function ca(t,e){switch(e.type){case"testrun_member_start":case"testrun_authored_member_start":return{...t,members:t.members.map(n=>aa(n,e.path)?{...n,status:"running"}:n)};case"testrun_member_end":case"testrun_authored_member_end":return{...t,members:t.members.map(n=>aa(n,e.path)?{...n,status:Vc(e.status),durationS:e.duration_s}:n)};case"testrun_summary":return{...t,summary:{execution:e.execution??null,authored:e.authored??[],totals:e.totals,durationS:e.duration_s,upload:e.upload,cancelled:!!e.cancelled}};case"testrun_done":return{...t,done:{executionId:e.execution_id,overallStatus:e.overall_status}};default:return t}}var q=Ie(ht(),1);function ua(t){return t<60?`${t.toFixed(1)}s`:`${Math.floor(t/60)}m ${Math.round(t%60)}s`}function da({member:t}){let e=t.status==="running",n=t.status==="passed",i=t.status==="failed",o=t.durationS!=null?ua(t.durationS):"";return(0,q.jsxs)(ae,{children:[(0,q.jsx)(ae,{width:3,children:e?(0,q.jsx)(po,{}):n?(0,q.jsx)(K,{color:Y.green,bold:!0,children:"\u2713"}):i?(0,q.jsx)(K,{color:Y.red,bold:!0,children:"\u2717"}):(0,q.jsx)(K,{color:Y.muted,children:"\u25CB"})}),(0,q.jsxs)(ae,{flexGrow:1,children:[(0,q.jsx)(K,{color:i?Y.red:Y.dim,children:t.relPath}),t.memberClass==="author"&&(0,q.jsx)(K,{color:Y.purple,children:" authoring"})]}),(0,q.jsx)(ae,{width:8,justifyContent:"flex-end",children:(0,q.jsx)(K,{color:Y.dim,children:o})})]})}function Lc({summary:t}){let e=t.totals,n=t.cancelled?"cancelled":e.failed>0||e.broken>0?"failed":"passed",i=n==="cancelled"?Y.orange:n==="passed"?Y.green:Y.red,o=n==="cancelled"?"!":n==="passed"?"\u2713":"\u2717",r=n.toUpperCase(),a=`${e.passed} passed \xB7 ${e.failed} failed \xB7 ${e.broken} broken \xB7 ${e.skipped} skipped \xB7 ${e.authored} authored`;return(0,q.jsx)(ae,{flexDirection:"column",marginTop:1,children:(0,q.jsxs)(ae,{borderStyle:"round",borderColor:i,flexDirection:"column",paddingX:2,paddingY:1,children:[(0,q.jsxs)(K,{bold:!0,color:i,children:[o," ",r]}),(0,q.jsx)(K,{color:Y.dim,children:a}),t.execution&&(0,q.jsxs)(K,{color:Y.dim,children:["execution ",t.execution.id,": ",t.execution.status]}),t.authored.length>0&&(0,q.jsxs)(K,{color:Y.dim,children:["authored: ",t.authored.length," test(s)"]}),(0,q.jsxs)(K,{color:Y.dim,children:[ua(t.durationS)," \xB7 upload: ",t.upload]})]})})}function ma({members:t,title:e,env:n,dispatchRef:i,onDone:o}){let{exit:r}=Gt(),{append:a}=Xt(),[s,l]=(0,Me.useState)(()=>la(t)),[u,c]=(0,Me.useState)(()=>new Set),m=(0,Me.useRef)(!1),p=(0,Me.useRef)(!1);(0,Me.useEffect)(()=>(i.current=d=>l(h=>ca(h,d)),()=>{i.current=null}),[]),(0,Me.useEffect)(()=>{p.current||(p.current=!0,a((0,q.jsxs)(ae,{borderStyle:"round",borderColor:"#dc4e08",paddingX:2,children:[(0,q.jsx)(K,{color:"#ff9500",bold:!0,children:"KaneAI CLI"}),(0,q.jsx)(K,{color:Y.dim,children:" \u2502 "}),(0,q.jsx)(K,{color:Y.dim,children:`testrun \xB7 ${e} \xB7 ${n}`})]})))},[]),(0,Me.useEffect)(()=>{let d=s.members.filter(h=>(h.status==="passed"||h.status==="failed")&&!u.has(h.relPath));if(d.length!==0){for(let h of d)a((0,q.jsx)(da,{member:h},h.relPath));c(h=>{let k=new Set(h);for(let b of d)k.add(b.relPath);return k})}},[s.members,u,a]),(0,Me.useEffect)(()=>{s.done&&!m.current&&(m.current=!0,o?.(),r())},[s.done,r,o]);let g=s.members.filter(d=>!u.has(d.relPath));return(0,q.jsxs)(ae,{flexDirection:"column",children:[g.length>0&&(0,q.jsx)(ae,{flexDirection:"column",children:g.map(d=>(0,q.jsx)(da,{member:d},d.relPath))}),s.summary&&(0,q.jsx)(Lc,{summary:s.summary})]})}import{existsSync as Bc}from"fs";import{resolve as Hc,relative as Wc}from"path";import{existsSync as Uc}from"fs";import{relative as pa}from"path";var fe=class extends Error{};function fa(t,e){let n=qe(t);if(!Uc(n))throw new fe(`--from-context needs an assurance store at ${n} \u2014 run the design flow there first, or run from the project root that holds .context`);let i=gi(n),o=as(ir(t)),r=[];for(let a of e){let s=a.trim();if(!s)continue;let l=i.resolve(s);if(!l)throw new fe(`--from-context: unknown id '${s}' \u2014 it does not resolve in the assurance graph`);if(i.superseded.has(l.tip))throw new fe(`--from-context: '${s}' is tombstoned (retired with no live successor) \u2014 redesign the suite or select a live test id`);let u=i.getNode(l.tip);if(u?.label!=="test")throw new fe(`--from-context: '${s}' is a ${u?.label??"unknown"} node, not a test \u2014 only test ids select members`);let c=s.toLowerCase(),m=o.get(c)??o.get(s)??[];if(m.length===0)throw new fe(`--from-context: '${s}' has no minted test file under ${ir(t)} \u2014 re-run the design for this suite, or restore the deleted file`);if(m.length>1)throw new fe(`--from-context: '${s}' is claimed by ${m.length} files (${m.map(p=>pa(t,p)).join(", ")}) \u2014 remove the duplicates`);r.push({path:m[0],relPath:pa(t,m[0]),contextId:c})}return r}async function ga(t){let e=t.cwd??process.cwd(),n=t.fromContext?.length?fa(e,t.fromContext):[],i;if(t.paths&&t.paths.length>0||n.length>0){let a=(t.paths??[]).map(s=>{let l=Hc(e,s);if(!Bc(l)||!l.endsWith("_test.md"))throw new fe(`not a *_test.md file: ${s}`);return{path:l,relPath:Wc(e,l)}});i=[...n,...a]}else i=(await Ci({root:e})).results.map(s=>({path:s.path,relPath:s.relPath}));if(t.match){let a;try{a=new RegExp(t.match)}catch(s){throw new fe(`invalid --match regex: ${s instanceof Error?s.message:s}`)}i=i.filter(s=>a.test(s.relPath))}let o=new Set,r=[];for(let a of i){if(o.has(a.path))continue;o.add(a.path);let s=Si(a.path);r.push({...a,tags:s.tags,...s.mobileTarget?{mobile:!0,platform:s.mobileTarget.platform,...s.mobileTarget.os_version?{osVersion:s.mobileTarget.os_version}:{},...s.mobileTarget.device_name?{deviceName:s.mobileTarget.device_name}:{},...s.mobileTarget.app?{app:s.mobileTarget.app}:{}}:{}})}if(t.tags&&t.tags.length>0){let a=new Set(t.tags.map(s=>s.toLowerCase()));return r.filter(s=>s.tags.some(l=>a.has(l))).sort((s,l)=>s.relPath.localeCompare(l.relPath))}return r.sort((a,s)=>a.relPath.localeCompare(s.relPath))}import{readFileSync as qc}from"fs";import{join as Kc}from"path";function ha(t){try{return JSON.parse(qc(Kc(Ae(t),".internal","meta.json"),"utf8"))}catch{return null}}var Ct=t=>typeof t=="string"&&t?t:void 0;function Yc(t,e){if(!e)return[];try{return Xi(st(t.path),e.index)}catch{return[]}}function va(t,e){let n=Yc(t,e);return n.length===0?t:t.memberClass==="author"?{...t,unresolved:n,failure:"unresolved_variables"}:{...t,unresolved:n}}function ba(t,e={}){let n=[],i,o,r;for(let l of t){if(l.mobile&&!e.remote&&(r??=(e.host??Zt)().supported,!r)){n.push({...l,memberClass:Ct(ha(l.path)?.test_id)?"replay":"author",failure:"mobile_host_unsupported"});continue}let u=ha(l.path);if(!u){n.push(va({...l,memberClass:"author"},e.variables));continue}let c={testcaseId:Ct(u.testcase_id),folderId:Ct(u.folder_id),commitId:Ct(u.commit_id),sessionName:Ct(u.session_name)},m=Ct(u.test_id),p=typeof u.org_id=="string"?u.org_id:void 0,g=typeof u.project_id=="string"?u.project_id:void 0,d=m?"replay":"author";if(i===void 0&&p&&(i=p),o===void 0&&g&&(o=g),p&&i&&p!==i){n.push({...l,...c,testId:m,orgId:p,projectId:g,memberClass:d,failure:"org_mismatch"});continue}if(g&&o&&g!==o){n.push({...l,...c,testId:m,orgId:p,projectId:g,memberClass:d,failure:"project_mismatch"});continue}n.push(va({...l,...c,testId:m,orgId:p,projectId:g,memberClass:d},e.variables))}let a=n.length>0&&n.every(l=>!l.failure),s=Qi(n.map(l=>l.unresolved??[]));return{checks:n,valid:a,orgId:i,projectId:o,...s.length?{unresolved:s}:{}}}function Jc(t){return t.tags?.length?`testrun --tags ${t.tags.join(",")}`:t.match?`testrun --match ${t.match}`:t.paths?.length?`testrun ${t.paths.length} paths`:"testrun"}async function wa(t,e={}){let n=await ga(t),i=t.cwd??process.cwd(),o=ba(n,{...e,variables:{index:zi(Gi(i))},...t.remote?{remote:!0}:{}}),r=Number(t.parallel??1),a=Number.isFinite(r)&&r>=1?Math.floor(r):1;if(a>1&&!t.remote&&n.some(s=>s.mobile))throw new fe("Mobile tests can only run one at a time on your local device. Please remove --parallel and try again.");if(t.deviceOverride&&new Set(n.filter(l=>l.mobile&&l.platform).map(l=>l.platform)).size>1)throw new fe("--device-name/--os-version name ONE device, but this selection has both emulator and simulator members \u2014 no device can serve both. Select one platform (--match/--tags) or drop the override.");return{...o,parallel:a,parallelClamped:!1,onFailure:t.onFailure??"continue",title:t.name??Jc(t)}}import{basename as Gc,join as Aa}from"path";import{readFileSync as $a,existsSync as zc}from"fs";import{promises as Lt}from"fs";import{existsSync as Ut}from"fs";import{join as Xe}from"path";async function Sr(t){let e=t.status??"skipped",n=Xe(t.packDir,"tests",t.testId),i=Xe(n,"steps"),o=Xe(n,"logs");await Lt.mkdir(i,{recursive:!0});let r=Xe(i,".keep");Ut(r)||await Lt.writeFile(r,""),await Lt.mkdir(o,{recursive:!0});let a=Xe(o,"testrun.log");Ut(a)||await Lt.writeFile(a,t.reason+`
43
+ `);let s=Xe(n,t.definition.path);Ut(s)||await Lt.writeFile(s,t.definition.content);let l=Xe(o,"meta.yaml");if(!Ut(l)){let c=await mi(o);await ui(t.packDir,t.testId,ci(c))}let u=Xe(n,"result.yaml");Ut(u)||await di(t.packDir,t.testId,li({testId:t.testId,status:e,definitionPath:t.definition.path,externalId:ii(t.externalIdInput),tags:t.tags,environment:{},steps:[]}))}async function kn(t,e,n){let i=[],o=new Array(t.length).fill(!1),r=0,a=!1,s,l=!1,u=()=>{i.length<t.length&&(l=!0)};n.signal&&(n.signal.aborted?u():n.signal.addEventListener("abort",u,{once:!0}));async function c(){for(;;){if(a||n.signal?.aborted||r>=t.length)return;let p=r++,g=t[p];o[p]=!0;try{n.onStart?.(g);let d=await e(g);i.push({item:g,result:d}),n.onEnd?.(g,d),n.failFast&&n.isFailure(d)&&(a=!0)}catch(d){s=s??d,a=!0}}}let m=Math.max(1,Math.min(n.parallel,t.length));try{await Promise.all(Array.from({length:m},()=>c()))}finally{n.signal?.removeEventListener("abort",u)}if(s)throw s;return{done:i,skipped:t.filter((p,g)=>!o[g]),cancelled:l}}function ya(t){return{type:"testrun_plan",members:t.checks.map(e=>({path:e.path,test_id:e.testId,tags:e.tags,...e.mobile?{mobile:!0}:{},...e.contextId?{context_id:e.contextId}:{},...e.failure?{failure:e.failure}:{},...e.unresolved?.length?{unresolved:e.unresolved}:{}})),valid:t.valid,parallel:t.parallel,...t.parallelClamped?{parallel_clamped:!0}:{}}}function ka(t,e){return{type:"testrun_start",execution_id:t,members:e.checks.map(n=>n.relPath),parallel:e.parallel}}function _a(t){return{type:"testrun_member_start",path:t.path,test_id:t.testId,...t.contextId?{context_id:t.contextId}:{}}}function xa(t,e){return{type:"testrun_member_end",path:t.path,test_id:t.testId,status:e.overallStatus,duration_s:e.durationS,...t.contextId?{context_id:t.contextId}:{}}}function Ca(t){return{type:"testrun_authored_member_start",path:t.path}}function Sa(t){return{type:"testrun_authored_member_end",path:t.relPath,...t.testId?{test_id:t.testId}:{},status:t.overallStatus,duration_s:t.durationS}}function St(t,e){return{type:"testrun_evidence_ingest",status:t.ok?"ok":"failed",evidence_id:e,...t.stage?{stage:t.stage}:{}}}function _n(t){return{type:"testrun_summary",execution:t.execution,authored:t.authored,totals:t.totals,duration_s:t.durationS,upload:t.upload,cancelled:t.cancelled,...t.remote?{remote:t.remote}:{}}}function Et(t,e){return{type:"testrun_done",execution_id:t,overall_status:e}}function Ea(t){return{type:"remote_start",backend:t.backend,env:t.env}}function Ia(t){return{type:"remote_device",platform:t.platform,slug:t.slug,name:t.name,os_version:t.osVersion,...t.avdId?{avd_id:t.avdId}:{},...t.pool?{pool:t.pool}:{}}}function Ra(t){return{type:"remote_app",path:t.path,app_id:t.appId,source:t.source}}function Er(t){return{type:"remote_device_hint",reason:t.reason,detail:t.detail}}function Ta(t){return{type:"remote_dispatched",job_id:t.jobId,job_url:t.jobUrl}}function Qe(t){return{type:"reconcile_merge_degraded",code:"RECONCILE_MERGE_DEGRADED",reason:t.reason,...t.detail?{detail:t.detail}:{},...t.excludedPack?{excluded_pack:t.excludedPack}:{},...t.standaloneIds?{standalone_execution_ids:t.standaloneIds}:{}}}function Bt(t){return{type:"remote_import_tape",path:t.path,status:t.status,...t.reason?{reason:t.reason}:{},...t.dispatchCommit?{dispatch_commit:t.dispatchCommit}:{},...t.gridCommit?{grid_commit:t.gridCommit}:{},...t.localCommit?{local_commit:t.localCommit}:{}}}function Ye(t){return{type:"remote_exec_sync",code:{skipped:"REMOTE_EXEC_SYNC_SKIPPED",warning:"REMOTE_EXEC_SYNC_WARNING",failed:"REMOTE_EXEC_SYNC_FAILED"}[t.status],status:t.status,reason:t.reason,...t.detail?{detail:t.detail}:{},...t.executionId?{execution_id:t.executionId}:{}}}function Ir(t){return{type:"remote_coverage",code:{skipped:"REMOTE_COVERAGE_SKIPPED",failed:"REMOTE_COVERAGE_FAILED"}[t.status],status:t.status,reason:t.reason,...t.detail?{detail:t.detail}:{}}}function xn(t){return{type:"remote_error",code:t.code,detail:t.detail}}function Ht(t){return{type:"remote_done",status:t.status,exit:t.exit,job_id:t.jobId,sessions_path:t.sessionsPath}}var It=t=>t.overallStatus==="failed"||t.overallStatus==="broken"||t.overallStatus==="interrupted";function Pa(t){try{return $a(t,"utf8")}catch{return""}}async function Da(t,e){let n=e.cwd??process.cwd(),i=Date.now(),o=_t();e.onExecutionId?.(o);let r=f=>({execution_id:o,test_id:f.testId,testcase_id:f.testcaseId,project_id:f.projectId,folder_id:f.folderId,org_id:f.orgId,commit_id:f.commitId,session_name:f.sessionName,user_name:e.operator?.userName,user_email:e.operator?.userEmail}),a=await ai({execution_id:o,title:t.title,started:new Date().toISOString(),producerVersion:ye,run_kind:"author",origin:"testrun",pid:process.pid},n);e.emit(ka(o,t));let s=[...new Set(t.checks.flatMap(f=>f.tags))];e.log?.("info","TESTRUN_START","Testrun started",{execution_id:o,member_count:t.checks.length,parallel:t.parallel,on_failure:t.onFailure,tags:s});let l=0,u=t.checks.map(f=>({key:f.path,value:f})),c=await kn(u,f=>e.executeMember(f.value,l++),{parallel:t.parallel,failFast:t.onFailure==="fail-fast",isFailure:It,signal:e.signal,onStart:f=>e.emit(_a(f.value)),onEnd:(f,S)=>{e.emit(xa(f.value,S)),e.log?.("info","TESTRUN_MEMBER_END","Testrun member ended",{execution_id:o,member_test_id:f.value.testId??Se(f.value.relPath),status:S.overallStatus,result_code:S.resultCode??null,duration_s:S.durationS,run_kind:S.runKind})}}),m=c.done.find(f=>It(f.result));for(let f of c.skipped)await Sr({packDir:a,testId:Se(f.value.relPath),definition:{path:"test.md",content:Pa(f.value.path)},externalIdInput:r(f.value),tags:f.value.tags,reason:c.cancelled?"skipped: testrun cancelled":`skipped: fail-fast after ${m?Gc(m.item.value.path):"failure"}`});let p=new Map(c.done.map(f=>[f.item.value.relPath,f.result]));for(let f of t.checks){let S=Se(f.relPath);if(zc(Aa(a,"tests",S,"result.yaml")))continue;let y=p.get(f.relPath);await Sr({packDir:a,testId:S,definition:{path:"test.md",content:Pa(f.path)},externalIdInput:r(f),tags:f.tags,reason:`member ended '${y?.overallStatus??"broken"}' before writing its result (chrome-slot failure or pre-run crash \u2014 see member session logs)`,status:"broken"}),y&&!It(y)&&(y.overallStatus="broken",y.exitCode=2)}let g=c.done.flatMap(f=>f.result.pendingInvestigations??[]);if(g.length>0){e.emit({type:"testrun_investigations_wait",count:g.length});let f=g.map(R=>R.exited),S,y=!1;try{await Promise.race([Promise.allSettled(f),new Promise(R=>{S=setTimeout(()=>{y=!0,R()},e.investigationTimeoutMs??12e4)})])}finally{clearTimeout(S)}if(y){for(let N of g)try{N.cancel()}catch{}let R;try{await Promise.race([Promise.allSettled(f),new Promise(N=>{R=setTimeout(N,15e3)})])}finally{clearTimeout(R)}}}try{let f=R=>R==="passed"||R==="failed"||R==="skipped"?R:"broken",S=R=>{try{let N=wt($a(Aa(a,"tests",R,"result.yaml"),"utf8"));return cn(N.steps??[])}catch{return[]}},y=dn({cwd:n,members:c.done.map(R=>({path:R.item.value.path,verdict:f(R.result.overallStatus),acs:S(R.result.testId),executionId:o,startedAt:new Date().toISOString(),durationMs:Math.round(R.result.durationS*1e3),mode:"testrun",local:!e.shouldPublish}))});for(let R of y.warnings)e.log?.("warn","TESTRUN_EXEC_SYNC_WARNING",R,{execution_id:o})}catch(f){e.log?.("warn","TESTRUN_EXEC_SYNC_FAILED","Testrun exec-sync failed",{execution_id:o,error:String(f)})}try{let f=(e.coverageWriter??xt)(a,qe(n));f.status==="skipped"&&e.log?.("warn","TESTRUN_COVERAGE_SKIPPED",`Testrun coverage/usecases.yaml not written: ${f.reason}`,{execution_id:o,reason:f.reason})}catch(f){e.log?.("warn","TESTRUN_COVERAGE_WRITER_THREW","Testrun coverage writer threw",{execution_id:o,error:String(f)})}let d=await kt(a,new Date().toISOString()),h;try{let f=await yt(Te(o,n),"L1");h=f.valid,f.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed testrun pack failed L1 validation",{execution_id:o,first_code:String(f.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(f){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Testrun pack validation threw",{execution_id:o,error:String(f)})}let k="skipped";if(e.shouldPublish&&!c.cancelled&&e.publish){let f=t.checks[0],S=await e.publish({testId:f.testId,sessionId:o,executionId:o,sealedPackPath:Te(o,n),projectId:t.projectId});k=S.ok?"ok":"failed",e.emit(St(S,o))}else e.shouldPublish&&c.cancelled&&e.log?.("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:"cancel"});let b=new Map(c.done.map(f=>[f.item.value.path,f.result]));for(let f of t.checks){let S=b.get(f.path);await ln(Ae(f.path),{execution_id:o,run_kind:S?.runKind??"author",status:S?It(S)?S.overallStatus==="failed"?"failed":"broken":"passed":"skipped",valid:h,uploaded:k==="ok",at:new Date().toISOString()})}let v={tests:t.checks.length,passed:c.done.filter(f=>!It(f.result)).length,failed:c.done.filter(f=>f.result.overallStatus==="failed").length,broken:c.done.filter(f=>["broken","interrupted"].includes(f.result.overallStatus)).length,skipped:c.skipped.length};e.log?.("info","TESTRUN_SUMMARY","Testrun summary",{execution_id:o,totals:{passed:v.passed,failed:v.failed,broken:v.broken,skipped:v.skipped},upload:k});let _=c.done.some(f=>It(f.result)),P=c.cancelled?3:_?1:0;return e.log?.("info","TESTRUN_DONE","Testrun done",{execution_id:o,exit_code:P}),{exitCode:P,executionId:o,totals:v,upload:k}}import{readFileSync as Xc}from"fs";function Oa(t,e){if(t.mobile)return e;let{deviceName:n,osVersion:i,...o}=e;return o}function Qc(t,e){return{testId:t,overallStatus:e.overallStatus,exitCode:e.exitCode,durationS:e.durationS??0,runKind:ns(!!e.anyAuthorStepRan),resultCode:e.resultCode??null,...e.pendingInvestigations?.length?{pendingInvestigations:e.pendingInvestigations}:{}}}function Ma(t){let e=t.cdpEndpoint!==void 0?{...t.passThroughOpts,cdpEndpoint:t.cdpEndpoint}:{...t.passThroughOpts};return{path:t.abs,cwd:t.cwd,opts:e,isAgent:!0,disableAskUser:!0,resolved:t.cdpEndpoint!==void 0?{...t.resolved,chrome:{...t.resolved.chrome,cdp_endpoint:t.cdpEndpoint}}:t.resolved,resolvedAuth:t.resolvedAuth,cliOverrides:{},environment:t.environment,envConfig:t.envConfig,profile:t.profile,model:t.model,creds:t.creds,configStore:t.configStore,session:t.session,skipGlobalRemoteLogger:!0,evidenceAttach:t.attach,suppressEvidenceOffer:!0,onFatalExit:n=>{throw new Error(`project/folder gate failed: ${n.split(`
44
+ `)[0]}`)},signal:t.signal}}async function Rr(t,e,n,i,o=or){let r=Se(t.relPath),a=Date.now();try{let s=await hi.attach({packDir:n.packDir,testId:r,definition:{path:"test.md",content:Xc(t.path,"utf8")},cwd:n.cwd}),l=Oa(t,n.passThroughOpts),u=Ma({abs:t.path,cwd:n.cwd,resolved:st(t.path),resolvedAuth:n.resolvedAuth,environment:n.environment,envConfig:n.envConfig,profile:n.profile,model:n.model,creds:n.creds,configStore:n.configStore,session:new Nt,passThroughOpts:l,...e?{cdpEndpoint:e.cdpEndpoint}:{},attach:s,signal:n.signal}),{host:c,lifecycle:m}=i(t),p=()=>{try{m.cleanup("runner","testrun cancelled")}catch{}};n.signal?.addEventListener("abort",p);try{let g=await o(u,c,m);return Qc(r,g)}finally{n.signal?.removeEventListener("abort",p)}}catch(s){return process.stderr.write(`member ${t.relPath} broken: ${s.message}
45
+ `),{testId:r,overallStatus:"broken",exitCode:2,durationS:(Date.now()-a)/1e3,runKind:"replay"}}finally{e?.release()}}async function Tr(t,e,n,i,o=or){let r=Date.now();try{let a=Oa(t,n.passThroughOpts),s=Ma({abs:t.path,cwd:n.cwd,resolved:st(t.path),resolvedAuth:n.resolvedAuth,environment:n.environment,envConfig:n.envConfig,profile:n.profile,model:n.model,creds:n.creds,configStore:n.configStore,session:new Nt,passThroughOpts:a,...e?{cdpEndpoint:e.cdpEndpoint}:{},attach:void 0,signal:n.signal}),{host:l,lifecycle:u}=i(t),c=()=>{try{u.cleanup("runner","testrun cancelled")}catch{}};n.signal?.addEventListener("abort",c);try{let m=await o(s,l,u);return{relPath:t.relPath,testId:m.ownPack?.testId,testcaseId:m.ownPack?.testcaseId,commitId:m.ownPack?.commitId,executionId:m.ownPack?.executionId,overallStatus:m.overallStatus,exitCode:m.exitCode,durationS:m.durationS??0,published:m.ownPack?m.ownPack.published?"yes":"no":"unknown"}}finally{n.signal?.removeEventListener("abort",c)}}catch(a){return process.stderr.write(`author member ${t.relPath} broken: ${a.message}
46
+ `),{relPath:t.relPath,overallStatus:"broken",exitCode:2,durationS:(Date.now()-r)/1e3,published:"no"}}finally{e?.release()}}var Zc=t=>t.overallStatus==="failed"||t.overallStatus==="broken"||t.overallStatus==="interrupted";async function Na(t,e){if(t.length===0)return{results:[],cancelled:!1,skipped:[]};let n=0,i=t.map(r=>({key:r.path,value:r})),o=await kn(i,r=>e.executeAuthorMember(r.value,n++),{parallel:e.parallel,failFast:!1,isFailure:Zc,signal:e.signal,onStart:r=>e.emit(Ca(r.value)),onEnd:(r,a)=>e.emit(Sa(a))});return{results:o.done.map(r=>r.result),cancelled:o.cancelled,skipped:o.skipped.map(r=>r.value)}}import{mkdtempSync as ed,rmSync as td}from"fs";import{tmpdir as nd}from"os";import{join as rd}from"path";function ja(t){let e=Promise.resolve(),n=new Map,i=r=>{try{td(r,{recursive:!0,force:!0})}catch{}};function o(r){let a=e.then(async()=>{if(n.has(r))throw new Error(`chrome slot ${r} already acquired (one acquire per worker index)`);let s=ed(rd(nd(),"kane-testrun-chrome-")),l;try{l=await t.launch({userDataDir:s,width:t.width,height:t.height,headless:t.headless})}catch(u){throw i(s),u}return n.set(r,{chrome:l,dataDir:s}),{cdpEndpoint:l.cdpEndpoint,release(){let u=n.get(r);if(u){n.delete(r);try{u.chrome.kill()}catch{}i(u.dataDir)}}}});return e=a.catch(()=>{}),a}return{acquire:o,killAll(){for(let[,r]of n){try{r.chrome.kill()}catch{}i(r.dataDir)}n.clear()}}}function Fa(){let t=new Map;return{register(e,n){t.set(e,n)},deregister(e){t.delete(e)},cleanup(e,n){let i=t.get(e);if(i){t.delete(e);try{i()}catch{}}},remoteLogger:null}}import{EventEmitter as od}from"events";import{Writable as id}from"stream";function sd(){return new id({write(t,e,n){n()}})}function ad(){let t=new od;return Object.assign(t,{isTTY:!0,setEncoding(){},setRawMode(e){return t},ref(){return t},unref(){return t},read(){return null}}),t}function Va(){let t=process.env.KANE_TESTRUN_MEMBER_DEBUG;return t==="1"||t==="true"}function La(){return{...Ai({isAgent:!0,log:()=>{},stdout:Va()?process.stderr:sd(),stdin:ad()}),onAgentEvent:Va()?e=>{process.stderr.write(`[member] ${JSON.stringify(e)}
47
+ `)}:()=>{},onLockState:()=>{},onAdaptiveHeal:()=>{}}}import{randomUUID as Su}from"crypto";import{appendFileSync as Eu}from"fs";import{join as Iu,relative as Lr}from"path";import{execFileSync as dd}from"child_process";import{existsSync as Ba}from"fs";import{isAbsolute as Ha,resolve as Wa,relative as qa,sep as Ka}from"path";import{basename as ld}from"path";function Cn(t){return t==="ios"?"simulator":"emulator"}function cd(t){return t.filter(e=>e.app&&!Mt(e.app.trim()))}async function Ua(t,e,n={}){let i=t.checks.filter(m=>m.mobile),o=cd(i);if(o.length===0)return{ok:!0,app:{byMember:{},uploads:[]}};let r=[...new Set(o.map(m=>m.app.trim()))];if(e.dryRun)return{ok:!0,app:{byMember:{},uploads:r.map(m=>({path:m,appId:"",source:"dry-run"}))}};let a=n.upload??Do,s=new Map,l=[],u=[];for(let m of r){let p=o.find(d=>d.app.trim()===m).platform,g=await a({path:m,type:Cn(p),env:e.env,orgId:e.orgId,userId:e.userId,auth:{username:e.auth.username,accessKey:e.auth.accessKey,orgId:e.orgId},baseUrl:ot(e.env),...e.onProgress?{onProgress:e.onProgress}:{}});if(Po(g)){u.push({code:"mobile_app_upload_failed",detail:`${ld(m)} could not be uploaded, and the grid has no other way to get it: ${g.reason}
48
+ Fix the upload, or set the file's \`app:\` to an APP\u2026 id from \`kane-cli apps list --target ${Cn(p)}\`.`});continue}s.set(m,g.appId),l.push({path:m,appId:g.appId,source:g.fromCache?"cache":"uploaded"})}if(u.length)return{ok:!1,errors:u};let c={};for(let m of o)c[m.relPath]=s.get(m.app.trim());return{ok:!0,app:{byMember:c,uploads:l}}}function Ar(t,e){return`project conflict: this profile is configured for project ${t}, but the selected members were authored in project ${e}.
48
49
  Dispatching would mint authored tests into ${t} while their evidence publishes to ${e}.
49
- Fix: \`kane-cli config project ${e}\`, or select only members belonging to ${t}.`}function ic(t,e){return t.filter(n=>e.checkIgnore(n))}function sc(t,e){try{return oc("git",["check-ignore","-q",t],{cwd:e,stdio:"ignore"}),!0}catch{return!1}}function ra(t,e={}){let n=e.env??process.env,i=e.collectBundleFn??oi,o=e.checkIgnore??sc,r=[];n.KANE_CLI_MODE==="hyperexecute"&&r.push({code:"on_grid",detail:"already running on a HyperExecute grid \u2014 --remote cannot re-dispatch"}),t.plan.valid||r.push({code:"invalid_plan",detail:"members do not share one org/project, or the plan is otherwise invalid"});let a=t.plan.checks.filter(c=>c.mobile);a.length&&r.push({code:"mobile_remote_unsupported",detail:`${a.length} mobile test(s) selected \u2014 --remote does not support emulator/simulator tests yet:
50
- `+a.map(c=>` ${c.relPath}`).join(`
50
+ Fix: \`kane-cli config project ${e}\`, or select only members belonging to ${t}.`}function ud(t,e){return t.filter(n=>e.checkIgnore(n))}function md(t,e){try{return dd("git",["check-ignore","-q",t],{cwd:e,stdio:"ignore"}),!0}catch{return!1}}function Ya(t,e={}){let n=e.env??process.env,i=e.collectBundleFn??Ri,o=e.checkIgnore??md,r=[];n.KANE_CLI_MODE==="hyperexecute"&&r.push({code:"on_grid",detail:"already running on a HyperExecute grid \u2014 --remote cannot re-dispatch"}),t.plan.valid||r.push({code:"invalid_plan",detail:"members do not share one org/project, or the plan is otherwise invalid"});let a=t.plan.checks.filter(d=>d.mobile),s=t.plan.checks.filter(d=>!d.mobile),l=a.filter(d=>d.platform==="android"),u=a.filter(d=>d.platform==="ios");if(a.length){let d=a.filter(_=>_.platform!=="android"&&_.platform!=="ios");d.length&&r.push({code:"mobile_remote_unsupported",detail:`${d.length} test(s) need a device --remote cannot provide (Android emulators and iOS simulators only):
51
+ `+d.map(_=>` ${_.relPath}${_.platform?` (${_.platform})`:" (frontmatter did not parse)"}`).join(`
51
52
  `)+`
52
- Run them locally (drop --remote), or deselect them (--match/--tags).`}),t.plan.checks.some(c=>c.memberClass==="author")&&t.projectId&&t.plan.projectId&&t.projectId!==t.plan.projectId&&r.push({code:"project_authority_conflict",detail:fr(t.projectId,t.plan.projectId)});let l=[];for(let c of t.plan.checks)if(c.memberClass==="replay")try{let m=i(c.path);for(let p of m.files)l.push(p.abs)}catch(m){r.push({code:"bundle_error",detail:`${c.relPath}: ${m instanceof Error?m.message:String(m)}`})}else l.push(c.path);let u=ic(l,{checkIgnore:c=>o(c,t.cwd)});return u.length&&r.push({code:"gitignored_inputs",detail:`${u.length} required input(s) are gitignored and won't reach the grid:
53
- `+u.map(c=>` ${c}`).join(`
54
- `)+"\n Fix: un-ignore them (e.g. `!output-*/`) or commit them, then re-run."}),{ok:r.length===0,errors:r,requiredInputs:l}}import{existsSync as ac,mkdirSync as lc,readFileSync as cc,writeFileSync as dc}from"fs";import{isAbsolute as uc,join as gr,relative as sa,sep as mc}from"path";function oa(t){let e=[];return t.author===!0&&e.push("--author"),t.adaptiveHeal===!1&&e.push("--no-adaptive-heal"),t.testmdSync===!1&&e.push("--no-testmd-sync"),e}function ia(t){return t.length?` ${t.join(" ")}`:""}function pc(t,e){let n=t;for(let[i,o]of Object.entries(e))n=n.split(`{{${i}}}`).join(o);return n}function fc(t){let e=t.map(o=>({relPath:o.relPath,absPath:o.path,memberClass:o.memberClass,testId:o.testId,commitId:o.commitId}));return{discoveryCommand:`printf '%s\\n' ${e.map(o=>`'${o.relPath}'`).join(" ")}`,members:e}}function gc(t,e,n=[]){let i=t.map(a=>sa(e,Ae(a.absPath))),o=[...new Set(n)].filter(a=>!i.includes(a));return[...[...i,...o].map(a=>` - "${a}/**"`)," - .testmuai/evidence/**"," - artifacts/session/**"].join(`
55
- `)}function hc(t,e,n){let i=n??(l=>{try{return At(l).unitFiles.map(u=>u.file).filter(u=>u!==l)}catch{return[]}}),o=new Set(t.map(l=>l.absPath)),r=[],a=[],s=new Set;for(let l of t)for(let u of i(l.absPath)){if(o.has(u)||s.has(u))continue;s.add(u);let c=Ae(u),m=sa(e,c);if(m===".."||m.startsWith(`..${mc}`)||uc(m)){a.push({unitAbsPath:u,reason:"outside payload cwd \u2014 cannot round-trip through the grid"});continue}let p;try{let g=gr(c,".internal","meta.json");if(ac(g)){let d=JSON.parse(cc(g,"utf8"));typeof d.commit_id=="string"&&d.commit_id&&(p=d.commit_id)}}catch{}r.push({unitAbsPath:u,tapeDir:c,relTape:m,...p?{dispatchCommitId:p}:{}})}return{tapes:r,skipped:a}}function bc(t){return t.projectId?` --project-id ${t.projectId}${t.folderId?` --folder-id ${t.folderId}`:""}`:""}var vc=new Set(["--author","--no-testmd-sync"]);function wc(t){return t.some(e=>vc.has(e))?Ee:"latest"}async function yc(t){let e=new bi(ce(t.env).secretsBaseUrl),n={username:t.auth.username,accessKey:t.auth.access_key,orgId:t.orgId};await e.pushSecret({secretKey:"LT_USERNAME",secretValue:t.auth.username,...n}),await e.pushSecret({secretKey:"LT_ACCESS_KEY",secretValue:t.auth.access_key,...n})}async function aa(t,e={}){let n=e.base??Z,i=gr(ji("remote-execution",n),t.jobId);lc(i,{recursive:!0});let{discoveryCommand:o,members:r}=fc(t.plan.checks),{tapes:a,skipped:s}=hc(r,t.cwd);await(e.pushSecrets??yc)(t);let l=t.memberFlags??[],u=pc(Ni,{runson:e.runson??"mac",concurrency:String(t.parallel),env:t.env,kaneVersion:e.kaneVersion??wc(l),discoveryCommand:o,uploadPaths:gc(r,t.cwd,a.map(m=>m.relTape)),projectFolderFlags:bc(t),memberFlags:ia(l)}),c=gr(i,".hyperexecute.yaml");return dc(c,u),{job:t,jobDir:i,yamlPath:c,members:r,importTapes:a,...s.length>0?{skippedImports:s}:{}}}import{spawn as kc,execFileSync as _c}from"child_process";import{join as xc}from"path";function Sc(t){let e=t.match(/Job Link:\s*(https?:\/\/\S*?[?&]jobId=([0-9a-fA-F-]{36}))/);return e?{url:e[1],jobId:e[2]}:null}function Cc(){try{return _c("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),!0}catch{return!1}}function Ic(t){return t.binaryPath?t.binaryPath:(t.onPath??Cc)()?"hyperexecute":cn()}function la(t,e){if(!t)return;let n="";t.on("data",i=>{n+=String(i);let o;for(;(o=n.indexOf(`
56
- `))>=0;)e(n.slice(0,o)),n=n.slice(o+1)}),t.on("end",()=>{n.length&&e(n)})}async function ca(t,e={}){let n=t.job,i=Ic(e),o=xc(t.jobDir,"dl"),r=["--user",n.auth.username,"--key",n.auth.access_key,"--env",n.env,"--config",t.yamlPath,"--concurrency",String(n.parallel),"--download-artifacts","--download-artifacts-path",o],s=(e.spawnImpl??((d,y,_)=>kc(d,y,{cwd:_.cwd})))(i,r,{cwd:n.cwd}),l="",u="",c=d=>{if(e.onLine?.(d),!l){let y=Sc(d);y&&(l=y.jobId,u=y.url)}};la(s.stdout,c),la(s.stderr,c);let m=!1,p=()=>{m=!0;try{s.kill("SIGTERM")}catch{}};e.signal&&(e.signal.aborted?p():e.signal.addEventListener("abort",p,{once:!0}));let g=await new Promise(d=>{s.on("close",y=>d(m?3:typeof y=="number"?y:1)),s.on("error",()=>d(1))});return e.signal?.removeEventListener?.("abort",p),{job:n,prepared:t,hxJobId:l,jobUrl:u,downloadDir:o,exitCode:g,cancelled:m}}import{existsSync as Me,readdirSync as vn,statSync as pa,mkdirSync as Ec,cpSync as hn,readFileSync as fa,writeFileSync as vr,rmSync as hr,mkdtempSync as Tc}from"fs";import{tmpdir as Rc}from"os";import{join as G,basename as Ue,relative as ga}from"path";function Ac(t,e){if(Me(t)){for(let n of vn(t).sort())if(n.endsWith(e))return G(t,n)}}function ha(t){return Me(t)?vn(t).map(e=>G(t,e)).filter(e=>pa(e).isDirectory()):[]}function Pc(t){let e=G(t,"kane-testrun");return ha(e)}function it(t){try{return JSON.parse(fa(t,"utf8"))}catch{return}}async function ba(t){let e=t.prepared.members,n=t.job.cwd,i=Pc(t.downloadDir),o=e.map(s=>{let l=ga(n,Ae(s.absPath));for(let u of i){let c=G(u,l);if(Me(c))return{member:s,tapeDir:c}}return{member:s}}),r=new Map;for(let s of i)for(let l of ha(G(s,"artifacts","session")))r.has(Ue(l))||r.set(Ue(l),l);let a=(t.prepared.importTapes??[]).map(s=>{for(let l of i){let u=G(l,s.relTape);if(Me(u))return{prepared:s,pulledDir:u}}return{prepared:s}});return{result:t,perMember:o,sessionDirs:[...r.values()],importTapes:a}}function Oc(t){let e=it(G(t,"execution.json")),n=it(G(t,"session.json")),i=Date.parse(String(e?.start_timestamp??"")),o=Date.parse(String(e?.end_timestamp??"")),r=Number.isFinite(i)&&Number.isFinite(o)&&o>=i?(o-i)/1e3:void 0;return{testId:e?.test_id,status:e?.status,packPath:Ac(G(t,"evidence"),".evidence"),uploadStatus:n?.upload_status,...r!==void 0?{durationS:r}:{}}}function da(t){return t?.uploadStatus==="uploaded"?"yes":t?.uploadStatus==="failed"?"no":"unknown"}function $c(t){if(t.member.memberClass==="replay"&&t.member.testId)return t.member.testId;if(t.tapeDir){let n=it(G(t.tapeDir,".internal","meta.json"))?.test_id;if(n)return n;let o=it(G(t.tapeDir,".internal","execution.json"))?.test_id;if(o)return o}return t.member.testId}function Dc(t){if(!t.tapeDir)return;let n=it(G(t.tapeDir,".internal","meta.json"))?.commit_id;return typeof n=="string"&&n?n:void 0}function wr(t){try{let e=mt(t,{schema:Jt});return e&&typeof e=="object"?e:void 0}catch{return}}function bn(t){try{return wr(fa(t,"utf8"))}catch{return}}function ke(t){return t instanceof Error?t.message:String(t)}function Mc(t,e=3){let n=t.slice(0,e).join("; ");return t.length>e?`${n} (+${t.length-e} more)`:n}function jc(t){let e=[],n=[],i=o=>{if(!Me(o))return;let r;try{r=vn(o).sort()}catch(a){n.push(`readdir ${o}: ${ke(a)}`);return}for(let a of r){let s=G(o,a);try{if(pa(s).isDirectory()){i(s);continue}}catch(l){n.push(`stat ${s}: ${ke(l)}`);continue}a==="result.yaml"&&e.push(s)}};return i(t),{files:e,errors:n}}function yr(t,e){let n=[],i=G(t,"run.yaml"),o=bn(i),r=o?.environment,a=typeof r?.run_kind=="string"?r.run_kind:void 0;if(o&&r&&a!==void 0){let p={...r};delete p.run_kind,p.run_kind_observed=a,o.environment=p;try{vr(i,Nn(o,{lineWidth:-1,schema:Jt}))}catch(g){n.push(`write ${i}: ${ke(g)}`)}}let s=new Map,l=new Map;for(let p of e){let g=p.evidenceClass??p.memberClass;p.gridTestId&&s.set(p.gridTestId,g),l.set(Se(p.relPath),g)}let u=new Set(e.map(p=>p.evidenceClass??p.memberClass)),c=u.size===1?[...u][0]:void 0,m=jc(G(t,"tests"));n.push(...m.errors);for(let p of m.files){let g=bn(p);if(!g)continue;let d={...g.environment??{}},y=typeof d.run_kind=="string"?d.run_kind:a,_=g.external_id,b=typeof _?.test_id=="string"?_.test_id:void 0,v=typeof g.test=="string"?g.test:void 0,E=(b?s.get(b):void 0)??(v?l.get(v)??l.get(v.replace(/-\d+$/,"")):void 0)??c;if(E){d.run_kind=E,y&&y!==E&&(d.run_kind_observed=y),g.environment=d;try{vr(p,Nn(g,{lineWidth:-1,schema:Jt}))}catch(P){n.push(`write ${p}: ${ke(P)}`)}}}return{errors:n}}function Nc(t,e){let n=new Map,i=new Map,o=new Map;for(let s of e)s.gridTestId&&i.set(s.gridTestId,s.relPath),o.set(Se(s.relPath),s.relPath);let r=G(t,"tests");if(!Me(r))return n;let a;try{a=vn(r).sort()}catch{return n}for(let s of a){let l=bn(G(r,s,"result.yaml"));if(!l)continue;let u=l.external_id,c=typeof u?.test_id=="string"?u.test_id:void 0,m=typeof l.test=="string"?l.test:s,p=(c?i.get(c):void 0)??o.get(m)??o.get(m.replace(/-\d+$/,""));if(!p||n.has(p))continue;let g=Array.isArray(l.steps)?l.steps:[],d=l.duration_ms;n.set(p,{acs:en(g),...typeof d=="number"?{durationMs:d}:{}})}return n}function Fc(t){let e=bn(G(t,"run.yaml"));return typeof e?.started=="string"?e.started:void 0}function ua(t){if(t.members.length===0)return;let e=[],n=We(t.cwd);if(!Me(n))return t.emit(Ke({status:"skipped",reason:"no_context_store",detail:n})),{status:"skipped",reason:"no_context_store",detail:n,synced:0,warnings:e};for(let o of t.members){if(!o.drift)continue;let r=`sync: ${o.relPath} ran a healed definition on the grid (tape commit ${o.drift.tape} \u2260 local ${o.drift.local}) \u2014 the verdict is attached to the local, pre-heal definition`;e.push(r),t.emit(Ke({status:"warning",reason:"heal_drift",detail:r}))}let i=t.members.map(o=>{let r=t.packFacts.get(o.relPath);return{path:o.absPath,verdict:o.verdict,...r?.acs.length?{acs:r.acs}:{},executionId:o.executionId,...r?.durationMs!==void 0?{durationMs:r.durationMs}:{},startedAt:t.startedAt,mode:"testrun",local:t.local,...o.drift?{driftFlag:!0}:{}}});try{let o=t.syncFn({cwd:t.cwd,members:i});e.push(...o.warnings);for(let r of o.warnings)t.emit(Ke({status:"warning",reason:"sync_warning",detail:r}));return o.skipped?(t.emit(Ke({status:"skipped",reason:o.skipped})),{status:"skipped",reason:o.skipped,synced:0,warnings:e}):{status:"synced",synced:o.synced,warnings:e}}catch(o){let r=ke(o);return t.emit(Ke({status:"failed",reason:"sync_error",detail:r})),{status:"failed",reason:"sync_error",detail:r,synced:0,warnings:e}}}function ma(t,e){try{return e()}catch(n){let i=ke(n);try{t(Ke({status:"failed",reason:"sync_error",detail:i}))}catch{}return{status:"failed",reason:"sync_error",detail:i,synced:0,warnings:[]}}}function Lc(t,e,n,i){try{let o=i(t,We(e));o.status==="skipped"&&n(ur({status:"skipped",reason:o.reason}))}catch(o){let r=ke(o);try{n(ur({status:"failed",reason:"coverage_error",detail:r}))}catch{}}}async function kr(t){let e,n=-1/0;for(let i of t){let o;try{let s=await Un(i.path,"run.yaml");s&&(o=wr(s))}catch{}let r=typeof o?.ended=="string"?o.ended:typeof o?.started=="string"?o.started:void 0;if(!r)continue;let a=Date.parse(r);!Number.isNaN(a)&&a>n&&(n=a,e=r)}return e}function Vc(t){let e=/collides between packs "([^"]+)" and "([^"]+)"/.exec(t);if(e)return[e[2],e[1]];let n=/^pack "([^"]+)"/.exec(t);return n?[n[1]]:[]}async function Uc(t,e){let n=Vc(t);if(n.length)for(let i of n){let o=e.find(r=>Ue(r.path,".evidence")===i);if(o)return o;for(let r of e)try{let a=await Un(r.path,"run.yaml");if(a&&wr(a)?.run_id===i)return r}catch{}}}async function br(t,e){let n=[];for(let i of t){let o=Ue(i.path,".evidence");try{await jo(i.path,o,e),n.push(o)}catch{}}return n}async function Bc(t,e,n){let i=n.emit??(()=>{}),o=n.mergeFn??Qt,r,a;try{r=Tc(G(Rc(),"kane-remote-merge-rules-")),a=G(r,"merge-rules.yaml"),vr(a,nn())}catch(u){r&&hr(r,{recursive:!0,force:!0});let c=ke(u),m=await br(t,e);return i(ze({reason:"merge_rules_standalone",detail:c,standaloneIds:m})),{kind:"standalone",degraded:{reason:"merge_rules_standalone",detail:c,standaloneIds:m}}}let s=async u=>{let c=gt(),m=Re(c,e);try{return await o(u.map(p=>p.path),{runId:c,out:m,rulesPath:a,finalize:!1}),{ok:!0,execId:c,out:m}}catch(p){return hr(m,{recursive:!0,force:!0}),{ok:!1,error:p}}},l=u=>u?.code==="ABORT";try{let u=await s(t);if(u.ok)return{kind:"merged",execId:u.execId,out:u.out,used:t};let c=l(u.error)?await Uc(ke(u.error),t):void 0;if(c&&t.length>1){let d=Ue(c.path,".evidence"),y=ke(u.error);i(ze({reason:"merge_abort_excluded_pack",detail:y,excludedPack:d}));let _=t.filter(P=>P!==c),b=await s(_);if(b.ok)return{kind:"merged",execId:b.execId,out:b.out,used:_,degraded:{reason:"merge_abort_excluded_pack",detail:y}};let v=await br(t,e),E=ke(b.error);return i(ze({reason:"merge_abort_standalone",detail:E,standaloneIds:v})),{kind:"standalone",degraded:{reason:"merge_abort_standalone",detail:E,standaloneIds:v}}}let m=await br(t,e),p=l(u.error)?"merge_abort_standalone":"merge_error_standalone",g=ke(u.error);return i(ze({reason:p,detail:g,standaloneIds:m})),{kind:"standalone",degraded:{reason:p,detail:g,standaloneIds:m}}}finally{r&&hr(r,{recursive:!0,force:!0})}}async function va(t,e={}){let n=t.result,i=n.job.cwd,o=(n.job.memberFlags??[]).includes("--author"),r=e.sessionsRoot??G(Z,"sessions","remote"),a=G(r,n.hxJobId||"unknown-job");Ec(a,{recursive:!0});let s=new Map;for(let x of t.sessionDirs){Me(x)&&hn(x,G(a,Ue(x)),{recursive:!0});let N=Oc(x);N.testId&&!s.has(N.testId)&&s.set(N.testId,N)}let l=[],u=[],c=[],m=[],p=0,g=0,d=0,y=0,_,b;for(let x of t.perMember){let N=Dc(x),$=x.member.commitId;x.tapeDir&&Me(x.tapeDir)&&hn(x.tapeDir,Ae(x.member.absPath),{recursive:!0});let F=$c(x),A=F?s.get(F):void 0;A&&y++;let J=A?.status==="success"||A?.status==="passed";A?J?p++:g++:d++;let X=A?.packPath,Oe=x.member.memberClass;if(X){let ve={path:X,memberClass:Oe,gridTestId:F,relPath:x.member.relPath,...o?{evidenceClass:"author"}:{}};(Oe==="author"?c:u).push(ve),Oe==="replay"?_??=F:b??=F}if(m.push({absPath:x.member.absPath,relPath:x.member.relPath,verdict:J?"passed":"failed",...X?{packId:Ue(X,".evidence")}:{},...F?{gridTestId:F}:{},...$&&N&&$!==N&&!o?{drift:{tape:N,local:$}}:{}}),Oe==="author"){let ve=A?J?"passed":"failed":"broken",st=A?J?0:1:2,Xe=A?.durationS??0;X?l.push({relPath:x.member.relPath,testId:F??x.member.testId,commitId:x.member.commitId,sourceExecutionId:Ue(X,".evidence"),overallStatus:ve,exitCode:st,durationS:Xe,published:da(A)}):l.push({relPath:x.member.relPath,overallStatus:ve,exitCode:st,durationS:Xe,published:da(A)})}}let v=[...u,...c],E=null,P="skipped",f,C,w=e.emit??(()=>{}),I=e.syncFn??tn,j=!e.publishFn;{let x=new Set(n.prepared.members.map(N=>N.absPath));for(let N of t.importTapes??[]){let $=N.prepared;if(x.has($.unitAbsPath)||!N.pulledDir||!Me(N.pulledDir))continue;let F=it(G(N.pulledDir,".internal","meta.json")),A=typeof F?.commit_id=="string"&&F.commit_id?F.commit_id:void 0,J=it(G($.tapeDir,".internal","meta.json")),X=typeof J?.commit_id=="string"&&J.commit_id?J.commit_id:void 0;if($.dispatchCommitId?X!==void 0&&X!==$.dispatchCommitId:X!==void 0){w(Dt({path:$.relTape,status:"kept_local_drift",localCommit:X,...$.dispatchCommitId?{dispatchCommit:$.dispatchCommitId}:{},gridCommit:A}));continue}try{hn(N.pulledDir,$.tapeDir,{recursive:!0})}catch(ve){w(Ke({status:"warning",reason:"import_tape_writeback_failed",detail:`${$.relTape}: ${ve instanceof Error?ve.message:String(ve)}`}));continue}w(Dt({path:$.relTape,status:"written",...$.dispatchCommitId?{dispatchCommit:$.dispatchCommitId}:{},...A?{gridCommit:A}:{}})),A&&$.dispatchCommitId&&A!==$.dispatchCommitId&&w(Ke({status:"warning",reason:"import_heal_drift",detail:`imported unit ${ga(i,$.unitAbsPath)} healed on the grid (dispatch ${$.dispatchCommitId} \u2192 grid ${A}) \u2014 tape written home; the local source file still holds the pre-heal definition`}))}}if(v.length){let x=await Bc(v,i,e);if(f=x.degraded,x.kind==="merged"){try{let A=yr(x.out,x.used);if(A.errors.length){let J=Mc(A.errors);w(ze({reason:"stamp_incomplete",detail:J})),f=f??{reason:"stamp_incomplete",detail:J}}}catch(A){let J=ke(A);w(ze({reason:"stamp_failed",detail:J})),f=f??{reason:"stamp_failed",detail:J}}let N=new Set(x.used.map(A=>Ue(A.path,".evidence")));C=ma(w,()=>ua({cwd:i,members:m.filter(A=>A.packId&&N.has(A.packId)).map(A=>({...A,executionId:x.execId})),packFacts:Nc(x.out,x.used),startedAt:Fc(x.out)??new Date().toISOString(),local:j,emit:w,syncFn:I})),Lc(x.out,i,w,e.coverageWriter??ht);let $=!0;try{let A=await kr(x.used)??new Date().toISOString();await(e.sealFn??ft)(x.out,A)}catch(A){let J=ke(A);w(ze({reason:"seal_failed",detail:J})),f={reason:"seal_failed",detail:J},$=!1}E={id:x.execId,status:g>0?"failed":"passed",evidenceId:x.execId};let F=new Set(x.used.map(A=>Ue(A.path,".evidence")));for(let A of l)A.sourceExecutionId&&F.has(A.sourceExecutionId)&&(A.executionId=x.execId);try{Me(x.out)&&hn(x.out,G(a,`execution-${x.execId}.evidence`),{recursive:!0})}catch{}if(e.publishFn&&$&&!n.cancelled){try{let X=await(e.validateFn??pt)(x.out,"L1");X.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed remote testrun pack failed L1 validation",{execution_id:x.execId,first_code:String(X.diagnostics?.[0]?.code??""),surface:"testrun_remote"})}catch(X){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Remote testrun pack validation threw",{execution_id:x.execId,error:String(X)})}let A=_??b,J=n.job.plan.projectId??n.job.projectId;if(A&&J){let X=await e.publishFn({testId:A,sessionId:x.execId,executionId:x.execId,sealedPackPath:x.out,projectId:J});P=X.ok?"ok":"failed",w(vt(X,x.execId))}}}else{let N=new Set(x.degraded.standaloneIds??[]);for(let $ of l)$.sourceExecutionId&&N.has($.sourceExecutionId)&&($.executionId=$.sourceExecutionId);C=ma(w,()=>ua({cwd:i,members:m.filter($=>$.packId&&N.has($.packId)).map($=>({...$,executionId:$.packId})),packFacts:new Map,startedAt:new Date().toISOString(),local:j,emit:w,syncFn:I}))}}let D={tests:t.perMember.length,passed:p,failed:g,broken:d,skipped:0,authored:l.length};return{execution:E,authored:l,totals:D,upload:P,hxJobId:n.hxJobId,jobUrl:n.jobUrl,sessionsPath:a,cancelled:n.cancelled,...t.perMember.length>0&&y===0?{artifactless:!0}:{},...f?{degraded:f}:{},...C?{execSync:C}:{}}}var wa={id:"hyper",preflight:ra,prepare:aa,dispatch:ca,collect:ba,reconcile:va};var Hc={hyper:wa};function ya(t){return Hc[t]}import{existsSync as xa,readFileSync as Sa}from"fs";import{join as qc}from"path";var Wc=["name","version","backendId","kaneCompat"];function ka(t){if(typeof t!="object"||t===null)throw new Error("manifest must be an object");let e=t;for(let i of Wc)if(typeof e[i]!="string"||e[i].length===0)throw new Error(`manifest missing required string field '${i}'`);let n={name:e.name,version:e.version,backendId:e.backendId,kaneCompat:e.kaneCompat};return e.defaults&&typeof e.defaults=="object"&&(n.defaults=e.defaults),n}function _a(t,e){let n=r=>{let a=r.replace(/^[v=]+/,"").split(".").map(s=>parseInt(s,10));return[a[0]||0,a[1]||0,a[2]||0]},i=(r,a)=>r[0]-a[0]||r[1]-a[1]||r[2]-a[2],o=n(t);return e.startsWith(">=")?i(o,n(e.slice(2)))>=0:i(o,n(e))===0}function kt(t,e=Z){let n=Mi(t,e);if(!xa(n))return{ok:!1,reason:"not_installed"};let i=Sa(n,"utf8").trim();if(!i)return{ok:!1,reason:"corrupt",detail:"empty current pointer"};let o=Di(t,i,e),r=qc(o,"plugin.json");if(!xa(r))return{ok:!1,reason:"corrupt",detail:`current points at ${i} but ${r} is missing`};let a;try{a=ka(JSON.parse(Sa(r,"utf8")))}catch(s){return{ok:!1,reason:"corrupt",detail:s.message}}return _a(Ee,a.kaneCompat)?{ok:!0,plugin:{name:t,version:i,dir:o,manifest:a}}:{ok:!1,reason:"incompatible",detail:`plugin needs kane-cli ${a.kaneCompat}, have ${Ee}`}}async function Ca(t,e={}){let n=e.creds??new pe,i=t.envFlag??n.getDefaultEnv()??"prod",o=kt("remote-execution",t.base);if(!o.ok)return{ok:!1,code:o.reason==="incompatible"?"plugin_incompatible":"plugin_missing",detail:o.reason==="incompatible"?`remote-execution plugin is incompatible${o.detail?`: ${o.detail}`:""}`:"remote-execution plugin is not installed \u2014 run `kane-cli plugin install remote-execution`"};let r=await Ve({creds:n,env:i,usernameFlag:t.usernameFlag,accessKeyFlag:t.accessKeyFlag,log:t.log});if(!r.basicAuth)return{ok:!1,code:"no_basic_auth",detail:"HyperExecute needs a LambdaTest username + access key \u2014 log in with basic auth or pass --user/--key"};let a=r.resolvedCreds?.org_id!=null?String(r.resolvedCreds.org_id):"",s=n.getActiveProfile()??"default",l=(t.memberClasses??[]).includes("author"),u=ho(n,s,i);if(l&&u.projectId&&t.planProjectId&&u.projectId!==t.planProjectId)return{ok:!1,code:"project_authority_conflict",detail:fr(u.projectId,t.planProjectId)};let c=u.projectId??void 0,m=u.folderId??void 0,p;if(l&&!t.dryRun){let g,d=await Xt({creds:n,config:e.config??new Te,profile:s,env:i,tmsCreds:r.basicAuth,isLocal:!!t.local,log:t.log,onFatalExit:y=>{g=y}});if(d.status==="ok")c=d.projectId,m=d.folderId,p=d.autoDefaulted;else if(d.status!=="skip")return{ok:!1,code:"project_folder",detail:g?.trim()||"could not resolve a TMS project/folder for the grid login"}}return{ok:!0,ctx:{env:i,auth:r.basicAuth,orgId:a,plugin:o.plugin,projectId:c,folderId:m,resolvedCreds:r.resolvedCreds??null,...p?{autoDefaulted:p}:{}}}}var Ia="\x1B[2m",Ea="\x1B[0m";function zc(t){return t.local?{shouldPublish:!1,reason:"local"}:t.hasAuth?t.projectId==null?{shouldPublish:!1,reason:"no_project"}:t.evidencePublish===!1?{shouldPublish:!1,reason:"flag"}:{shouldPublish:!0}:{shouldPublish:!1,reason:"no_auth"}}function Xc(t,e){if(t.cancelled)return{status:"cancelled",exit:3};if(t.artifactless)return e!==0?{status:"failed",exit:e}:{status:"broken",exit:1};let n=o=>Number(t.totals?.[o]??0);return n("failed")>0||n("broken")>0?{status:"failed",exit:1}:{status:t.execution?.status??(t.authored.length?"authored":"passed"),exit:0}}async function Ta(t,e,n,i){let o=D=>{for(let x of D)i.emit(gn(x));if(!i.isAgent)for(let x of D)process.stderr.write(`error: [${x.code}] ${x.detail}
57
- `);i.emit(wt("","failed")),i.emit(Mt({status:"failed",exit:2,jobId:"",sessionsPath:""})),process.exitCode=2},r=typeof e.remote=="string"&&e.remote?e.remote:"hyper",s=(i.findBackendFn??ya)(r);if(!s){o([{code:"unknown_backend",detail:`unknown remote backend '${r}'`}]);return}let l=i.log??(()=>{}),c=await(i.resolveContext??Ca)({envFlag:e.env,usernameFlag:e.username,accessKeyFlag:e.accessKey,memberClasses:t.checks.map(D=>D.memberClass),planProjectId:t.projectId,dryRun:!!e.dryRun,local:!!e.local,log:l},{});if(!c.ok){o([{code:c.code,detail:c.detail}]);return}i.isAgent&&c.ctx.autoDefaulted&&i.emit(vo(c.ctx.autoDefaulted));let m={command:"testrun",plan:t,cwd:n,jobId:Kc(),parallel:Number(e.parallel??1),env:c.ctx.env,auth:c.ctx.auth,orgId:c.ctx.orgId,plugin:c.ctx.plugin,projectId:c.ctx.projectId,folderId:c.ctx.folderId,memberFlags:oa(e)},p=s.preflight(m);if(!p.ok){o(p.errors);return}if(e.dryRun){i.isAgent||process.stderr.write(`\u2713 remote preflight passed \u2014 ${m.plan.checks.length} member(s), backend '${r}', env '${m.env}'
58
- `),process.exitCode=0;return}i.emit(Ws({backend:r,env:m.env})),i.isTTYView&&process.stderr.write(`
59
- ${Ia}remote testrun \xB7 ${r} \xB7 env ${m.env} \xB7 dispatching\u2026${Ea}
60
- `);let g=await s.prepare(m);for(let D of g.skippedImports??[])i.emit(Dt({path:Jc(m.cwd,D.unitAbsPath),status:"skipped",reason:D.reason}));let d=Gc(g.jobDir,"hyper.log"),y=Date.now(),_=await s.dispatch(g,{signal:i.signal,onLine:D=>{try{Yc(d,D+`
61
- `)}catch{}i.isTTYView&&/Job Link:|ERR::|error|failed|✔|✗|scenario|completed/i.test(D)&&process.stderr.write(`${Ia}${D}${Ea}
62
- `)}});i.emit(qs({jobId:_.hxJobId,jobUrl:_.jobUrl}));let b=await s.collect(_),v=t.projectId??m.projectId,E=zc({local:!!e.local,hasAuth:!!(m.auth?.username&&m.auth?.access_key),projectId:v,evidencePublish:e.evidencePublish});E.shouldPublish||l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:E.reason});let P=ce(m.env),f=c.ctx.resolvedCreds,C=E.shouldPublish?async D=>{let x=await sn({controller:new Ht(P.controllerBaseUrl,{username:m.auth.username,accessKey:m.auth.access_key}),tms:new Gt(P.tmsBaseUrl,f?.username??m.auth.username,f?.access_key??m.auth.access_key),...D});if(x.ok)return l("info","EVIDENCE_PUBLISH_OK","Remote testrun evidence published",{surface:"testrun_remote",execution_id:D.executionId}),{ok:!0};let N=/\b(\d{3})\b/.exec(x.error)?.[1]??null;return l("error","EVIDENCE_PUBLISH_FAILED","Remote testrun evidence publish failed",{surface:"testrun_remote",stage:x.stage,http_status:N?Number(N):null,error:x.error}),{ok:!1,stage:x.stage}}:void 0,w=await s.reconcile(b,{emit:i.emit,publishFn:C,log:l});E.shouldPublish&&w.cancelled&&l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:"cancel"}),w.degraded&&!i.isAgent&&(process.stderr.write(`
63
- warning: evidence merge degraded (${w.degraded.reason})${w.degraded.detail?` \u2014 ${w.degraded.detail}`:""}
64
- `),w.degraded.standaloneIds?.length&&process.stderr.write(` packs kept standalone: ${w.degraded.standaloneIds.join(", ")}
65
- `));let I=w.execSync;if(I&&!i.isAgent){I.status==="failed"&&process.stderr.write(`
66
- warning: execution facts were not recorded in the local assurance graph${I.detail?` \u2014 ${I.detail}`:""}
67
- `);for(let D of I.warnings)process.stderr.write(` ${D}
68
- `)}i.emit(fn({execution:w.execution?{id:w.execution.id,status:w.execution.status,evidence_id:w.execution.evidenceId}:null,authored:w.authored.map(D=>({path:D.relPath,test_id:D.testId,commit_id:D.commitId,execution_id:D.executionId,...D.sourceExecutionId?{source_execution_id:D.sourceExecutionId}:{},status:D.overallStatus,published:D.published})),totals:w.totals,durationS:(Date.now()-y)/1e3,upload:w.upload,cancelled:w.cancelled,remote:{backend:r,jobId:w.hxJobId,jobUrl:w.jobUrl,sessionsPath:w.sessionsPath}}));try{let D=Fi({executionId:w.execution?.id,executionStatus:w.execution?.status,authored:w.authored,cwd:n});if(i.isTTYView)process.stderr.write(`
69
- Remote job: ${w.jobUrl||"(job id not captured)"}
70
- `),process.stderr.write(`Sessions: ${w.sessionsPath}
71
- `),D.length&&await Vi({rows:D,env:m.env});else if(!i.isAgent){process.stderr.write(`
72
- Remote job: ${w.jobUrl||"(job id not captured)"}
73
- `),process.stderr.write(`Sessions: ${w.sessionsPath}
74
- `);let x=Li(D);if(x.length){process.stderr.write(`
53
+ Run them locally (drop --remote), or deselect them (--match/--tags).`}),s.length&&r.push({code:"mobile_remote_mixed",detail:`this selection mixes ${s.length} web and ${a.length} device test(s), and one grid job runs one or the other.
54
+ Split it into two runs (--match/--tags), e.g. one for the device tests and one for the rest.`}),l.length&&u.length&&r.push({code:"mobile_remote_mixed_platform",detail:`this selection mixes ${l.length} emulator and ${u.length} simulator test(s), and one grid job runs one platform.
55
+ Split it into two runs (--match/--tags), one per platform.`});let h=[...new Set(l.map(_=>_.osVersion).filter(_=>!!_))];h.length>1&&r.push({code:"mobile_os_version_split",detail:`device tests in this selection ask for different Android versions (${h.join(", ")}), and one grid job allocates one device.
56
+ Split it into one run per version (--match/--tags), or pass --os-version to force one.`});let k=e.exists??Ba,b=a.filter(_=>_.app&&!Mt(_.app.trim())&&!k(_.app.trim()));b.length&&r.push({code:"mobile_app_missing",detail:`${b.length} device test(s) name a build that is not on this machine:
57
+ `+b.map(_=>` ${_.relPath} -> ${_.app}`).join(`
58
+ `)+"\n The build is uploaded from here before dispatch, so it has to exist here. Fix the path, or set the file's `app:` to an APP\u2026 id from `kane-cli apps list`."});let v=a.filter(_=>_.app&&!Mt(_.app.trim())&&k(_.app.trim())).map(_=>({m:_,why:$o(_.app.trim(),Cn(_.platform))})).filter(_=>_.why!==null);v.length&&r.push({code:"mobile_app_not_uploadable",detail:`${v.length} device test(s) name a build the cloud cannot take:
59
+ `+v.map(({m:_,why:P})=>` ${_.relPath}: ${P}`).join(`
60
+ `)+"\n Emulators take an .apk; simulators take a .zip of the .app bundle (built for the simulator). Or set the file's `app:` to an APP\u2026 id from `kane-cli apps list`."})}t.plan.checks.some(d=>d.memberClass==="author")&&t.projectId&&t.plan.projectId&&t.projectId!==t.plan.projectId&&r.push({code:"project_authority_conflict",detail:Ar(t.projectId,t.plan.projectId)});let m=t.plan.checks.filter(d=>{let h=qa(t.cwd,Wa(d.path));return h===".."||h.startsWith(`..${Ka}`)||Ha(h)});m.length&&r.push({code:"member_outside_payload",detail:`${m.length} test(s) live outside the directory being dispatched (${t.cwd}), so they cannot ride the payload:
61
+ `+m.map(d=>` ${d.path}`).join(`
62
+ `)+`
63
+ Run from a directory that contains them, or move them into this one.`});let p=[];for(let d of t.plan.checks)if(d.memberClass==="replay")try{let h=i(d.path);for(let k of h.files)p.push(k.abs)}catch(h){r.push({code:"bundle_error",detail:`${d.relPath}: ${h instanceof Error?h.message:String(h)}`})}else p.push(d.path);if(t.kaneDist){let d=Wa(t.cwd,t.kaneDist),h=qa(t.cwd,d);h===".."||h.startsWith(`..${Ka}`)||Ha(h)?r.push({code:"kane_dist_outside_cwd",detail:`--kane-dist ${t.kaneDist} resolves outside the payload \u2014 it cannot be uploaded.`}):(e.exists??Ba)(d)?p.push(d):r.push({code:"kane_dist_missing",detail:`--kane-dist ${t.kaneDist} does not exist.
64
+ Build it (npm run build in kane-cli/) and copy the dist/ dir to that path inside this project.`})}let g=ud(p,{checkIgnore:d=>o(d,t.cwd)});return g.length&&r.push({code:"gitignored_inputs",detail:`${g.length} required input(s) are gitignored and won't reach the grid:
65
+ `+g.map(d=>` ${d}`).join(`
66
+ `)+"\n Fix: un-ignore them (e.g. `!output-*/`) or commit them, then re-run."}),{ok:r.length===0,errors:r,requiredInputs:p}}import{existsSync as wd,mkdirSync as yd,readFileSync as kd,writeFileSync as _d}from"fs";import{isAbsolute as xd,join as $r,relative as za,sep as Cd}from"path";function Ja(t){let e=[];return t.author===!0&&e.push("--author"),t.adaptiveHeal===!1&&e.push("--no-adaptive-heal"),t.testmdSync===!1&&e.push("--no-testmd-sync"),e}function Ga(t){return t.length?` ${t.join(" ")}`:""}import{existsSync as pd,readFileSync as fd}from"fs";var gd={deviceName:"iPhone 15",osVersion:"17.5",runson:{}},hd={runson:"mac26",deviceName:"Galaxy A53 5G",osVersion:"15",queueTimeout:300,appiumPort:4739,androidHome:"$HOME/android-sdk-shim",globalTimeout:90,testSuiteTimeout:90,testSuiteStep:45,ios:gd},vd={runson:"mac",concurrency:1,timeoutMinutes:120,mobile:hd},ct=(t,e)=>typeof t=="string"&&t.trim()!==""?t.trim():e,dt=(t,e)=>typeof t=="number"&&Number.isInteger(t)&&t>0?t:e;function Sn(t=J,e="remote-execution"){let n={};try{let a=ms(e,t);pd(a)&&(n=JSON.parse(fd(a,"utf8")))}catch{}let i=typeof n.mobile=="object"&&n.mobile!==null?n.mobile:{},o=typeof i.ios=="object"&&i.ios!==null?i.ios:{},r=vd;return{runson:ct(n.runson,r.runson),concurrency:dt(n.concurrency,r.concurrency),timeoutMinutes:dt(n.timeoutMinutes,r.timeoutMinutes),mobile:{runson:ct(i.runson,r.mobile.runson),deviceName:ct(i.deviceName,r.mobile.deviceName),osVersion:ct(i.osVersion,r.mobile.osVersion),queueTimeout:dt(i.queueTimeout,r.mobile.queueTimeout),appiumPort:dt(i.appiumPort,r.mobile.appiumPort),androidHome:ct(i.androidHome,r.mobile.androidHome),globalTimeout:dt(i.globalTimeout,r.mobile.globalTimeout),testSuiteTimeout:dt(i.testSuiteTimeout,r.mobile.testSuiteTimeout),testSuiteStep:dt(i.testSuiteStep,r.mobile.testSuiteStep),ios:{deviceName:ct(o.deviceName,r.mobile.ios.deviceName),osVersion:ct(o.osVersion,r.mobile.ios.osVersion),runson:bd(o.runson)}}}}function bd(t){if(typeof t!="object"||t===null)return{};let e={};for(let[n,i]of Object.entries(t))n.trim()!==""&&typeof i=="string"&&i.trim()!==""&&(e[n.trim()]=i.trim());return e}var Sd={android:"emulator",ios:"simulator"};function Ed(t){return t.plan.checks.some(e=>e.mobile)}function Xa(t){let e=t.plan.checks.find(n=>n.mobile);if(e)return e.platform==="ios"?"ios":"android"}function Id(t){if(!t)return{timeouts:"",deviceDirective:"",devicePre:"",devicePostLogin:""};let{platform:e,slug:n,mobile:i}=t;return{timeouts:`globalTimeout: ${i.globalTimeout}
67
+ testSuiteTimeout: ${i.testSuiteTimeout}
68
+ testSuiteStep: ${i.testSuiteStep}
69
+ `,deviceDirective:`framework:
70
+ name: kane-cli
71
+ args:
72
+ platformName: ${e}
73
+ isRealMobile: false
74
+ isVirtualDevice: true
75
+ queueTimeout: ${i.queueTimeout}
76
+ devices:
77
+ - "${n}"
78
+ `,devicePre:"",devicePostLogin:` - kane-cli doctor --target ${Sd[e]} --install
79
+ `}}function Rd(t){let e=Object.entries(t.appIds??{});return e.length===0?"":` case "$test" in
80
+ `+e.map(([n,i])=>` ${Qa(n)}) KANE_APP=${i} ;;
81
+ `).join("")+` *) KANE_APP= ;;
82
+ esac
83
+ `}function Qa(t){return`'${t.replace(/'/g,"'\\''")}'`}function Td(t){let e=t.devicePlatform??Xa(t),n=Object.keys(t.appIds??{}).length?" ${KANE_APP:+--app $KANE_APP}":"";if(e==="ios"){let i=t.deviceFlags??{};return(i.deviceName?` --device-name ${Qa(i.deviceName)}`:"")+(i.osVersion?` --os-version ${i.osVersion}`:"")+n}return e==="android"?(t.deviceLabel?.osVersion?` --os-version ${t.deviceLabel.osVersion}`:"")+n:""}function Pr(t,e){let n=t;for(let[i,o]of Object.entries(e))n=n.split(`{{${i}}}`).join(o);return n}function Ad(t){let e=t.map(o=>({relPath:o.relPath,absPath:o.path,memberClass:o.memberClass,testId:o.testId,commitId:o.commitId}));return{discoveryCommand:`printf '%s\\n' ${e.map(o=>`'${o.relPath}'`).join(" ")}`,members:e}}function Pd(t,e,n=[]){let i=t.map(a=>za(e,Ae(a.absPath))),o=[...new Set(n)].filter(a=>!i.includes(a));return[...[...i,...o].map(a=>` - "${a}/**"`)," - .testmuai/evidence/**"," - artifacts/session/**"].join(`
84
+ `)}function $d(t,e,n){let i=n??(l=>{try{return st(l).unitFiles.map(u=>u.file).filter(u=>u!==l)}catch{return[]}}),o=new Set(t.map(l=>l.absPath)),r=[],a=[],s=new Set;for(let l of t)for(let u of i(l.absPath)){if(o.has(u)||s.has(u))continue;s.add(u);let c=Ae(u),m=za(e,c);if(m===".."||m.startsWith(`..${Cd}`)||xd(m)){a.push({unitAbsPath:u,reason:"outside payload cwd \u2014 cannot round-trip through the grid"});continue}let p;try{let g=$r(c,".internal","meta.json");if(wd(g)){let d=JSON.parse(kd(g,"utf8"));typeof d.commit_id=="string"&&d.commit_id&&(p=d.commit_id)}}catch{}r.push({unitAbsPath:u,tapeDir:c,relTape:m,...p?{dispatchCommitId:p}:{}})}return{tapes:r,skipped:a}}function Dd(t){return t.projectId?` --project-id ${t.projectId}${t.folderId?` --folder-id ${t.folderId}`:""}`:""}var Od=new Set(["--author","--no-testmd-sync"]);function Md(t){return t.some(e=>Od.has(e))?ye:"latest"}async function Nd(t){let e=new Ui(oe(t.env).secretsBaseUrl),n={username:t.auth.username,accessKey:t.auth.access_key,orgId:t.orgId};await e.pushSecret({secretKey:"LT_USERNAME",secretValue:t.auth.username,...n}),await e.pushSecret({secretKey:"LT_ACCESS_KEY",secretValue:t.auth.access_key,...n})}async function Za(t,e={}){let n=e.base??J,i=$r(ps("remote-execution",n),t.jobId);yd(i,{recursive:!0});let{discoveryCommand:o,members:r}=Ad(t.plan.checks),{tapes:a,skipped:s}=$d(r,t.cwd);await(e.pushSecrets??Nd)(t);let l=e.config??Sn(n),u=Ed(t);if(u&&!t.deviceSlug)throw new Error("device job prepared without a resolved device slug \u2014 preflight should have set one");let c=u?t.devicePlatform??Xa(t):void 0;if(c==="ios"&&!t.devicePool&&!t.runson&&!e.runson)throw new Error("simulator job prepared without a resolved pool \u2014 preflight should have set one");let m=Id(u?{platform:c,slug:t.deviceSlug,mobile:l.mobile}:null),p=e.runson??t.runson??(c==="ios"?t.devicePool:u?l.mobile.runson:l.runson),g=c==="ios"?ys:u?ws:vs,d=t.memberFlags??[],h=t.kaneDist?Pr(bs,{kaneDist:t.kaneDist}):"",k=Pr(fs,{runnerBody:g}),b=Pr(k,{runson:p,concurrency:String(t.parallel),env:t.env,kaneVersion:e.kaneVersion??t.kaneVersion??Md(d),discoveryCommand:o,uploadPaths:Pd(r,t.cwd,a.map(_=>_.relTape)),projectFolderFlags:Dd(t),memberFlags:Ga(d),deviceFlags:Td(t),appLookup:Rd(t),kaneDistSwap:h,sessionMark:gs,sessionCopy:hs,...m}),v=$r(i,".hyperexecute.yaml");return _d(v,b),{job:t,jobDir:i,yamlPath:v,members:r,importTapes:a,...s.length>0?{skippedImports:s}:{}}}import{spawn as jd,execFileSync as Fd}from"child_process";import{join as Vd}from"path";function Ld(t){let e=t.match(/Job Link:\s*(https?:\/\/\S*?[?&]jobId=([0-9a-fA-F-]{36}))/);return e?{url:e[1],jobId:e[2]}:null}function Ud(){try{return Fd("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),!0}catch{return!1}}function Bd(t){return t.binaryPath?t.binaryPath:(t.onPath??Ud)()?"hyperexecute":vn()}function el(t,e){if(!t)return;let n="";t.on("data",i=>{n+=String(i);let o;for(;(o=n.indexOf(`
85
+ `))>=0;)e(n.slice(0,o)),n=n.slice(o+1)}),t.on("end",()=>{n.length&&e(n)})}async function tl(t,e={}){let n=t.job,i=Bd(e),o=Vd(t.jobDir,"dl"),r=["--user",n.auth.username,"--key",n.auth.access_key,"--env",n.env,"--config",t.yamlPath,"--concurrency",String(n.parallel),"--download-artifacts","--download-artifacts-path",o],s=(e.spawnImpl??((d,h,k)=>jd(d,h,{cwd:k.cwd})))(i,r,{cwd:n.cwd}),l="",u="",c=d=>{if(e.onLine?.(d),!l){let h=Ld(d);h&&(l=h.jobId,u=h.url)}};el(s.stdout,c),el(s.stderr,c);let m=!1,p=()=>{m=!0;try{s.kill("SIGTERM")}catch{}};e.signal&&(e.signal.aborted?p():e.signal.addEventListener("abort",p,{once:!0}));let g=await new Promise(d=>{s.on("close",h=>d(m?3:typeof h=="number"?h:1)),s.on("error",()=>d(1))});return e.signal?.removeEventListener?.("abort",p),{job:n,prepared:t,hxJobId:l,jobUrl:u,downloadDir:o,exitCode:g,cancelled:m}}import{existsSync as Ne,readdirSync as Rn,statSync as il,mkdirSync as Hd,cpSync as En,readFileSync as sl,writeFileSync as Mr,rmSync as Dr,mkdtempSync as Wd}from"fs";import{tmpdir as qd}from"os";import{join as G,basename as Ue,relative as al}from"path";function Kd(t,e){if(Ne(t)){for(let n of Rn(t).sort())if(n.endsWith(e))return G(t,n)}}function ll(t){return Ne(t)?Rn(t).map(e=>G(t,e)).filter(e=>il(e).isDirectory()):[]}function Yd(t){let e=G(t,"kane-testrun");return ll(e)}function ut(t){try{return JSON.parse(sl(t,"utf8"))}catch{return}}async function cl(t){let e=t.prepared.members,n=t.job.cwd,i=Yd(t.downloadDir),o=e.map(s=>{let l=al(n,Ae(s.absPath));for(let u of i){let c=G(u,l);if(Ne(c))return{member:s,tapeDir:c}}return{member:s}}),r=new Map;for(let s of i)for(let l of ll(G(s,"artifacts","session")))r.has(Ue(l))||r.set(Ue(l),l);let a=(t.prepared.importTapes??[]).map(s=>{for(let l of i){let u=G(l,s.relTape);if(Ne(u))return{prepared:s,pulledDir:u}}return{prepared:s}});return{result:t,perMember:o,sessionDirs:[...r.values()],importTapes:a}}function Jd(t){let e=ut(G(t,"execution.json")),n=ut(G(t,"session.json")),i=Date.parse(String(e?.start_timestamp??"")),o=Date.parse(String(e?.end_timestamp??"")),r=Number.isFinite(i)&&Number.isFinite(o)&&o>=i?(o-i)/1e3:void 0;return{testId:e?.test_id,status:e?.status,packPath:Kd(G(t,"evidence"),".evidence"),uploadStatus:n?.upload_status,...r!==void 0?{durationS:r}:{}}}function nl(t){return t?.uploadStatus==="uploaded"?"yes":t?.uploadStatus==="failed"?"no":"unknown"}function Gd(t){if(t.member.memberClass==="replay"&&t.member.testId)return t.member.testId;if(t.tapeDir){let n=ut(G(t.tapeDir,".internal","meta.json"))?.test_id;if(n)return n;let o=ut(G(t.tapeDir,".internal","execution.json"))?.test_id;if(o)return o}return t.member.testId}function zd(t){if(!t.tapeDir)return;let n=ut(G(t.tapeDir,".internal","meta.json"))?.commit_id;return typeof n=="string"&&n?n:void 0}function Nr(t){try{let e=wt(t,{schema:rn});return e&&typeof e=="object"?e:void 0}catch{return}}function In(t){try{return Nr(sl(t,"utf8"))}catch{return}}function _e(t){return t instanceof Error?t.message:String(t)}function Xd(t,e=3){let n=t.slice(0,e).join("; ");return t.length>e?`${n} (+${t.length-e} more)`:n}function Qd(t){let e=[],n=[],i=o=>{if(!Ne(o))return;let r;try{r=Rn(o).sort()}catch(a){n.push(`readdir ${o}: ${_e(a)}`);return}for(let a of r){let s=G(o,a);try{if(il(s).isDirectory()){i(s);continue}}catch(l){n.push(`stat ${s}: ${_e(l)}`);continue}a==="result.yaml"&&e.push(s)}};return i(t),{files:e,errors:n}}function jr(t,e){let n=[],i=G(t,"run.yaml"),o=In(i),r=o?.environment,a=typeof r?.run_kind=="string"?r.run_kind:void 0;if(o&&r&&a!==void 0){let p={...r};delete p.run_kind,p.run_kind_observed=a,o.environment=p;try{Mr(i,zn(o,{lineWidth:-1,schema:rn}))}catch(g){n.push(`write ${i}: ${_e(g)}`)}}let s=new Map,l=new Map;for(let p of e){let g=p.evidenceClass??p.memberClass;p.gridTestId&&s.set(p.gridTestId,g),l.set(Se(p.relPath),g)}let u=new Set(e.map(p=>p.evidenceClass??p.memberClass)),c=u.size===1?[...u][0]:void 0,m=Qd(G(t,"tests"));n.push(...m.errors);for(let p of m.files){let g=In(p);if(!g)continue;let d={...g.environment??{}},h=typeof d.run_kind=="string"?d.run_kind:a,k=g.external_id,b=typeof k?.test_id=="string"?k.test_id:void 0,v=typeof g.test=="string"?g.test:void 0,_=(b?s.get(b):void 0)??(v?l.get(v)??l.get(v.replace(/-\d+$/,"")):void 0)??c;if(_){d.run_kind=_,h&&h!==_&&(d.run_kind_observed=h),g.environment=d;try{Mr(p,zn(g,{lineWidth:-1,schema:rn}))}catch(P){n.push(`write ${p}: ${_e(P)}`)}}}return{errors:n}}function Zd(t,e){let n=new Map,i=new Map,o=new Map;for(let s of e)s.gridTestId&&i.set(s.gridTestId,s.relPath),o.set(Se(s.relPath),s.relPath);let r=G(t,"tests");if(!Ne(r))return n;let a;try{a=Rn(r).sort()}catch{return n}for(let s of a){let l=In(G(r,s,"result.yaml"));if(!l)continue;let u=l.external_id,c=typeof u?.test_id=="string"?u.test_id:void 0,m=typeof l.test=="string"?l.test:s,p=(c?i.get(c):void 0)??o.get(m)??o.get(m.replace(/-\d+$/,""));if(!p||n.has(p))continue;let g=Array.isArray(l.steps)?l.steps:[],d=l.duration_ms;n.set(p,{acs:cn(g),...typeof d=="number"?{durationMs:d}:{}})}return n}function eu(t){let e=In(G(t,"run.yaml"));return typeof e?.started=="string"?e.started:void 0}function rl(t){if(t.members.length===0)return;let e=[],n=qe(t.cwd);if(!Ne(n))return t.emit(Ye({status:"skipped",reason:"no_context_store",detail:n})),{status:"skipped",reason:"no_context_store",detail:n,synced:0,warnings:e};for(let o of t.members){if(!o.drift)continue;let r=`sync: ${o.relPath} ran a healed definition on the grid (tape commit ${o.drift.tape} \u2260 local ${o.drift.local}) \u2014 the verdict is attached to the local, pre-heal definition`;e.push(r),t.emit(Ye({status:"warning",reason:"heal_drift",detail:r}))}let i=t.members.map(o=>{let r=t.packFacts.get(o.relPath);return{path:o.absPath,verdict:o.verdict,...r?.acs.length?{acs:r.acs}:{},executionId:o.executionId,...r?.durationMs!==void 0?{durationMs:r.durationMs}:{},startedAt:t.startedAt,mode:"testrun",local:t.local,...o.drift?{driftFlag:!0}:{}}});try{let o=t.syncFn({cwd:t.cwd,members:i});e.push(...o.warnings);for(let r of o.warnings)t.emit(Ye({status:"warning",reason:"sync_warning",detail:r}));return o.skipped?(t.emit(Ye({status:"skipped",reason:o.skipped})),{status:"skipped",reason:o.skipped,synced:0,warnings:e}):{status:"synced",synced:o.synced,warnings:e}}catch(o){let r=_e(o);return t.emit(Ye({status:"failed",reason:"sync_error",detail:r})),{status:"failed",reason:"sync_error",detail:r,synced:0,warnings:e}}}function ol(t,e){try{return e()}catch(n){let i=_e(n);try{t(Ye({status:"failed",reason:"sync_error",detail:i}))}catch{}return{status:"failed",reason:"sync_error",detail:i,synced:0,warnings:[]}}}function tu(t,e,n,i){try{let o=i(t,qe(e));o.status==="skipped"&&n(Ir({status:"skipped",reason:o.reason}))}catch(o){let r=_e(o);try{n(Ir({status:"failed",reason:"coverage_error",detail:r}))}catch{}}}async function Fr(t){let e,n=-1/0;for(let i of t){let o;try{let s=await er(i.path,"run.yaml");s&&(o=Nr(s))}catch{}let r=typeof o?.ended=="string"?o.ended:typeof o?.started=="string"?o.started:void 0;if(!r)continue;let a=Date.parse(r);!Number.isNaN(a)&&a>n&&(n=a,e=r)}return e}function nu(t){let e=/collides between packs "([^"]+)" and "([^"]+)"/.exec(t);if(e)return[e[2],e[1]];let n=/^pack "([^"]+)"/.exec(t);return n?[n[1]]:[]}async function ru(t,e){let n=nu(t);if(n.length)for(let i of n){let o=e.find(r=>Ue(r.path,".evidence")===i);if(o)return o;for(let r of e)try{let a=await er(r.path,"run.yaml");if(a&&Nr(a)?.run_id===i)return r}catch{}}}async function Or(t,e){let n=[];for(let i of t){let o=Ue(i.path,".evidence");try{await si(i.path,o,e),n.push(o)}catch{}}return n}async function ou(t,e,n){let i=n.emit??(()=>{}),o=n.mergeFn??an,r,a;try{r=Wd(G(qd(),"kane-remote-merge-rules-")),a=G(r,"merge-rules.yaml"),Mr(a,un())}catch(u){r&&Dr(r,{recursive:!0,force:!0});let c=_e(u),m=await Or(t,e);return i(Qe({reason:"merge_rules_standalone",detail:c,standaloneIds:m})),{kind:"standalone",degraded:{reason:"merge_rules_standalone",detail:c,standaloneIds:m}}}let s=async u=>{let c=_t(),m=Te(c,e);try{return await o(u.map(p=>p.path),{runId:c,out:m,rulesPath:a,finalize:!1}),{ok:!0,execId:c,out:m}}catch(p){return Dr(m,{recursive:!0,force:!0}),{ok:!1,error:p}}},l=u=>u?.code==="ABORT";try{let u=await s(t);if(u.ok)return{kind:"merged",execId:u.execId,out:u.out,used:t};let c=l(u.error)?await ru(_e(u.error),t):void 0;if(c&&t.length>1){let d=Ue(c.path,".evidence"),h=_e(u.error);i(Qe({reason:"merge_abort_excluded_pack",detail:h,excludedPack:d}));let k=t.filter(P=>P!==c),b=await s(k);if(b.ok)return{kind:"merged",execId:b.execId,out:b.out,used:k,degraded:{reason:"merge_abort_excluded_pack",detail:h}};let v=await Or(t,e),_=_e(b.error);return i(Qe({reason:"merge_abort_standalone",detail:_,standaloneIds:v})),{kind:"standalone",degraded:{reason:"merge_abort_standalone",detail:_,standaloneIds:v}}}let m=await Or(t,e),p=l(u.error)?"merge_abort_standalone":"merge_error_standalone",g=_e(u.error);return i(Qe({reason:p,detail:g,standaloneIds:m})),{kind:"standalone",degraded:{reason:p,detail:g,standaloneIds:m}}}finally{r&&Dr(r,{recursive:!0,force:!0})}}async function dl(t,e={}){let n=t.result,i=n.job.cwd,o=(n.job.memberFlags??[]).includes("--author"),r=e.sessionsRoot??G(J,"sessions","remote"),a=G(r,n.hxJobId||"unknown-job");Hd(a,{recursive:!0});let s=new Map;for(let C of t.sessionDirs){Ne(C)&&En(C,G(a,Ue(C)),{recursive:!0});let D=Jd(C);D.testId&&!s.has(D.testId)&&s.set(D.testId,D)}let l=[],u=[],c=[],m=[],p=0,g=0,d=0,h=0,k,b;for(let C of t.perMember){let D=zd(C),M=C.member.commitId;C.tapeDir&&Ne(C.tapeDir)&&En(C.tapeDir,Ae(C.member.absPath),{recursive:!0});let V=Gd(C),$=V?s.get(V):void 0;$&&h++;let z=$?.status==="success"||$?.status==="passed";$?z?p++:g++:d++;let Q=$?.packPath,De=C.member.memberClass;if(Q){let be={path:Q,memberClass:De,gridTestId:V,relPath:C.member.relPath,...o?{evidenceClass:"author"}:{}};(De==="author"?c:u).push(be),De==="replay"?k??=V:b??=V}if(m.push({absPath:C.member.absPath,relPath:C.member.relPath,verdict:z?"passed":"failed",...Q?{packId:Ue(Q,".evidence")}:{},...V?{gridTestId:V}:{},...M&&D&&M!==D&&!o?{drift:{tape:D,local:M}}:{}}),De==="author"){let be=$?z?"passed":"failed":"broken",mt=$?z?0:1:2,Ze=$?.durationS??0;Q?l.push({relPath:C.member.relPath,testId:V??C.member.testId,commitId:C.member.commitId,sourceExecutionId:Ue(Q,".evidence"),overallStatus:be,exitCode:mt,durationS:Ze,published:nl($)}):l.push({relPath:C.member.relPath,overallStatus:be,exitCode:mt,durationS:Ze,published:nl($)})}}let v=[...u,...c],_=null,P="skipped",f,S,y=e.emit??(()=>{}),R=e.syncFn??dn,N=!e.publishFn;{let C=new Set(n.prepared.members.map(D=>D.absPath));for(let D of t.importTapes??[]){let M=D.prepared;if(C.has(M.unitAbsPath)||!D.pulledDir||!Ne(D.pulledDir))continue;let V=ut(G(D.pulledDir,".internal","meta.json")),$=typeof V?.commit_id=="string"&&V.commit_id?V.commit_id:void 0,z=ut(G(M.tapeDir,".internal","meta.json")),Q=typeof z?.commit_id=="string"&&z.commit_id?z.commit_id:void 0;if(M.dispatchCommitId?Q!==void 0&&Q!==M.dispatchCommitId:Q!==void 0){y(Bt({path:M.relTape,status:"kept_local_drift",localCommit:Q,...M.dispatchCommitId?{dispatchCommit:M.dispatchCommitId}:{},gridCommit:$}));continue}try{En(D.pulledDir,M.tapeDir,{recursive:!0})}catch(be){y(Ye({status:"warning",reason:"import_tape_writeback_failed",detail:`${M.relTape}: ${be instanceof Error?be.message:String(be)}`}));continue}y(Bt({path:M.relTape,status:"written",...M.dispatchCommitId?{dispatchCommit:M.dispatchCommitId}:{},...$?{gridCommit:$}:{}})),$&&M.dispatchCommitId&&$!==M.dispatchCommitId&&y(Ye({status:"warning",reason:"import_heal_drift",detail:`imported unit ${al(i,M.unitAbsPath)} healed on the grid (dispatch ${M.dispatchCommitId} \u2192 grid ${$}) \u2014 tape written home; the local source file still holds the pre-heal definition`}))}}if(v.length){let C=await ou(v,i,e);if(f=C.degraded,C.kind==="merged"){try{let $=jr(C.out,C.used);if($.errors.length){let z=Xd($.errors);y(Qe({reason:"stamp_incomplete",detail:z})),f=f??{reason:"stamp_incomplete",detail:z}}}catch($){let z=_e($);y(Qe({reason:"stamp_failed",detail:z})),f=f??{reason:"stamp_failed",detail:z}}let D=new Set(C.used.map($=>Ue($.path,".evidence")));S=ol(y,()=>rl({cwd:i,members:m.filter($=>$.packId&&D.has($.packId)).map($=>({...$,executionId:C.execId})),packFacts:Zd(C.out,C.used),startedAt:eu(C.out)??new Date().toISOString(),local:N,emit:y,syncFn:R})),tu(C.out,i,y,e.coverageWriter??xt);let M=!0;try{let $=await Fr(C.used)??new Date().toISOString();await(e.sealFn??kt)(C.out,$)}catch($){let z=_e($);y(Qe({reason:"seal_failed",detail:z})),f={reason:"seal_failed",detail:z},M=!1}_={id:C.execId,status:g>0?"failed":"passed",evidenceId:C.execId};let V=new Set(C.used.map($=>Ue($.path,".evidence")));for(let $ of l)$.sourceExecutionId&&V.has($.sourceExecutionId)&&($.executionId=C.execId);try{Ne(C.out)&&En(C.out,G(a,`execution-${C.execId}.evidence`),{recursive:!0})}catch{}if(e.publishFn&&M&&!n.cancelled){try{let Q=await(e.validateFn??yt)(C.out,"L1");Q.valid||e.log?.("warn","EVIDENCE_INVALID","Sealed remote testrun pack failed L1 validation",{execution_id:C.execId,first_code:String(Q.diagnostics?.[0]?.code??""),surface:"testrun_remote"})}catch(Q){e.log?.("warn","TESTRUN_VALIDATION_ERROR","Remote testrun pack validation threw",{execution_id:C.execId,error:String(Q)})}let $=k??b,z=n.job.plan.projectId??n.job.projectId;if($&&z){let Q=await e.publishFn({testId:$,sessionId:C.execId,executionId:C.execId,sealedPackPath:C.out,projectId:z});P=Q.ok?"ok":"failed",y(St(Q,C.execId))}}}else{let D=new Set(C.degraded.standaloneIds??[]);for(let M of l)M.sourceExecutionId&&D.has(M.sourceExecutionId)&&(M.executionId=M.sourceExecutionId);S=ol(y,()=>rl({cwd:i,members:m.filter(M=>M.packId&&D.has(M.packId)).map(M=>({...M,executionId:M.packId})),packFacts:new Map,startedAt:new Date().toISOString(),local:N,emit:y,syncFn:R}))}}let I={tests:t.perMember.length,passed:p,failed:g,broken:d,skipped:0,authored:l.length};return{execution:_,authored:l,totals:I,upload:P,hxJobId:n.hxJobId,jobUrl:n.jobUrl,sessionsPath:a,cancelled:n.cancelled,...t.perMember.length>0&&h===0?{artifactless:!0}:{},...f?{degraded:f}:{},...S?{execSync:S}:{}}}var ul={id:"hyper",preflight:Ya,prepare:Za,dispatch:tl,collect:cl,reconcile:dl};var iu={hyper:ul};function ml(t){return iu[t]}import{existsSync as gl,readFileSync as hl}from"fs";import{join as au}from"path";var su=["name","version","backendId","kaneCompat"];function pl(t){if(typeof t!="object"||t===null)throw new Error("manifest must be an object");let e=t;for(let i of su)if(typeof e[i]!="string"||e[i].length===0)throw new Error(`manifest missing required string field '${i}'`);let n={name:e.name,version:e.version,backendId:e.backendId,kaneCompat:e.kaneCompat};return e.defaults&&typeof e.defaults=="object"&&(n.defaults=e.defaults),n}function fl(t,e){let n=r=>{let a=r.replace(/^[v=]+/,"").split(".").map(s=>parseInt(s,10));return[a[0]||0,a[1]||0,a[2]||0]},i=(r,a)=>r[0]-a[0]||r[1]-a[1]||r[2]-a[2],o=n(t);return e.startsWith(">=")?i(o,n(e.slice(2)))>=0:i(o,n(e))===0}function Rt(t,e=J){let n=us(t,e);if(!gl(n))return{ok:!1,reason:"not_installed"};let i=hl(n,"utf8").trim();if(!i)return{ok:!1,reason:"corrupt",detail:"empty current pointer"};let o=ds(t,i,e),r=au(o,"plugin.json");if(!gl(r))return{ok:!1,reason:"corrupt",detail:`current points at ${i} but ${r} is missing`};let a;try{a=pl(JSON.parse(hl(r,"utf8")))}catch(s){return{ok:!1,reason:"corrupt",detail:s.message}}return fl(ye,a.kaneCompat)?{ok:!0,plugin:{name:t,version:i,dir:o,manifest:a}}:{ok:!1,reason:"incompatible",detail:`plugin needs kane-cli ${a.kaneCompat}, have ${ye}`}}async function vl(t,e={}){let n=e.creds??new de,i=t.envFlag??n.getDefaultEnv()??"prod",o=Rt("remote-execution",t.base);if(!o.ok)return{ok:!1,code:o.reason==="incompatible"?"plugin_incompatible":"plugin_missing",detail:o.reason==="incompatible"?`remote-execution plugin is incompatible${o.detail?`: ${o.detail}`:""}`:"remote-execution plugin is not installed \u2014 run `kane-cli plugin install remote-execution`"};let r=await Le({creds:n,env:i,usernameFlag:t.usernameFlag,accessKeyFlag:t.accessKeyFlag,log:t.log});if(!r.basicAuth)return{ok:!1,code:"no_basic_auth",detail:"HyperExecute needs a LambdaTest username + access key \u2014 log in with basic auth or pass --user/--key"};let a=r.resolvedCreds?.org_id!=null?String(r.resolvedCreds.org_id):"",s=n.getActiveProfile()??"default",l=(t.memberClasses??[]).includes("author"),u=Lo(n,s,i);if(l&&u.projectId&&t.planProjectId&&u.projectId!==t.planProjectId)return{ok:!1,code:"project_authority_conflict",detail:Ar(u.projectId,t.planProjectId)};let c=u.projectId??void 0,m=u.folderId??void 0,p;if(l&&!t.dryRun){let g,d=await sn({creds:n,config:e.config??new Re,profile:s,env:i,tmsCreds:r.basicAuth,isLocal:!!t.local,log:t.log,onFatalExit:h=>{g=h}});if(d.status==="ok")c=d.projectId,m=d.folderId,p=d.autoDefaulted;else if(d.status!=="skip")return{ok:!1,code:"project_folder",detail:g?.trim()||"could not resolve a TMS project/folder for the grid login"}}return{ok:!0,ctx:{env:i,auth:r.basicAuth,orgId:a,plugin:o.plugin,projectId:c,folderId:m,resolvedCreds:r.resolvedCreds??null,...p?{autoDefaulted:p}:{}}}}import{mkdirSync as cu,readFileSync as du,renameSync as uu,writeFileSync as mu}from"fs";import{dirname as pu}from"path";function Be(t){let e=t.indexOf(".");return e>=0?t.slice(0,e):t}var Je=t=>typeof t=="string"&&t.trim()!=="";function wl(t){if(typeof t!="object"||t===null)return{};let e={};for(let[n,i]of Object.entries(t))typeof i=="string"&&(e[n]=i);return e}function lu(t,e,n){if(typeof t!="object"||t===null)return null;let i=t;if(!Je(i.name)||!Je(i.brand)||!Array.isArray(i.osVersions)||i.osVersions.length===0)return null;let o=[];for(let s of i.osVersions)Je(s)&&n.has(s)&&!o.includes(s)&&o.push(s);if(o.length===0)return null;if(e==="ios")return{name:i.name,brand:i.brand,osVersions:o};if(!Je(i.configName))return null;let r=i.avdIds;if(typeof r!="object"||r===null)return null;let a={};for(let s of o){let l=r[s];if(!Je(l))return null;a[s]=l}return{name:i.name,brand:i.brand,configName:i.configName,osVersions:o,avdIds:a}}function Tn(t){if(typeof t!="object"||t===null)return{catalog:null,reason:"not an object"};let e=t;if(typeof e.schemaVersion!="number"||!Number.isInteger(e.schemaVersion)||e.schemaVersion<1)return{catalog:null,reason:"schemaVersion missing or not a positive integer"};if(e.schemaVersion>1)return{catalog:null,reason:`catalog schemaVersion ${e.schemaVersion} is newer than this kane-cli understands (${1}) \u2014 upgrade kane-cli`};if(!Je(e.platform))return{catalog:null,reason:"platform is empty"};if(e.platform!=="android"&&e.platform!=="ios")return{catalog:null,reason:`platform "${e.platform}" is not android or ios`};let n=e.platform;if(!Array.isArray(e.supportedOsVersions)||e.supportedOsVersions.length===0)return{catalog:null,reason:"supportedOsVersions is empty"};let i=e.supportedOsVersions.filter(Je);if(i.length===0)return{catalog:null,reason:"supportedOsVersions has no usable entries"};if(!Array.isArray(e.devices)||e.devices.length===0)return{catalog:null,reason:"catalog has no devices"};let o;if(n==="ios"){o=wl(e.runson);for(let u of i)if(!Je(o[Be(u)]))return{catalog:null,reason:`ios catalog has no runson pool for iOS ${Be(u)}`}}let r=new Set(i),a=[],s=new Set;for(let u of e.devices){let c=lu(u,n,r);c&&(s.has(c.name)||(s.add(c.name),a.push(c)))}if(a.length===0)return{catalog:null,reason:"no valid devices survived validation"};let l=typeof e.source=="object"&&e.source!==null?e.source:{};return{catalog:{schemaVersion:e.schemaVersion,generatedAt:typeof e.generatedAt=="string"?e.generatedAt:"",platform:n,supportedOsVersions:i,...o?{runson:o}:{},source:{marketApi:typeof l.marketApi=="string"?l.marketApi:"",deviceConfigVersions:wl(l.deviceConfigVersions),...Je(l.filter)?{filter:l.filter}:{}},devices:a}}}var yl=1,fu=1440*60*1e3;function kl(t,e=Date.now()){return t!==null&&e-t.fetchedAt<fu}function _l(t,e=Date.now()){return Math.max(0,Math.floor((e-t.fetchedAt)/(3600*1e3)))}function xl(t,e="android",n=Kn(t,e)){try{let i=JSON.parse(du(n,"utf-8"));if(i.wrapperVersion!==yl)return null;let{catalog:o}=Tn(i.catalog);return!o||o.platform!==e?null:{catalog:o,fetchedAt:typeof i.fetchedAt=="number"?i.fetchedAt:0}}catch{return null}}function Cl(t,e,n=Date.now(),i=Kn(t,e.platform)){try{cu(pu(i),{recursive:!0});let o={wrapperVersion:yl,writtenByVersion:ye,fetchedAt:n,catalog:e},r=`${i}.tmp`;mu(r,`${JSON.stringify(o)}
86
+ `,{encoding:"utf-8"}),uu(r,i)}catch{}}async function gu(t,e,n){return new vt(oe(t).controllerBaseUrl,{username:e.username,accessKey:e.accessKey}).getMobileDeviceCatalog(n)}async function Wt(t,e,n={}){let i=n.now??Date.now,o=n.platform??"android",r=n.readCacheFn??xl,a=n.writeCacheFn??Cl,s=n.fetchCatalog??gu,l=null;try{l=r(t,o)}catch{l=null}if(kl(l,i()))return{ok:!0,catalog:l.catalog,origin:"cache"};let u;try{let c=await s(t,e,o),{catalog:m,reason:p}=Tn(c);if(m&&m.platform!==o)u=`the controller served the ${m.platform} catalog when ${o} was asked for (controller too old for ?platform=${o}?)`;else{if(m)return a(t,m,i()),{ok:!0,catalog:m,origin:"network"};u=`the controller returned a catalog this kane-cli cannot read (${p})`}}catch(c){u=c.message}if(l){let c=_l(l,i());return{ok:!0,catalog:l.catalog,origin:"stale-cache",ageHours:c,warning:`could not refresh the device catalog (${u}) \u2014 using the cached copy from ${c}h ago. A device added since then will not be listed.`}}return{ok:!1,reason:`could not fetch the ${o==="ios"?"simulator":"emulator"} device catalog: ${u}
87
+ The catalog names which devices HyperExecute can provision, so a device cannot be validated without it.
88
+ Check your connection and credentials`+(o==="android"?", or bypass validation with --device-slug <slug>.":".")}}function Tt(t){return t.toLowerCase().replace(/\+/g,"plus").replace(/[^a-z0-9]/g,"")}function An(t){return t==="ios"?{os:"iOS",device:"simulator",target:"simulator"}:{os:"Android",device:"emulator",target:"emulator"}}var hu=.4,vu=3;function bu(t,e,n){let i=Tt(e);if(i==="")return[];let o=Math.max(1,Math.round(i.length*hu)),r=[];for(let a of t.devices){if(n&&!a.osVersions.includes(n))continue;let s=Math.min(Vt(i,Tt(a.name)),a.configName?Vt(i,Tt(a.configName)):1/0);s<=o&&r.push({device:a,score:s})}return r.sort((a,s)=>a.score-s.score||a.device.name.localeCompare(s.device.name)),r.slice(0,vu).map(a=>a.device)}function wu(t,e){let n=Number.parseFloat(e);if(!Number.isFinite(n))return t.osVersions[t.osVersions.length-1];let i,o=1/0;for(let r of t.osVersions){let a=Math.abs(Number.parseFloat(r)-n);Number.isFinite(a)&&a<o&&(o=a,i=r)}return i??t.osVersions[t.osVersions.length-1]}function Sl(t){return` See all devices: kane-cli devices list --target ${An(t).target} --remote`}function yu(t,e){let n=Tt(e);return t.devices.find(i=>Tt(i.name)===n||i.configName!==void 0&&Tt(i.configName)===n)}function El(t,e){return t.runson?.[Be(e)]}function Vr(t,e,n){let i=An(t.platform),o=yu(t,e);if(!o){let r=bu(t,e,n),a=r.length?` Did you mean: ${r.map(s=>`${s.name} (${s.osVersions.join(", ")})`).join(`
89
+ `)}
90
+ `:"";return{ok:!1,code:"device_not_found",detail:`no ${i.device} device named "${e}"`+(n&&r.length?` running ${i.os} ${n}`:"")+`.
91
+ ${a}${Sl(t.platform)}`}}if(!o.osVersions.includes(n)){let r=wu(o,n);return{ok:!1,code:"device_os_version_unsupported",detail:`${o.name} does not run ${i.os} ${n}.
92
+ Supported: ${o.osVersions.join(", ")}`+(r?` \u2014 nearest is ${r}.`:".")+`
93
+ ${Sl(t.platform)}`}}return t.platform==="ios"?{ok:!0,resolved:{device:o,osVersion:n,slug:`${o.name}-${n}`,...El(t,n)?{pool:El(t,n)}:{}}}:{ok:!0,resolved:{device:o,osVersion:n,slug:`${o.configName}-${n}`,avdId:o.avdIds?.[n]}}}function ku(t){let e=t.lastIndexOf("-");if(e<0)return;let n=t.slice(e+1);return/^\d+(\.\d+)*$/.test(n)?n:void 0}function _u(t){let e=t.checks.find(n=>n.mobile);if(e)return e.platform==="ios"?"ios":"android"}async function Il(t,e,n={}){let i=n.config??Sn(n.base),o=_u(t);if(!o)return{ok:!1,errors:[{code:"invalid_plan",detail:"no device member in a device job"}]};let r=t.checks.filter(a=>a.mobile);return o==="ios"?Cu(r,e,i,n):xu(r,e,i,n)}async function xu(t,e,n,i){let o=t.filter(c=>c.deviceName).map(c=>`${c.relPath} (device_name: ${c.deviceName})`),r=t.find(c=>c.osVersion)?.osVersion,a=(e.osVersion??r??n.mobile.osVersion).trim();if(e.deviceSlug){let c=e.deviceSlug.trim(),m=ku(c);return{ok:!0,device:{platform:"android",slug:c,label:{name:c,osVersion:m??a,avdId:"(unvalidated --device-slug)"},ignoredDeviceNames:o}}}let s=(e.deviceName??n.mobile.deviceName).trim(),l=await(i.resolveCatalogFn??Wt)(e.env,e.auth,{platform:"android"});if(!l.ok)return{ok:!1,errors:[{code:"device_catalog_unavailable",detail:l.reason}]};let u=Vr(l.catalog,s,a);return u.ok?{ok:!0,device:{platform:"android",slug:u.resolved.slug,label:{name:u.resolved.device.name,osVersion:u.resolved.osVersion,...u.resolved.avdId?{avdId:u.resolved.avdId}:{}},ignoredDeviceNames:o,...l.warning?{warning:l.warning}:{}}}:{ok:!1,errors:[{code:u.code,detail:u.detail+(e.deviceName?"":`
94
+ (device name came from the remote-execution plugin config, not a flag \u2014 pass --device-name to override)`)}]}}async function Cu(t,e,n,i){let o=An("ios");if(e.deviceSlug)return{ok:!1,errors:[{code:"device_slug_android_only",detail:`--device-slug names a HyperExecute emulator slug; a simulator job has no slug to bypass to.
95
+ Use --device-name/--os-version, or the members' own device_name:/os_version:.`}]};let r=await(i.resolveCatalogFn??Wt)(e.env,e.auth,{platform:"ios"});if(!r.ok)return{ok:!1,errors:[{code:"device_catalog_unavailable",detail:r.reason}]};let a=r.catalog,s=e.deviceName?.trim(),l=e.osVersion?.trim(),u=h=>n.mobile.ios.runson[Be(h)]??a.runson?.[Be(h)],c=new Map,m=new Map,p;for(let h of t){let k=s??h.deviceName?.trim()??n.mobile.ios.deviceName,b=l??h.osVersion?.trim()??n.mobile.ios.osVersion,v=Vr(a,k,b);if(!v.ok){let S=s?"--device-name":h.deviceName?`${h.relPath} device_name:`:"the remote-execution plugin config",y=l?"--os-version":h.osVersion?`${h.relPath} os_version:`:"the remote-execution plugin config",R=`${v.code}
96
+ ${v.detail}`,N=c.get(R)??{code:v.code,detail:v.detail,sources:[]};N.sources.push(`device name from ${S}; ${o.os} version from ${y}`),c.set(R,N);continue}let _=v.resolved.pool??u(b);if(!_){let S=`device_pool_unknown
97
+ ${b}`,y=c.get(S)??{code:"device_pool_unknown",detail:`no HyperExecute pool is known for ${o.os} ${b}.
98
+ The catalog's runson map names a pool per iOS major; set mobile.ios.runson["${Be(b)}"] in the remote-execution plugin config to override.`,sources:[]};y.sources.push(h.relPath),c.set(S,y);continue}let f=n.mobile.ios.runson[Be(b)]??_;m.set(f,[...m.get(f)??[],`${h.relPath} (${o.os} ${b})`]),p??={name:v.resolved.device.name,osVersion:b,slug:v.resolved.slug}}if(c.size)return{ok:!1,errors:[...c.values()].map(h=>({code:h.code,detail:`${h.detail}
99
+ (${[...new Set(h.sources)].join(`
100
+ `)})`}))};if(m.size>1)return{ok:!1,errors:[{code:"mobile_pool_split",detail:`simulator tests in this selection need different HyperExecute pools, and one grid job runs on one:
101
+ `+[...m.entries()].map(([h,k])=>` ${h}: ${k.join(", ")}`).join(`
102
+ `)+`
103
+ Split it into one run per pool (--match/--tags), or pass --os-version to force one.`}]};let g=[...m.keys()][0],d=s||l?{...s?{deviceName:s}:{},...l?{osVersion:l}:{}}:void 0;return{ok:!0,device:{platform:"ios",slug:p.slug,label:{name:p.name,osVersion:p.osVersion},ignoredDeviceNames:[],pool:g,...d?{deviceFlags:d}:{},...r.warning?{warning:r.warning}:{}}}}var Rl="\x1B[2m",Tl="\x1B[0m";function Ru(t){return t.local?{shouldPublish:!1,reason:"local"}:t.hasAuth?t.projectId==null?{shouldPublish:!1,reason:"no_project"}:t.evidencePublish===!1?{shouldPublish:!1,reason:"flag"}:{shouldPublish:!0}:{shouldPublish:!1,reason:"no_auth"}}function Tu(t,e){if(t.cancelled)return{status:"cancelled",exit:3};if(t.artifactless)return e!==0?{status:"failed",exit:e}:{status:"broken",exit:1};let n=o=>Number(t.totals?.[o]??0);return n("failed")>0||n("broken")>0?{status:"failed",exit:1}:{status:t.execution?.status??(t.authored.length?"authored":"passed"),exit:0}}async function Al(t,e,n,i){let o=I=>{for(let C of I)i.emit(xn(C));if(!i.isAgent)for(let C of I)process.stderr.write(`error: [${C.code}] ${C.detail}
104
+ `);i.emit(Et("","failed")),i.emit(Ht({status:"failed",exit:2,jobId:"",sessionsPath:""})),process.exitCode=2},r=typeof e.remote=="string"&&e.remote?e.remote:"hyper",s=(i.findBackendFn??ml)(r);if(!s){o([{code:"unknown_backend",detail:`unknown remote backend '${r}'`}]);return}let l=i.log??(()=>{}),c=await(i.resolveContext??vl)({envFlag:e.env,usernameFlag:e.username,accessKeyFlag:e.accessKey,memberClasses:t.checks.map(I=>I.memberClass),planProjectId:t.projectId,dryRun:!!e.dryRun,local:!!e.local,log:l},{});if(!c.ok){o([{code:c.code,detail:c.detail}]);return}i.isAgent&&c.ctx.autoDefaulted&&i.emit(Bo(c.ctx.autoDefaulted));let m={command:"testrun",plan:t,cwd:n,jobId:Su(),parallel:Number(e.parallel??1),env:c.ctx.env,auth:c.ctx.auth,orgId:c.ctx.orgId,plugin:c.ctx.plugin,projectId:c.ctx.projectId,folderId:c.ctx.folderId,...e.kaneVersion?{kaneVersion:e.kaneVersion}:{},...e.runson?{runson:e.runson}:{},...e.kaneDist?{kaneDist:e.kaneDist}:{},memberFlags:Ja(e)},p=s.preflight(m);if(!p.ok){o(p.errors);return}if(t.checks.some(I=>I.mobile)){let I=await(i.resolveDevice??Il)(t,{deviceName:e.deviceName,osVersion:e.osVersion,deviceSlug:e.deviceSlug,env:m.env,auth:{username:m.auth.username,accessKey:m.auth.access_key}});if(!I.ok){o(I.errors);return}m.deviceSlug=I.device.slug,m.deviceLabel=I.device.label,m.devicePlatform=I.device.platform,I.device.pool&&(m.devicePool=I.device.pool),I.device.deviceFlags&&(m.deviceFlags=I.device.deviceFlags);for(let D of I.device.ignoredDeviceNames){let M=Er({reason:"device_name_ignored",detail:`${D} \u2014 a remote job's device is named by the grid catalog, not by a local AVD name. Use --device-name to choose a grid device.`});i.emit(M),i.isAgent||process.stderr.write(`note: ${M.detail}
105
+ `)}if(I.device.warning){let D=Er({reason:"catalog_stale",detail:I.device.warning});i.emit(D),i.isAgent||process.stderr.write(`warning: ${D.detail}
106
+ `)}i.emit(Ia({platform:I.device.platform,slug:I.device.slug,...I.device.label,...I.device.pool?{pool:I.device.pool}:{}})),i.isAgent||process.stderr.write(I.device.platform==="ios"?`simulators: pool ${I.device.pool}`+(I.device.deviceFlags?` \xB7 ${I.device.deviceFlags.deviceName??"each file's device_name:"} \xB7 iOS ${I.device.deviceFlags.osVersion??"each file's os_version:"}`:" \xB7 each member binds its own device_name:/os_version:")+`
107
+ `:`device: ${I.device.label.name} \xB7 Android ${I.device.label.osVersion} \xB7 slug ${I.device.slug} \xB7 avd ${I.device.label.avdId}
108
+ `);let C=await(i.resolveApp??Ua)(t,{env:m.env,auth:{username:m.auth.username,accessKey:m.auth.access_key},orgId:m.orgId,userId:String(c.ctx.resolvedCreds?.user_id??""),dryRun:!!e.dryRun,...i.isAgent?{}:{onProgress:D=>process.stderr.write(`${D}
109
+ `)}});if(!C.ok){o(C.errors);return}Object.keys(C.app.byMember).length&&(m.appIds=C.app.byMember);for(let D of C.app.uploads)i.emit(Ra({path:D.path,appId:D.appId,source:D.source})),i.isAgent||process.stderr.write(D.source==="dry-run"?`app: ${Lr(n,D.path)||D.path} \u2014 would be uploaded before dispatch (dry run)
110
+ `:`app: ${Lr(n,D.path)||D.path} \u2192 ${D.appId} (${D.source==="cache"?"already in the cloud":"uploaded"})
111
+ `)}if(e.dryRun){i.isAgent||process.stderr.write(`\u2713 remote preflight passed \u2014 ${m.plan.checks.length} member(s), backend '${r}', env '${m.env}'`+(m.devicePlatform==="ios"?`, pool '${m.runson??m.devicePool}'`:m.deviceSlug?`, device '${m.deviceSlug}'`:"")+`
112
+ `),process.exitCode=0;return}i.emit(Ea({backend:r,env:m.env})),i.isTTYView&&process.stderr.write(`
113
+ ${Rl}remote testrun \xB7 ${r} \xB7 env ${m.env} \xB7 dispatching\u2026${Tl}
114
+ `);let g=await s.prepare(m);for(let I of g.skippedImports??[])i.emit(Bt({path:Lr(m.cwd,I.unitAbsPath),status:"skipped",reason:I.reason}));let d=Iu(g.jobDir,"hyper.log"),h=Date.now(),k=await s.dispatch(g,{signal:i.signal,onLine:I=>{try{Eu(d,I+`
115
+ `)}catch{}i.isTTYView&&/Job Link:|ERR::|error|failed|✔|✗|scenario|completed/i.test(I)&&process.stderr.write(`${Rl}${I}${Tl}
116
+ `)}});i.emit(Ta({jobId:k.hxJobId,jobUrl:k.jobUrl}));let b=await s.collect(k),v=t.projectId??m.projectId,_=Ru({local:!!e.local,hasAuth:!!(m.auth?.username&&m.auth?.access_key),projectId:v,evidencePublish:e.evidencePublish});_.shouldPublish||l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:_.reason});let P=oe(m.env),f=c.ctx.resolvedCreds,S=_.shouldPublish?async I=>{let C=await fn({controller:new vt(P.controllerBaseUrl,{username:m.auth.username,accessKey:m.auth.access_key}),tms:new nn(P.tmsBaseUrl,f?.username??m.auth.username,f?.access_key??m.auth.access_key),...I});if(C.ok)return l("info","EVIDENCE_PUBLISH_OK","Remote testrun evidence published",{surface:"testrun_remote",execution_id:I.executionId}),{ok:!0};let D=/\b(\d{3})\b/.exec(C.error)?.[1]??null;return l("error","EVIDENCE_PUBLISH_FAILED","Remote testrun evidence publish failed",{surface:"testrun_remote",stage:C.stage,http_status:D?Number(D):null,error:C.error}),{ok:!1,stage:C.stage}}:void 0,y=await s.reconcile(b,{emit:i.emit,publishFn:S,log:l});_.shouldPublish&&y.cancelled&&l("info","PUBLISH_SKIPPED","Remote testrun evidence publish skipped",{surface:"testrun_remote",reason:"cancel"}),y.degraded&&!i.isAgent&&(process.stderr.write(`
117
+ warning: evidence merge degraded (${y.degraded.reason})${y.degraded.detail?` \u2014 ${y.degraded.detail}`:""}
118
+ `),y.degraded.standaloneIds?.length&&process.stderr.write(` packs kept standalone: ${y.degraded.standaloneIds.join(", ")}
119
+ `));let R=y.execSync;if(R&&!i.isAgent){R.status==="failed"&&process.stderr.write(`
120
+ warning: execution facts were not recorded in the local assurance graph${R.detail?` \u2014 ${R.detail}`:""}
121
+ `);for(let I of R.warnings)process.stderr.write(` ${I}
122
+ `)}i.emit(_n({execution:y.execution?{id:y.execution.id,status:y.execution.status,evidence_id:y.execution.evidenceId}:null,authored:y.authored.map(I=>({path:I.relPath,test_id:I.testId,commit_id:I.commitId,execution_id:I.executionId,...I.sourceExecutionId?{source_execution_id:I.sourceExecutionId}:{},status:I.overallStatus,published:I.published})),totals:y.totals,durationS:(Date.now()-h)/1e3,upload:y.upload,cancelled:y.cancelled,remote:{backend:r,jobId:y.hxJobId,jobUrl:y.jobUrl,sessionsPath:y.sessionsPath}}));try{let I=ks({executionId:y.execution?.id,executionStatus:y.execution?.status,authored:y.authored,cwd:n});if(i.isTTYView)process.stderr.write(`
123
+ Remote job: ${y.jobUrl||"(job id not captured)"}
124
+ `),process.stderr.write(`Sessions: ${y.sessionsPath}
125
+ `),I.length&&await xs({rows:I,env:m.env});else if(!i.isAgent){process.stderr.write(`
126
+ Remote job: ${y.jobUrl||"(job id not captured)"}
127
+ `),process.stderr.write(`Sessions: ${y.sessionsPath}
128
+ `);let C=_s(I);if(C.length){process.stderr.write(`
75
129
  Evidence \u2014 view locally:
76
- `);for(let N of x)process.stderr.write(` ${N}
77
- `)}}}catch(D){i.isAgent||process.stderr.write(`warning: evidence presentation failed: ${D.message}
78
- `)}let j=Xc(w,_.exitCode);w.artifactless&&_.exitCode===0&&!i.isAgent&&process.stderr.write(`
79
- error: the grid job exited 0 but no session artifacts came home \u2014 nothing to reconcile. Check the job's dashboard artifacts (${w.jobUrl||w.hxJobId}).
80
- `),i.emit(wt(w.execution?.id??"",j.status==="cancelled"?"cancelled":j.status==="failed"||j.status==="broken"?"failed":"passed")),i.emit(Mt({status:j.status,exit:j.exit,jobId:w.hxJobId,sessionsPath:w.sessionsPath})),process.exitCode=j.exit}import{randomUUID as nd}from"crypto";import{existsSync as Ra,mkdtempSync as Qc,readFileSync as Zc,rmSync as wn,writeFileSync as ed}from"fs";import{tmpdir as td}from"os";import{join as _r}from"path";function Pa(t){let e=t.checks.some(n=>n.memberClass==="author");return{willConsolidate:e,interimShouldPublish:t.shouldPublish&&!e}}function Oa(t,e){for(let n of t)n.executionId&&(n.sourceExecutionId=n.executionId,n.executionId=e)}var _t=t=>t instanceof Error?t.message:String(t);async function Aa(t,e){if(!t.shouldPublish||!t.publish)return"skipped";let n=t.checks.find(o=>o.memberClass==="replay"&&o.testId)?.testId??t.authored.find(o=>o.testId)?.testId;if(!n||t.projectId==null)return"skipped";let i=await t.publish({testId:n,sessionId:e,executionId:e,sealedPackPath:Re(e,t.cwd),projectId:t.projectId});return t.emit(vt(i,e)),i.ok?"ok":"failed"}async function $a(t){let e=t.mergeFn??Qt,n=t.sealFn??ft,i=t.authored.filter(d=>d.executionId).map(d=>({id:d.executionId,path:Re(d.executionId,t.cwd)})).filter(d=>Ra(d.path)),o=t.interim?Re(t.interim.executionId,t.cwd):null,r=async d=>(t.log("warn","TESTRUN_CONSOLIDATION_DEGRADED","Local consolidation fell back to split evidence",{reason:d}),{kind:"split",upload:t.interim?await Aa(t,t.interim.executionId):"skipped",reason:d});if(i.length===0)return r("no authored packs to fold in");let a,s;try{a=Qc(_r(td(),"kane-local-merge-rules-")),s=_r(a,"merge-rules.yaml"),ed(s,nn())}catch(d){return a&&wn(a,{recursive:!0,force:!0}),r(`merge rules unavailable: ${_t(d)}`)}let l=gt(),u=Re(l,t.cwd),c=[...o&&Ra(o)?[o]:[],...i.map(d=>d.path)];try{await e(c,{runId:l,out:u,rulesPath:s,finalize:!1})}catch(d){return wn(u,{recursive:!0,force:!0}),r(`merge failed: ${_t(d)}`)}finally{a&&wn(a,{recursive:!0,force:!0})}let m=t.checks.map(d=>({path:"",memberClass:d.memberClass,relPath:d.relPath}));try{let d=yr(u,m);d.errors.length&&t.log("warn","TESTRUN_CONSOLIDATION_STAMP_INCOMPLETE","Some merged tests missed their run_kind stamp",{execution_id:l,errors:d.errors.slice(0,5)})}catch(d){t.log("warn","TESTRUN_CONSOLIDATION_STAMP_FAILED","run_kind stamping threw",{execution_id:l,error:_t(d)})}try{(t.coverageWriter??ht)(u,We(t.cwd))}catch(d){t.log("warn","TESTRUN_COVERAGE_WRITER_THREW","Coverage writer threw on the consolidated pack",{execution_id:l,error:_t(d)})}let p=new Map;for(let d of t.checks)try{let y=mt(Zc(_r(u,"tests",Se(d.relPath),"result.yaml"),"utf8"));typeof y?.status=="string"&&p.set(d.relPath,y.status)}catch{}try{let d=c.map(_=>({path:_,memberClass:"replay",relPath:""})),y=await kr(d)??new Date().toISOString();await n(u,y)}catch(d){return wn(u,{recursive:!0,force:!0}),r(`seal failed: ${_t(d)}`)}try{let d=await(t.validateFn??pt)(u,"L1");d.valid||t.log("warn","EVIDENCE_INVALID","Sealed consolidated pack failed L1 validation",{execution_id:l,first_code:String(d.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(d){t.log("warn","TESTRUN_VALIDATION_ERROR","Consolidated pack validation threw",{execution_id:l,error:_t(d)})}let g=await Aa(t,l);for(let d of t.checks){let y=p.get(d.relPath);if(y)try{await Zt(Ae(d.path),{execution_id:l,run_kind:d.memberClass==="author"?"author":"replay",status:y,at:new Date().toISOString(),...g==="ok"?{uploaded:!0}:{}})}catch{}}return{kind:"merged",executionId:l,upload:g}}function Da(t,e){return e.concat(t.split(",").map(n=>n.trim()).filter(n=>n.length>0))}function Cr(t){return t===1?"failed":t===3?"cancelled":"passed"}function rd(t){let e=Number(t);if(!Number.isInteger(e)||e<1)throw new ls(`--parallel must be a positive integer, got: ${t}`);return t}function ja(){let t=new rt("testrun").description("Run M authored *_test.md files as one execution (one sealed evidence pack)");return t.command("run [paths...]").description("Select + preflight + execute *_test.md members").option("--match <regex>","Filter candidates by project-relative path regex").option("--tags <list>","ANY-match on frontmatter tags (repeatable or comma-separated)",Da,[]).option("--from-context <ids>","Select members by assurance-graph test ids, e.g. T-1,T-2 (repeatable or comma-separated; unions with explicit paths)",Da,[]).option("--parallel <n>","Worker count",rd,"1").option("--on-failure <mode>","continue | fail-fast",e=>{if(e!=="continue"&&e!=="fail-fast")throw new Error(`--on-failure must be continue|fail-fast, got: ${e}`);return e},"continue").option("--name <label>","run.yaml title (default: derived from the selection query)").option("--dry-run","Plan + validate only, execute nothing").option("--remote [backend]","Dispatch to a remote grid instead of local Chrome (default backend: hyper). Requires `kane-cli plugin install remote-execution`.").option("--no-adaptive-heal","disable adaptive heal for every member \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").option("--author","re-author every member in place on its existing identity and commit a new version").addOption(new Y("--no-testmd-sync","skip the testmd bundle push before each member's commit \u2014 the caller owns the bundle").hideHelp()).option("--bug-detection <mode>","detect product bugs while authoring member steps: off|stop|continue. Overrides `config set-bug-detection`.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).addOption(new Y("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new Y("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--headless","Run Chrome in headless mode").option("--device-name <name>","Device for the run's mobile members, as `kane-cli devices list` shows it. The OS version comes from --os-version or each member's own os_version:").option("--os-version <version>","OS version for the run's mobile members (e.g. 17.5, 14). Alone = any device on that version").option("--env <name>","Environment (prod or stage)").addOption(new Y("--local","Skip TMS integration (no uploads, no evidence publish)").hideHelp()).addOption(new Y("--no-evidence-publish","skip the sealed pack's evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,n)=>{await od(e,n)}),t}async function od(t,e){let n=ai(e);n&&process.stderr.write(n+`
81
- `);let i=e.cwd??process.cwd(),o=!process.stdin.isTTY,r=!o&&!!process.stderr.isTTY,a={current:null};{let R=gi({deviceName:e.deviceName,osVersion:e.osVersion});if(!R.ok){process.stderr.write(`error: ${R.message}
82
- `),process.exitCode=2;return}}let s;try{s=await Ns({paths:t.length>0?t:void 0,match:e.match,tags:e.tags?.length?e.tags:void 0,fromContext:e.fromContext?.length?e.fromContext:void 0,parallel:e.parallel!==void 0?Number(e.parallel):void 0,onFailure:e.onFailure,name:e.name,deviceOverride:e.deviceName!==void 0||e.osVersion!==void 0,cwd:i})}catch(R){if(R instanceof fe){process.stderr.write(`error: ${R.message}
83
- `),process.exitCode=2;return}throw R}let l=r&&s.valid&&!e.dryRun&&!e.remote,u=cd(o,l?R=>a.current?.(R):void 0);if(o?u(Fs(s)):l||Ma(s),e.remote){if(!s.valid){o||xr(s),process.exitCode=2;return}let R=e.__runRemote??Ta;try{await R(s,e,i,{emit:u,isAgent:o,isTTYView:r})}catch(he){let L=he.message;u(gn({code:"internal_error",detail:L})),u(wt("","failed")),u(Mt({status:"failed",exit:1,jobId:"",sessionsPath:""})),o||process.stderr.write(`error: remote run crashed: ${L}
84
- `),process.exitCode=1}return}if(e.dryRun){!s.valid&&!o&&xr(s),process.exitCode=s.valid?0:2;return}if(!s.valid){o||xr(s),process.exitCode=2;return}let c=new pe,m=new Te,p=c.getActiveProfile()??"default",g=e.env??c.getDefaultEnv()??"prod",d=ce(g),y="v16-alpha",_;try{_=await Ve({creds:c,env:g,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}})}catch(R){l&&Ma(s),R instanceof Rt&&R.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
130
+ `);for(let D of C)process.stderr.write(` ${D}
131
+ `)}}}catch(I){i.isAgent||process.stderr.write(`warning: evidence presentation failed: ${I.message}
132
+ `)}let N=Tu(y,k.exitCode);y.artifactless&&k.exitCode===0&&!i.isAgent&&process.stderr.write(`
133
+ error: the grid job exited 0 but no session artifacts came home \u2014 nothing to reconcile. Check the job's dashboard artifacts (${y.jobUrl||y.hxJobId}).
134
+ `),i.emit(Et(y.execution?.id??"",N.status==="cancelled"?"cancelled":N.status==="failed"||N.status==="broken"?"failed":"passed")),i.emit(Ht({status:N.status,exit:N.exit,jobId:y.hxJobId,sessionsPath:y.sessionsPath})),process.exitCode=N.exit}import{randomUUID as Ou}from"crypto";import{existsSync as Pl,mkdtempSync as Au,readFileSync as Pu,rmSync as Pn,writeFileSync as $u}from"fs";import{tmpdir as Du}from"os";import{join as Ur}from"path";function Dl(t){let e=t.checks.some(n=>n.memberClass==="author");return{willConsolidate:e,interimShouldPublish:t.shouldPublish&&!e}}function Ol(t,e){for(let n of t)n.executionId&&(n.sourceExecutionId=n.executionId,n.executionId=e)}var At=t=>t instanceof Error?t.message:String(t);async function $l(t,e){if(!t.shouldPublish||!t.publish)return"skipped";let n=t.checks.find(o=>o.memberClass==="replay"&&o.testId)?.testId??t.authored.find(o=>o.testId)?.testId;if(!n||t.projectId==null)return"skipped";let i=await t.publish({testId:n,sessionId:e,executionId:e,sealedPackPath:Te(e,t.cwd),projectId:t.projectId});return t.emit(St(i,e)),i.ok?"ok":"failed"}async function Ml(t){let e=t.mergeFn??an,n=t.sealFn??kt,i=t.authored.filter(d=>d.executionId).map(d=>({id:d.executionId,path:Te(d.executionId,t.cwd)})).filter(d=>Pl(d.path)),o=t.interim?Te(t.interim.executionId,t.cwd):null,r=async d=>(t.log("warn","TESTRUN_CONSOLIDATION_DEGRADED","Local consolidation fell back to split evidence",{reason:d}),{kind:"split",upload:t.interim?await $l(t,t.interim.executionId):"skipped",reason:d});if(i.length===0)return r("no authored packs to fold in");let a,s;try{a=Au(Ur(Du(),"kane-local-merge-rules-")),s=Ur(a,"merge-rules.yaml"),$u(s,un())}catch(d){return a&&Pn(a,{recursive:!0,force:!0}),r(`merge rules unavailable: ${At(d)}`)}let l=_t(),u=Te(l,t.cwd),c=[...o&&Pl(o)?[o]:[],...i.map(d=>d.path)];try{await e(c,{runId:l,out:u,rulesPath:s,finalize:!1})}catch(d){return Pn(u,{recursive:!0,force:!0}),r(`merge failed: ${At(d)}`)}finally{a&&Pn(a,{recursive:!0,force:!0})}let m=t.checks.map(d=>({path:"",memberClass:d.memberClass,relPath:d.relPath}));try{let d=jr(u,m);d.errors.length&&t.log("warn","TESTRUN_CONSOLIDATION_STAMP_INCOMPLETE","Some merged tests missed their run_kind stamp",{execution_id:l,errors:d.errors.slice(0,5)})}catch(d){t.log("warn","TESTRUN_CONSOLIDATION_STAMP_FAILED","run_kind stamping threw",{execution_id:l,error:At(d)})}try{(t.coverageWriter??xt)(u,qe(t.cwd))}catch(d){t.log("warn","TESTRUN_COVERAGE_WRITER_THREW","Coverage writer threw on the consolidated pack",{execution_id:l,error:At(d)})}let p=new Map;for(let d of t.checks)try{let h=wt(Pu(Ur(u,"tests",Se(d.relPath),"result.yaml"),"utf8"));typeof h?.status=="string"&&p.set(d.relPath,h.status)}catch{}try{let d=c.map(k=>({path:k,memberClass:"replay",relPath:""})),h=await Fr(d)??new Date().toISOString();await n(u,h)}catch(d){return Pn(u,{recursive:!0,force:!0}),r(`seal failed: ${At(d)}`)}try{let d=await(t.validateFn??yt)(u,"L1");d.valid||t.log("warn","EVIDENCE_INVALID","Sealed consolidated pack failed L1 validation",{execution_id:l,first_code:String(d.diagnostics?.[0]?.code??""),surface:"testrun"})}catch(d){t.log("warn","TESTRUN_VALIDATION_ERROR","Consolidated pack validation threw",{execution_id:l,error:At(d)})}let g=await $l(t,l);for(let d of t.checks){let h=p.get(d.relPath);if(h)try{await ln(Ae(d.path),{execution_id:l,run_kind:d.memberClass==="author"?"author":"replay",status:h,at:new Date().toISOString(),...g==="ok"?{uploaded:!0}:{}})}catch{}}return{kind:"merged",executionId:l,upload:g}}function Nl(t,e){return e.concat(t.split(",").map(n=>n.trim()).filter(n=>n.length>0))}function Wr(t){return t===1?"failed":t===3?"cancelled":"passed"}function Mu(t){let e=Number(t);if(!Number.isInteger(e)||e<1)throw new Hs(`--parallel must be a positive integer, got: ${t}`);return t}function Vl(){let t=new at("testrun").description("Run M authored *_test.md files as one execution (one sealed evidence pack)");return t.command("run [paths...]").description("Select + preflight + execute *_test.md members").option("--match <regex>","Filter candidates by project-relative path regex").option("--tags <list>","ANY-match on frontmatter tags (repeatable or comma-separated)",Nl,[]).option("--from-context <ids>","Select members by assurance-graph test ids, e.g. T-1,T-2 (repeatable or comma-separated; unions with explicit paths)",Nl,[]).option("--parallel <n>","Worker count",Mu,"1").option("--on-failure <mode>","continue | fail-fast",e=>{if(e!=="continue"&&e!=="fail-fast")throw new Error(`--on-failure must be continue|fail-fast, got: ${e}`);return e},"continue").option("--name <label>","run.yaml title (default: derived from the selection query)").option("--dry-run","Plan + validate only, execute nothing").option("--remote [backend]","Dispatch to a remote grid instead of local Chrome (default backend: hyper). Requires `kane-cli plugin install remote-execution`.").option("--no-adaptive-heal","disable adaptive heal for every member \u2014 a replay miss becomes terminal instead of re-authoring the failing tail (default: heal on, 3 attempts then a full re-author)").option("--author","re-author every member in place on its existing identity and commit a new version").addOption(new W("--no-testmd-sync","skip the testmd bundle push before each member's commit \u2014 the caller owns the bundle").hideHelp()).option("--bug-detection <mode>","detect product bugs while authoring member steps: off|stop|continue. Overrides `config set-bug-detection`.",e=>{if(e!=="off"&&e!=="stop"&&e!=="continue")throw new Error(`--bug-detection must be off, stop or continue, got: ${e}`);return e}).addOption(new W("--retry","(retired) adaptive heal is on by default").hideHelp()).addOption(new W("--retry-count <n>","(retired) heal budget is fixed at 3").argParser(e=>{let n=parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`--retry-count must be a non-negative integer, got: ${e}`);return e}).hideHelp()).option("--headless","Run Chrome in headless mode").option("--device-name <name>","Device for the run's mobile members. Locally: as `kane-cli devices list` shows it. With --remote: a grid device from `kane-cli devices list --target emulator --remote`, validated before dispatch. The OS version comes from --os-version or each member's own os_version:").option("--os-version <version>","OS version for the run's mobile members (e.g. 17.5, 14). Alone = any device on that version").addOption(new W("--device-slug <slug>","(--remote, emulator) raw HyperExecute device slug (<configName>-<androidVersion>), bypassing catalog validation; the member binds the slug's version").hideHelp()).addOption(new W("--runson <label>","(--remote) HyperExecute host pool override").hideHelp()).addOption(new W("--kane-version <version>","(--remote) kane-cli version the grid installs (default: latest)").hideHelp()).addOption(new W("--kane-dist <dir>","(--remote, dev) cwd-relative dir holding a built kane-cli dist/ to swap over the grid's npm install").hideHelp()).option("--env <name>","Environment (prod or stage)").addOption(new W("--local","Skip TMS integration (no uploads, no evidence publish)").hideHelp()).addOption(new W("--no-evidence-publish","skip the sealed pack's evidence publish (blob upload + TMS /evidence/ingest) \u2014 the run leaves no execution record in TMS").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").action(async(e,n)=>{await Nu(e,n)}),t}async function Nu(t,e){let n=Pi(e);n&&process.stderr.write(n+`
135
+ `);let i=e.cwd??process.cwd(),o=!process.stdin.isTTY,r=!o&&!!process.stderr.isTTY,a={current:null};{let A=Vi({deviceName:e.deviceName,osVersion:e.osVersion});if(!A.ok){process.stderr.write(`error: ${A.message}
136
+ `),process.exitCode=2;return}}let s;try{s=await wa({paths:t.length>0?t:void 0,match:e.match,tags:e.tags?.length?e.tags:void 0,fromContext:e.fromContext?.length?e.fromContext:void 0,parallel:e.parallel!==void 0?Number(e.parallel):void 0,onFailure:e.onFailure,name:e.name,deviceOverride:e.deviceName!==void 0||e.osVersion!==void 0,remote:!!e.remote,cwd:i})}catch(A){if(A instanceof fe){process.stderr.write(`error: ${A.message}
137
+ `),process.exitCode=2;return}throw A}let l=r&&s.valid&&!e.dryRun&&!e.remote,u=Uu(o,l?A=>a.current?.(A):void 0);if(o?u(ya(s)):l?(s.unresolved??[]).length>0&&process.stderr.write(`warning: ${s.unresolved.map(A=>A.name).join(", ")} have no value in the variable files \u2014 replayed steps resolve from their tape/TMS; authored steps would type them verbatim
138
+ `):Fl(s),e.remote){if(!s.valid){o||Br(s),process.exitCode=2;return}let A=e.__runRemote??Al;try{await A(s,e,i,{emit:u,isAgent:o,isTTYView:r})}catch(he){let L=he.message;u(xn({code:"internal_error",detail:L})),u(Et("","failed")),u(Ht({status:"failed",exit:1,jobId:"",sessionsPath:""})),o||process.stderr.write(`error: remote run crashed: ${L}
139
+ `),process.exitCode=1}return}if(e.dryRun){!s.valid&&!o&&Br(s),jl(s,o,u,i),process.exitCode=s.valid?0:2;return}if(!s.valid){o||Br(s),jl(s,o,u,i),process.exitCode=2;return}let c=new de,m=new Re,p=c.getActiveProfile()??"default",g=e.env??c.getDefaultEnv()??"prod",d=oe(g),h="v16-alpha",k;try{k=await Le({creds:c,env:g,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}})}catch(A){l&&Fl(s),A instanceof jt&&A.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
85
140
  \u2022 Pass credentials inline: --username <user> --access-key <key>
86
141
  \u2022 Run 'kane-cli login --oauth' (browser-based)
87
142
  \u2022 Run 'kane-cli login --username <user> --access-key <key>'
88
- `):R instanceof Rt&&R.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
89
- `):process.stderr.write(`error: auth resolution failed: ${R.message}
90
- `),process.exitCode=2;return}let b=null;l&&(b=et(Sr.default.createElement(tt,null,Sr.default.createElement(Ps,{members:s.checks.map(R=>({relPath:R.relPath,memberClass:R.memberClass,tags:R.tags})),title:s.title,env:g,dispatchRef:a})),{stdout:process.stderr,exitOnCtrlC:!1}));let v=e.log?{log:e.log,shutdown:async()=>{}}:ld({environment:g,resolvedAuth:_,isAgent:o}),E=v.log,P={adaptiveHeal:e.adaptiveHeal,author:e.author,testmdSync:e.testmdSync,headless:e.headless,env:e.env,local:e.local,username:e.username,accessKey:e.accessKey,bugDetection:e.bugDetection,deviceName:e.deviceName,osVersion:e.osVersion},f=m.load(),C=Zs({launch:So,width:f.window_size.width,height:f.window_size.height,headless:!!e.headless});ut("testrun-slots",()=>C.killAll());let w={packDir:"",resolvedAuth:_,environment:g,envConfig:d,creds:c,configStore:m,profile:p,model:y,passThroughOpts:P,cwd:i},I=R=>({host:na(),lifecycle:ea()}),j="",D=async(R,he)=>{if(R.mobile)return mr(R,null,w,I);let L;try{L=await C.acquire(he)}catch(ee){let at=ee.message;process.stderr.write(`member ${R.relPath}: chrome slot failed: ${at}
91
- `);let lt=Se(R.relPath),Ne=R.testId??lt;return Wo(Ho(w.packDir,lt),"warn","TESTRUN_SLOT_FAILURE",{execution_id:j,slot_index:he,member_test_id:Ne,phase:"launch",error:at},E),{testId:R.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return mr(R,L,w,I)},x=!e.local&&!!_.basicAuth&&s.projectId!=null&&e.evidencePublish!==!1,{willConsolidate:N,interimShouldPublish:$}=Pa({checks:s.checks,shouldPublish:x});if(x&&N&&E("info","PUBLISH_SKIPPED","Interim testrun evidence publish deferred to the consolidated pack",{surface:"testrun",reason:"consolidation"}),!x){let R=e.local?"local":_.basicAuth?s.projectId==null?"no_project":"flag":"no_auth";E("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:R})}let F=_.basicAuth?async R=>{let he=_.basicAuth,L=await sn({controller:new Ht(d.controllerBaseUrl,{username:he.username,accessKey:he.access_key}),tms:new Gt(d.tmsBaseUrl,_.resolvedCreds?.username??he.username,_.resolvedCreds?.access_key??he.access_key),...R});if(L.ok)return E("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:R.executionId}),{ok:!0};let ee=/\b(\d{3})\b/.exec(L.error)?.[1]??null;return E("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:L.stage,http_status:ee?Number(ee):null,error:L.error}),{ok:!1,stage:L.stage}}:void 0,A=new AbortController;w.signal=A.signal;let J=ad(A),X={executeMember:D,publish:F,emit:u,log:E,shouldPublish:$,operator:{userName:_.resolvedCreds?.username??void 0,userEmail:_.resolvedCreds?.email??void 0},signal:A.signal,cwd:i,onExecutionId:R=>{j=R,w.packDir=Re(R,i)}},Oe=s.checks.filter(R=>R.memberClass==="replay"),ve=s.checks.filter(R=>R.memberClass==="author"),st=async(R,he)=>{if(R.mobile)return pr(R,null,w,I);let L;try{L=await C.acquire(he)}catch(ee){return process.stderr.write(`author member ${R.relPath}: chrome slot failed: ${ee.message}
92
- `),{relPath:R.relPath,overallStatus:"broken",exitCode:2,durationS:0,published:"no"}}return pr(R,L,w,I)},Xe=Date.now(),ge=null,le=[],_e=[],He=!1,xe=!1;try{if(Oe.length>0&&(ge=await Js({...s,checks:Oe},X),ge.exitCode===3&&(xe=!0)),ve.length>0&&!xe)try{let M=await Qs(ve,{executeAuthorMember:st,emit:u,parallel:s.parallel,signal:A.signal});le=M.results,_e=M.skipped,xe=xe||M.cancelled}catch(M){process.stderr.write(`error: author pass failed: ${M.message}
93
- `),le=[],_e=ve,He=!0}let R=ge?ge.exitCode===1:!1,he=He||le.some(M=>M.overallStatus==="failed"||M.overallStatus==="broken"||M.overallStatus==="interrupted"),L=xe?3:R||he?1:0;process.exitCode=L;let ee=null;if(N&&!xe){try{ee=await $a({interim:ge?{executionId:ge.executionId}:null,authored:le,checks:s.checks,cwd:i,projectId:s.projectId,shouldPublish:x,publish:F,emit:u,log:E})}catch(M){o||process.stderr.write(`warning: evidence consolidation failed: ${M.message}
94
- `)}ee?.kind==="merged"&&Oa(le,ee.executionId)}let at=ee?.kind==="merged"?ee.executionId:ge?.executionId,lt=ee?ee.upload:ge?.upload??"skipped",Ne=ge?.totals??{tests:0,passed:0,failed:0,broken:0,skipped:0},Ft=le.filter(M=>M.overallStatus==="passed").length;u(fn({execution:ee?.kind==="merged"?{id:ee.executionId,status:Cr(L),evidence_id:ee.executionId}:ge?{id:ge.executionId,status:Cr(ge.exitCode),evidence_id:ge.executionId}:null,authored:le.map(M=>({path:M.relPath,test_id:M.testId,commit_id:M.commitId,execution_id:M.executionId,...M.sourceExecutionId?{source_execution_id:M.sourceExecutionId}:{},status:M.overallStatus,published:M.published})),totals:{tests:(Ne.tests??0)+le.length+_e.length,passed:(Ne.passed??0)+Ft,failed:(Ne.failed??0)+le.filter(M=>M.overallStatus==="failed").length,broken:(Ne.broken??0)+le.filter(M=>M.overallStatus==="broken"||M.overallStatus==="interrupted").length,skipped:(Ne.skipped??0)+_e.length,authored:le.length},durationS:(Date.now()-Xe)/1e3,upload:lt,cancelled:xe})),u(wt(at??"",L===0?"passed":L===3?"cancelled":"failed")),b&&await b.waitUntilExit(),await id({executionResult:ee?.kind==="merged"?{executionId:ee.executionId,exitCode:L}:ge,authored:le,cwd:i,environment:g,isAgent:o,cancelled:xe})}catch(R){b?.unmount(),process.stderr.write(`error: testrun failed: ${R.message}
95
- `),process.exitCode=1}finally{J(),C.killAll(),oo("testrun-slots"),await v.shutdown()}}async function id(t,e=sd){try{await e(t)}catch(n){t.isAgent||process.stderr.write(`warning: evidence presentation failed: ${n.message}
96
- `)}}async function sd(t){let{collectEvidenceRows:e,serveCommands:n}=await import("./evidence-presentation-XF23B7F2.js"),i=e({executionId:t.executionResult?.executionId,executionStatus:t.executionResult?Cr(t.executionResult.exitCode):void 0,authored:t.authored,cwd:t.cwd});if(i.length===0)return;if(!(!t.isAgent&&!t.cancelled&&!!process.stdin.isTTY&&!!process.stderr.isTTY)){process.stderr.write(`
143
+ `):A instanceof jt&&A.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
144
+ `):process.stderr.write(`error: auth resolution failed: ${A.message}
145
+ `),process.exitCode=2;return}let b=null;l&&(b=nt(Hr.default.createElement(rt,null,Hr.default.createElement(ma,{members:s.checks.map(A=>({relPath:A.relPath,memberClass:A.memberClass,tags:A.tags})),title:s.title,env:g,dispatchRef:a})),{stdout:process.stderr,exitOnCtrlC:!1}));let v=e.log?{log:e.log,shutdown:async()=>{}}:Lu({environment:g,resolvedAuth:k,isAgent:o}),_=v.log,P={adaptiveHeal:e.adaptiveHeal,author:e.author,testmdSync:e.testmdSync,headless:e.headless,env:e.env,local:e.local,username:e.username,accessKey:e.accessKey,bugDetection:e.bugDetection,deviceName:e.deviceName,osVersion:e.osVersion},f=m.load(),S=ja({launch:Jo,width:f.window_size.width,height:f.window_size.height,headless:!!e.headless});bt("testrun-slots",()=>S.killAll());let y={packDir:"",resolvedAuth:k,environment:g,envConfig:d,creds:c,configStore:m,profile:p,model:h,passThroughOpts:P,cwd:i},R=A=>({host:La(),lifecycle:Fa()}),N="",I=async(A,he)=>{if(A.mobile)return Rr(A,null,y,R);let L;try{L=await S.acquire(he)}catch(te){let pt=te.message;process.stderr.write(`member ${A.relPath}: chrome slot failed: ${pt}
146
+ `);let ft=Se(A.relPath),je=A.testId??ft;return fi(pi(y.packDir,ft),"warn","TESTRUN_SLOT_FAILURE",{execution_id:N,slot_index:he,member_test_id:je,phase:"launch",error:pt},_),{testId:A.testId??"",overallStatus:"broken",exitCode:2,durationS:0,runKind:"replay"}}return Rr(A,L,y,R)},C=!e.local&&!!k.basicAuth&&s.projectId!=null&&e.evidencePublish!==!1,{willConsolidate:D,interimShouldPublish:M}=Dl({checks:s.checks,shouldPublish:C});if(C&&D&&_("info","PUBLISH_SKIPPED","Interim testrun evidence publish deferred to the consolidated pack",{surface:"testrun",reason:"consolidation"}),!C){let A=e.local?"local":k.basicAuth?s.projectId==null?"no_project":"flag":"no_auth";_("info","PUBLISH_SKIPPED","Testrun evidence publish skipped",{surface:"testrun",reason:A})}let V=k.basicAuth?async A=>{let he=k.basicAuth,L=await fn({controller:new vt(d.controllerBaseUrl,{username:he.username,accessKey:he.access_key}),tms:new nn(d.tmsBaseUrl,k.resolvedCreds?.username??he.username,k.resolvedCreds?.access_key??he.access_key),...A});if(L.ok)return _("info","EVIDENCE_PUBLISH_OK","Testrun evidence published",{surface:"testrun",execution_id:A.executionId}),{ok:!0};let te=/\b(\d{3})\b/.exec(L.error)?.[1]??null;return _("error","EVIDENCE_PUBLISH_FAILED","Testrun evidence publish failed",{surface:"testrun",stage:L.stage,http_status:te?Number(te):null,error:L.error}),{ok:!1,stage:L.stage}}:void 0,$=new AbortController;y.signal=$.signal;let z=Vu($),Q={executeMember:I,publish:V,emit:u,log:_,shouldPublish:M,operator:{userName:k.resolvedCreds?.username??void 0,userEmail:k.resolvedCreds?.email??void 0},signal:$.signal,cwd:i,onExecutionId:A=>{N=A,y.packDir=Te(A,i)}},De=s.checks.filter(A=>A.memberClass==="replay"),be=s.checks.filter(A=>A.memberClass==="author"),mt=async(A,he)=>{if(A.mobile)return Tr(A,null,y,R);let L;try{L=await S.acquire(he)}catch(te){return process.stderr.write(`author member ${A.relPath}: chrome slot failed: ${te.message}
147
+ `),{relPath:A.relPath,overallStatus:"broken",exitCode:2,durationS:0,published:"no"}}return Tr(A,L,y,R)},Ze=Date.now(),ge=null,ce=[],xe=[],We=!1,Ce=!1;try{if(De.length>0&&(ge=await Da({...s,checks:De},Q),ge.exitCode===3&&(Ce=!0)),be.length>0&&!Ce)try{let j=await Na(be,{executeAuthorMember:mt,emit:u,parallel:s.parallel,signal:$.signal});ce=j.results,xe=j.skipped,Ce=Ce||j.cancelled}catch(j){process.stderr.write(`error: author pass failed: ${j.message}
148
+ `),ce=[],xe=be,We=!0}let A=ge?ge.exitCode===1:!1,he=We||ce.some(j=>j.overallStatus==="failed"||j.overallStatus==="broken"||j.overallStatus==="interrupted"),L=Ce?3:A||he?1:0;process.exitCode=L;let te=null;if(D&&!Ce){try{te=await Ml({interim:ge?{executionId:ge.executionId}:null,authored:ce,checks:s.checks,cwd:i,projectId:s.projectId,shouldPublish:C,publish:V,emit:u,log:_})}catch(j){o||process.stderr.write(`warning: evidence consolidation failed: ${j.message}
149
+ `)}te?.kind==="merged"&&Ol(ce,te.executionId)}let pt=te?.kind==="merged"?te.executionId:ge?.executionId,ft=te?te.upload:ge?.upload??"skipped",je=ge?.totals??{tests:0,passed:0,failed:0,broken:0,skipped:0},Yt=ce.filter(j=>j.overallStatus==="passed").length;u(_n({execution:te?.kind==="merged"?{id:te.executionId,status:Wr(L),evidence_id:te.executionId}:ge?{id:ge.executionId,status:Wr(ge.exitCode),evidence_id:ge.executionId}:null,authored:ce.map(j=>({path:j.relPath,test_id:j.testId,commit_id:j.commitId,execution_id:j.executionId,...j.sourceExecutionId?{source_execution_id:j.sourceExecutionId}:{},status:j.overallStatus,published:j.published})),totals:{tests:(je.tests??0)+ce.length+xe.length,passed:(je.passed??0)+Yt,failed:(je.failed??0)+ce.filter(j=>j.overallStatus==="failed").length,broken:(je.broken??0)+ce.filter(j=>j.overallStatus==="broken"||j.overallStatus==="interrupted").length,skipped:(je.skipped??0)+xe.length,authored:ce.length},durationS:(Date.now()-Ze)/1e3,upload:ft,cancelled:Ce})),u(Et(pt??"",L===0?"passed":L===3?"cancelled":"failed")),b&&await b.waitUntilExit(),await ju({executionResult:te?.kind==="merged"?{executionId:te.executionId,exitCode:L}:ge,authored:ce,cwd:i,environment:g,isAgent:o,cancelled:Ce})}catch(A){b?.unmount(),process.stderr.write(`error: testrun failed: ${A.message}
150
+ `),process.exitCode=1}finally{z(),S.killAll(),Eo("testrun-slots"),await v.shutdown()}}async function ju(t,e=Fu){try{await e(t)}catch(n){t.isAgent||process.stderr.write(`warning: evidence presentation failed: ${n.message}
151
+ `)}}async function Fu(t){let{collectEvidenceRows:e,serveCommands:n}=await import("./evidence-presentation-XF23B7F2.js"),i=e({executionId:t.executionResult?.executionId,executionStatus:t.executionResult?Wr(t.executionResult.exitCode):void 0,authored:t.authored,cwd:t.cwd});if(i.length===0)return;if(!(!t.isAgent&&!t.cancelled&&!!process.stdin.isTTY&&!!process.stderr.isTTY)){process.stderr.write(`
97
152
  Evidence \u2014 view locally:
98
153
  `);for(let a of n(i))process.stderr.write(` ${a}
99
- `);return}let{renderTestrunEvidenceTable:r}=await import("./TestrunEvidenceTable-7SCCTZPH.js");await r({rows:i,env:t.environment})}function ad(t){let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT");let n=()=>t.abort();return process.on("SIGINT",n),()=>{process.removeListener("SIGINT",n);for(let i of e)process.on("SIGINT",i)}}function ld(t){let e=null;try{let o=t.resolvedAuth.resolvedCreds;o&&(e=xi({sessionId:nd(),identity:{org_id:String(o.org_id??""),user_id:String(o.user_id??""),machine_id:ko(),email:o.email??null,email_domain:o.email_domain??"unknown",user_type:o.user_type??"unknown",env:t.environment,plan:o.plan??"unknown"},invocationMode:t.isAgent?"agent":"cli",getToken:async()=>t.resolvedAuth.token??null}),e.start())}catch{e=null}return{log:(o,r,a,s)=>{try{e?.log(o,r,a,s)}catch{}},shutdown:async()=>{try{await e?.shutdown()}catch{}}}}function cd(t,e){return t?n=>process.stdout.write(JSON.stringify(n)+`
100
- `):e||(n=>dd(n))}function dd(t){switch(t.type){case"testrun_start":process.stdout.write(`
154
+ `);return}let{renderTestrunEvidenceTable:r}=await import("./TestrunEvidenceTable-JLJBJ76Q.js");await r({rows:i,env:t.environment})}function Vu(t){let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT");let n=()=>t.abort();return process.on("SIGINT",n),()=>{process.removeListener("SIGINT",n);for(let i of e)process.on("SIGINT",i)}}function Lu(t){let e=null;try{let o=t.resolvedAuth.resolvedCreds;o&&(e=Yi({sessionId:Ou(),identity:{org_id:String(o.org_id??""),user_id:String(o.user_id??""),machine_id:qo(),email:o.email??null,email_domain:o.email_domain??"unknown",user_type:o.user_type??"unknown",env:t.environment,plan:o.plan??"unknown"},invocationMode:t.isAgent?"agent":"cli",getToken:async()=>t.resolvedAuth.token??null}),e.start())}catch{e=null}return{log:(o,r,a,s)=>{try{e?.log(o,r,a,s)}catch{}},shutdown:async()=>{try{await e?.shutdown()}catch{}}}}function Uu(t,e){return t?n=>process.stdout.write(JSON.stringify(n)+`
155
+ `):e||(n=>Bu(n))}function Bu(t){switch(t.type){case"testrun_start":process.stdout.write(`
101
156
  running ${t.members.length} test(s) (parallel=${t.parallel})
102
157
  `);break;case"testrun_member_start":process.stdout.write(` -> ${t.path}
103
158
  `);break;case"testrun_member_end":process.stdout.write(` ${t.status==="passed"?"PASS":"FAIL"} ${t.path} (${t.status}, ${t.duration_s}s)
@@ -109,44 +164,52 @@ execution ${n.id}: ${n.status} (${e.passed} passed, ${e.failed} failed, ${e.bro
109
164
  `),(e.authored??0)>0&&process.stdout.write(`authored: ${e.authored} test(s)
110
165
  `),process.stdout.write(`(${t.duration_s}s, upload: ${t.upload})
111
166
  `);break}case"testrun_done":process.stdout.write(`testrun ${t.execution_id}: ${t.overall_status}
112
- `);break;default:break}}function Ma(t){process.stdout.write(`
167
+ `);break;default:break}}function jl(t,e,n,i){!e||!(t.unresolved??[]).length||t.checks.some(o=>o.failure==="unresolved_variables")&&n(es(t.unresolved,{cwd:i}))}function Fl(t){process.stdout.write(`
113
168
  testrun: ${t.title}
114
169
  `),process.stdout.write(` parallel=${t.parallel} on-failure=${t.onFailure}
115
170
 
116
- `);for(let e of t.checks){let n=e.failure?"x":"+",i=e.tags.length>0?` [${e.tags.join(", ")}]`:"",o=e.mobile?" (mobile)":"";process.stdout.write(` ${n} ${e.relPath}${o}${i}
171
+ `);for(let n of t.checks){let i=n.failure?"x":"+",o=n.tags.length>0?` [${n.tags.join(", ")}]`:"",r=n.mobile?" (mobile)":"";process.stdout.write(` ${i} ${n.relPath}${r}${o}
117
172
  `)}process.stdout.write(`
118
173
  ${t.checks.length} test(s) selected \u2014 plan ${t.valid?"valid":"INVALID"}
119
- `)}function xr(t){let e=t.checks.filter(n=>n.failure);if(e.length===0){process.stderr.write(`error: no *_test.md files selected.
174
+ `);let e=t.unresolved??[];t.valid&&e.length>0&&process.stdout.write(`
175
+ warning: ${e.map(n=>n.name).join(", ")} have no value in the pools \u2014 replayed steps resolve from their tape/TMS; authored steps would type them verbatim
176
+ `)}function Br(t){let e=t.checks.filter(n=>n.failure);if(e.length===0){process.stderr.write(`error: no *_test.md files selected.
120
177
  `);return}process.stderr.write(`
121
178
  error: plan invalid \u2014 ${e.length} offending test(s):
122
- `);for(let n of e)process.stderr.write(` ${n.relPath}: ${n.failure}
179
+ `),e.some(n=>n.failure==="unresolved_variables")&&process.stderr.write(`
180
+ `+Zi(t.unresolved??[],{cwd:process.cwd()}));for(let n of e.filter(i=>i.failure!=="unresolved_variables"))process.stderr.write(` ${n.relPath}: ${n.failure}
123
181
  `);e.some(n=>n.failure==="mobile_host_unsupported")&&process.stderr.write(`
124
182
  mobile members need a machine that can drive a device (macOS on Apple Silicon) \u2014 deselect them (--match/--tags) to run the web members here.
125
- `)}import{existsSync as ud,readdirSync as md}from"fs";function Na(t=Z){let e=Oi(t);if(!ud(e))return[];let n=[];for(let i of md(e,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name)){let o=kt(i,t);o.ok&&n.push({name:i,version:o.plugin.version,backendId:o.plugin.manifest.backendId})}return n.sort((i,o)=>i.name.localeCompare(o.name))}import{existsSync as pd,rmSync as fd}from"fs";function Fa(t,e=Z){let n=$i(t,e);return pd(n)?(fd(n,{recursive:!0,force:!0}),{removed:!0}):{removed:!1}}import{existsSync as gd}from"fs";import{execFileSync as hd}from"child_process";function bd(){try{return!!new pe().getActiveProfile()}catch{return!1}}function vd(t){try{return hd("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),"hyperexecute"}catch{}let e=cn(t);return gd(e)?e:null}function La(t,e={}){let n=e.base??Z,i=e.isLoggedIn??bd,o=e.findBinary??(()=>vd(n)),r=[],a=kt(t,n);if(!a.ok)return r.push({id:"installed",ok:!1,level:"error",message:a.reason==="not_installed"?`plugin '${t}' is not installed \u2014 run \`kane-cli plugin install ${t}\``:`plugin '${t}' is ${a.reason}${a.detail?`: ${a.detail}`:""}`}),r;r.push({id:"installed",ok:!0,level:"ok",message:`plugin '${t}' v${a.plugin.version} installed`});let s=o();r.push({id:"binary-present",ok:!!s,level:s?"ok":"error",message:s?`hyperexecute binary found (${s})`:`hyperexecute binary not found \u2014 run \`kane-cli plugin install ${t}\` to download it`});let l=i();return r.push({id:"logged-in",ok:l,level:l?"ok":"warn",message:l?"authenticated":"not logged in \u2014 run `kane-cli login`"}),r}function Va(t,e){let n=o=>o.level==="ok"?"\u2713":o.level==="warn"?"\u26A0":"\u2717",i=[`plugin doctor \u2014 ${t}`];for(let o of e)i.push(` ${n(o)} ${o.message}`);return i.join(`
126
- `)}function Ua(){let t=new rt("plugin").description("Manage kane-cli plugins (install, list, remove, doctor)"),e=i=>i.base??Z,n=()=>!process.stdin.isTTY;return t.command("install").argument("<name>","plugin name (e.g. remote-execution)").option("--version <v>","specific version (defaults to the bundled version)").addOption(new Y("--base <dir>","override base dir (test seam)").hideHelp()).action(async(i,o)=>{let r=Ui(i,{version:o.version,base:e(o)});if(r.status==="failed"){process.stderr.write(`error: ${r.error}
127
- `),process.exitCode=/unknown plugin/i.test(r.error??"")?2:1;return}let a=i==="remote-execution"?await Bi(e(o)):void 0;n()?process.stdout.write(JSON.stringify({type:"plugin_install_result",status:r.status,name:r.name,version:r.version,dir:r.dir,binary:a})+`
183
+ `)}import{existsSync as Hu,readdirSync as Wu}from"fs";function Ll(t=J){let e=ls(t);if(!Hu(e))return[];let n=[];for(let i of Wu(e,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name)){let o=Rt(i,t);o.ok&&n.push({name:i,version:o.plugin.version,backendId:o.plugin.manifest.backendId})}return n.sort((i,o)=>i.name.localeCompare(o.name))}import{existsSync as qu,rmSync as Ku}from"fs";function Ul(t,e=J){let n=cs(t,e);return qu(n)?(Ku(n,{recursive:!0,force:!0}),{removed:!0}):{removed:!1}}import{existsSync as Yu}from"fs";import{execFileSync as Ju}from"child_process";function Gu(){try{return!!new de().getActiveProfile()}catch{return!1}}function zu(t){try{return Ju("hyperexecute",["--version"],{stdio:"ignore",timeout:2e3}),"hyperexecute"}catch{}let e=vn(t);return Yu(e)?e:null}function Bl(t,e={}){let n=e.base??J,i=e.isLoggedIn??Gu,o=e.findBinary??(()=>zu(n)),r=[],a=Rt(t,n);if(!a.ok)return r.push({id:"installed",ok:!1,level:"error",message:a.reason==="not_installed"?`plugin '${t}' is not installed \u2014 run \`kane-cli plugin install ${t}\``:`plugin '${t}' is ${a.reason}${a.detail?`: ${a.detail}`:""}`}),r;r.push({id:"installed",ok:!0,level:"ok",message:`plugin '${t}' v${a.plugin.version} installed`});let s=o();r.push({id:"binary-present",ok:!!s,level:s?"ok":"error",message:s?`hyperexecute binary found (${s})`:`hyperexecute binary not found \u2014 run \`kane-cli plugin install ${t}\` to download it`});let l=i();return r.push({id:"logged-in",ok:l,level:l?"ok":"warn",message:l?"authenticated":"not logged in \u2014 run `kane-cli login`"}),r}function Hl(t,e){let n=o=>o.level==="ok"?"\u2713":o.level==="warn"?"\u26A0":"\u2717",i=[`plugin doctor \u2014 ${t}`];for(let o of e)i.push(` ${n(o)} ${o.message}`);return i.join(`
184
+ `)}function Wl(){let t=new at("plugin").description("Manage kane-cli plugins (install, list, remove, doctor)"),e=i=>i.base??J,n=()=>!process.stdin.isTTY;return t.command("install").argument("<name>","plugin name (e.g. remote-execution)").option("--version <v>","specific version (defaults to the bundled version)").addOption(new W("--base <dir>","override base dir (test seam)").hideHelp()).action(async(i,o)=>{let r=Cs(i,{version:o.version,base:e(o)});if(r.status==="failed"){process.stderr.write(`error: ${r.error}
185
+ `),process.exitCode=/unknown plugin/i.test(r.error??"")?2:1;return}let a=i==="remote-execution"?await Ss(e(o)):void 0;n()?process.stdout.write(JSON.stringify({type:"plugin_install_result",status:r.status,name:r.name,version:r.version,dir:r.dir,binary:a})+`
128
186
  `):(process.stderr.write(`${r.status==="already-installed"?"already installed":"installed"} ${r.name}@${r.version} \u2192 ${r.dir}
129
187
  `),a&&(a.status==="failed"?process.stderr.write(`\u26A0 hyperexecute binary download failed (${a.error}) \u2014 re-run \`kane-cli plugin install ${r.name}\`
130
188
  `):process.stderr.write(`\u2713 hyperexecute binary ${a.status} \u2192 ${a.path}
131
189
  `)),process.stderr.write(`run \`kane-cli plugin doctor ${r.name}\` to check readiness for --remote
132
- `)),process.exitCode=0}),t.command("list").addOption(new Y("--base <dir>","override base dir (test seam)").hideHelp()).action(i=>{let o=Na(e(i));if(n())process.stdout.write(JSON.stringify({type:"plugin_list",plugins:o})+`
190
+ `)),process.exitCode=0}),t.command("list").addOption(new W("--base <dir>","override base dir (test seam)").hideHelp()).action(i=>{let o=Ll(e(i));if(n())process.stdout.write(JSON.stringify({type:"plugin_list",plugins:o})+`
133
191
  `);else if(o.length===0)process.stderr.write(`no plugins installed
134
192
  `);else for(let r of o)process.stdout.write(`${r.name}@${r.version} (${r.backendId})
135
- `);process.exitCode=0}),t.command("remove").argument("<name>","plugin name").addOption(new Y("--base <dir>","override base dir (test seam)").hideHelp()).action((i,o)=>{let r=Fa(i,e(o));n()?process.stdout.write(JSON.stringify({type:"plugin_remove_result",name:i,removed:r.removed})+`
193
+ `);process.exitCode=0}),t.command("remove").argument("<name>","plugin name").addOption(new W("--base <dir>","override base dir (test seam)").hideHelp()).action((i,o)=>{let r=Ul(i,e(o));n()?process.stdout.write(JSON.stringify({type:"plugin_remove_result",name:i,removed:r.removed})+`
136
194
  `):process.stderr.write(r.removed?`removed ${i}
137
195
  `:`not installed: ${i}
138
- `),process.exitCode=0}),t.command("doctor").argument("[name]","plugin name","remote-execution").addOption(new Y("--base <dir>","override base dir (test seam)").hideHelp()).action((i,o)=>{let r=La(i,{base:e(o)});n()?process.stdout.write(JSON.stringify({type:"plugin_doctor",name:i,checks:r})+`
139
- `):process.stdout.write(Va(i,r)+`
140
- `),process.exitCode=r.some(a=>a.id==="installed"&&!a.ok)?2:0}),t}var Ir="pass --target emulator|simulator";function Ha(t){return t===void 0||t===""?{error:Ir}:t==="emulator"||t==="simulator"?{ok:t}:t==="desktop"?{error:`desktop has no devices or uploads to list \u2014 ${Ir}`}:{error:`unknown target "${t}" \u2014 ${Ir}`}}function Ba(t){return t.kind==="simulator"||t.id.startsWith("emulator-")?t.id:void 0}function wd(t){let e=t.osVersion;return{name:zr(t),state:t.state,...Ba(t)?{id:Ba(t)}:{},platform:t.platform,kind:t.kind,...e?{os_version:e}:{}}}function yd(t,e=n=>process.stdout.write(`${n}
141
- `)){if(t.length===0){e("(no devices found)");return}let n=s=>s.os_version??"-",i=s=>s.id??"-",o=Math.max(6,...t.map(s=>s.name.length)),r=Math.max(10,...t.map(s=>n(s).length)),a=Math.max(5,...t.map(s=>s.state.length));e(`${"DEVICE".padEnd(o)} ${"OS VERSION".padEnd(r)} ${"STATE".padEnd(a)} ID`);for(let s of t)e(`${s.name.padEnd(o)} ${n(s).padEnd(r)} ${s.state.padEnd(a)} ${i(s)}`)}function kd(){return{host:qt,depsInstalled:async t=>(await Wt().status(t)).installed,discover:t=>Xr(t),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:t=>process.stdout.write(`${t}
196
+ `),process.exitCode=0}),t.command("doctor").argument("[name]","plugin name","remote-execution").addOption(new W("--base <dir>","override base dir (test seam)").hideHelp()).action((i,o)=>{let r=Bl(i,{base:e(o)});n()?process.stdout.write(JSON.stringify({type:"plugin_doctor",name:i,checks:r})+`
197
+ `):process.stdout.write(Hl(i,r)+`
198
+ `),process.exitCode=r.some(a=>a.id==="installed"&&!a.ok)?2:0}),t}var qr="pass --target emulator|simulator";function Kr(t){return t===void 0||t===""?{error:qr}:t==="emulator"||t==="simulator"?{ok:t}:t==="desktop"?{error:`desktop has no devices or uploads to list \u2014 ${qr}`}:{error:`unknown target "${t}" \u2014 ${qr}`}}function ql(t){return t.kind==="simulator"||t.id.startsWith("emulator-")?t.id:void 0}function Xu(t){let e=t.osVersion;return{name:vo(t),state:t.state,...ql(t)?{id:ql(t)}:{},platform:t.platform,kind:t.kind,...e?{os_version:e}:{}}}function Qu(t,e=n=>process.stdout.write(`${n}
199
+ `)){if(t.length===0){e("(no devices found)");return}let n=s=>s.os_version??"-",i=s=>s.id??"-",o=Math.max(6,...t.map(s=>s.name.length)),r=Math.max(10,...t.map(s=>n(s).length)),a=Math.max(5,...t.map(s=>s.state.length));e(`${"DEVICE".padEnd(o)} ${"OS VERSION".padEnd(r)} ${"STATE".padEnd(a)} ID`);for(let s of t)e(`${s.name.padEnd(o)} ${n(s).padEnd(r)} ${s.state.padEnd(a)} ${i(s)}`)}function Zu(){return{host:Zt,depsInstalled:async t=>(await Qt().status(t)).installed,discover:t=>wo(t),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:t=>process.stdout.write(`${t}
200
+ `),err:t=>process.stderr.write(`${t}
201
+ `),exit:(t,e)=>x(t,e)}}async function em(t,e=Zu()){let n=Kr(t.target);if("error"in n){e.err(`error: ${n.error}`),e.exit(2,`devices list: ${n.error}`);return}let i=e.host();if(!i.supported){e.err(`error: ${i.reason}`),e.exit(2,"devices list: unsupported host");return}if(n.ok==="emulator"&&!bo()&&!await e.depsInstalled("emulator")){e.err(`error: the managed Android dependencies are not installed, so emulators cannot be discovered.
202
+ Install them: kane-cli doctor --target emulator --install`),e.exit(2,"devices list: emulator deps missing");return}let o=zt(n.ok),r=(await e.discover(o)).filter(a=>a.kind===n.ok).map(Xu);if(t.agent||e.isAgent()){for(let a of r)e.out(JSON.stringify(a));e.out(JSON.stringify({total:r.length}))}else Qu(r,e.out);e.exit(0,"devices list complete")}function tm(t){return{name:t.name,brand:t.brand,...t.configName?{config_name:t.configName}:{},os_versions:t.osVersions,...t.avdIds?{avd_ids:t.avdIds}:{}}}function nm(t,e=n=>process.stdout.write(`${n}
203
+ `)){if(t.length===0){e("(no devices found)");return}let n=r=>r.os_versions.join(", "),i=Math.max(5,...t.map(r=>r.brand.length)),o=Math.max(6,...t.map(r=>r.name.length));e(`${"BRAND".padEnd(i)} ${"DEVICE".padEnd(o)} OS VERSIONS`);for(let r of t)e(`${r.brand.padEnd(i)} ${r.name.padEnd(o)} ${n(r)}`)}function rm(){return{resolveCatalogFn:Wt,resolveAuth:sr,isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:t=>process.stdout.write(`${t}
142
204
  `),err:t=>process.stderr.write(`${t}
143
- `),exit:(t,e)=>k(t,e)}}async function _d(t,e=kd()){let n=Ha(t.target);if("error"in n){e.err(`error: ${n.error}`),e.exit(2,`devices list: ${n.error}`);return}let i=e.host();if(!i.supported){e.err(`error: ${i.reason}`),e.exit(2,"devices list: unsupported host");return}if(n.ok==="emulator"&&!await e.depsInstalled("emulator")){e.err(`error: the managed Android dependencies are not installed, so emulators cannot be discovered.
144
- Install them: kane-cli doctor --target emulator --install`),e.exit(2,"devices list: emulator deps missing");return}let o=Ut(n.ok),r=(await e.discover(o)).filter(a=>a.kind===n.ok).map(wd);if(t.agent||e.isAgent()){for(let a of r)e.out(JSON.stringify(a));e.out(JSON.stringify({total:r.length}))}else yd(r,e.out);e.exit(0,"devices list complete")}function xd(t){return{app_id:t.appId,name:t.name,...t.packageName?{package:t.packageName}:{},...t.updatedAt?{updated_at:t.updatedAt}:{}}}function Sd(t,e,n=i=>process.stdout.write(`${i}
145
- `)){if(t.length===0){n("(no uploads found)");return}let i=Math.max(4,...t.map(r=>r.name.length)),o=Math.max(6,...t.map(r=>r.app_id.length));n(`${"NAME".padEnd(i)} ${"APP ID".padEnd(o)} UPDATED`);for(let r of t){let a=r.updated_at?r.updated_at.slice(0,10):"";n(`${r.name.padEnd(i)} ${r.app_id.padEnd(o)} ${a}`)}e>t.length&&n(""),e>t.length&&n(`${t.length} of ${e}`)}var Cd=50;function Id(t){return{resolveAuth:async()=>{let e=new pe,n=t.profile??e.getActiveProfile()??"default",i=t.env??e.getDefaultEnv(),o=await Hi(n,i,t);if(!o.ok){let{message:r,exitCode:a}=Wi(n,i,o);return process.stderr.write(r),k(a,`${o.reason} for "${n}" [${i}]`),{ok:!1}}return{ok:!0,username:o.creds.username,accessKey:o.creds.access_key,env:i}},list:async({baseUrl:e,auth:n,type:i})=>new lo(e,n).list({type:i,limit:Cd}),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:e=>process.stdout.write(`${e}
205
+ `),exit:(t,e)=>x(t,e)}}async function om(t,e=rm()){let n=Kr(t.target);if("error"in n){e.err(`error: ${n.error}`),e.exit(2,`devices list --remote: ${n.error}`);return}let i=n.ok==="simulator"?"ios":"android",o=i==="ios"?"iOS":"Android",r=new de,a=t.profile??r.getActiveProfile()??"default",s=t.env??r.getDefaultEnv()??"prod",l=await e.resolveAuth(a,s,{...t.username?{username:t.username}:{},...t.accessKey?{accessKey:t.accessKey}:{}});if(!l.ok){let{message:p,exitCode:g}=ar(a,s,l);e.err(p.trimEnd()),e.exit(g,"devices list --remote: auth");return}let u=await e.resolveCatalogFn(s,{username:l.creds.username,accessKey:l.creds.access_key},{platform:i});if(!u.ok){e.err(`error: ${u.reason}`),e.exit(1,"devices list --remote: catalog unavailable");return}u.warning&&e.err(`warning: ${u.warning}`);let c=u.catalog.devices;if(t.osVersion){let p=t.osVersion.trim();if(c=c.filter(g=>g.osVersions.includes(p)),c.length===0){e.err(`error: no ${n.ok} device runs ${o} ${p}.
206
+ The grid supports: ${u.catalog.supportedOsVersions.join(", ")}`),e.exit(2,"devices list --remote: no devices on that version");return}}let m=c.map(tm);if(t.agent||e.isAgent()){for(let p of m)e.out(JSON.stringify(p));e.out(JSON.stringify({total:m.length,platform:u.catalog.platform,supported_os_versions:u.catalog.supportedOsVersions,generated_at:u.catalog.generatedAt,device_config_versions:u.catalog.source.deviceConfigVersions,...u.catalog.runson?{runson:u.catalog.runson}:{},origin:u.origin}))}else nm(m,e.out);e.exit(0,"devices list --remote complete")}function im(t){return{app_id:t.appId,name:t.name,...t.packageName?{package:t.packageName}:{},...t.updatedAt?{updated_at:t.updatedAt}:{}}}function sm(t,e,n=i=>process.stdout.write(`${i}
207
+ `)){if(t.length===0){n("(no uploads found)");return}let i=Math.max(4,...t.map(r=>r.name.length)),o=Math.max(6,...t.map(r=>r.app_id.length));n(`${"NAME".padEnd(i)} ${"APP ID".padEnd(o)} UPDATED`);for(let r of t){let a=r.updated_at?r.updated_at.slice(0,10):"";n(`${r.name.padEnd(i)} ${r.app_id.padEnd(o)} ${a}`)}e>t.length&&n(""),e>t.length&&n(`${t.length} of ${e}`)}var am=50;function lm(t){return{resolveAuth:async()=>{let e=new de,n=t.profile??e.getActiveProfile()??"default",i=t.env??e.getDefaultEnv(),o=await sr(n,i,t);if(!o.ok){let{message:r,exitCode:a}=ar(n,i,o);return process.stderr.write(r),x(a,`${o.reason} for "${n}" [${i}]`),{ok:!1}}return{ok:!0,username:o.creds.username,accessKey:o.creds.access_key,env:i}},list:async({baseUrl:e,auth:n,type:i})=>new Ao(e,n).list({type:i,limit:am}),isAgent:()=>!process.stdin.isTTY||!process.stdout.isTTY,out:e=>process.stdout.write(`${e}
146
208
  `),err:e=>process.stderr.write(`${e}
147
- `),exit:(e,n)=>k(e,n)}}async function Ed(t,e=Id(t)){let n=Ha(t.target);if("error"in n){e.err(`error: ${n.error}`),e.exit(2,`apps list: ${n.error}`);return}let i=await e.resolveAuth();if(i.ok)try{let o=await e.list({baseUrl:Et(i.env),auth:{username:i.username,accessKey:i.accessKey},type:n.ok}),r=o.apps.map(xd);if(t.agent||e.isAgent()){for(let a of r)e.out(JSON.stringify(a));e.out(JSON.stringify({total:o.total}))}else Sd(r,o.total,e.out);e.exit(0,"apps list complete")}catch(o){e.err(`error: ${o instanceof Error?o.message:String(o)}`),e.exit(1,"apps list failed")}}function Wa(t){t.command("devices").description("List the emulators or simulators on this machine (TTY = table; non-TTY / --agent = NDJSON). Address a device by DEVICE + OS VERSION: --device-name/--os-version, or `config set-device-name` + `config set-os-version`.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,n)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
148
- `),k(2,`devices: unknown action "${e}"`);return}await _d(n)}),t.command("apps").description("List this account's uploaded builds for a device class (TTY = table; non-TTY / --agent = NDJSON). The APP ID column is what --app and `config set-app` accept.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--profile <name>","Profile name (default: active)").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip stored creds)").option("--access-key <key>","Basic auth access key").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,n)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
149
- `),k(2,`apps: unknown action "${e}"`);return}await Ed(n)})}function Ad(t={}){let e=t.hostSupportsMobile??Kt(),n=new rt;n.name("kane-cli").description("Kane-CLI \u2014 the validation layer for AI coding agents. Natural-language web and mobile-app automation, plus requirements-to-coverage assurance, called from your CLI or IDE.").version(Ee).enablePositionalOptions().configureHelp({sortSubcommands:!0}).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)").addHelpText("after",`
209
+ `),exit:(e,n)=>x(e,n)}}async function cm(t,e=lm(t)){let n=Kr(t.target);if("error"in n){e.err(`error: ${n.error}`),e.exit(2,`apps list: ${n.error}`);return}let i=await e.resolveAuth();if(i.ok)try{let o=await e.list({baseUrl:ot(i.env),auth:{username:i.username,accessKey:i.accessKey},type:n.ok}),r=o.apps.map(im);if(t.agent||e.isAgent()){for(let a of r)e.out(JSON.stringify(a));e.out(JSON.stringify({total:o.total}))}else sm(r,o.total,e.out);e.exit(0,"apps list complete")}catch(o){e.err(`error: ${o instanceof Error?o.message:String(o)}`),e.exit(1,"apps list failed")}}function Kl(t){t.command("devices").description("List the emulators or simulators on this machine (TTY = table; non-TTY / --agent = NDJSON). Address a device by DEVICE + OS VERSION: --device-name/--os-version, or `config set-device-name` + `config set-os-version`.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--remote","List what the HyperExecute grid can provision instead of what is attached here. Needs auth, not a mobile host \u2014 DEVICE + OS VERSIONS are what `testrun run --remote` accepts.").option("--os-version <version>","With --remote: list only devices that run this OS version").option("--profile <name>","With --remote: profile name (default: active)").option("--env <name>","With --remote: environment (prod or stage)").option("--username <user>","With --remote: basic auth username (skip stored creds)").option("--access-key <key>","With --remote: basic auth access key").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,n)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
210
+ `),x(2,`devices: unknown action "${e}"`);return}if(n.remote){await om(n);return}if(n.osVersion){process.stderr.write(`error: --os-version filters the --remote listing only; a local listing already shows every attached device.
211
+ `),x(2,"devices list: --os-version without --remote");return}await em(n)}),t.command("apps").description("List this account's uploaded builds for a device class (TTY = table; non-TTY / --agent = NDJSON). The APP ID column is what --app and `config set-app` accept.").argument("<action>","'list'").option("--target <kind>","emulator | simulator (required)").option("--profile <name>","Profile name (default: active)").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip stored creds)").option("--access-key <key>","Basic auth access key").option("--agent","Force NDJSON output (auto-on when stdin is not a TTY)").action(async(e,n)=>{if(e!=="list"){process.stderr.write(`error: unknown action "${e}" (try: list)
212
+ `),x(2,`apps: unknown action "${e}"`);return}await cm(n)})}function mm(t={}){let e=t.hostSupportsMobile??en(),n=new at;n.name("kane-cli").description("Kane-CLI \u2014 the validation layer for AI coding agents. Natural-language web and mobile-app automation, plus requirements-to-coverage assurance, called from your CLI or IDE.").version(ye).enablePositionalOptions().configureHelp({sortSubcommands:!0}).showHelpAfterError("(run `kane-cli --help` to see all commands; `-h` and `help` also work)").addHelpText("after",`
150
213
  Examples:
151
214
  $ kane-cli run "Search for a laptop"
152
215
  $ kane-cli testmd run smoke_test.md
@@ -160,11 +223,11 @@ Test files:
160
223
 
161
224
  Docs https://www.testmuai.com/support/docs/kane-cli-introduction
162
225
  Bugs https://github.com/LambdaTest/kane-cli/issues
163
- `),n.on("command:*",o=>{n.error(`error: unknown command '${o[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),n.command("login").description("Authenticate (interactive; --oauth opens the browser, or --username/--access-key for basic auth)").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new Y("--env <name>","Environment (prod or stage)").default("prod").hideHelp()).option("--profile <name>","Profile name","default").option("--project-id <id>","Project ID (skip picker)").option("--folder-id <id>","Folder ID (skip picker)").addOption(new Y("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async o=>{let r=new pe,a=new Te,s=o.env,l=o.profile;if(!process.stdin.isTTY||o.oauth||o.username){if(r.setDefaultEnv(s),o.oauth)await new wo(l,s,r).login(),console.log(`Logged in as ${l} [${s}] via OAuth`);else if(o.username&&o.accessKey){try{let{validateBasicAuth:v}=await import("./validate-basic-BXBHTTTO.js");await v(s,o.username,o.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),k(1,"Invalid basic-auth credentials");return}r.saveBasicAuth(l,s,{username:o.username,access_key:o.accessKey}),console.log(`Logged in as ${l} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),k(1,"Missing --oauth or credentials for login");r.setActiveProfile(l),a.set("model",o.model),o.chromeProfile&&a.set("chrome_profile_path",o.chromeProfile);let b=null;if(o.username&&o.accessKey)b={username:o.username,access_key:o.accessKey};else try{let E=await Ve({creds:r,env:s,log:()=>{}});E.resolvedCreds&&(b={username:E.resolvedCreds.username,access_key:E.resolvedCreds.access_key})}catch{}if(o.projectId&&(nt(r,a,l,s,{projectId:o.projectId}),console.log(`Project set to ${o.projectId}`)),o.folderId&&(nt(r,a,l,s,{folderId:o.folderId}),console.log(`Folder set to ${o.folderId}`)),b&&(!o.projectId||!o.folderId))try{let v=await go({creds:r,config:a,profile:l,env:s,tmsCreds:b,log:()=>{}});o.projectId||console.log(`Auto-selected project: ${v.projectName} (${v.projectId})`),o.folderId||console.log(`Auto-selected folder: ${v.folderName} (${v.folderId})`)}catch(v){console.warn(`Could not auto-select project/folder: ${v instanceof Error?v.message:v}`)}zt(r,a,l,s),console.log("Setup complete."),k(0,"Setup complete")}let{SingleShotApp:u}=await import("./SingleShotApp-KXZF5ZJM.js"),{ScrollbackProvider:c}=await import("./scrollback-JLPJR25X.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js"),g={current:null},d={current:!1},{waitUntilExit:y,unmount:_}=m(p.default.createElement(c,null,p.default.createElement(u,{resultRef:g,mode:"login",loginCompleteRef:d})),{exitOnCtrlC:!1});It(()=>_()),await y();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),d.current&&console.log("Login setup complete."),process.exit(0)}),n.command("logout").description("Revoke tokens and delete the stored profile credentials").action(async()=>{let o=new pe,r=o.getActiveProfile();if(!r){console.log("No active profile to logout");return}let a=o.getDefaultEnv(),s=await yo(o,r,a),l=new Te;s.switchedTo?(zt(o,l,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(l.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),n.command("whoami").description("Show the authenticated identity, active profile, and environment").option("--profile <name>","Profile name").action(async o=>{let r=new pe,a=o.profile??r.getActiveProfile()??"default",s=r.getDefaultEnv(),l=r.loadCredentials(a,s),u=r.loadBasicAuth(a,s),c="none",m=u?.username,p,g,d,y;if(u?c="basic":l&&(c="oauth",g=new Date(l.expires_at*1e3).toISOString().slice(0,10)),c==="none")p="missing";else try{let P=await Ve({creds:r,env:s,log:()=>{}});if(P.resolvedCreds)d="verified",p="valid",m=P.resolvedCreds.username??m;else{let{classifyAuthFailure:f}=await import("./resolver-PSNP72H4.js");f(P.resolver.lastError)==="auth"?(d="rejected",p="expired",y="Credentials rejected by the server \u2014 re-login or rotate your access key"):(d="unreachable",y=P.resolver.lastError?.message)}}catch(P){let f=P;f.code==="refresh_failed"?(d="rejected",p="expired",y="OAuth token refresh failed \u2014 run 'kane-cli login'"):f.code==="not_authenticated"?(c="none",p="missing"):(d="unreachable",y=f.message)}let{WhoamiView:_}=await import("./WhoamiView-PDMQ6F5N.js"),{render:b}=await import("./build-JIKYOZUH.js"),v=await import("./react-QWOAB3TB.js"),{waitUntilExit:E}=b(v.default.createElement(_,{profile:a,env:s,authenticated:d==="verified",authMethod:c,username:m,tokenStatus:p,expiresAt:g,serverStatus:d,detail:y}));await E(),c==="none"?k(1,"whoami: not-authenticated"):d&&d!=="verified"&&k(d==="unreachable"?3:1,`whoami: ${d}`)}),n.command("config <action> [value]").description("Show or change settings ("+["show","set-target",...e?[...cr]:[],"set-mode","set-assertion-mode","set-network-ws","set-network-sse","set-bug-detection","set-final-validation","set-url","set-window","chrome-profile","project","folder","reset"].join(", ")+")").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(o,r,a)=>{let s=new Te,l=new pe,u=ys(o,{hostSupportsMobile:e,mobileMessage:Yt()});if(u){process.stderr.write(u.message),k(u.exitCode,`config ${o} unavailable off a mobile host`);return}if(o==="show"){let c=s.load(),m=l.getActiveProfile()??"default",p=l.getDefaultEnv(),g=l.loadProfileConfig(m,p)??{},d=g.project_id??c.project_id??null,y=g.project_name??c.project_name??null,_=g.folder_id??c.folder_id??null,b=g.folder_name??c.folder_name??null,v=l.loadBasicAuth(m,p),E=l.loadCredentials(m,p),P=v?`basic (${v.username})`:E?"oauth":"not configured",{resolveSessionTarget:f}=await import("./session-target-UWROGOCY.js"),{deviceRefName:C,deviceRefOsVersion:w}=await import("./device-ref-LAZWPRQN.js"),I=f(c.mobile?.tui_target,c.mobile?.default_target?.kind),j=I.kind==="unset"?"desktop":I.kind==="choose-mobile"?"mobile (legacy \u2014 run `kane-cli config set-target emulator|simulator`)":I.kind;if(!!a?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let A=ce(p);process.stdout.write(`${JSON.stringify({profile:m,env:p,auth:P,project_id:d,project_name:y,folder_id:_,folder_name:b,model:c.model,mode:c.mode,assertion_mode:c.assertion_mode,network_ws:c.network_ws,network_sse:c.network_sse,bug_detection:c.bug_detection,final_validation:c.final_validation,window_size:`${c.window_size.width}x${c.window_size.height}`,chrome_profile:c.chrome_profile_path,default_url:c.default_url??$n,target:j,device_name:C(c.mobile?.default_target),os_version:w(c.mobile?.default_target),app:c.mobile?.default_app??null,auto_grant_permissions:c.mobile?.auto_grant_permissions??!0,auto_accept_alerts:c.mobile?.auto_accept_alerts??!0,controller_base_url:A.controllerBaseUrl,tms_base_url:A.tmsBaseUrl})}
164
- `),k(0,"config show complete");return}let{ConfigView:x}=await import("./ConfigView-7HFP4OXS.js"),{render:N}=await import("./build-JIKYOZUH.js"),$=await import("./react-QWOAB3TB.js"),{waitUntilExit:F}=N($.default.createElement(x,{model:c.model,authLabel:P,profile:m,env:p,defaultUrl:c.default_url??$n,projectId:d,projectName:y,folderId:_,folderName:b,windowSize:`${c.window_size.width}x${c.window_size.height}`,chromeProfile:c.chrome_profile_path,target:j,deviceName:C(c.mobile?.default_target),osVersion:w(c.mobile?.default_target),appLabel:c.mobile?.default_app??null}));await F()}else if(o==="set-window"&&r){let c=r.split("x").map(Number),[m,p]=c;!m||!p||!Number.isInteger(m)||!Number.isInteger(p)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):m<800||m>3840?console.error(`Width must be between 800 and 3840 (got ${m})`):p<600||p>2160?console.error(`Height must be between 600 and 2160 (got ${p})`):(s.set("window_size",{width:m,height:p}),console.log(`Window size set to ${m}x${p}`))}else if(o==="set-mode"){if(r!=="action"&&r!=="testing"){console.error("Mode must be 'action' or 'testing'."),k(1,"Invalid mode");return}s.set("mode",r),console.log(`Mode set to ${r}`)}else if(o==="set-assertion-mode"){if(r!=="visual"&&r!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),k(1,"Invalid assertion-mode");return}s.set("assertion_mode",r),console.log(`Assertion mode set to ${r}`)}else if(o==="set-network-ws"){if(r!=="on"&&r!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),k(1,"Invalid network-ws value");return}s.set("network_ws",r==="on"),console.log(`WebSocket capture set to ${r}`)}else if(o==="set-network-sse"){if(r!=="on"&&r!=="off"){console.error("SSE capture must be 'on' or 'off'."),k(1,"Invalid network-sse value");return}s.set("network_sse",r==="on"),console.log(`SSE capture set to ${r}`)}else if(o==="set-bug-detection"){if(r!=="off"&&r!=="stop"&&r!=="continue"){console.error("Bug detection must be 'off', 'stop' or 'continue'."),k(1,"Invalid bug-detection value");return}s.set("bug_detection",r),console.log(`Bug detection set to ${r}`)}else if(o==="set-final-validation"){if(r!=="on"&&r!=="off"){console.error("Final validation must be 'on' or 'off'."),k(1,"Invalid final-validation value");return}s.set("final_validation",r==="on"),console.log(`Final validation set to ${r}`)}else if(o==="set-target"){if(r!=="desktop"&&r!=="emulator"&&r!=="simulator"){console.error("Target must be 'desktop', 'emulator' or 'simulator'."),k(1,"Invalid target");return}if(r!=="desktop"){let{mobileHostSupport:c}=await import("./host-7GZPBA74.js"),m=c();if(!m.supported){console.error(m.reason),k(1,"unsupported host for mobile target");return}}s.setMobile(r==="desktop"?{tui_target:r,default_target:void 0,default_app:void 0}:{tui_target:r}),console.log(`Target set to ${r}`)}else if(o==="set-device-name"||o==="set-os-version"){let c=o==="set-device-name"?"device name":"OS version",m=o==="set-device-name"?"set-os-version":"set-device-name";if(!r){console.error(o==="set-device-name"?'Usage: kane-cli config set-device-name "<name>"':"Usage: kane-cli config set-os-version <version>"),k(1,`Missing ${c}`);return}let{resolveSessionTarget:p,platformOf:g}=await import("./session-target-UWROGOCY.js"),d=s.load().mobile,y=p(d?.tui_target,d?.default_target?.kind),_=y.kind==="emulator"||y.kind==="simulator"?y.kind:null;if(!_){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),k(1,`no mobile target for ${o}`);return}let b=d?.default_target?.kind===_?d.default_target:void 0,v=o==="set-device-name"?r.trim():b?.name?.trim()??"",E=o==="set-os-version"?r.trim():b?.os_version?.trim()??"";if(!v||!E){s.setMobile({default_target:{platform:g(_),kind:_,...v?{name:v}:{},...E?{os_version:E}:{}}}),console.log(`${c[0].toUpperCase()}${c.slice(1)} saved. Complete the pair: kane-cli config ${m} "<value>" \u2014 see kane-cli devices list --target ${_}`);return}let{resolveTarget:P}=await import("./registry-AA5YIO5Y.js"),f;try{f=await P({device:{name:v,osVersion:E},platform:g(_),interactive:!1})}catch($){console.error($ instanceof Error?$.message:String($)),console.error(`Run \`kane-cli doctor --target ${_}\` to check the mobile toolchain.`),k(1,"device discovery failed");return}if(!f.ok){console.error(f.message),k(1,"device not found");return}let C=f.target;if(C.kind!==_){console.error(`${C.displayName} is a ${C.kind}, but the session target is ${_}.`),k(1,"device kind mismatch");return}let{toAppSpec:w}=await import("./prepare-target-JGVB7OKC.js"),{appSuitsTarget:I}=await import("./resolve-run-intent-3CENNCF3.js"),j=d?.default_app,D=j?w(j):null,x=!!j&&(!D||!I(D,_)),{deviceRefOf:N}=await import("./device-ref-LAZWPRQN.js");s.setMobile({default_target:N(C),...x?{default_app:void 0}:{}}),console.log(`Device set to ${v} (${C.osVersion??E}) \u2014 ${C.platform} \xB7 ${C.kind}`),x&&console.log(`Saved app ${j} does not suit a ${_} \u2014 cleared. Set one: kane-cli config set-app`)}else if(o==="set-app"){if(!r){console.error("Usage: kane-cli config set-app </path/to/build | AppId>"),k(1,"Missing app");return}let{resolveSessionTarget:c}=await import("./session-target-UWROGOCY.js"),m=s.load().mobile,p=c(m?.tui_target,m?.default_target?.kind),g=p.kind==="emulator"||p.kind==="simulator"?p.kind:null;if(!g){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),k(1,"no mobile target for set-app");return}if(m?.default_target?.kind!==g){console.error('Set a device first: kane-cli config set-device-name "<name>" && kane-cli config set-os-version "<version>"'),k(1,"no device for set-app");return}let{toAppSpec:d,PACKAGE_ID_REJECTED:y}=await import("./prepare-target-JGVB7OKC.js"),{appSuitsTarget:_}=await import("./resolve-run-intent-3CENNCF3.js"),b=d(r);if(!b){console.error(`${r}: ${y}`),k(1,"not an installable app");return}if(!_(b,g)){console.error(g==="emulator"?`${r} cannot run on an emulator (needs an .apk, or an APP\u2026 id).`:`${r} cannot run on a simulator (needs a .zip of the .app bundle, or an APP\u2026 id).`),k(1,"app does not suit target");return}if(b.kind!=="app_id"){let{access:v}=await import("fs/promises");if(!await v(b.value).then(()=>!0,()=>!1)){console.error(`${b.value} is not there.`),k(1,"app build missing");return}}s.setMobile({default_app:b.value}),console.log(`App set to ${b.value}`)}else if(o==="set-auto-grant-permissions"||o==="set-auto-accept-alerts"){let c=o==="set-auto-grant-permissions"?{label:"Auto grant permissions",kind:"emulator",key:"auto_grant_permissions"}:{label:"Auto accept alerts",kind:"simulator",key:"auto_accept_alerts"};if(r!=="on"&&r!=="off"){console.error(`Usage: kane-cli config ${o} on|off`),k(1,`Invalid ${o} value`);return}let{resolveSessionTarget:m}=await import("./session-target-UWROGOCY.js"),p=s.load().mobile,g=m(p?.tui_target,p?.default_target?.kind);if(g.kind!=="emulator"&&g.kind!=="simulator"){console.error(`Set a mobile target first: kane-cli config set-target ${c.kind}`),k(1,`no mobile target for ${o}`);return}if(g.kind!==c.kind){console.error(`${c.label} applies to ${c.kind} sessions only \u2014 your target is ${g.kind}. Switch with: kane-cli config set-target ${c.kind}`),k(1,`${o} does not apply to ${g.kind}`);return}s.setMobile({[c.key]:r==="on"}),console.log(`${c.label} set to ${r}`)}else if(o==="set-url"){if(!r){console.error("Usage: kane-cli config set-url <url>"),k(1,"Missing URL");return}let c=Xo(r);if(!c){console.error(`Invalid URL: ${r}`),k(1,"Invalid URL");return}s.set("default_url",c),console.log(`Default URL set to ${c}`)}else if(o==="chrome-profile"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config chrome-profile <path>"),k(1,"Missing chrome-profile path")),s.set("chrome_profile_path",r),console.log(`Chrome profile set to ${r}`);return}let{ChromeProfilePicker:c}=await import("./ChromeProfilePicker-PUCZN6WU.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js");await new Promise(g=>{let{unmount:d}=m(p.default.createElement(c,{currentPath:s.load().chrome_profile_path,onSelect:y=>{s.set("chrome_profile_path",y),console.log(`Chrome profile set to ${y}`),d(),g()},onCancel:()=>{d(),g()}}))})}else if(o==="project"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config project <project-id>"),k(1,"Missing project ID"));let f=l.getActiveProfile()??"default",C=l.getDefaultEnv();nt(l,s,f,C,{projectId:r}),console.log(`Project set to ${r}`);return}let c=l.getDefaultEnv(),m=ce(c),p=l.getActiveProfile()??"default",{resolveTmsBasicAuth:g,formatAuthResolutionError:d}=await import("./list-commands-CJCEW7MQ.js"),y=await g(p,c,{});if(!y.ok){let{message:f}=d(p,c,y);process.stderr.write(f),k(2,`${y.reason} for "${p}" [${c}]`);return}let{ProjectPicker:_}=await import("./ProjectPicker-2CJMO5TD.js"),{AuthResolver:b}=await import("./resolver-PSNP72H4.js"),{render:v}=await import("./build-JIKYOZUH.js"),E=await import("./react-QWOAB3TB.js"),P=new b(m.controllerBaseUrl,async()=>null,{username:y.creds.username,access_key:y.creds.access_key});await P.resolve(),await new Promise(f=>{let{unmount:C}=v(E.default.createElement(_,{resolver:P,currentProjectId:s.load().project_id,env:c,onSelect:(w,I)=>{let j=l.getActiveProfile()??"default",D=l.getDefaultEnv();nt(l,s,j,D,{projectId:w,projectName:I}),console.log(`Project set to ${I} (${w})`),C(),f()},onCancel:()=>{C(),f()}}))})}else if(o==="folder"){if(r||!process.stdin.isTTY){if(r||(console.error("Usage: kane-cli config folder <folder-id>"),k(1,"Missing folder ID")),!s.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let w=l.getActiveProfile()??"default",I=l.getDefaultEnv();nt(l,s,w,I,{folderId:r}),console.log(`Folder set to ${r}`);return}let c=s.load();if(!c.project_id){console.log("Select a project first: kane-cli config project");return}let m=l.getDefaultEnv(),p=ce(m),g=l.getActiveProfile()??"default",{resolveTmsBasicAuth:d,formatAuthResolutionError:y}=await import("./list-commands-CJCEW7MQ.js"),_=await d(g,m,{});if(!_.ok){let{message:C}=y(g,m,_);process.stderr.write(C),k(2,`${_.reason} for "${g}" [${m}]`);return}let{FolderPicker:b}=await import("./FolderPicker-LTQW4YNR.js"),{AuthResolver:v}=await import("./resolver-PSNP72H4.js"),{render:E}=await import("./build-JIKYOZUH.js"),P=await import("./react-QWOAB3TB.js"),f=new v(p.controllerBaseUrl,async()=>null,{username:_.creds.username,access_key:_.creds.access_key});await f.resolve(),await new Promise(C=>{let{unmount:w}=E(P.default.createElement(b,{resolver:f,projectId:c.project_id,currentFolderId:c.folder_id,env:m,onSelect:(I,j)=>{let D=l.getActiveProfile()??"default",x=l.getDefaultEnv();nt(l,s,D,x,{folderId:I,folderName:j}),console.log(`Folder set to ${j} (${I})`),w(),C()},onCancel:()=>{w(),C()}}))})}else console.log(`Usage: kane-cli config show|set-target|${e?"set-device-name|set-os-version|set-app|":""}set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|set-bug-detection|set-final-validation|chrome-profile|project|folder`)});let i=n.command("run").description("Run a browser or mobile objective (inline natural-language string)").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","50").option("--timeout <seconds>","Kill run after N seconds").option("--url <url>","Start URL for the run").option("--cdp-endpoint <url>","Connect to existing Chrome CDP endpoint").option("--ws-endpoint <url>","Connect via Playwright WebSocket (e.g. LambdaTest wss:// URL)").option("--global-context <file>",`Override global context markdown (default: ${je(Z,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new Y("--model <name>","Model override").hideHelp()).option("--variables <json>",`Inline variables JSON, e.g. '{"user": {"value": "alice"}}'`).option("--variables-file <path>","Load variables from a JSON file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new Y("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key (skip OAuth)").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: 'action' (strict \u2014 hard-stop on auth/blocked/error) or 'testing' (lenient \u2014 fall through). Overrides config; default: testing.").option("--assertion-mode <mode>","Assertion mode: 'dom' (default \u2014 DOM-based extraction & assertions, vision fallback) or 'visual' (vision model only). Overrides config.").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint verifying the objective as a whole. Overrides config (default: off).").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").option("--bug-detection <mode>","Detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`.",o=>{if(o!=="off"&&o!=="stop"&&o!=="continue")throw new Error("--bug-detection must be off, stop or continue");return o}).addOption(new Y("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when no start URL resolves (a provided --url is still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code export language: python (default) | javascript").option("--name <name>","Persist the session under this name (validated [a-zA-Z0-9_-]+)").option("--chrome-profile <path>","Chrome user-data-dir for this run (overrides stored config)").option("--target <name>","Where to run: desktop | emulator | simulator (default: the saved session target)");return e&&i.option("--device-name <name>","Which device, when the target is mobile: the name as `kane-cli devices list` shows it. Needs an OS version via --os-version").option("--os-version <version>","The device's OS version (e.g. 17.5, 14). Alone = any device on that version").option("--app <path|AppId>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads"),i.addOption(new Y("--appium-url <url>","Appium server URL override (default: runner-managed local server)").hideHelp()).option("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
226
+ `),n.on("command:*",o=>{n.error(`error: unknown command '${o[0]}'`,{exitCode:2,code:"commander.unknownCommand"})}),n.command("login").description("Authenticate (interactive; --oauth opens the browser, or --username/--access-key for basic auth)").option("--oauth","Login via OAuth (opens browser)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").addOption(new W("--env <name>","Environment (prod or stage)").default("prod").hideHelp()).option("--profile <name>","Profile name","default").option("--project-id <id>","Project ID (skip picker)").option("--folder-id <id>","Folder ID (skip picker)").addOption(new W("--model <name>","Model").default("v16-alpha").hideHelp()).option("--chrome-profile <path>","Chrome profile path").action(async o=>{let r=new de,a=new Re,s=o.env,l=o.profile;if(!process.stdin.isTTY||o.oauth||o.username){if(r.setDefaultEnv(s),o.oauth)await new Ho(l,s,r).login(),console.log(`Logged in as ${l} [${s}] via OAuth`);else if(o.username&&o.accessKey){try{let{validateBasicAuth:v}=await import("./validate-basic-GTSVZFQI.js");await v(s,o.username,o.accessKey)}catch{console.error("Credentials not valid. Please use valid credentials."),x(1,"Invalid basic-auth credentials");return}r.saveBasicAuth(l,s,{username:o.username,access_key:o.accessKey}),console.log(`Logged in as ${l} [${s}] via basic auth`)}else console.error("Provide --oauth, or --username and --access-key"),x(1,"Missing --oauth or credentials for login");r.setActiveProfile(l),a.set("model",o.model),o.chromeProfile&&a.set("chrome_profile_path",o.chromeProfile);let b=null;if(o.username&&o.accessKey)b={username:o.username,access_key:o.accessKey};else try{let _=await Le({creds:r,env:s,log:()=>{}});_.resolvedCreds&&(b={username:_.resolvedCreds.username,access_key:_.resolvedCreds.access_key})}catch{}if(o.projectId&&(it(r,a,l,s,{projectId:o.projectId}),console.log(`Project set to ${o.projectId}`)),o.folderId&&(it(r,a,l,s,{folderId:o.folderId}),console.log(`Folder set to ${o.folderId}`)),b&&(!o.projectId||!o.folderId))try{let v=await Vo({creds:r,config:a,profile:l,env:s,tmsCreds:b,log:()=>{}});o.projectId||console.log(`Auto-selected project: ${v.projectName} (${v.projectId})`),o.folderId||console.log(`Auto-selected folder: ${v.folderName} (${v.folderId})`)}catch(v){console.warn(`Could not auto-select project/folder: ${v instanceof Error?v.message:v}`)}on(r,a,l,s),console.log("Setup complete."),x(0,"Setup complete")}let{SingleShotApp:u}=await import("./SingleShotApp-72D5VVLE.js"),{ScrollbackProvider:c}=await import("./scrollback-JLPJR25X.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js"),g={current:null},d={current:!1},{waitUntilExit:h,unmount:k}=m(p.default.createElement(c,null,p.default.createElement(u,{resultRef:g,mode:"login",loginCompleteRef:d})),{exitOnCtrlC:!1});Ot(()=>k()),await h();try{process.stdin.setRawMode?.(!1)}catch{}process.stdout.write("\x1B[?25h"),d.current&&console.log("Login setup complete."),process.exit(0)}),n.command("logout").description("Revoke tokens and delete the stored profile credentials").action(async()=>{let o=new de,r=o.getActiveProfile();if(!r){console.log("No active profile to logout");return}let a=o.getDefaultEnv(),s=await Wo(o,r,a),l=new Re;s.switchedTo?(on(o,l,s.switchedTo.profile,s.switchedTo.env),console.log(`Logged out ${s.profile} [${s.env}]. Switched to ${s.switchedTo.profile} [${s.switchedTo.env}]`)):(l.save({project_id:null,project_name:null,folder_id:null,folder_name:null}),console.log(`Logged out ${s.profile} [${s.env}]. No profiles remaining.`))}),n.command("whoami").description("Show the authenticated identity, active profile, and environment").option("--profile <name>","Profile name").action(async o=>{let r=new de,a=o.profile??r.getActiveProfile()??"default",s=r.getDefaultEnv(),l=r.loadCredentials(a,s),u=r.loadBasicAuth(a,s),c="none",m=u?.username,p,g,d,h;if(u?c="basic":l&&(c="oauth",g=new Date(l.expires_at*1e3).toISOString().slice(0,10)),c==="none")p="missing";else try{let P=await Le({creds:r,env:s,log:()=>{}});if(P.resolvedCreds)d="verified",p="valid",m=P.resolvedCreds.username??m;else{let{classifyAuthFailure:f}=await import("./resolver-7JC5VZ4S.js");f(P.resolver.lastError)==="auth"?(d="rejected",p="expired",h="Credentials rejected by the server \u2014 re-login or rotate your access key"):(d="unreachable",h=P.resolver.lastError?.message)}}catch(P){let f=P;f.code==="refresh_failed"?(d="rejected",p="expired",h="OAuth token refresh failed \u2014 run 'kane-cli login'"):f.code==="not_authenticated"?(c="none",p="missing"):(d="unreachable",h=f.message)}let{WhoamiView:k}=await import("./WhoamiView-PNVUCWLB.js"),{render:b}=await import("./build-JIKYOZUH.js"),v=await import("./react-QWOAB3TB.js"),{waitUntilExit:_}=b(v.default.createElement(k,{profile:a,env:s,authenticated:d==="verified",authMethod:c,username:m,tokenStatus:p,expiresAt:g,serverStatus:d,detail:h}));await _(),c==="none"?x(1,"whoami: not-authenticated"):d&&d!=="verified"&&x(d==="unreachable"?3:1,`whoami: ${d}`)}),n.command("config <action> [value]").description("Show or change settings ("+["show","set-target",...e?[...Cr]:[],"set-mode","set-assertion-mode","set-network-ws","set-network-sse","set-bug-detection","set-final-validation","set-url","set-window","chrome-profile","project","folder","reset"].join(", ")+")").option("--agent","Force JSON output for `show` (auto-on when stdin is not a TTY)").action(async(o,r,a)=>{let s=new Re,l=new de,u=ta(o,{hostSupportsMobile:e,mobileMessage:tn()});if(u){process.stderr.write(u.message),x(u.exitCode,`config ${o} unavailable off a mobile host`);return}if(o==="show"){let c=s.load(),m=l.getActiveProfile()??"default",p=l.getDefaultEnv(),g=l.loadProfileConfig(m,p)??{},d=g.project_id??c.project_id??null,h=g.project_name??c.project_name??null,k=g.folder_id??c.folder_id??null,b=g.folder_name??c.folder_name??null,v=l.loadBasicAuth(m,p),_=l.loadCredentials(m,p),P=v?`basic (${v.username})`:_?"oauth":"not configured",{resolveSessionTarget:f}=await import("./session-target-UWROGOCY.js"),{deviceRefName:S,deviceRefOsVersion:y}=await import("./device-ref-LAZWPRQN.js"),R=f(c.mobile?.tui_target,c.mobile?.default_target?.kind),N=R.kind==="unset"?"desktop":R.kind==="choose-mobile"?"mobile (legacy \u2014 run `kane-cli config set-target emulator|simulator`)":R.kind;if(!!a?.agent||!process.stdin.isTTY||!process.stdout.isTTY){let $=oe(p);process.stdout.write(`${JSON.stringify({profile:m,env:p,auth:P,project_id:d,project_name:h,folder_id:k,folder_name:b,model:c.model,mode:c.mode,assertion_mode:c.assertion_mode,network_ws:c.network_ws,network_sse:c.network_sse,bug_detection:c.bug_detection,final_validation:c.final_validation,window_size:`${c.window_size.width}x${c.window_size.height}`,chrome_profile:c.chrome_profile_path,default_url:c.default_url??qn,target:N,device_name:S(c.mobile?.default_target),os_version:y(c.mobile?.default_target),app:c.mobile?.default_app??null,auto_grant_permissions:c.mobile?.auto_grant_permissions??!0,auto_accept_alerts:c.mobile?.auto_accept_alerts??!0,controller_base_url:$.controllerBaseUrl,tms_base_url:$.tmsBaseUrl})}
227
+ `),x(0,"config show complete");return}let{ConfigView:C}=await import("./ConfigView-UQIRPENS.js"),{render:D}=await import("./build-JIKYOZUH.js"),M=await import("./react-QWOAB3TB.js"),{waitUntilExit:V}=D(M.default.createElement(C,{model:c.model,authLabel:P,profile:m,env:p,defaultUrl:c.default_url??qn,projectId:d,projectName:h,folderId:k,folderName:b,windowSize:`${c.window_size.width}x${c.window_size.height}`,chromeProfile:c.chrome_profile_path,target:N,deviceName:S(c.mobile?.default_target),osVersion:y(c.mobile?.default_target),appLabel:c.mobile?.default_app??null}));await V()}else if(o==="set-window"&&r){let c=r.split("x").map(Number),[m,p]=c;!m||!p||!Number.isInteger(m)||!Number.isInteger(p)?console.error("Invalid format. Use: kane-cli config set-window WIDTHxHEIGHT"):m<800||m>3840?console.error(`Width must be between 800 and 3840 (got ${m})`):p<600||p>2160?console.error(`Height must be between 600 and 2160 (got ${p})`):(s.set("window_size",{width:m,height:p}),console.log(`Window size set to ${m}x${p}`))}else if(o==="set-mode"){if(r!=="action"&&r!=="testing"){console.error("Mode must be 'action' or 'testing'."),x(1,"Invalid mode");return}s.set("mode",r),console.log(`Mode set to ${r}`)}else if(o==="set-assertion-mode"){if(r!=="visual"&&r!=="dom"){console.error("Assertion mode must be 'visual' or 'dom'."),x(1,"Invalid assertion-mode");return}s.set("assertion_mode",r),console.log(`Assertion mode set to ${r}`)}else if(o==="set-network-ws"){if(r!=="on"&&r!=="off"){console.error("WebSocket capture must be 'on' or 'off'."),x(1,"Invalid network-ws value");return}s.set("network_ws",r==="on"),console.log(`WebSocket capture set to ${r}`)}else if(o==="set-network-sse"){if(r!=="on"&&r!=="off"){console.error("SSE capture must be 'on' or 'off'."),x(1,"Invalid network-sse value");return}s.set("network_sse",r==="on"),console.log(`SSE capture set to ${r}`)}else if(o==="set-bug-detection"){if(r!=="off"&&r!=="stop"&&r!=="continue"){console.error("Bug detection must be 'off', 'stop' or 'continue'."),x(1,"Invalid bug-detection value");return}s.set("bug_detection",r),console.log(`Bug detection set to ${r}`)}else if(o==="set-final-validation"){if(r!=="on"&&r!=="off"){console.error("Final validation must be 'on' or 'off'."),x(1,"Invalid final-validation value");return}s.set("final_validation",r==="on"),console.log(`Final validation set to ${r}`)}else if(o==="set-target"){if(r!=="desktop"&&r!=="emulator"&&r!=="simulator"){console.error("Target must be 'desktop', 'emulator' or 'simulator'."),x(1,"Invalid target");return}if(r!=="desktop"){let{mobileHostSupport:c}=await import("./host-7GZPBA74.js"),m=c();if(!m.supported){console.error(m.reason),x(1,"unsupported host for mobile target");return}}s.setMobile(r==="desktop"?{tui_target:r,default_target:void 0,default_app:void 0}:{tui_target:r}),console.log(`Target set to ${r}`)}else if(o==="set-device-name"||o==="set-os-version"){let c=o==="set-device-name"?"device name":"OS version",m=o==="set-device-name"?"set-os-version":"set-device-name";if(!r){console.error(o==="set-device-name"?'Usage: kane-cli config set-device-name "<name>"':"Usage: kane-cli config set-os-version <version>"),x(1,`Missing ${c}`);return}let{resolveSessionTarget:p,platformOf:g}=await import("./session-target-UWROGOCY.js"),d=s.load().mobile,h=p(d?.tui_target,d?.default_target?.kind),k=h.kind==="emulator"||h.kind==="simulator"?h.kind:null;if(!k){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),x(1,`no mobile target for ${o}`);return}let b=d?.default_target?.kind===k?d.default_target:void 0,v=o==="set-device-name"?r.trim():b?.name?.trim()??"",_=o==="set-os-version"?r.trim():b?.os_version?.trim()??"";if(!v||!_){s.setMobile({default_target:{platform:g(k),kind:k,...v?{name:v}:{},..._?{os_version:_}:{}}}),console.log(`${c[0].toUpperCase()}${c.slice(1)} saved. Complete the pair: kane-cli config ${m} "<value>" \u2014 see kane-cli devices list --target ${k}`);return}let{resolveTarget:P}=await import("./registry-JJTRUPH7.js"),f;try{f=await P({device:{name:v,osVersion:_},platform:g(k),interactive:!1})}catch(M){console.error(M instanceof Error?M.message:String(M)),console.error(`Run \`kane-cli doctor --target ${k}\` to check the mobile toolchain.`),x(1,"device discovery failed");return}if(!f.ok){console.error(f.message),x(1,"device not found");return}let S=f.target;if(S.kind!==k){console.error(`${S.displayName} is a ${S.kind}, but the session target is ${k}.`),x(1,"device kind mismatch");return}let{toAppSpec:y}=await import("./prepare-target-UJEY2FSR.js"),{appSuitsTarget:R}=await import("./resolve-run-intent-GHISMXLZ.js"),N=d?.default_app,I=N?y(N):null,C=!!N&&(!I||!R(I,k)),{deviceRefOf:D}=await import("./device-ref-LAZWPRQN.js");s.setMobile({default_target:D(S),...C?{default_app:void 0}:{}}),console.log(`Device set to ${v} (${S.osVersion??_}) \u2014 ${S.platform} \xB7 ${S.kind}`),C&&console.log(`Saved app ${N} does not suit a ${k} \u2014 cleared. Set one: kane-cli config set-app`)}else if(o==="set-app"){if(!r){console.error("Usage: kane-cli config set-app </path/to/build | AppId>"),x(1,"Missing app");return}let{resolveSessionTarget:c}=await import("./session-target-UWROGOCY.js"),m=s.load().mobile,p=c(m?.tui_target,m?.default_target?.kind),g=p.kind==="emulator"||p.kind==="simulator"?p.kind:null;if(!g){console.error("Set a mobile target first: kane-cli config set-target emulator|simulator"),x(1,"no mobile target for set-app");return}if(m?.default_target?.kind!==g){console.error('Set a device first: kane-cli config set-device-name "<name>" && kane-cli config set-os-version "<version>"'),x(1,"no device for set-app");return}let{toAppSpec:d,PACKAGE_ID_REJECTED:h}=await import("./prepare-target-UJEY2FSR.js"),{appSuitsTarget:k}=await import("./resolve-run-intent-GHISMXLZ.js"),b=d(r);if(!b){console.error(`${r}: ${h}`),x(1,"not an installable app");return}if(!k(b,g)){console.error(g==="emulator"?`${r} cannot run on an emulator (needs an .apk, or an APP\u2026 id).`:`${r} cannot run on a simulator (needs a .zip of the .app bundle, or an APP\u2026 id).`),x(1,"app does not suit target");return}if(b.kind!=="app_id"){let{access:v}=await import("fs/promises");if(!await v(b.value).then(()=>!0,()=>!1)){console.error(`${b.value} is not there.`),x(1,"app build missing");return}}s.setMobile({default_app:b.value}),console.log(`App set to ${b.value}`)}else if(o==="set-auto-grant-permissions"||o==="set-auto-accept-alerts"){let c=o==="set-auto-grant-permissions"?{label:"Auto grant permissions",kind:"emulator",key:"auto_grant_permissions"}:{label:"Auto accept alerts",kind:"simulator",key:"auto_accept_alerts"};if(r!=="on"&&r!=="off"){console.error(`Usage: kane-cli config ${o} on|off`),x(1,`Invalid ${o} value`);return}let{resolveSessionTarget:m}=await import("./session-target-UWROGOCY.js"),p=s.load().mobile,g=m(p?.tui_target,p?.default_target?.kind);if(g.kind!=="emulator"&&g.kind!=="simulator"){console.error(`Set a mobile target first: kane-cli config set-target ${c.kind}`),x(1,`no mobile target for ${o}`);return}if(g.kind!==c.kind){console.error(`${c.label} applies to ${c.kind} sessions only \u2014 your target is ${g.kind}. Switch with: kane-cli config set-target ${c.kind}`),x(1,`${o} does not apply to ${g.kind}`);return}s.setMobile({[c.key]:r==="on"}),console.log(`${c.label} set to ${r}`)}else if(o==="set-url"){if(!r){console.error("Usage: kane-cli config set-url <url>"),x(1,"Missing URL");return}let c=ki(r);if(!c){console.error(`Invalid URL: ${r}`),x(1,"Invalid URL");return}s.set("default_url",c),console.log(`Default URL set to ${c}`)}else if(o==="chrome-profile"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config chrome-profile <path>"),x(1,"Missing chrome-profile path")),s.set("chrome_profile_path",r),console.log(`Chrome profile set to ${r}`);return}let{ChromeProfilePicker:c}=await import("./ChromeProfilePicker-QSICCUMV.js"),{render:m}=await import("./build-JIKYOZUH.js"),p=await import("./react-QWOAB3TB.js");await new Promise(g=>{let{unmount:d}=m(p.default.createElement(c,{currentPath:s.load().chrome_profile_path,onSelect:h=>{s.set("chrome_profile_path",h),console.log(`Chrome profile set to ${h}`),d(),g()},onCancel:()=>{d(),g()}}))})}else if(o==="project"){if(r||!process.stdin.isTTY){r||(console.error("Usage: kane-cli config project <project-id>"),x(1,"Missing project ID"));let f=l.getActiveProfile()??"default",S=l.getDefaultEnv();it(l,s,f,S,{projectId:r}),console.log(`Project set to ${r}`);return}let c=l.getDefaultEnv(),m=oe(c),p=l.getActiveProfile()??"default",{resolveTmsBasicAuth:g,formatAuthResolutionError:d}=await import("./list-commands-SH4HPFI4.js"),h=await g(p,c,{});if(!h.ok){let{message:f}=d(p,c,h);process.stderr.write(f),x(2,`${h.reason} for "${p}" [${c}]`);return}let{ProjectPicker:k}=await import("./ProjectPicker-SBBGVF4L.js"),{AuthResolver:b}=await import("./resolver-7JC5VZ4S.js"),{render:v}=await import("./build-JIKYOZUH.js"),_=await import("./react-QWOAB3TB.js"),P=new b(m.controllerBaseUrl,async()=>null,{username:h.creds.username,access_key:h.creds.access_key});await P.resolve(),await new Promise(f=>{let{unmount:S}=v(_.default.createElement(k,{resolver:P,currentProjectId:s.load().project_id,env:c,onSelect:(y,R)=>{let N=l.getActiveProfile()??"default",I=l.getDefaultEnv();it(l,s,N,I,{projectId:y,projectName:R}),console.log(`Project set to ${R} (${y})`),S(),f()},onCancel:()=>{S(),f()}}))})}else if(o==="folder"){if(r||!process.stdin.isTTY){if(r||(console.error("Usage: kane-cli config folder <folder-id>"),x(1,"Missing folder ID")),!s.load().project_id){console.log("Select a project first: kane-cli config project <id>");return}let y=l.getActiveProfile()??"default",R=l.getDefaultEnv();it(l,s,y,R,{folderId:r}),console.log(`Folder set to ${r}`);return}let c=s.load();if(!c.project_id){console.log("Select a project first: kane-cli config project");return}let m=l.getDefaultEnv(),p=oe(m),g=l.getActiveProfile()??"default",{resolveTmsBasicAuth:d,formatAuthResolutionError:h}=await import("./list-commands-SH4HPFI4.js"),k=await d(g,m,{});if(!k.ok){let{message:S}=h(g,m,k);process.stderr.write(S),x(2,`${k.reason} for "${g}" [${m}]`);return}let{FolderPicker:b}=await import("./FolderPicker-OJFR7AKZ.js"),{AuthResolver:v}=await import("./resolver-7JC5VZ4S.js"),{render:_}=await import("./build-JIKYOZUH.js"),P=await import("./react-QWOAB3TB.js"),f=new v(p.controllerBaseUrl,async()=>null,{username:k.creds.username,access_key:k.creds.access_key});await f.resolve(),await new Promise(S=>{let{unmount:y}=_(P.default.createElement(b,{resolver:f,projectId:c.project_id,currentFolderId:c.folder_id,env:m,onSelect:(R,N)=>{let I=l.getActiveProfile()??"default",C=l.getDefaultEnv();it(l,s,I,C,{folderId:R,folderName:N}),console.log(`Folder set to ${N} (${R})`),y(),S()},onCancel:()=>{y(),S()}}))})}else console.log(`Usage: kane-cli config show|set-target|${e?"set-device-name|set-os-version|set-app|":""}set-url|set-window|set-mode|set-assertion-mode|set-network-ws|set-network-sse|set-bug-detection|set-final-validation|chrome-profile|project|folder`)});let i=n.command("run").description("Run a browser or mobile objective (inline natural-language string)").argument("<objective>","Test objective (use {{var}} to reference variables)").option("--headless","Run Chrome in headless mode").option("--max-steps <n>","Maximum agent steps","50").option("--timeout <seconds>","Kill run after N seconds").option("--url <url>","Start URL for the run").option("--cdp-endpoint <url>","Connect to existing Chrome CDP endpoint").option("--ws-endpoint <url>","Connect via Playwright WebSocket (e.g. LambdaTest wss:// URL)").option("--global-context <file>",`Override global context markdown (default: ${$e(J,"global-memory.md")})`).option("--local-context <file>","Override local context markdown (default: .testmuai/context.md in cwd)").addOption(new W("--model <name>","Model override").hideHelp()).option("--variables <json>",`Inline variables JSON, e.g. '{"user": {"value": "alice"}}'`).option("--variables-file <path>","Load variables from a JSON file").option("--session-context <json>","Session context JSON (prior runs)").addOption(new W("--cft","Use Playwright Chromium instead of managed Chrome").hideHelp()).option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key (skip OAuth)").option("--env <name>","Environment (prod or stage)").option("--mode <name>","Run mode: 'action' (strict \u2014 hard-stop on auth/blocked/error) or 'testing' (lenient \u2014 fall through). Overrides config; default: testing.").option("--assertion-mode <mode>","Assertion mode: 'dom' (default \u2014 DOM-based extraction & assertions, vision fallback) or 'visual' (vision model only). Overrides config.").option("--final-validation <on|off>","Final validation: append the system cp_final checkpoint verifying the objective as a whole. Overrides config (default: off).").option("--agent","Agent mode: plain NDJSON output, no colors/UI").option("--task-skills","Enable domain-specific task skills (experimental)").option("--network-ws","Capture WebSocket frames for assertions/extraction (experimental)").option("--network-sse","Capture Server-Sent Events messages (Chromium-only) for assertions/extraction (experimental)").option("--bug-detection <mode>","Detect product bugs while authoring: off|stop|continue (stop halts the run on a confirmed bug; continue records it and keeps going). Overrides `config set-bug-detection`.",o=>{if(o!=="off"&&o!=="stop"&&o!=="continue")throw new Error("--bug-detection must be off, stop or continue");return o}).addOption(new W("--local","Skip TMS integration (no uploads, no variables/secrets push)").hideHelp()).option("--allow-missing-url","Non-TTY only: proceed from the browser's current page instead of failing when no start URL resolves (a provided --url is still used)").option("--code-export","Generate code export after upload").option("--code-language <lang>","Code export language: python (default) | javascript").option("--name <name>","Persist the session under this name (validated [a-zA-Z0-9_-]+)").option("--chrome-profile <path>","Chrome user-data-dir for this run (overrides stored config)").option("--target <name>","Where to run: desktop | emulator | simulator (default: the saved session target)");return e&&i.option("--device-name <name>","Which device, when the target is mobile: the name as `kane-cli devices list` shows it. Needs an OS version via --os-version").option("--os-version <version>","The device's OS version (e.g. 17.5, 14). Alone = any device on that version").option("--app <path|AppId>","App under test, when the target is mobile: a build (.apk / .zip of the .app) or an APP\u2026 id from your uploads"),i.addOption(new W("--appium-url <url>","Appium server URL override (default: runner-managed local server)").hideHelp()).option("--skip-code-validation","Skip post-codegen worker-side validation").option("--no-skip-code-validation","Force post-codegen worker-side validation").addHelpText("after",`
165
228
  Variables:
166
229
  Variables are loaded in order (later wins):
167
- 1. Global: ${je(Z,"variables")}/*.json
230
+ 1. Global: ${$e(J,"variables")}/*.json
168
231
  2. Local: {cwd}/.testmuai/variables/*.json
169
232
  3. File: --variables-file <path>
170
233
  4. Inline: --variables '{"key": {"value": "...", "secret": false}}'
@@ -179,37 +242,38 @@ Variables:
179
242
 
180
243
  Context Files:
181
244
  Context files provide additional instructions to the agent.
182
- Global: ${je(Z,"global-memory.md")}
245
+ Global: ${$e(J,"global-memory.md")}
183
246
  Local: {cwd}/.testmuai/context.md
184
247
 
185
248
  Override with --global-context / --local-context flags.
186
- `).action(async(o,r)=>{try{if(r.name){let{validateNameOrThrow:h}=await import("./name-validator-5YGJXLZ7.js");try{h(r.name)}catch(T){console.error(`error: ${T.message}`),k(2,"Invalid --name");return}}if(o&&o.endsWith(".md")&&!o.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane-cli run'.
249
+ `).action(async(o,r)=>{try{if(r.name){let{validateNameOrThrow:w}=await import("./name-validator-5YGJXLZ7.js");try{w(r.name)}catch(T){console.error(`error: ${T.message}`),x(2,"Invalid --name");return}}if(o&&o.endsWith(".md")&&!o.startsWith("-")){process.stderr.write(`error: '.md' files are no longer accepted by 'kane-cli run'.
187
250
  Use 'kane-cli testmd run <path>' instead.
188
- `),process.exit(2);return}let a=new pe,s=new Te,l=s.load();r.chromeProfile&&(l.chrome_profile_path=r.chromeProfile);let u;if(r.mode===void 0)u=l.mode==="action"?"action":"testing";else if(r.mode==="action"||r.mode==="testing")u=r.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),k(2,"Invalid --mode");return}let c;if(r.assertionMode===void 0)c=l.assertion_mode==="dom"?"dom":"visual";else if(r.assertionMode==="visual"||r.assertionMode==="dom")c=r.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),k(2,"Invalid --assertion-mode");return}let m;if(r.finalValidation!==void 0){if(r.finalValidation!=="on"&&r.finalValidation!=="off"){console.error("Invalid --final-validation. Must be 'on' or 'off'."),k(2,"Invalid --final-validation");return}m=r.finalValidation==="on"}let p=new Tt,{printRecordingBanner:g}=await import("./recording-banner-CQBXZMT3.js");await g({isAgent:!!r.agent||!process.stdin.isTTY,sessionId:p.sessionId,sessionName:r.name??null,testPath:r.name?je(process.cwd(),".testmuai","tests",`${r.name}_test.md`):null,outputPath:r.name?je(process.cwd(),".testmuai","tests",`output-${r.name}`):null});let d=!!(r.username&&r.accessKey);if(await ri({isInteractive:!!process.stdin.isTTY&&!r.agent&&!d,creds:a,config:s}),!d){let h=a.getActiveProfile(),T=a.getDefaultEnv();h&&(a.loadBasicAuth(h,T)||a.loadCredentials(h,T))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),k(1,"Not authenticated"))}let y=`${a.getActiveProfile()??"no profile"}/${a.getDefaultEnv()}`,_=[],b=r.env??a.getDefaultEnv(),v=null,E=[],P=(h,T,O,V)=>{v?v(h,T,O,V):E.push([h,T,O,V])},f;try{f=await Ve({creds:a,env:b,usernameFlag:r.username,accessKeyFlag:r.accessKey,log:P})}catch(h){throw h instanceof Rt&&(console.error(h.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),k(2,h.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),h}let C=!!f.basicAuth,w=f.basicAuth?.username,I=f.basicAuth?.access_key,j=f.token,D=f.resolver,x=f.resolvedCreds;f.basicAuth&&_.push(`Auth: ${f.basicAuth.username}`);let N=a.getActiveProfile()??"default",$=a.getDefaultEnv();fo(a,s,N,$);let F=s.load(),A=f.basicAuth??(f.resolvedCreds?{username:f.resolvedCreds.username,access_key:f.resolvedCreds.access_key}:null);if(A){let h=!!r.agent||!process.stdin.isTTY,T=await Xt({creds:a,config:s,profile:N,env:$,tmsCreds:A,isLocal:!!r.local,log:P});T.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),k(2,"project/folder gate failed")),T.status==="ok"&&T.autoDefaulted&&h&&process.stdout.write(bo(T.autoDefaulted)),F=s.load()}else r.local||(console.error("Project and folder must be configured. Run `kane-cli login` to set up auth, or pass --username/--access-key, then `kane-cli config project <id>` / `kane-cli config folder <id>`."),k(2,"no TMS credentials for project/folder gate"));let{resolveRunIntent:J,formatRunningOn:X,missingPieceMessage:Oe,staleAppMessage:ve,CHOOSE_MOBILE_KIND_MESSAGE:st}=await import("./resolve-run-intent-3CENNCF3.js"),{mobileHostSupport:Xe}=await import("./host-7GZPBA74.js"),{platformOf:ge}=await import("./session-target-UWROGOCY.js"),le=Ci()&&!r.agent,_e=J({flags:{target:r.target,deviceName:r.deviceName,osVersion:r.osVersion,app:r.app},saved:l.mobile,host:Xe()});if(_e.kind==="choose-mobile-kind")if(le){let{promptMobileKind:h}=await import("./mobile-prompts-SJZVJWSB.js"),T=await h();if(!T){k(2,"target selection cancelled");return}s.setMobile({tui_target:T}),_e=J({flags:{target:T,deviceName:r.deviceName,osVersion:r.osVersion,app:r.app},saved:s.load().mobile,host:Xe()})}else{console.error(`error: ${st}`),k(2,"ambiguous legacy session target");return}if(_e.kind==="invalid"){console.error(`error: ${_e.message}`),k(2,"invalid run target");return}if(_e.kind==="choose-mobile-kind"){k(2,"ambiguous legacy session target");return}for(let h of _e.warnings)console.error(`warning: ${h}`);let He=_e.kind==="mobile"?_e:null;if(He&&r.codeLanguage?.toLowerCase()==="javascript"){console.error("error: --code-language javascript is not supported on a mobile target \u2014 mobile code export is Appium + Python only. Drop the flag, or pass --code-language python."),k(2,"javascript code export on a mobile target");return}let xe=He?"device":"web";if(He||console.error(X({target:"desktop"})),!ms({target:r.target,deviceName:r.deviceName,osVersion:r.osVersion,app:r.app,cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint,cft:r.cft,url:r.url})){let h=xe==="device"?"mobile":"web",T=await mo({objective:o,sessionTarget:h,controllerBaseUrl:ce(b).controllerBaseUrl,authHeader:f.basicAuth?Dn(f.basicAuth.username,f.basicAuth.access_key):`Bearer ${f.token}`}),O=ps(po(T,h));O&&console.error(O),P("info","CLASSIFY_VERDICT","Objective classified",{session_target:h,target:T?.target??null,confidence:T?.confidence??null,warned:!!O})}let R=xe==="device"?null:Qo({flag:r.url,configDefault:l.default_url}),he=xe==="device"?!1:Zo({resolvedUrl:R,local:r.local,allowMissingUrl:r.allowMissingUrl,isTTY:!!process.stdin.isTTY}),L=wi({objective:o,globalDir:je(Z,"variables"),localDir:je(process.cwd(),".testmuai","variables"),file:r.variablesFile,inline:r.variables,onLoadError:h=>console.error(h)}),ee;if(r.sessionContext)try{ee=JSON.parse(r.sessionContext)}catch{console.error("Invalid --session-context JSON"),k(2,"Invalid --session-context JSON")}let at=r.globalContext??je(Z,"global-memory.md"),lt=r.localContext??je(process.cwd(),".testmuai","context.md"),Ne=Bn(at),Ft=Bn(lt),M={},oe=await ui(xe,{prepareDevice:async()=>{let h=He,{isAppId:T}=await import("./app-download-K2ELUXWR.js"),{access:O}=await import("fs/promises"),V=h.app?.value,ne=!1,Ce=!1,z=h.app?.source==="saved"&&!T(h.app.value)?await O(h.app.value).then(()=>!1,()=>!0):!1;if(le){if(h.missing.includes("app")||z){z&&console.error(`${h.app.value} is no longer there \u2014 choose the app under test.`);let{promptApp:B}=await import("./mobile-prompts-SJZVJWSB.js"),{AppClient:me}=await import("./app-client-ZCCNE3RV.js"),Le=w&&I?ct=>new me(Et(b),{username:w,accessKey:I}).list({type:h.target,...ct}):void 0,ie=await B({kind:h.target,...Le?{listApps:Le}:{}});if(!ie)throw k(2,"app selection cancelled"),new Error("app selection cancelled");V=ie,ne=!0}}else{let B=h.missing.map(me=>Oe(h.target,me));if(z&&B.push(ve(h.app.value,h.target)),B.length>0){for(let me of B)console.error(`error: ${me}`);k(2,"mobile run not fully specified")}}let H,we=mn();try{H=await uo({device:h.deviceSelector,platform:ge(h.target),app:V,defaults:l.mobile,interactive:le,agent:!!r.agent,appiumUrl:r.appiumUrl,...le?{pickTarget:async B=>{let{promptDevice:me}=await import("./mobile-prompts-SJZVJWSB.js"),Le=B.filter(ct=>ct.kind===h.target),ie=await me(Le.length>0?Le:B,h.target,l.mobile?.default_target);return ie&&(Ce=!0),ie}}:{},...!r.local&&w&&I&&x?.org_id?{cloudUpload:{env:b,orgId:String(x.org_id),userId:String(x.user_id??""),baseUrl:Et(b),auth:{username:w,accessKey:I}}}:{},onProgress:we.onProgress})}catch(B){we.done(),B instanceof co?(console.error(B.doctorText),console.error(`
189
- ${B.message}`)):console.error(B instanceof Error?B.message:String(B)),k(2,"mobile target preparation failed")}we.done(),H.device.app_package||(console.error(`error: ${Oe(h.target,"app")}`),k(2,"mobile run missing app binding"));let U=h.device?.source==="flag";if(ne||Ce||!U){let{deviceRefOf:B}=await import("./device-ref-LAZWPRQN.js");s.setMobile({...r.target===void 0?{tui_target:h.target}:{},...U?{}:{default_target:B(H.target)},...ne&&V?{default_app:V}:{}})}M.current=H;let Q=V??H.appRef??H.device.app_package??"";return M.appLabel=T(Q)?Q:Td(Q),{device:H.device,...H.appRef?{appRef:H.appRef}:{},...H.appId?{appId:H.appId}:{}}},prepareWeb:async()=>{try{return await di({config:l,startUrl:R??void 0,headless:r.headless,cft:r.cft,wsEndpoint:r.wsEndpoint,cdpEndpoint:r.cdpEndpoint})}catch(h){console.error(xo(h));let T=h instanceof _o?"Chrome not found at standard paths":`Chrome failed: ${h instanceof Error?h.message:h}`;k(2,T)}}}),Ye=oe.kind==="web"?oe.chrome:{instance:null,tempDir:null};Ye.instance&&ut("chrome",()=>{Ye.instance.kill()});let $e=null,Mr=Ye.cdpEndpoint??r.cdpEndpoint;if(Mr&&!r.cft&&!r.wsEndpoint&&($e=Ro({headless:r.headless,cdpEndpoint:Mr,chromePid:Ye.instance?.process.pid}),$e&&ut("marker-overlay",()=>$e.kill())),oe.kind==="device"&&M.current&&He){let h=X({target:He.target,deviceLabel:M.current.target.displayName,appLabel:M.appLabel??""});le||console.error(h),_.push(h)}else r.cft?_.push("CfT mode: Playwright will manage its own browser"):r.wsEndpoint?_.push(`Playwright WS endpoint (${r.wsEndpoint.slice(0,60)}...)`):r.cdpEndpoint?_.push(`CDP connected (${r.cdpEndpoint})`):Ye.cdpEndpoint&&_.push(`Chrome ready (${Ye.cdpEndpoint})`);let S=p;S.start({model:r.model??l.model,environment:b,profile:a.getActiveProfile()}),r.name&&S.setSessionName(r.name),f.resolvedCreds?.org_id!==void 0&&S.setOrgId(String(f.resolvedCreds.org_id)),f.resolvedCreds?.plan!==void 0&&S.setPlan(f.resolvedCreds.plan??null),S.setUserIdentity(f.resolvedCreds?.username??null,f.resolvedCreds?.email??null),v=(h,T,O,V)=>S.log(h,T,O,V);for(let h of E)S.log(...h);E.length=0;let jr=C&&w&&I?{username:w,accessKey:I}:j??null,Fe=null;if(jr!==null){let h=await Si({env:b,tmsCreds:f.resolvedCreds??null,resolver:f.resolver,auth:jr,getToken:async()=>f.token??null,session:S,log:(T,O,V,ne)=>S.log(T,O,V,ne),skipScreenshotQueue:r.local||oe.kind==="device",invocationMode:r.agent||!process.stdin.isTTY?"agent":"cli"});Fe=h.screenshotQueue,h.remoteLogger&&(ut("remote-logger",()=>h.remoteLogger.shutdownSync()),no(h.remoteLogger),to(qr))}let Nr=f.basicAuth&&!r.local?await yi({variables:L,auth:f.basicAuth,orgId:String(f.resolvedCreds?.org_id??""),env:b,localMode:!!r.local,log:(h,T,O,V)=>S.log(h,T,O,V)}):{};S.setAuteurVariables(L.auteur),S.setFirstRun(L.auteurObjective,R??"");let{startInlineEvidence:el,noteInlineSpawn:Fr,inlineEvidenceBlock:tl,finalizeInlineEvidence:nl,createCdpBrowserCapture:rl}=await import("./evidence-MJV3PY2J.js"),Sn=rl(Ye.cdpEndpoint),te=await el({objectiveOrName:r.name??o,sessionId:S.sessionId,title:r.name??o,producerVersion:Ee,pid:process.pid,surfaces:R?[R]:void 0,packRootDir:je(S.sessionDir,"evidence")}),Lt=async(h={})=>(S.flushRecorder(),await nl(te,{saved:!!S.sessionName,local:!!r.local,deviceName:M.current?.target.displayName,deviceModel:M.current?.target.modelIdentifier,recordedTestPath:S.recorder?.lastWrittenPath??null,externalIdInput:{session_id:S.sessionId,commit_id:S.sessionId,test_id:S.testId??void 0,testcase_id:h.testcaseId??S.testcaseId??void 0,project_id:F.project_id??void 0,folder_id:F.folder_id??void 0,org_id:S.orgId??void 0,session_name:S.sessionName??void 0,user_name:S.userName??void 0,user_email:S.userEmail??void 0,sharable_link:li(ce(b).testManagerUiUrl,F.project_id,h.testcaseId??S.testcaseId,h.shareId)},cdpBrowserCapture:Sn,model:r.model??l.model,tuiLogPath:je(S.sessionDir,"tui.log"),log:(T,O,V,ne)=>S.log(T,O,V,ne)}));if(!r.local&&f.basicAuth&&F.project_id){let h=ce(b),T=await _i({tmsBaseUrl:h.tmsBaseUrl,auth:f.basicAuth,objective:L.auteurObjective,url:R??"",projectId:F.project_id,folderId:F.folder_id??"",hasCustomProfile:!!l.chrome_profile_path,...oe.kind==="device"?{mobile:ki({platform:oe.device.platform,appId:oe.appId,deviceName:M.current?.target.displayName,osVersion:M.current?.target.osVersion,udid:oe.device.udid})}:{},log:(O,V,ne,Ce)=>S.log(O,V,ne,Ce)});T&&S.setTestId(T)}S.setResolvedGlobal({mode:u,max_steps:parseInt(r.maxSteps,10),timeout:r.timeout?parseInt(r.timeout,10):void 0,target:mi(oe,{cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint}),app:fi(oe),os_version:oe.kind==="device"?M.current?.target.osVersion:void 0,device_name:pi(oe,M.current?.target),chrome_profile:l.chrome_profile_path||void 0,cdp_endpoint:r.cdpEndpoint||void 0,ws_endpoint:r.wsEndpoint||void 0,headless:r.headless,global_context:Ne??void 0,local_context:Ft??void 0,variables:Object.keys(L.auteur).length>0?L.auteur:void 0});let Lr=vi(L.auteur,L.auteurObjective),Vr=hi({objective:L.auteurObjective,url:R??void 0,requireStartUrl:he,model:r.model??l.model,chrome:Ye,auth:f,sessionId:S.sessionId,runIndex:0,windowSize:l.window_size,maxSteps:parseInt(r.maxSteps,10),headless:r.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:r.taskSkills,networkWs:r.networkWs,networkSse:r.networkSse,bugDetection:r.bugDetection??l.bug_detection,variables:Object.keys(Lr).length>0?Lr:void 0,globalContext:Ne??void 0,localContext:Ft??void 0,sessionContext:ee,device:oe.kind==="device"?oe.device:void 0,evidence:tl(te)}),Cn=Go(),Ur=Fe?(h,T,O,V)=>{if(te&&V){Cn.track(Jo(te.packTestDir,V,Fe,(ne,Ce,z,H)=>S.log(ne,Ce,z,H)));return}zo(S.sessionDir,T,h,Fe,(ne,Ce,z,H)=>S.log(ne,Ce,z,H),O)}:void 0;if(!process.stdin.isTTY&&!r.agent&&(r.agent=!0),r.agent){let h=U=>{process.stdout.write(JSON.stringify(U)+`
190
- `)};$e?.setRunActive(!0);let T;try{T=await us(Vr,{environment:b,mode:u,assertionMode:c,finalValidation:m,log:(U,Q,B,me)=>S.log(U,Q,B,me)},{onStepEnd:Ur,onStepLog:(U,Q,B)=>S.logStep(U,Q,B),onReasoning:U=>$e?.setStepText(U),onStepComplete:()=>$e?.setStepComplete()})}finally{$e?.setRunActive(!1)}let{lastRunEnd:O,stepsTotal:V,hadError:ne,bifurcationFlows:Ce}=T;if(Fr(te,T.evidence,O),ne&&S.escalateRun(0),O){let U=Fn(O,0,Ce);S.addRunResult(Ln(O,L.auteurObjective,0,U),O.total_runs);let Q=O.status==="passed"?"passed":ne?"error":"failed";S.addFlow({runIndex:0,objective:L.auteurObjective,status:Q,summary:O.summary??"",duration:O.duration??0,steps:V,stepsPassed:Q==="passed"?V:0,stepsFailed:Q==="passed"?0:V,reason:O.reason,creditsConsumed:O.credits_consumed})}te&&await Sn(),Mn("chrome","Agent run completed");let z;if(S.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!O,local:!!r.local,mobile:oe.kind==="device"}),O&&!r.local)try{let U=ce(b),Q=F.project_id;if(f.basicAuth){let{UploadPipeline:B}=await import("./pipeline-B2TYZBMB.js");Fe&&(await Cn.settle(),await Fe.drain());let me=Hn({mobile:oe.kind==="device",session:S,env:b,auth:f,variables:L,variableIds:Nr,projectId:Q,folderId:F.folder_id,totalSteps:V,totalDuration:O.duration??0,screenshotExtMap:Fe?.getExtMap(),codeExport:Wn({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(Qe,Rn,An,Pn)=>S.log(Qe,Rn,An,Pn),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:te?{executionId:te.executionId,packTestDir:te.packTestDir,sealedPackPath:te.packDir,sealFn:Lt}:void 0}),ie=await new B(me).execute();ie.success&&(ie.testcaseId&&S.setTestcaseId(ie.testcaseId),ie.testcaseId&&ie.shareId&&Q&&(z=on(U.testManagerUiUrl,Q,ie.testcaseId,ie.shareId)));let ct=null;try{let{persistRecordedSession:Qe}=await import("./persist-recorded-session-FWBAOQEF.js");ct=await Qe(S,{testcaseId:S.testcaseId??void 0,projectId:F.project_id??void 0,folderId:F.folder_id??void 0,codeExportDir:ie.codeExportDir,mobile:oe.kind==="device",packTestDir:te?.packTestDir})}catch(Qe){S.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(Qe)})}let{syncPersistedBundle:al}=await import("./testmd-sync-TPUBEORI.js");await al({recordedTestPath:ct?.recordedTestPath,uploadSucceeded:ie.success,local:!!r.local,sessionId:S.sessionId,basicAuth:f.basicAuth,controllerBaseUrl:U.controllerBaseUrl,log:(Qe,Rn,An,Pn)=>S.log(Qe,Rn,An,Pn),onAgentEvent:h})}}catch(U){S.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:U instanceof Error?U.message:String(U)})}let H=await Lt({});if(te&&H?.sealed){let{offerEvidenceView:U}=await import("./evidence-MJV3PY2J.js");await U({packPath:te.packDir,env:b,isTTY:!1,log:Q=>process.stderr.write(Q+`
191
- `)})}if(O){let U={...O};z&&(U.test_url=z),h(U)}await S.finish("complete"),O||k(ne?2:1,"Agent run ended with no result");let we=O.reason??"";(we.includes("Cancel")||we.includes("Timeout"))&&k(3,`Agent run: ${we}`),O.status==="passed"&&k(0,"Agent run passed"),k(1,"Agent run failed")}let ue=null,xt=0,In=!1,Br=null,Hr=0,Wr={current:null},ol=A?{authHeader:Dn(A.username,A.access_key),sessionId:S.sessionId,controllerBaseUrl:ce(b).controllerBaseUrl}:null,{waitUntilExit:il}=et(Er.default.createElement(tt,null,Er.default.createElement(ds,{config:Vr,describeContext:ol,spawnOpts:{environment:b,mode:u,assertionMode:c,finalValidation:m,log:(h,T,O,V)=>S.log(h,T,O,V)},cancelRef:Wr,banner:{model:r.model??l.model,auth:y,status:_},onComplete:h=>{ue=h.lastRunEnd,xt=h.stepsTotal,In=h.hadError,Br=h.bifurcationFlows,Hr=h.describeCredits,Fr(te,h.evidence,h.lastRunEnd)},onStepEnd:Ur,onReasoning:h=>$e?.setStepText(h),onStepComplete:()=>$e?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),En;if(r.timeout){let h=parseInt(r.timeout,10)*1e3;En=setTimeout(()=>{console.error(`
192
- Timeout: ${r.timeout}s exceeded \u2014 cancelling...`),Wr.current?.()},h)}$e?.setRunActive(!0);try{await il()}finally{$e?.setRunActive(!1)}if(En&&clearTimeout(En),ue){let h=Fn(ue,0,Br);S.addRunResult(Ln(ue,L.auteurObjective,0,h),ue.total_runs);let T=ue.status==="passed"?"passed":In?"error":"failed";S.addFlow({runIndex:0,objective:L.auteurObjective,status:T,summary:ue.summary??"",duration:ue.duration??0,steps:xt,stepsPassed:T==="passed"?xt:0,stepsFailed:T==="passed"?0:xt,reason:ue.reason,creditsConsumed:(ue.credits_consumed??0)+Hr})}te&&await Sn(),Mn("chrome","Ink run completed");{let h=u==="testing",T=S.nextRunIndex()>0;if(h&&!r.name&&T&&process.stdin.isTTY)try{let{renderSavePrompt:O,defaultSessionTimestamp:V}=await import("./SaveSessionPrompt-4DTPZSXD.js"),ne=await O(V());ne&&S.setSessionName(ne)}catch(O){S.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(O)})}}if(S.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!ue,local:!!r.local,mobile:oe.kind==="device"}),ue&&!r.local)try{let h=ce(b),T=F.project_id;if(f.basicAuth){let{UploadPipeline:O}=await import("./pipeline-B2TYZBMB.js");Fe&&(S.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await Cn.settle(),await Fe.drain(),S.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let V=Hn({mobile:oe.kind==="device",session:S,env:b,auth:f,variables:L,variableIds:Nr,projectId:F.project_id,folderId:F.folder_id,totalSteps:xt,totalDuration:ue.duration??0,screenshotExtMap:Fe?.getExtMap(),codeExport:Wn({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(H,we,U,Q)=>S.log(H,we,U,Q),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:te?{executionId:te.executionId,packTestDir:te.packTestDir,sealedPackPath:te.packDir,sealFn:Lt}:void 0}),ne=new O(V),{renderUploadProgress:Ce}=await import("./CliUploadProgress-53LQMQJD.js"),z=await Ce(ne,H=>{if(H.testcaseId&&H.shareId&&T)return on(h.testManagerUiUrl,T,H.testcaseId,H.shareId)});if(z.success){z.testcaseId&&S.setTestcaseId(z.testcaseId);let H=null;try{let{persistRecordedSession:B}=await import("./persist-recorded-session-FWBAOQEF.js");H=await B(S,{testcaseId:S.testcaseId??void 0,projectId:F.project_id??void 0,folderId:F.folder_id??void 0,codeExportDir:z.codeExportDir,mobile:oe.kind==="device",packTestDir:te?.packTestDir})}catch(B){S.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(B)})}let{syncPersistedBundle:we}=await import("./testmd-sync-TPUBEORI.js");await we({recordedTestPath:H?.recordedTestPath,uploadSucceeded:z.success,local:!!r.local,sessionId:S.sessionId,basicAuth:f.basicAuth,controllerBaseUrl:h.controllerBaseUrl,log:(B,me,Le,ie)=>S.log(B,me,Le,ie)});let U=z.testcaseId&&z.shareId&&T?on(h.testManagerUiUrl,T,z.testcaseId,z.shareId):void 0,Q=z.testcaseId&&T?ci(h.testManagerUiUrl,T,z.testcaseId):void 0;if(U||Q||z.codeExportDir||H){let{LinksBox:B}=await import("./LinksBox-6NS3GHWO.js"),{render:me}=await import("./build-JIKYOZUH.js"),Le=await import("./react-QWOAB3TB.js"),{waitUntilExit:ie}=me(Le.default.createElement(B,{recordedTestPath:H?.recordedTestPath,outputDir:H?.outputDir,shareableLink:U,testCaseLink:Q,codeExportDir:z.codeExportDir}),{stdout:process.stderr});await ie()}}if(S.testId){let{renderFeedbackPrompt:H}=await import("./CliFeedbackPrompt-JAIB5MHS.js"),we=await H();if(we)try{await Ti({tmsBaseUrl:h.tmsBaseUrl,username:f.basicAuth.username,accessKey:f.basicAuth.access_key,testId:S.testId,feedbackType:we,log:(U,Q,B,me)=>S.log(U,Q,B,me)})}catch(U){S.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(U)})}}}}catch(h){S.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:h instanceof Error?h.stack??h.message:String(h)}),console.error(`Upload failed: ${h}`)}let sl=await Lt({});if(te&&sl?.sealed){let{offerEvidenceView:h}=await import("./evidence-MJV3PY2J.js"),T=ue?.reason??"",O=T.includes("Cancel")||T.includes("Timeout");await h({packPath:te.packDir,env:b,isTTY:!!process.stdin.isTTY&&!!process.stderr.isTTY&&!O,log:V=>process.stderr.write(V+`
193
- `)})}await S.finish("complete"),ue||k(In?2:1,"Run ended with no result");let Tn=ue.reason??"";(Tn.includes("Cancel")||Tn.includes("Timeout"))&&k(3,`Run: ${Tn}`),ue.status==="passed"&&k(0,"Run passed"),k(1,"Run failed")}catch(a){await io(),k(2,`CLI error: ${a instanceof Error?a.message:String(a)}`)}}),ks(n),_s(n),xs(n),Ss(n),Cs(n),n.addCommand(ja()),n.addCommand(Ua()),qi(n),e&&(hs(n),Wa(n)),n.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(o,r)=>{if(o==="plugin"){let c=r;if(!c){console.error("error: usage: kane-cli install plugin <name>"),k(2,"install plugin: missing name");return}let{installPlugin:m}=await import("./install-BDHZVEY4.js"),p=m(c,{});if(p.status==="failed"){console.error(`error: ${p.error}`),k(/unknown plugin/i.test(p.error??"")?2:1,`install plugin: ${p.status}`);return}let{ensureHyperexecuteBinary:g}=await import("./binary-QVQRWQFK.js"),d=c==="remote-execution"?await g(Z):void 0;process.stdin.isTTY?(process.stderr.write(`${p.status==="already-installed"?"already installed":"installed"} ${p.name}@${p.version} \u2192 ${p.dir}
251
+ `),process.exit(2);return}{let{objectiveVariableGate:w}=await import("./objective-variable-gate-3VUXNDCZ.js"),{formatUnresolvedReceipt:T,unresolvedVariablesEvent:O}=await import("./variable-receipt-IHQAYWMZ.js"),F=w({objective:o,cwd:process.cwd(),globalDir:$e(J,"variables"),opts:{variables:r.variables,variablesFile:r.variablesFile,sessionContext:r.sessionContext}});if(F.refuse){!!r.agent||!process.stdin.isTTY?process.stdout.write(JSON.stringify(O(F.rows,{cwd:process.cwd()}))+`
252
+ `):process.stderr.write(T(F.rows,{cwd:process.cwd()})),process.exit(2);return}}let a=new de,s=new Re,l=s.load();r.chromeProfile&&(l.chrome_profile_path=r.chromeProfile);let u;if(r.mode===void 0)u=l.mode==="action"?"action":"testing";else if(r.mode==="action"||r.mode==="testing")u=r.mode;else{console.error("Invalid --mode. Must be 'action' or 'testing'."),x(2,"Invalid --mode");return}let c;if(r.assertionMode===void 0)c=l.assertion_mode==="dom"?"dom":"visual";else if(r.assertionMode==="visual"||r.assertionMode==="dom")c=r.assertionMode;else{console.error("Invalid --assertion-mode. Must be 'visual' or 'dom'."),x(2,"Invalid --assertion-mode");return}let m;if(r.finalValidation!==void 0){if(r.finalValidation!=="on"&&r.finalValidation!=="off"){console.error("Invalid --final-validation. Must be 'on' or 'off'."),x(2,"Invalid --final-validation");return}m=r.finalValidation==="on"}let p=new Nt,{printRecordingBanner:g}=await import("./recording-banner-7E75ERQJ.js");await g({isAgent:!!r.agent||!process.stdin.isTTY,sessionId:p.sessionId,sessionName:r.name??null,testPath:r.name?$e(process.cwd(),".testmuai","tests",`${r.name}_test.md`):null,outputPath:r.name?$e(process.cwd(),".testmuai","tests",`output-${r.name}`):null});let d=!!(r.username&&r.accessKey);if(await Ii({isInteractive:!!process.stdin.isTTY&&!r.agent&&!d,creds:a,config:s}),!d){let w=a.getActiveProfile(),T=a.getDefaultEnv();w&&(a.loadBasicAuth(w,T)||a.loadCredentials(w,T))||(console.error("Not authenticated. Run: kane-cli login --oauth, or kane-cli login --username <user> --access-key <key>"),x(1,"Not authenticated"))}let h=`${a.getActiveProfile()??"no profile"}/${a.getDefaultEnv()}`,k=[],b=r.env??a.getDefaultEnv(),v=null,_=[],P=(w,T,O,F)=>{v?v(w,T,O,F):_.push([w,T,O,F])},f;try{f=await Le({creds:a,env:b,usernameFlag:r.username,accessKeyFlag:r.accessKey,log:P})}catch(w){throw w instanceof jt&&(console.error(w.code==="not_authenticated"?"Not authenticated. Run: kane-cli login":"Token refresh failed. Run: kane-cli login"),x(2,w.code==="not_authenticated"?"Not authenticated":"Token refresh failed")),w}let S=!!f.basicAuth,y=f.basicAuth?.username,R=f.basicAuth?.access_key,N=f.token,I=f.resolver,C=f.resolvedCreds;f.basicAuth&&k.push(`Auth: ${f.basicAuth.username}`);let D=a.getActiveProfile()??"default",M=a.getDefaultEnv();Fo(a,s,D,M);let V=s.load(),$=f.basicAuth??(f.resolvedCreds?{username:f.resolvedCreds.username,access_key:f.resolvedCreds.access_key}:null);if($){let w=!!r.agent||!process.stdin.isTTY,T=await sn({creds:a,config:s,profile:D,env:M,tmsCreds:$,isLocal:!!r.local,log:P});T.status==="cancelled"&&(console.error("error: project/folder configuration failed. See remediation above, or use --local."),x(2,"project/folder gate failed")),T.status==="ok"&&T.autoDefaulted&&w&&process.stdout.write(Uo(T.autoDefaulted)),V=s.load()}else r.local||(console.error("Project and folder must be configured. Run `kane-cli login` to set up auth, or pass --username/--access-key, then `kane-cli config project <id>` / `kane-cli config folder <id>`."),x(2,"no TMS credentials for project/folder gate"));let{resolveRunIntent:z,formatRunningOn:Q,missingPieceMessage:De,staleAppMessage:be,CHOOSE_MOBILE_KIND_MESSAGE:mt}=await import("./resolve-run-intent-GHISMXLZ.js"),{mobileHostSupport:Ze}=await import("./host-7GZPBA74.js"),{platformOf:ge}=await import("./session-target-UWROGOCY.js"),ce=ts()&&!r.agent,xe=z({flags:{target:r.target,deviceName:r.deviceName,osVersion:r.osVersion,app:r.app},saved:l.mobile,host:Ze()});if(xe.kind==="choose-mobile-kind")if(ce){let{promptMobileKind:w}=await import("./mobile-prompts-UZTRJ3L7.js"),T=await w();if(!T){x(2,"target selection cancelled");return}s.setMobile({tui_target:T}),xe=z({flags:{target:T,deviceName:r.deviceName,osVersion:r.osVersion,app:r.app},saved:s.load().mobile,host:Ze()})}else{console.error(`error: ${mt}`),x(2,"ambiguous legacy session target");return}if(xe.kind==="invalid"){console.error(`error: ${xe.message}`),x(2,"invalid run target");return}if(xe.kind==="choose-mobile-kind"){x(2,"ambiguous legacy session target");return}for(let w of xe.warnings)console.error(`warning: ${w}`);let We=xe.kind==="mobile"?xe:null;if(We&&r.codeLanguage?.toLowerCase()==="javascript"){console.error("error: --code-language javascript is not supported on a mobile target \u2014 mobile code export is Appium + Python only. Drop the flag, or pass --code-language python."),x(2,"javascript code export on a mobile target");return}let Ce=We?"device":"web";if(We||console.error(Q({target:"desktop"})),!Ys({target:r.target,deviceName:r.deviceName,osVersion:r.osVersion,app:r.app,cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint,cft:r.cft,url:r.url})){let w=Ce==="device"?"mobile":"web",T=await No({objective:o,sessionTarget:w,controllerBaseUrl:oe(b).controllerBaseUrl,authHeader:f.basicAuth?Yn(f.basicAuth.username,f.basicAuth.access_key):`Bearer ${f.token}`}),O=Js(jo(T,w));O&&console.error(O),P("info","CLASSIFY_VERDICT","Objective classified",{session_target:w,target:T?.target??null,confidence:T?.confidence??null,warned:!!O})}let A=Ce==="device"?null:_i({flag:r.url,configDefault:l.default_url}),he=Ce==="device"?!1:xi({resolvedUrl:A,local:r.local,allowMissingUrl:r.allowMissingUrl,isTTY:!!process.stdin.isTTY}),L=Hi({objective:o,globalDir:$e(J,"variables"),localDir:$e(process.cwd(),".testmuai","variables"),file:r.variablesFile,inline:r.variables,onLoadError:w=>console.error(w)}),te;if(r.sessionContext)try{te=JSON.parse(r.sessionContext)}catch{console.error("Invalid --session-context JSON"),x(2,"Invalid --session-context JSON")}let pt=r.globalContext??$e(J,"global-memory.md"),ft=r.localContext??$e(process.cwd(),".testmuai","context.md"),je=tr(pt),Yt=tr(ft),j={},ie=await Mi(Ce,{prepareDevice:async()=>{let w=We,{isAppId:T}=await import("./app-download-NNB52ZRJ.js"),{access:O}=await import("fs/promises"),F=w.app?.value,ee=!1,Ee=!1,X=w.app?.source==="saved"&&!T(w.app.value)?await O(w.app.value).then(()=>!1,()=>!0):!1;if(ce){if(w.missing.includes("app")||X){X&&console.error(`${w.app.value} is no longer there \u2014 choose the app under test.`);let{promptApp:B}=await import("./mobile-prompts-UZTRJ3L7.js"),{AppClient:pe}=await import("./app-client-ZCCNE3RV.js"),Ve=y&&R?gt=>new pe(ot(b),{username:y,accessKey:R}).list({type:w.target,...gt}):void 0,se=await B({kind:w.target,...Ve?{listApps:Ve}:{}});if(!se)throw x(2,"app selection cancelled"),new Error("app selection cancelled");F=se,ee=!0}}else{let B=w.missing.map(pe=>De(w.target,pe));if(X&&B.push(be(w.app.value,w.target)),B.length>0){for(let pe of B)console.error(`error: ${pe}`);x(2,"mobile run not fully specified")}}let H,we=yn();try{H=await Mo({device:w.deviceSelector,platform:ge(w.target),app:F,defaults:l.mobile,interactive:ce,agent:!!r.agent,appiumUrl:r.appiumUrl,...ce?{pickTarget:async B=>{let{promptDevice:pe}=await import("./mobile-prompts-UZTRJ3L7.js"),Ve=B.filter(gt=>gt.kind===w.target),se=await pe(Ve.length>0?Ve:B,w.target,l.mobile?.default_target);return se&&(Ee=!0),se}}:{},...!r.local&&y&&R&&C?.org_id?{cloudUpload:{env:b,orgId:String(C.org_id),userId:String(C.user_id??""),baseUrl:ot(b),auth:{username:y,accessKey:R}}}:{},onProgress:we.onProgress})}catch(B){we.done(),B instanceof Oo?(console.error(B.doctorText),console.error(`
253
+ ${B.message}`)):console.error(B instanceof Error?B.message:String(B)),x(2,"mobile target preparation failed")}we.done(),H.device.app_package||(console.error(`error: ${De(w.target,"app")}`),x(2,"mobile run missing app binding"));let U=w.device?.source==="flag";if(ee||Ee||!U){let{deviceRefOf:B}=await import("./device-ref-LAZWPRQN.js");s.setMobile({...r.target===void 0?{tui_target:w.target}:{},...U?{}:{default_target:B(H.target)},...ee&&F?{default_app:F}:{}})}j.current=H;let Z=F??H.appRef??H.device.app_package??"";return j.appLabel=T(Z)?Z:dm(Z),{device:H.device,...H.appRef?{appRef:H.appRef}:{},...H.appId?{appId:H.appId}:{}}},prepareWeb:async()=>{try{return await Oi({config:l,startUrl:A??void 0,headless:r.headless,cft:r.cft,wsEndpoint:r.wsEndpoint,cdpEndpoint:r.cdpEndpoint})}catch(w){console.error(Yo(w));let T=w instanceof Ko?"Chrome not found at standard paths":`Chrome failed: ${w instanceof Error?w.message:w}`;x(2,T)}}}),Ge=ie.kind==="web"?ie.chrome:{instance:null,tempDir:null};Ge.instance&&bt("chrome",()=>{Ge.instance.kill()});let Oe=null,to=Ge.cdpEndpoint??r.cdpEndpoint;if(to&&!r.cft&&!r.wsEndpoint&&(Oe=Zo({headless:r.headless,cdpEndpoint:to,chromePid:Ge.instance?.process.pid}),Oe&&bt("marker-overlay",()=>Oe.kill())),ie.kind==="device"&&j.current&&We){let w=Q({target:We.target,deviceLabel:j.current.target.displayName,appLabel:j.appLabel??""});ce||console.error(w),k.push(w)}else r.cft?k.push("CfT mode: Playwright will manage its own browser"):r.wsEndpoint?k.push(`Playwright WS endpoint (${r.wsEndpoint.slice(0,60)}...)`):r.cdpEndpoint?k.push(`CDP connected (${r.cdpEndpoint})`):Ge.cdpEndpoint&&k.push(`Chrome ready (${Ge.cdpEndpoint})`);let E=p;E.start({model:r.model??l.model,environment:b,profile:a.getActiveProfile()}),r.name&&E.setSessionName(r.name),f.resolvedCreds?.org_id!==void 0&&E.setOrgId(String(f.resolvedCreds.org_id)),f.resolvedCreds?.plan!==void 0&&E.setPlan(f.resolvedCreds.plan??null),E.setUserIdentity(f.resolvedCreds?.username??null,f.resolvedCreds?.email??null),v=(w,T,O,F)=>E.log(w,T,O,F);for(let w of _)E.log(...w);_.length=0;let no=S&&y&&R?{username:y,accessKey:R}:N??null,Fe=null;if(no!==null){let w=await Ji({env:b,tmsCreds:f.resolvedCreds??null,resolver:f.resolver,auth:no,getToken:async()=>f.token??null,session:E,log:(T,O,F,ee)=>E.log(T,O,F,ee),skipScreenshotQueue:r.local,invocationMode:r.agent||!process.stdin.isTTY?"agent":"cli"});Fe=w.screenshotQueue,w.remoteLogger&&(bt("remote-logger",()=>w.remoteLogger.shutdownSync()),Co(w.remoteLogger),xo(mo))}let ro=f.basicAuth&&!r.local?await Wi({variables:L,auth:f.basicAuth,orgId:String(f.resolvedCreds?.org_id??""),env:b,localMode:!!r.local,log:(w,T,O,F)=>E.log(w,T,O,F)}):{};E.setAuteurVariables(L.auteur),E.setFirstRun(L.auteurObjective,A??"");let{startInlineEvidence:nc,noteInlineSpawn:oo,inlineEvidenceBlock:rc,finalizeInlineEvidence:oc,createCdpBrowserCapture:ic}=await import("./evidence-FHO36EEV.js"),Nn=ic(Ge.cdpEndpoint),ne=await nc({objectiveOrName:r.name??o,sessionId:E.sessionId,title:r.name??o,producerVersion:ye,pid:process.pid,surfaces:A?[A]:void 0,packRootDir:$e(E.sessionDir,"evidence")}),Jt=async(w={})=>(E.flushRecorder(),await oc(ne,{saved:!!E.sessionName,local:!!r.local,deviceName:j.current?.target.displayName,deviceModel:j.current?.target.modelIdentifier,recordedTestPath:E.recorder?.lastWrittenPath??null,externalIdInput:{session_id:E.sessionId,commit_id:E.sessionId,test_id:E.testId??void 0,testcase_id:w.testcaseId??E.testcaseId??void 0,project_id:V.project_id??void 0,folder_id:V.folder_id??void 0,org_id:E.orgId??void 0,session_name:E.sessionName??void 0,user_name:E.userName??void 0,user_email:E.userEmail??void 0,sharable_link:$i(oe(b).testManagerUiUrl,V.project_id,w.testcaseId??E.testcaseId,w.shareId)},cdpBrowserCapture:Nn,model:r.model??l.model,tuiLogPath:$e(E.sessionDir,"tui.log"),log:(T,O,F,ee)=>E.log(T,O,F,ee)}));if(!r.local&&f.basicAuth&&V.project_id){let w=oe(b),T=await Ki({tmsBaseUrl:w.tmsBaseUrl,auth:f.basicAuth,objective:L.auteurObjective,url:A??"",projectId:V.project_id,folderId:V.folder_id??"",hasCustomProfile:!!l.chrome_profile_path,...ie.kind==="device"?{mobile:qi({platform:ie.device.platform,appId:ie.appId,deviceName:j.current?.target.displayName,osVersion:j.current?.target.osVersion,udid:ie.device.udid})}:{},log:(O,F,ee,Ee)=>E.log(O,F,ee,Ee)});T&&E.setTestId(T)}E.setResolvedGlobal({mode:u,max_steps:parseInt(r.maxSteps,10),timeout:r.timeout?parseInt(r.timeout,10):void 0,target:Ni(ie,{cdpEndpoint:r.cdpEndpoint,wsEndpoint:r.wsEndpoint}),app:Fi(ie),os_version:ie.kind==="device"?j.current?.target.osVersion:void 0,device_name:ji(ie,j.current?.target),chrome_profile:l.chrome_profile_path||void 0,cdp_endpoint:r.cdpEndpoint||void 0,ws_endpoint:r.wsEndpoint||void 0,headless:r.headless,global_context:je??void 0,local_context:Yt??void 0,variables:Object.keys(L.auteur).length>0?L.auteur:void 0});let io=Bi(L.auteur,L.auteurObjective),so=Li({objective:L.auteurObjective,url:A??void 0,requireStartUrl:he,model:r.model??l.model,chrome:Ge,auth:f,sessionId:E.sessionId,runIndex:0,windowSize:l.window_size,maxSteps:parseInt(r.maxSteps,10),headless:r.headless,disableAskUser:!process.stdin.isTTY,enableTaskSkills:r.taskSkills,networkWs:r.networkWs,networkSse:r.networkSse,bugDetection:r.bugDetection??l.bug_detection,variables:Object.keys(io).length>0?io:void 0,globalContext:je??void 0,localContext:Yt??void 0,sessionContext:te,device:ie.kind==="device"?ie.device:void 0,evidence:rc(ne)}),jn=bi(),ao=Fe?(w,T,O,F)=>{if(ne&&F){jn.track(wi(ne.packTestDir,F,Fe,(ee,Ee,X,H)=>E.log(ee,Ee,X,H)));return}yi(E.sessionDir,T,w,Fe,(ee,Ee,X,H)=>E.log(ee,Ee,X,H),O)}:void 0;if(!process.stdin.isTTY&&!r.agent&&(r.agent=!0),r.agent){let w=U=>{process.stdout.write(JSON.stringify(U)+`
254
+ `)};Oe?.setRunActive(!0);let T;try{T=await Ks(so,{environment:b,mode:u,assertionMode:c,finalValidation:m,log:(U,Z,B,pe)=>E.log(U,Z,B,pe)},{onStepEnd:ao,onStepLog:(U,Z,B)=>E.logStep(U,Z,B),onReasoning:U=>Oe?.setStepText(U),onStepComplete:()=>Oe?.setStepComplete()})}finally{Oe?.setRunActive(!1)}let{lastRunEnd:O,stepsTotal:F,hadError:ee,bifurcationFlows:Ee}=T;if(oo(ne,T.evidence,O),ee&&E.escalateRun(0),O){let U=Xn(O,0,Ee);E.addRunResult(Qn(O,L.auteurObjective,0,U),O.total_runs);let Z=O.status==="passed"?"passed":ee?"error":"failed";E.addFlow({runIndex:0,objective:L.auteurObjective,status:Z,summary:O.summary??"",duration:O.duration??0,steps:F,stepsPassed:Z==="passed"?F:0,stepsFailed:Z==="passed"?0:F,reason:O.reason,creditsConsumed:O.credits_consumed})}ne&&await Nn(),Jn("chrome","Agent run completed");let X;if(E.log("info","DIRECT_UPLOAD_START","Starting direct upload (agent mode)",{agent_mode:!0,last_run_end:!!O,local:!!r.local,mobile:ie.kind==="device"}),O&&!r.local)try{let U=oe(b),Z=V.project_id;if(f.basicAuth){let{UploadPipeline:B}=await import("./pipeline-5FHWZAXK.js");Fe&&(await jn.settle(),await Fe.drain());let pe=nr({mobile:ie.kind==="device",session:E,env:b,auth:f,variables:L,variableIds:ro,projectId:Z,folderId:V.folder_id,totalSteps:F,totalDuration:O.duration??0,screenshotExtMap:Fe?.getExtMap(),codeExport:rr({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(et,Un,Bn,Hn)=>E.log(et,Un,Bn,Hn),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:ne?{executionId:ne.executionId,packTestDir:ne.packTestDir,sealedPackPath:ne.packDir,sealFn:Jt}:void 0}),se=await new B(pe).execute();se.success&&(se.testcaseId&&E.setTestcaseId(se.testcaseId),se.testcaseId&&se.shareId&&Z&&(X=pn(U.testManagerUiUrl,Z,se.testcaseId,se.shareId)));let gt=null;try{let{persistRecordedSession:et}=await import("./persist-recorded-session-QMRY4DOF.js");gt=await et(E,{testcaseId:E.testcaseId??void 0,projectId:V.project_id??void 0,folderId:V.folder_id??void 0,codeExportDir:se.codeExportDir,mobile:ie.kind==="device",packTestDir:ne?.packTestDir})}catch(et){E.log("error","DIRECT_PERSIST_ERROR","Persist failed in agent mode",{error:String(et)})}let{syncPersistedBundle:cc}=await import("./testmd-sync-UBXDLWYD.js");await cc({recordedTestPath:gt?.recordedTestPath,uploadSucceeded:se.success,local:!!r.local,sessionId:E.sessionId,basicAuth:f.basicAuth,controllerBaseUrl:U.controllerBaseUrl,log:(et,Un,Bn,Hn)=>E.log(et,Un,Bn,Hn),onAgentEvent:w})}}catch(U){E.log("error","DIRECT_UPLOAD_ERROR","Upload failed in agent mode",{error:U instanceof Error?U.message:String(U)})}let H=await Jt({});if(ne&&H?.sealed){let{offerEvidenceView:U}=await import("./evidence-FHO36EEV.js");await U({packPath:ne.packDir,env:b,isTTY:!1,log:Z=>process.stderr.write(Z+`
255
+ `)})}if(O){let U={...O};X&&(U.test_url=X),w(U)}await E.finish("complete"),O||x(ee?2:1,"Agent run ended with no result");let we=O.reason??"";(we.includes("Cancel")||we.includes("Timeout"))&&x(3,`Agent run: ${we}`),O.status==="passed"&&x(0,"Agent run passed"),x(1,"Agent run failed")}let me=null,Pt=0,Fn=!1,lo=null,co=0,uo={current:null},sc=$?{authHeader:Yn($.username,$.access_key),sessionId:E.sessionId,controllerBaseUrl:oe(b).controllerBaseUrl}:null,{waitUntilExit:ac}=nt(Yr.default.createElement(rt,null,Yr.default.createElement(qs,{config:so,describeContext:sc,spawnOpts:{environment:b,mode:u,assertionMode:c,finalValidation:m,log:(w,T,O,F)=>E.log(w,T,O,F)},cancelRef:uo,banner:{model:r.model??l.model,auth:h,status:k},onComplete:w=>{me=w.lastRunEnd,Pt=w.stepsTotal,Fn=w.hadError,lo=w.bifurcationFlows,co=w.describeCredits,oo(ne,w.evidence,w.lastRunEnd)},onStepEnd:ao,onReasoning:w=>Oe?.setStepText(w),onStepComplete:()=>Oe?.setStepComplete()})),{stdout:process.stderr,exitOnCtrlC:!1}),Vn;if(r.timeout){let w=parseInt(r.timeout,10)*1e3;Vn=setTimeout(()=>{console.error(`
256
+ Timeout: ${r.timeout}s exceeded \u2014 cancelling...`),uo.current?.()},w)}Oe?.setRunActive(!0);try{await ac()}finally{Oe?.setRunActive(!1)}if(Vn&&clearTimeout(Vn),me){let w=Xn(me,0,lo);E.addRunResult(Qn(me,L.auteurObjective,0,w),me.total_runs);let T=me.status==="passed"?"passed":Fn?"error":"failed";E.addFlow({runIndex:0,objective:L.auteurObjective,status:T,summary:me.summary??"",duration:me.duration??0,steps:Pt,stepsPassed:T==="passed"?Pt:0,stepsFailed:T==="passed"?0:Pt,reason:me.reason,creditsConsumed:(me.credits_consumed??0)+co})}ne&&await Nn(),Jn("chrome","Ink run completed");{let w=u==="testing",T=E.nextRunIndex()>0;if(w&&!r.name&&T&&process.stdin.isTTY)try{let{renderSavePrompt:O,defaultSessionTimestamp:F}=await import("./SaveSessionPrompt-F3563T3C.js"),ee=await O(F());ee&&E.setSessionName(ee)}catch(O){E.log("warn","DIRECT_SAVE_PROMPT_FAILED","Save prompt failed",{error:String(O)})}}if(E.log("info","DIRECT_UPLOAD_START","Starting direct upload (ink mode)",{ink_mode:!0,last_event:!!me,local:!!r.local,mobile:ie.kind==="device"}),me&&!r.local)try{let w=oe(b),T=V.project_id;if(f.basicAuth){let{UploadPipeline:O}=await import("./pipeline-5FHWZAXK.js");Fe&&(E.log("info","SCREENSHOT_UPLOAD_DRAIN","Draining screenshot upload queue before pipeline"),await jn.settle(),await Fe.drain(),E.log("info","SCREENSHOT_UPLOAD_DRAINED","Screenshot upload queue drained"));let F=nr({mobile:ie.kind==="device",session:E,env:b,auth:f,variables:L,variableIds:ro,projectId:V.project_id,folderId:V.folder_id,totalSteps:Pt,totalDuration:me.duration??0,screenshotExtMap:Fe?.getExtMap(),codeExport:rr({codeExport:r.codeExport,codeLanguage:r.codeLanguage,skipCodeValidation:r.skipCodeValidation},l.code_export),onProgress:()=>{},log:(H,we,U,Z)=>E.log(H,we,U,Z),shouldUploadArtifacts:!r.local,shouldReplaceLocalOutput:!1,shouldCommit:!1,isFirstRun:!0,evidence:ne?{executionId:ne.executionId,packTestDir:ne.packTestDir,sealedPackPath:ne.packDir,sealFn:Jt}:void 0}),ee=new O(F),{renderUploadProgress:Ee}=await import("./CliUploadProgress-N5IY66T2.js"),X=await Ee(ee,H=>{if(H.testcaseId&&H.shareId&&T)return pn(w.testManagerUiUrl,T,H.testcaseId,H.shareId)});if(X.success){X.testcaseId&&E.setTestcaseId(X.testcaseId);let H=null;try{let{persistRecordedSession:B}=await import("./persist-recorded-session-QMRY4DOF.js");H=await B(E,{testcaseId:E.testcaseId??void 0,projectId:V.project_id??void 0,folderId:V.folder_id??void 0,codeExportDir:X.codeExportDir,mobile:ie.kind==="device",packTestDir:ne?.packTestDir})}catch(B){E.log("error","DIRECT_PERSIST_ERROR","Persist failed in ink mode",{error:String(B)})}let{syncPersistedBundle:we}=await import("./testmd-sync-UBXDLWYD.js");await we({recordedTestPath:H?.recordedTestPath,uploadSucceeded:X.success,local:!!r.local,sessionId:E.sessionId,basicAuth:f.basicAuth,controllerBaseUrl:w.controllerBaseUrl,log:(B,pe,Ve,se)=>E.log(B,pe,Ve,se)});let U=X.testcaseId&&X.shareId&&T?pn(w.testManagerUiUrl,T,X.testcaseId,X.shareId):void 0,Z=X.testcaseId&&T?Di(w.testManagerUiUrl,T,X.testcaseId):void 0;if(U||Z||X.codeExportDir||H){let{LinksBox:B}=await import("./LinksBox-JFT44YUK.js"),{render:pe}=await import("./build-JIKYOZUH.js"),Ve=await import("./react-QWOAB3TB.js"),{waitUntilExit:se}=pe(Ve.default.createElement(B,{recordedTestPath:H?.recordedTestPath,outputDir:H?.outputDir,shareableLink:U,testCaseLink:Z,codeExportDir:X.codeExportDir}),{stdout:process.stderr});await se()}}if(E.testId){let{renderFeedbackPrompt:H}=await import("./CliFeedbackPrompt-LLLNSKW2.js"),we=await H();if(we)try{await os({tmsBaseUrl:w.tmsBaseUrl,username:f.basicAuth.username,accessKey:f.basicAuth.access_key,testId:E.testId,feedbackType:we,log:(U,Z,B,pe)=>E.log(U,Z,B,pe)})}catch(U){E.log("warn","FEEDBACK_FAILED","Feedback submission failed",{error:String(U)})}}}}catch(w){E.log("error","DIRECT_UPLOAD_FAILED","Direct upload failed (ink mode)",{error:w instanceof Error?w.stack??w.message:String(w)}),console.error(`Upload failed: ${w}`)}let lc=await Jt({});if(ne&&lc?.sealed){let{offerEvidenceView:w}=await import("./evidence-FHO36EEV.js"),T=me?.reason??"",O=T.includes("Cancel")||T.includes("Timeout");await w({packPath:ne.packDir,env:b,isTTY:!!process.stdin.isTTY&&!!process.stderr.isTTY&&!O,log:F=>process.stderr.write(F+`
257
+ `)})}await E.finish("complete"),me||x(Fn?2:1,"Run ended with no result");let Ln=me.reason??"";(Ln.includes("Cancel")||Ln.includes("Timeout"))&&x(3,`Run: ${Ln}`),me.status==="passed"&&x(0,"Run passed"),x(1,"Run failed")}catch(a){await Io(),x(2,`CLI error: ${a instanceof Error?a.message:String(a)}`)}}),na(n),ra(n),oa(n),ia(n),sa(n),n.addCommand(Vl()),n.addCommand(Wl()),Es(n),e&&Xs(n),Kl(n),n.command("install <target> [version]").description("Install kane-cli agent skill into Claude Code / Codex CLI / Gemini CLI (version defaults to latest compatible)").action(async(o,r)=>{if(o==="plugin"){let c=r;if(!c){console.error("error: usage: kane-cli install plugin <name>"),x(2,"install plugin: missing name");return}let{installPlugin:m}=await import("./install-SFJ2FFQ6.js"),p=m(c,{});if(p.status==="failed"){console.error(`error: ${p.error}`),x(/unknown plugin/i.test(p.error??"")?2:1,`install plugin: ${p.status}`);return}let{ensureHyperexecuteBinary:g}=await import("./binary-LXYAW7WQ.js"),d=c==="remote-execution"?await g(J):void 0;process.stdin.isTTY?(process.stderr.write(`${p.status==="already-installed"?"already installed":"installed"} ${p.name}@${p.version} \u2192 ${p.dir}
194
258
  `),d&&(d.status==="failed"?process.stderr.write(`\u26A0 hyperexecute binary download failed (${d.error}) \u2014 re-run \`kane-cli install plugin ${p.name}\`
195
259
  `):process.stderr.write(`\u2713 hyperexecute binary ${d.status} \u2192 ${d.path}
196
260
  `)),process.stderr.write(`run \`kane-cli plugin doctor ${p.name}\` to check readiness for --remote
197
261
  `)):process.stdout.write(JSON.stringify({type:"plugin_install_result",status:p.status,name:p.name,version:p.version,dir:p.dir,error:p.error,binary:d})+`
198
- `),k(0,`install plugin: ${p.status}`);return}if(o!=="skill"){console.error(`error: unknown install target '${o}'. Supported: skill, plugin`),k(2,`unknown install target '${o}'`);return}let{installSkill:a,formatInstallResult:s}=await import("./skill-installer-FBOPYFYS.js"),l=await a(r);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:l.status,version:l.version,installed_targets:l.installedTargets,error:l.error})+`
262
+ `),x(0,`install plugin: ${p.status}`);return}if(o!=="skill"){console.error(`error: unknown install target '${o}'. Supported: skill, plugin`),x(2,`unknown install target '${o}'`);return}let{installSkill:a,formatInstallResult:s}=await import("./skill-installer-YQPZZB7I.js"),l=await a(r);!process.stdin.isTTY?process.stdout.write(JSON.stringify({type:"skill_install_result",status:l.status,version:l.version,installed_targets:l.installedTargets,error:l.error})+`
199
263
  `):process.stderr.write(s(l)+`
200
- `),k(l.status==="failed"?1:0,`install skill: ${l.status}`)}),n.command("profiles [action] [name]").description("Manage auth profiles (list | switch | delete)").option("--env <name>","Environment for switch/delete").action(async(o,r,a)=>{let s=new pe;if(o==="list"||!o&&!process.stdin.isTTY){let m=s.listProfiles();if(m.length===0){console.log("No profiles configured. Run: kane-cli login");return}let p=s.getActiveProfile(),g=s.getDefaultEnv();for(let d of m){let y=d.profile===p&&d.env===g?" (active)":"";console.log(`${d.profile} [${d.env}]${y}`)}return}if(o==="switch"&&r){let m=a?.env??s.getDefaultEnv();s.setActiveProfile(r),s.setDefaultEnv(m),zt(s,new Te,r,m),console.log(`Switched to ${r} [${m}]`);return}if(o==="delete"&&r){let m=a?.env??s.getDefaultEnv();s.deleteProfileFull(r,m),console.log(`Deleted profile ${r} [${m}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),k(1,"Invalid profiles usage"));let{ProfilesView:l}=await import("./ProfilesView-HIKK2HPC.js"),{render:u}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(m=>{let{unmount:p}=u(c.default.createElement(l,{creds:s,onSwitch:(g,d)=>{s.setActiveProfile(g),s.setDefaultEnv(d),console.log(`Switched to ${g} [${d}]`)},onCancel:()=>{p(),m()}}))})}),n.command("feedback").description("Send thumbs-up/down feedback for a completed test run").requiredOption("--test-id <id>","Test ID").requiredOption("--feedback-type <type>","Feedback type: positive or negative").option("--details <text>","Feedback details (max 500 characters)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{o.feedbackType!=="positive"&&o.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),k(1,'Invalid --feedback-type (must be "positive" or "negative")')),o.details&&o.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),k(1,"--details exceeds 500 character limit"));let r=new pe,a=o.env??r.getDefaultEnv(),s=ce(a),l,u;try{let c=await Ve({creds:r,env:a,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}});l=c.resolvedCreds?.username??c.basicAuth?.username,u=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),k(2,"Not authenticated for feedback")}(!l||!u)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),k(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-V3TR4QW3.js"),p=await new c(s.tmsBaseUrl,l,u).submitFeedback({instruction_id:"",test_id:o.testId,feedback_type:o.feedbackType,details:o.details,mode:"agent"});console.log(JSON.stringify(p)),k(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),k(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),n.command("balance").description("Check credit balance").option("--profile <name>","Profile name").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{let r=new pe,a=o.env??r.getDefaultEnv(),s=ce(a),l=null;try{let u=await Ve({creds:r,env:a,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}}),c=u.resolvedCreds??(u.basicAuth?{username:u.basicAuth.username,access_key:u.basicAuth.access_key}:null);c&&(l={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${a}]. Run "kane-cli login" first.`),k(2,`Not authenticated for balance [${a}]`)}l||(console.error(`Could not resolve credentials [${a}]. Run "kane-cli login" again.`),k(2,`Could not resolve credentials for balance [${a}]`));try{let{ControllerClient:u}=await import("./controller-client-OB4WD2C4.js"),m=await new u(s.controllerBaseUrl,l).getCreditBalance();console.log(`Available credits: ${m.available_credits}`),console.log(`Total credits: ${m.total_credits}`),k(0,"Balance retrieved")}catch(u){console.error(`Error: ${u instanceof Error?u.message:String(u)}`),k(1,`Balance check failed: ${u instanceof Error?u.message:String(u)}`)}}),n.command("generate").description("Generate TCG test cases (TUI when interactive; NDJSON/plain when piped, --agent, --refine, or --save)").argument("[objective]",'Generation prompt (e.g. "checkout flow on staging"). Required for new + --refine; omit for --save.').option("--refine","Refine an existing request with <objective>. Requires --req.").option("--save","Save an existing request to disk. Requires --req; --out optional (defaults to <cwd>/.testmuai/tests). Takes no objective.").option("--req <id>","The request id to --refine or --save.").option("--out <dir>","Save target dir (only with --save; default <cwd>/.testmuai/tests).").option("--agent","Emit typed NDJSON on stdout (auto-on when stdin is not a TTY)").option("--name <name>","Name for this generation: sets the session name (like run/testmd) AND the --save suite folder (overrides the auto-derived name)").option("--scenario-limit <n>","Max number of scenarios to generate (1-20)").option("--per-scenario-limit <n>","Max test cases per scenario (1-20)").option("--memory","Enable memory enhancement for generation").option("--project <id>","TMS project id (default: org/config default)").option("--folder <id>","TMS folder id").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--files <paths>","Comma-separated local files to attach (allowlisted types, \u226450MB each, \u226410; new/refine only)").action(async(o,r)=>{let a=r.scenarioLimit?parseInt(r.scenarioLimit,10):void 0,s=r.perScenarioLimit?parseInt(r.perScenarioLimit,10):void 0,{decideGenerateMode:l,resolveGenerateOp:u,defaultOutDir:c,buildHeadlessDeps:m,runGenerateHeadless:p,parseFilesFlag:g}=await import("./generate-headless-NSK32S53.js"),d=u({objective:o,refine:r.refine,save:r.save,req:r.req,out:r.out});if("error"in d){process.stderr.write(`error: ${d.error}
201
- `),k(2,`generate: ${d.error}`);return}let y=d.op,_=g(r.files);if(y==="save"&&_){process.stderr.write(`error: --files is not valid with --save
202
- `),k(2,"generate: --files not valid with --save");return}let{headless:b,mode:v}=l(r,!!process.stdin.isTTY);if(!b){let{runGenerate:f}=await import("./tcg-generate-BPLQ7WJ5.js");await f({objective:o,scenarioLimit:a,perScenarioLimit:s});return}let E=await m({mode:v,env:r.env,projectId:r.project,folderId:r.folder,username:r.username,accessKey:r.accessKey,name:r.name}),P=await p({op:y,objective:o,reqId:r.req,outDir:y==="save"?r.out?Rd(process.cwd(),r.out):c():void 0,suiteName:r.name,scenarioLimit:a,perScenarioLimit:s,memory:r.memory,files:_},E);k(P,"generate complete")}),n.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async o=>{let{fetchChangelog:r,formatChangelog:a}=await import("./changelog-TK6DWFVW.js"),s=await r({all:o.all});console.log(a(s))}),n.addCommand(Pd()),n}function jt(t){Ad().parse(["node","kane-cli",...t])}function Pd(){let t=new rt("evidence").description("Evidence pack operations");return t.command("validate").argument("<target>","execution id, pack dir, or sealed .evidence").option("--profile <profile>","L0 | L1","L1").option("--json","machine-readable",!1).action(async(e,n)=>{let{runEvidenceValidate:i}=await import("./evidence-MJV3PY2J.js");process.exitCode=await i(e,{profile:n.profile,json:n.json})}),t.command("serve").argument("<paths...>","sealed .evidence file(s) to serve to the hosted viewer").option("--port <n>","pin the local port (default: ephemeral)",e=>parseInt(e,10)).option("--viewer-url <base>","override the hosted viewer base URL").option("--env <name>","environment (prod or stage)").action(async(e,n)=>{let{runEvidenceServe:i}=await import("./evidence-MJV3PY2J.js"),{CredentialsManager:o}=await import("./credentials-BEC4I5SE.js"),r=n.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{port:n.port,viewerUrl:n.viewerUrl,env:r})}),t.command("merge").argument("<targets...>","execution ids or pack paths (order-significant)").option("--run-id <id>","run_id for the merged pack (required \u2014 identity is the caller's fact)").option("-o, --out <path>","output path (default: .testmuai/evidence/<run-id>.evidence)").option("--rules <path>","merge-rules.yaml (replaces the kane defaults wholesale)").option("--on-collision <action>","error | prefer-first | prefer-latest | discard").option("--title <title>","merged run title (default: first eligible pack's)").option("--no-finalize","keep the merged pack live instead of sealing it").option("--json","machine-readable MergeReport",!1).option("--env <name>","environment (prod or stage)").action(async(e,n)=>{let{runEvidenceMerge:i}=await import("./evidence-MJV3PY2J.js"),{CredentialsManager:o}=await import("./credentials-BEC4I5SE.js"),r=n.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{runId:n.runId,out:n.out,rules:n.rules,onCollision:n.onCollision,title:n.title,finalize:n.finalize,json:n.json,env:r})}),t}function qa(t){let e=t.indexOf("--mode");return e>=0&&t[e+1]==="agent"||t.includes("--mode=agent")}function Ka(t,e,n=50){let i=!1,o=(r,a)=>{if(!a)return;let s=r.line(a);s!=null&&e(s)};return{eager(){for(let r of t)r.promise.then(a=>{i||o(r,a)}).catch(()=>{})},async bounded(){if(i)return;let r=new Promise(s=>{setTimeout(()=>s(null),n).unref?.()}),a=await Promise.all(t.map(s=>Promise.race([s.promise.catch(()=>null),r])));i=!0,a.forEach((s,l)=>o(t[l],s))},silence(){i=!0}}}function Ya(t){let e,n,i,o=[];for(let r=0;r<t.length;r++){let a=t[r];if(a==="--code-export")e=!0;else if(a==="--skip-code-validation"){let s=t[r+1]?.toLowerCase();s==="true"||s==="false"?(i=s==="true",r++):i=!0}else if(a==="--skip-code-validation=true"||a==="--skip-code-validation=false")i=a.endsWith("=true");else if(a==="--no-skip-code-validation")i=!1;else if(a==="--code-language"){let s=t[r+1];s!==void 0&&(n=s,r++)}else a.startsWith("--code-language=")?n=a.slice(16):o.push(a)}return{codeExport:e,codeLanguage:n,skipCodeValidation:i,filteredArgs:o}}function Ga(t){return t[0]==="run"?!0:(t[0]==="testmd"||t[0]==="testrun")&&t[1]==="run"}function Tr(t,e){let n=t[0];if(n!=="run"&&!(n==="testmd"&&t[1]==="run"))return t;let i=[...t];return e.codeExport&&i.push("--code-export"),e.codeLanguage&&i.push("--code-language",e.codeLanguage),e.skipCodeValidation===!0&&i.push("--skip-code-validation"),e.skipCodeValidation===!1&&i.push("--no-skip-code-validation"),i}function yn(t,e){let n=t.split(".").map(o=>Number(o)||0),i=e.split(".").map(o=>Number(o)||0);for(let o=0;o<3;o++){let r=n[o]??0,a=i[o]??0;if(r<a)return-1;if(r>a)return 1}return 0}var Od=[{version:"0.2.11",description:"Code export is now enabled by default (Python remains the default language; JavaScript is also available). Default run mode is now 'testing'.",apply:t=>{let e=[];return t.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),t.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...t,code_export:{...t.code_export,enabled:!0},mode:"testing"},changes:e}}},{version:"0.5.1",description:"Assertions now read the DOM first (falling back to vision when the value isn't in the DOM). Default assertion mode is now 'dom'.",apply:t=>{let e=[];return t.assertion_mode==="visual"&&e.push({field:"assertion_mode",from:"visual",to:"dom",description:"Default assertion mode is now 'dom' (DOM-first, vision fallback)."}),{cfg:{...t,assertion_mode:"dom"},changes:e}}}];function Ja(t,e=Ee,n=Od){let i=t.exists(),o=t.load();if(!i)return t.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=o.last_seen_version||"0.0.0";if(yn(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let a=n.filter(m=>yn(r,m.version)<0&&yn(m.version,e)<=0).sort((m,p)=>yn(m.version,p.version)),s=o,l=[],u=[];for(let m of a){let{cfg:p,changes:g}=m.apply(s);s=p,l.push(...g),u.push(m.version)}let c={...s,last_seen_version:e};return t.writeRaw(c),{changes:l,fromVersion:r,toVersion:e,appliedVersions:u}}function za(t){return t.changes.length===0?"":[`kane-cli updated to ${t.toVersion}. Default settings changed:`,...t.changes.map(n=>` \u2022 ${n.description} (${n.field}: ${JSON.stringify(n.from)} \u2192 ${JSON.stringify(n.to)})`),"","Use /config to review or revert any of these."].join(`
203
- `)}ao();Gi();Ki();var Za=an().catch(()=>null),$d=ln().catch(()=>null);Yo(void 0,ro);var kn=null,$r=()=>kn||(kn=Ja(new Te),kn),_n=de.argv.slice(2),Dd=_n.includes("--dev"),Rr=_n.includes("--local"),Md=_n.includes("--tui");Dd&&(de.env.KANE_DEV_MODE="1");var jd=_n.filter(t=>!["--dev","--local","--tui"].includes(t));function Nd(t){let e=[],n;for(let i=0;i<t.length;i++){let o=t[i];if(o==="--name"&&i+1<t.length){n=t[i+1],i++;continue}if(o.startsWith("--name=")){n=o.slice(7);continue}e.push(o)}return{name:n,rest:e}}var xn=Ya(jd),Be=xn.filteredArgs,Ar=xn.codeExport,Pr=xn.codeLanguage,Or=xn.skipCodeValidation,Dr=Ka([{promise:Za,line:t=>{let e=t;return`
204
- Update available: ${e.current} \u2192 ${e.latest} \u2014 run \`${Ri()}\` to update
264
+ `),x(l.status==="failed"?1:0,`install skill: ${l.status}`)}),n.command("profiles [action] [name]").description("Manage auth profiles (list | switch | delete)").option("--env <name>","Environment for switch/delete").action(async(o,r,a)=>{let s=new de;if(o==="list"||!o&&!process.stdin.isTTY){let m=s.listProfiles();if(m.length===0){console.log("No profiles configured. Run: kane-cli login");return}let p=s.getActiveProfile(),g=s.getDefaultEnv();for(let d of m){let h=d.profile===p&&d.env===g?" (active)":"";console.log(`${d.profile} [${d.env}]${h}`)}return}if(o==="switch"&&r){let m=a?.env??s.getDefaultEnv();s.setActiveProfile(r),s.setDefaultEnv(m),on(s,new Re,r,m),console.log(`Switched to ${r} [${m}]`);return}if(o==="delete"&&r){let m=a?.env??s.getDefaultEnv();s.deleteProfileFull(r,m),console.log(`Deleted profile ${r} [${m}]`);return}process.stdin.isTTY||(console.error("Usage: kane-cli profiles list|switch|delete <name> [--env <env>]"),x(1,"Invalid profiles usage"));let{ProfilesView:l}=await import("./ProfilesView-WZSPK3HF.js"),{render:u}=await import("./build-JIKYOZUH.js"),c=await import("./react-QWOAB3TB.js");await new Promise(m=>{let{unmount:p}=u(c.default.createElement(l,{creds:s,onSwitch:(g,d)=>{s.setActiveProfile(g),s.setDefaultEnv(d),console.log(`Switched to ${g} [${d}]`)},onCancel:()=>{p(),m()}}))})}),n.command("feedback").description("Send thumbs-up/down feedback for a completed test run").requiredOption("--test-id <id>","Test ID").requiredOption("--feedback-type <type>","Feedback type: positive or negative").option("--details <text>","Feedback details (max 500 characters)").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{o.feedbackType!=="positive"&&o.feedbackType!=="negative"&&(console.error('Error: --feedback-type must be "positive" or "negative"'),x(1,'Invalid --feedback-type (must be "positive" or "negative")')),o.details&&o.details.length>500&&(console.error("Error: --details must be 500 characters or fewer"),x(1,"--details exceeds 500 character limit"));let r=new de,a=o.env??r.getDefaultEnv(),s=oe(a),l,u;try{let c=await Le({creds:r,env:a,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}});l=c.resolvedCreds?.username??c.basicAuth?.username,u=c.resolvedCreds?.access_key??c.basicAuth?.access_key}catch{console.error("Not authenticated. Run: kane-cli login"),x(2,"Not authenticated for feedback")}(!l||!u)&&(console.error(JSON.stringify({error:"Could not resolve TMS credentials"})),x(1,"Could not resolve TMS credentials for feedback"));try{let{TmsClient:c}=await import("./tms-client-V3TR4QW3.js"),p=await new c(s.tmsBaseUrl,l,u).submitFeedback({instruction_id:"",test_id:o.testId,feedback_type:o.feedbackType,details:o.details,mode:"agent"});console.log(JSON.stringify(p)),x(0,"Feedback submitted")}catch(c){console.error(JSON.stringify({error:c instanceof Error?c.message:String(c)})),x(1,`Feedback failed: ${c instanceof Error?c.message:String(c)}`)}}),n.command("balance").description("Check credit balance").option("--profile <name>","Profile name").option("--username <user>","Basic auth username").option("--access-key <key>","Basic auth access key").option("--env <name>","Environment (prod or stage)").action(async o=>{let r=new de,a=o.env??r.getDefaultEnv(),s=oe(a),l=null;try{let u=await Le({creds:r,env:a,usernameFlag:o.username,accessKeyFlag:o.accessKey,log:()=>{}}),c=u.resolvedCreds??(u.basicAuth?{username:u.basicAuth.username,access_key:u.basicAuth.access_key}:null);c&&(l={username:c.username,accessKey:c.access_key})}catch{console.error(`Not authenticated [${a}]. Run "kane-cli login" first.`),x(2,`Not authenticated for balance [${a}]`)}l||(console.error(`Could not resolve credentials [${a}]. Run "kane-cli login" again.`),x(2,`Could not resolve credentials for balance [${a}]`));try{let{ControllerClient:u}=await import("./controller-client-ZF5IXRUV.js"),m=await new u(s.controllerBaseUrl,l).getCreditBalance();console.log(`Available credits: ${m.available_credits}`),console.log(`Total credits: ${m.total_credits}`),x(0,"Balance retrieved")}catch(u){console.error(`Error: ${u instanceof Error?u.message:String(u)}`),x(1,`Balance check failed: ${u instanceof Error?u.message:String(u)}`)}}),n.command("generate").description("Generate TCG test cases (TUI when interactive; NDJSON/plain when piped, --agent, --refine, or --save)").argument("[objective]",'Generation prompt (e.g. "checkout flow on staging"). Required for new + --refine; omit for --save.').option("--refine","Refine an existing request with <objective>. Requires --req.").option("--save","Save an existing request to disk. Requires --req; --out optional (defaults to <cwd>/.testmuai/tests). Takes no objective.").option("--req <id>","The request id to --refine or --save.").option("--out <dir>","Save target dir (only with --save; default <cwd>/.testmuai/tests).").option("--agent","Emit typed NDJSON on stdout (auto-on when stdin is not a TTY)").option("--name <name>","Name for this generation: sets the session name (like run/testmd) AND the --save suite folder (overrides the auto-derived name)").option("--scenario-limit <n>","Max number of scenarios to generate (1-20)").option("--per-scenario-limit <n>","Max test cases per scenario (1-20)").option("--memory","Enable memory enhancement for generation").option("--project <id>","TMS project id (default: org/config default)").option("--folder <id>","TMS folder id").option("--env <name>","Environment (prod or stage)").option("--username <user>","Basic auth username (skip OAuth)").option("--access-key <key>","Basic auth access key").option("--files <paths>","Comma-separated local files to attach (allowlisted types, \u226450MB each, \u226410; new/refine only)").action(async(o,r)=>{let a=r.scenarioLimit?parseInt(r.scenarioLimit,10):void 0,s=r.perScenarioLimit?parseInt(r.perScenarioLimit,10):void 0,{decideGenerateMode:l,resolveGenerateOp:u,defaultOutDir:c,buildHeadlessDeps:m,runGenerateHeadless:p,parseFilesFlag:g}=await import("./generate-headless-OBMB5CSB.js"),d=u({objective:o,refine:r.refine,save:r.save,req:r.req,out:r.out});if("error"in d){process.stderr.write(`error: ${d.error}
265
+ `),x(2,`generate: ${d.error}`);return}let h=d.op,k=g(r.files);if(h==="save"&&k){process.stderr.write(`error: --files is not valid with --save
266
+ `),x(2,"generate: --files not valid with --save");return}let{headless:b,mode:v}=l(r,!!process.stdin.isTTY);if(!b){let{runGenerate:f}=await import("./tcg-generate-V4QRNEZV.js");await f({objective:o,scenarioLimit:a,perScenarioLimit:s});return}let _=await m({mode:v,env:r.env,projectId:r.project,folderId:r.folder,username:r.username,accessKey:r.accessKey,name:r.name}),P=await p({op:h,objective:o,reqId:r.req,outDir:h==="save"?r.out?um(process.cwd(),r.out):c():void 0,suiteName:r.name,scenarioLimit:a,perScenarioLimit:s,memory:r.memory,files:k},_);x(P,"generate complete")}),n.command("changelog").description("Show recent release notes").option("--all","Show all releases instead of latest 5").action(async o=>{let{fetchChangelog:r,formatChangelog:a}=await import("./changelog-BSMZXLTG.js"),s=await r({all:o.all});console.log(a(s))}),n.addCommand(pm()),n}function qt(t){mm().parse(["node","kane-cli",...t])}function pm(){let t=new at("evidence").description("Evidence pack operations");return t.command("validate").argument("<target>","execution id, pack dir, or sealed .evidence").option("--profile <profile>","L0 | L1","L1").option("--json","machine-readable",!1).action(async(e,n)=>{let{runEvidenceValidate:i}=await import("./evidence-FHO36EEV.js");process.exitCode=await i(e,{profile:n.profile,json:n.json})}),t.command("serve").argument("<paths...>","sealed .evidence file(s) to serve to the hosted viewer").option("--port <n>","pin the local port (default: ephemeral)",e=>parseInt(e,10)).option("--viewer-url <base>","override the hosted viewer base URL").option("--env <name>","environment (prod or stage)").action(async(e,n)=>{let{runEvidenceServe:i}=await import("./evidence-FHO36EEV.js"),{CredentialsManager:o}=await import("./credentials-YNH5BU2Z.js"),r=n.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{port:n.port,viewerUrl:n.viewerUrl,env:r})}),t.command("merge").argument("<targets...>","execution ids or pack paths (order-significant)").option("--run-id <id>","run_id for the merged pack (required \u2014 identity is the caller's fact)").option("-o, --out <path>","output path (default: .testmuai/evidence/<run-id>.evidence)").option("--rules <path>","merge-rules.yaml (replaces the kane defaults wholesale)").option("--on-collision <action>","error | prefer-first | prefer-latest | discard").option("--title <title>","merged run title (default: first eligible pack's)").option("--no-finalize","keep the merged pack live instead of sealing it").option("--json","machine-readable MergeReport",!1).option("--env <name>","environment (prod or stage)").action(async(e,n)=>{let{runEvidenceMerge:i}=await import("./evidence-FHO36EEV.js"),{CredentialsManager:o}=await import("./credentials-YNH5BU2Z.js"),r=n.env??new o().getDefaultEnv()??"prod";process.exitCode=await i(e,{runId:n.runId,out:n.out,rules:n.rules,onCollision:n.onCollision,title:n.title,finalize:n.finalize,json:n.json,env:r})}),t}function Yl(t){let e=t.indexOf("--mode");return e>=0&&t[e+1]==="agent"||t.includes("--mode=agent")}function Jl(t,e,n=50){let i=!1,o=(r,a)=>{if(!a)return;let s=r.line(a);s!=null&&e(s)};return{eager(){for(let r of t)r.promise.then(a=>{i||o(r,a)}).catch(()=>{})},async bounded(){if(i)return;let r=new Promise(s=>{setTimeout(()=>s(null),n).unref?.()}),a=await Promise.all(t.map(s=>Promise.race([s.promise.catch(()=>null),r])));i=!0,a.forEach((s,l)=>o(t[l],s))},silence(){i=!0}}}function Gl(t){let e,n,i,o=[];for(let r=0;r<t.length;r++){let a=t[r];if(a==="--code-export")e=!0;else if(a==="--skip-code-validation"){let s=t[r+1]?.toLowerCase();s==="true"||s==="false"?(i=s==="true",r++):i=!0}else if(a==="--skip-code-validation=true"||a==="--skip-code-validation=false")i=a.endsWith("=true");else if(a==="--no-skip-code-validation")i=!1;else if(a==="--code-language"){let s=t[r+1];s!==void 0&&(n=s,r++)}else a.startsWith("--code-language=")?n=a.slice(16):o.push(a)}return{codeExport:e,codeLanguage:n,skipCodeValidation:i,filteredArgs:o}}function zl(t){return t[0]==="run"?!0:(t[0]==="testmd"||t[0]==="testrun")&&t[1]==="run"}function Jr(t,e){let n=t[0];if(n!=="run"&&!(n==="testmd"&&t[1]==="run"))return t;let i=[...t];return e.codeExport&&i.push("--code-export"),e.codeLanguage&&i.push("--code-language",e.codeLanguage),e.skipCodeValidation===!0&&i.push("--skip-code-validation"),e.skipCodeValidation===!1&&i.push("--no-skip-code-validation"),i}function $n(t,e){let n=t.split(".").map(o=>Number(o)||0),i=e.split(".").map(o=>Number(o)||0);for(let o=0;o<3;o++){let r=n[o]??0,a=i[o]??0;if(r<a)return-1;if(r>a)return 1}return 0}var fm=[{version:"0.2.11",description:"Code export is now enabled by default (Python remains the default language; JavaScript is also available). Default run mode is now 'testing'.",apply:t=>{let e=[];return t.code_export.enabled===!1&&e.push({field:"code_export.enabled",from:!1,to:!0,description:"Code export is now enabled by default."}),t.mode==="action"&&e.push({field:"mode",from:"action",to:"testing",description:"Default run mode is now 'testing'."}),{cfg:{...t,code_export:{...t.code_export,enabled:!0},mode:"testing"},changes:e}}},{version:"0.5.1",description:"Assertions now read the DOM first (falling back to vision when the value isn't in the DOM). Default assertion mode is now 'dom'.",apply:t=>{let e=[];return t.assertion_mode==="visual"&&e.push({field:"assertion_mode",from:"visual",to:"dom",description:"Default assertion mode is now 'dom' (DOM-first, vision fallback)."}),{cfg:{...t,assertion_mode:"dom"},changes:e}}}];function Xl(t,e=ye,n=fm){let i=t.exists(),o=t.load();if(!i)return t.set("last_seen_version",e),{changes:[],fromVersion:e,toVersion:e,appliedVersions:[]};let r=o.last_seen_version||"0.0.0";if($n(r,e)>=0)return{changes:[],fromVersion:r,toVersion:r,appliedVersions:[]};let a=n.filter(m=>$n(r,m.version)<0&&$n(m.version,e)<=0).sort((m,p)=>$n(m.version,p.version)),s=o,l=[],u=[];for(let m of a){let{cfg:p,changes:g}=m.apply(s);s=p,l.push(...g),u.push(m.version)}let c={...s,last_seen_version:e};return t.writeRaw(c),{changes:l,fromVersion:r,toVersion:e,appliedVersions:u}}function Ql(t){return t.changes.length===0?"":[`kane-cli updated to ${t.toVersion}. Default settings changed:`,...t.changes.map(n=>` \u2022 ${n.description} (${n.field}: ${JSON.stringify(n.from)} \u2192 ${JSON.stringify(n.to)})`),"","Use /config to review or revert any of these."].join(`
267
+ `)}To();Ts();Is();var tc=gn().catch(()=>null),gm=hn().catch(()=>null);vi(void 0,So);var Dn=null,Zr=()=>Dn||(Dn=Xl(new Re),Dn),On=ue.argv.slice(2),hm=On.includes("--dev"),Gr=On.includes("--local"),vm=On.includes("--tui");hm&&(ue.env.KANE_DEV_MODE="1");var bm=On.filter(t=>!["--dev","--local","--tui"].includes(t));function wm(t){let e=[],n;for(let i=0;i<t.length;i++){let o=t[i];if(o==="--name"&&i+1<t.length){n=t[i+1],i++;continue}if(o.startsWith("--name=")){n=o.slice(7);continue}e.push(o)}return{name:n,rest:e}}var Mn=Gl(bm),He=Mn.filteredArgs,zr=Mn.codeExport,Xr=Mn.codeLanguage,Qr=Mn.skipCodeValidation,eo=Jl([{promise:tc,line:t=>{let e=t;return`
268
+ Update available: ${e.current} \u2192 ${e.latest} \u2014 run \`${is()}\` to update
205
269
 
206
- `}},{promise:$d,line:t=>{let e=t;return`Skill update available: ${e.current??"not installed"} \u2192 ${e.latestCompatible} \u2014 run \`kane-cli install skill\`
270
+ `}},{promise:gm,line:t=>{let e=t;return`Skill update available: ${e.current??"not installed"} \u2192 ${e.latestCompatible} \u2014 run \`kane-cli install skill\`
207
271
 
208
- `}}],t=>de.stderr.write(t)),Xa=()=>Dr.eager(),Qa=()=>{let t=za($r());t&&de.stderr.write(`
272
+ `}}],t=>ue.stderr.write(t)),Zl=()=>eo.eager(),ec=()=>{let t=Ql(Zr());t&&ue.stderr.write(`
209
273
  ${t}
210
274
 
211
- `)},Fd=new Set(["--help","-h","--version","-V"]),Ld=Be[0]==="help"||Be.some(t=>Fd.has(t));if(Ld)jt(Be);else if(Md){de.stdin.isTTY||(de.stderr.write(`Error: --tui mode requires an interactive terminal (TTY).
212
- `),de.exit(1)),Xa();let{name:t}=Nd(Be);if(t){let{validateNameOrThrow:i}=await import("./name-validator-5YGJXLZ7.js");try{i(t)}catch(o){de.stderr.write(`error: ${o.message}
213
- `),de.exit(2)}}let{waitUntilExit:e,unmount:n}=et(Nt.default.createElement(tt,null,Nt.default.createElement(Ai,{localMode:Rr,codeExport:Ar,codeLanguage:Pr,skipCodeValidation:Or,updatePromise:Za,migrationResult:$r(),sessionName:t})),{exitOnCtrlC:!1});It(()=>n()),jn(()=>{try{de.stdin.setRawMode?.(!1)}catch{}de.stdout.write("\x1B[?25h")}),e().then(()=>{k(0,"TUI session ended")})}else if(Be.length>0){let t=Be[0],e=Kt(),n=lr(e).has(t),i=t.startsWith("-");if(!n&&!i){let{message:l,exitCode:u}=ws(t,{hostSupportsMobile:e,mobileMessage:Yt()});de.stderr.write(l),de.exit(u)}qa(Be)?(Dr.silence(),$r()):(t==="context"||t==="design"?await Dr.bounded():Xa(),Qa());let a=Rr&&Ga(Be)?[...Be,"--local"]:Be,s=Tr(a,{codeExport:Ar,codeLanguage:Pr,skipCodeValidation:Or});jt(s)}else{de.stdin.isTTY||(de.stderr.write(`Error: kane-cli requires an interactive terminal (TTY) when run without arguments.
275
+ `)},ym=new Set(["--help","-h","--version","-V"]),km=He[0]==="help"||He.some(t=>ym.has(t));if(km)qt(He);else if(vm){ue.stdin.isTTY||(ue.stderr.write(`Error: --tui mode requires an interactive terminal (TTY).
276
+ `),ue.exit(1)),Zl();let{name:t}=wm(He);if(t){let{validateNameOrThrow:i}=await import("./name-validator-5YGJXLZ7.js");try{i(t)}catch(o){ue.stderr.write(`error: ${o.message}
277
+ `),ue.exit(2)}}let{waitUntilExit:e,unmount:n}=nt(Kt.default.createElement(rt,null,Kt.default.createElement(ss,{localMode:Gr,codeExport:zr,codeLanguage:Xr,skipCodeValidation:Qr,updatePromise:tc,migrationResult:Zr(),sessionName:t})),{exitOnCtrlC:!1});Ot(()=>n()),Gn(()=>{try{ue.stdin.setRawMode?.(!1)}catch{}ue.stdout.write("\x1B[?25h")}),e().then(()=>{x(0,"TUI session ended")})}else if(He.length>0){let t=He[0],e=en(),n=xr(e).has(t),i=t.startsWith("-");if(!n&&!i){let{message:l,exitCode:u}=ea(t,{hostSupportsMobile:e,mobileMessage:tn()});ue.stderr.write(l),ue.exit(u)}Yl(He)?(eo.silence(),Zr()):(t==="context"||t==="design"?await eo.bounded():Zl(),ec());let a=Gr&&zl(He)?[...He,"--local"]:He,s=Jr(a,{codeExport:zr,codeLanguage:Xr,skipCodeValidation:Qr});qt(s)}else{ue.stdin.isTTY||(ue.stderr.write(`Error: kane-cli requires an interactive terminal (TTY) when run without arguments.
214
278
  Usage: kane-cli "objective" for non-interactive mode.
215
- `),de.exit(1));let t={current:null},{waitUntilExit:e,unmount:n}=et(Nt.default.createElement(tt,null,Nt.default.createElement(ni,{resultRef:t})),{exitOnCtrlC:!1});It(()=>n()),jn(()=>{try{de.stdin.setRawMode?.(!1)}catch{}de.stdout.write("\x1B[?25h")}),e().then(()=>{so();let i=t.current;if(!i){k(0,"Single-shot session ended (no objective)");return}let o=i.objective.trim();if(o==="--help"||o==="-h"||o==="help"){jt(["--help"]);return}Qa();let r=["run",i.objective];Rr&&r.push("--local"),jt(Tr(r,{codeExport:Ar,codeLanguage:Pr,skipCodeValidation:Or}))})}
279
+ `),ue.exit(1));let t={current:null},{waitUntilExit:e,unmount:n}=nt(Kt.default.createElement(rt,null,Kt.default.createElement(Ei,{resultRef:t})),{exitOnCtrlC:!1});Ot(()=>n()),Gn(()=>{try{ue.stdin.setRawMode?.(!1)}catch{}ue.stdout.write("\x1B[?25h")}),e().then(()=>{Ro();let i=t.current;if(!i){x(0,"Single-shot session ended (no objective)");return}let o=i.objective.trim();if(o==="--help"||o==="-h"||o==="help"){qt(["--help"]);return}ec();let r=["run",i.objective];Gr&&r.push("--local"),qt(Jr(r,{codeExport:zr,codeLanguage:Xr,skipCodeValidation:Qr}))})}