rnxsim 0.1.369 → 0.1.370

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 (253) hide show
  1. package/cli/auth.ts +2 -1
  2. package/cli/bin.ts +283 -273
  3. package/cli/commands/app-fonts.ts +3 -2
  4. package/cli/commands/assert.ts +8 -7
  5. package/cli/commands/auth.ts +2 -1
  6. package/cli/commands/box/checkout-plane.ts +45 -16
  7. package/cli/commands/config.ts +2 -1
  8. package/cli/commands/control.ts +37 -33
  9. package/cli/commands/daemon.ts +22 -21
  10. package/cli/commands/debug.ts +17 -15
  11. package/cli/commands/detox.ts +5 -4
  12. package/cli/commands/device.ts +6 -5
  13. package/cli/commands/electron.ts +6 -5
  14. package/cli/commands/flow.ts +12 -11
  15. package/cli/commands/inspect/find.ts +2 -1
  16. package/cli/commands/inspect/keyboard.ts +2 -1
  17. package/cli/commands/inspect/sleep.ts +2 -1
  18. package/cli/commands/inspect/wait-event.ts +4 -3
  19. package/cli/commands/inspect/wait-idle.ts +2 -1
  20. package/cli/commands/inspect/wait-ready.ts +3 -2
  21. package/cli/commands/inspect/wait-selector.ts +4 -3
  22. package/cli/commands/inspect/wait.ts +2 -1
  23. package/cli/commands/inspect.ts +82 -80
  24. package/cli/commands/install-desktop.ts +5 -4
  25. package/cli/commands/login.ts +3 -2
  26. package/cli/commands/mode.ts +2 -1
  27. package/cli/commands/record.ts +38 -37
  28. package/cli/commands/runtime.ts +9 -8
  29. package/cli/commands/screenshot-layers.ts +4 -3
  30. package/cli/commands/screenshot-mode.ts +2 -1
  31. package/cli/commands/screenshot.ts +8 -7
  32. package/cli/commands/screenshots-capture.ts +2 -1
  33. package/cli/commands/serve.ts +5 -4
  34. package/cli/commands/shell-boolean-mode.ts +2 -1
  35. package/cli/commands/skills.ts +11 -10
  36. package/cli/commands/telemetry.ts +2 -1
  37. package/cli/commands/three-mode.ts +2 -1
  38. package/cli/commands/timeline.ts +4 -3
  39. package/cli/commands/upload.ts +14 -13
  40. package/cli/commands/what-happened.ts +2 -1
  41. package/cli/recording-access.ts +6 -5
  42. package/cli/run-rnx.ts +140 -0
  43. package/dist-cli/bin.js +6 -6
  44. package/dist-cli/chunks/{agent-OUUFWDLF.js → agent-3R4424LW.js} +2 -2
  45. package/dist-cli/chunks/{agent-wrapper-7BE7DR4R.js → agent-wrapper-4PPWZWSY.js} +2 -2
  46. package/dist-cli/chunks/app-fonts-KYXB6CXQ.js +4 -0
  47. package/dist-cli/chunks/{assert-I3CMRNS7.js → assert-7EZOWGYQ.js} +11 -11
  48. package/dist-cli/chunks/auth-L7M36H6C.js +12 -0
  49. package/dist-cli/chunks/{beta-BHSKY4K4.js → beta-FKAF6YWJ.js} +2 -2
  50. package/dist-cli/chunks/{box-3CVWXVTT.js → box-5Y5VBMHV.js} +342 -342
  51. package/dist-cli/chunks/{camera-MNK73TYV.js → camera-XHF2RPFG.js} +2 -2
  52. package/dist-cli/chunks/{chunk-NPVEBXU3.js → chunk-2FOGXVOK.js} +2 -2
  53. package/dist-cli/chunks/{chunk-UDXQCEJU.js → chunk-3BG6UCQY.js} +2 -2
  54. package/dist-cli/chunks/{chunk-V7I4CTAX.js → chunk-3SOPYG7S.js} +2 -2
  55. package/dist-cli/chunks/{chunk-QE5MC4V3.js → chunk-3UXXYJVD.js} +1 -1
  56. package/dist-cli/chunks/{chunk-EKAEEWC2.js → chunk-5BR33NAZ.js} +1 -1
  57. package/dist-cli/chunks/{chunk-FGGESBWD.js → chunk-5RKRVS5A.js} +2 -2
  58. package/dist-cli/chunks/{chunk-MXWME7ET.js → chunk-64JAEJ6N.js} +1 -1
  59. package/dist-cli/chunks/{chunk-AKJYEX54.js → chunk-6A6L3VJR.js} +2 -2
  60. package/dist-cli/chunks/chunk-6GPS7U4X.js +74 -0
  61. package/dist-cli/chunks/{chunk-OROUEG22.js → chunk-6S5LJV2O.js} +2 -2
  62. package/dist-cli/chunks/{chunk-ZW6JXEVX.js → chunk-6W4HIWC7.js} +2 -2
  63. package/dist-cli/chunks/{chunk-6BMM6OCW.js → chunk-72S5FCBY.js} +2 -2
  64. package/dist-cli/chunks/{chunk-TBK5UXW2.js → chunk-7C7TJYZ3.js} +2 -2
  65. package/dist-cli/chunks/{chunk-D6MGELKZ.js → chunk-AALKIAUZ.js} +1 -1
  66. package/dist-cli/chunks/{chunk-WUR4FXWT.js → chunk-ARMXC3C3.js} +25 -25
  67. package/dist-cli/chunks/chunk-AVJBT5LF.js +4 -0
  68. package/dist-cli/chunks/chunk-BMIJZNKD.js +28 -0
  69. package/dist-cli/chunks/{chunk-N5KDDGV6.js → chunk-C7BA5CCM.js} +2 -2
  70. package/dist-cli/chunks/{chunk-F4OTMARL.js → chunk-CMVRTZ5G.js} +2 -2
  71. package/dist-cli/chunks/chunk-D24EOJ4C.js +24 -0
  72. package/dist-cli/chunks/{chunk-A56GQVNF.js → chunk-D2GZASRV.js} +1 -1
  73. package/dist-cli/chunks/{chunk-IYPMULI7.js → chunk-DHYTRCIP.js} +2 -2
  74. package/dist-cli/chunks/{chunk-X3PEDNLV.js → chunk-DMHSD6YJ.js} +2 -2
  75. package/dist-cli/chunks/{chunk-YPBDPVLR.js → chunk-DUXHYPBP.js} +2 -2
  76. package/dist-cli/chunks/{chunk-4SCVGBOX.js → chunk-DXV37CJN.js} +1 -1
  77. package/dist-cli/chunks/{chunk-H2GB2PLY.js → chunk-EOIBLKZO.js} +2 -2
  78. package/dist-cli/chunks/{chunk-UQJY6O72.js → chunk-EQ3OE2AV.js} +1 -1
  79. package/dist-cli/chunks/{chunk-3454VMHD.js → chunk-EWSWOWXK.js} +2 -2
  80. package/dist-cli/chunks/{chunk-FHRG772G.js → chunk-FA75F34Z.js} +1 -1
  81. package/dist-cli/chunks/{chunk-LU3AHE6T.js → chunk-FK4JSTZ3.js} +2 -2
  82. package/dist-cli/chunks/{chunk-AJJCYLBC.js → chunk-GJRLPJQL.js} +2 -2
  83. package/dist-cli/chunks/{chunk-WGE2P25F.js → chunk-GRO74J2X.js} +1 -1
  84. package/dist-cli/chunks/chunk-H5X5FJ63.js +99 -0
  85. package/dist-cli/chunks/chunk-HEKHLQ3B.js +497 -0
  86. package/dist-cli/chunks/chunk-HQQTS2CB.js +30 -0
  87. package/dist-cli/chunks/{chunk-DKSZZABN.js → chunk-I52NT6VG.js} +1 -1
  88. package/dist-cli/chunks/{chunk-A72MIIJI.js → chunk-IDLFVRPN.js} +1 -1
  89. package/dist-cli/chunks/{chunk-6F3WOWFC.js → chunk-JZLDHPB7.js} +2 -2
  90. package/dist-cli/chunks/{chunk-ZNNE5MAV.js → chunk-LIMWG54N.js} +1 -1
  91. package/dist-cli/chunks/{chunk-TTUZ5MCK.js → chunk-LUOHRBJG.js} +1 -1
  92. package/dist-cli/chunks/{chunk-B5NW4TT3.js → chunk-LXPHL6FO.js} +2 -2
  93. package/dist-cli/chunks/{chunk-TAC4CEIX.js → chunk-MDCY532E.js} +2 -2
  94. package/dist-cli/chunks/{chunk-45X3D6CI.js → chunk-NJMU5BN6.js} +1 -1
  95. package/dist-cli/chunks/{chunk-2APXX4RN.js → chunk-NR2V2ONN.js} +2 -2
  96. package/dist-cli/chunks/{chunk-JH5KE2OI.js → chunk-NTC46LSA.js} +2 -2
  97. package/dist-cli/chunks/{chunk-RV76U3EI.js → chunk-O6QLKSAM.js} +10 -10
  98. package/dist-cli/chunks/{chunk-ZEF57HQO.js → chunk-OJZHECGH.js} +1 -1
  99. package/dist-cli/chunks/chunk-OTFTMGAL.js +7 -0
  100. package/dist-cli/chunks/{chunk-RYGQ6LZN.js → chunk-PAUEZO6F.js} +2 -2
  101. package/dist-cli/chunks/{chunk-CCI3DZKE.js → chunk-PIZXOXBL.js} +2 -2
  102. package/dist-cli/chunks/{chunk-JLOOLA47.js → chunk-PNOENVMJ.js} +1 -1
  103. package/dist-cli/chunks/{chunk-YLNSLMQM.js → chunk-Q4MRJ6PO.js} +2 -2
  104. package/dist-cli/chunks/{chunk-5QFJFASW.js → chunk-RRX52O37.js} +1 -1
  105. package/dist-cli/chunks/{chunk-FBMNYSSW.js → chunk-U63T6LIQ.js} +1 -1
  106. package/dist-cli/chunks/{chunk-2PVVIPQS.js → chunk-UFVAAWGZ.js} +1 -1
  107. package/dist-cli/chunks/{chunk-CZ2HCNRK.js → chunk-VVQCZ42C.js} +1 -1
  108. package/dist-cli/chunks/{chunk-USHV3QFZ.js → chunk-WFQHT4QD.js} +2 -2
  109. package/dist-cli/chunks/{chunk-DCPDMF27.js → chunk-WPV4H5S4.js} +2 -2
  110. package/dist-cli/chunks/{chunk-SSBZA5VZ.js → chunk-X6WQ4YWE.js} +1 -1
  111. package/dist-cli/chunks/{chunk-VGJLCFSC.js → chunk-YIZGNT7A.js} +1 -1
  112. package/dist-cli/chunks/{chunk-JXARZBWS.js → chunk-Z2VBSNFI.js} +1 -1
  113. package/dist-cli/chunks/{chunk-4G4VCT2M.js → chunk-Z3DENGXW.js} +2 -2
  114. package/dist-cli/chunks/{cleanup-H4XFRMZV.js → cleanup-MXMMJ7JW.js} +2 -2
  115. package/dist-cli/chunks/cli-version-MLS55UTY.js +4 -0
  116. package/dist-cli/chunks/{compat-NKGYERLN.js → compat-E6KE5KDI.js} +2 -2
  117. package/dist-cli/chunks/config-QSLLVZDS.js +13 -0
  118. package/dist-cli/chunks/{connect-WWWAVVCF.js → connect-QE4VU6GB.js} +2 -2
  119. package/dist-cli/chunks/control-XD5F6K5T.js +4 -0
  120. package/dist-cli/chunks/daemon-UN5SE2JO.js +4 -0
  121. package/dist-cli/chunks/{debug-RO6GLDIM.js → debug-5FG3MBJS.js} +20 -20
  122. package/dist-cli/chunks/desktop-5EZX7NX5.js +31 -0
  123. package/dist-cli/chunks/detox-WJGQP5TM.js +52 -0
  124. package/dist-cli/chunks/device-D7LKCAMS.js +18 -0
  125. package/dist-cli/chunks/{diagnose-HDRTUPDO.js → diagnose-A3W6ZTGA.js} +2 -2
  126. package/dist-cli/chunks/{disk-cleanup-QP2NYN43.js → disk-cleanup-BDRHX5ZG.js} +2 -2
  127. package/dist-cli/chunks/{do-chain-6LP6SV5J.js → do-chain-RUJNRPPF.js} +2 -2
  128. package/dist-cli/chunks/drivers-3NJ5RL6X.js +4 -0
  129. package/dist-cli/chunks/{env-4XD5D2G6.js → env-U67SQVTV.js} +2 -2
  130. package/dist-cli/chunks/{film-I5SIXLS5.js → film-XC6UAQ3V.js} +3 -3
  131. package/dist-cli/chunks/flow-FHZZD3P6.js +4 -0
  132. package/dist-cli/chunks/help-BYYDUSXF.js +4 -0
  133. package/dist-cli/chunks/{hidden-runtime-alias-LJV2S4M2.js → hidden-runtime-alias-7S2TNZXG.js} +2 -2
  134. package/dist-cli/chunks/{home-paths-RFI2QRC3.js → home-paths-LMO5LB4F.js} +2 -2
  135. package/dist-cli/chunks/inspect-RQCTWDCC.js +4 -0
  136. package/dist-cli/chunks/install-desktop-GOWXCQUE.js +4 -0
  137. package/dist-cli/chunks/login-JIU42S4C.js +26 -0
  138. package/dist-cli/chunks/{logout-DKXZZ6HU.js → logout-JTAWQXZO.js} +2 -2
  139. package/dist-cli/chunks/{maestro-WKGVVWRA.js → maestro-TYBQYOGB.js} +3 -3
  140. package/dist-cli/chunks/{maestro-generate-KCK6RK2C.js → maestro-generate-YLAGWVKE.js} +3 -3
  141. package/dist-cli/chunks/mode-DV24ZRZ6.js +26 -0
  142. package/dist-cli/chunks/{optional-demo-registry-EUSKBIPP.js → optional-demo-registry-JZH66VIM.js} +2 -2
  143. package/dist-cli/chunks/{perf-IMZMA5MT.js → perf-LXXJ4EAX.js} +2 -2
  144. package/dist-cli/chunks/{permissions-SLWXTLH6.js → permissions-KAOVZUPW.js} +2 -2
  145. package/dist-cli/chunks/{platform-HQ735LAE.js → platform-KW35446W.js} +3 -3
  146. package/dist-cli/chunks/privacy-MIFE72CG.js +4 -0
  147. package/dist-cli/chunks/record-EK3ETFHZ.js +72 -0
  148. package/dist-cli/chunks/report-issue-NW5PCAZF.js +29 -0
  149. package/dist-cli/chunks/reset-RZ4O5AFJ.js +4 -0
  150. package/dist-cli/chunks/resolve-target-7R5BNYMM.js +4 -0
  151. package/dist-cli/chunks/runtime-MZHLSRS6.js +4 -0
  152. package/dist-cli/chunks/{screenshot-command-HAJB5FHK.js → screenshot-command-TQSPTFT2.js} +11 -11
  153. package/dist-cli/chunks/screenshot-layers-IZP3L3AQ.js +20 -0
  154. package/dist-cli/chunks/screenshots-capture-K7LJOVAE.js +42 -0
  155. package/dist-cli/chunks/{serve-TM46TKFW.js → serve-MMX4WXXG.js} +18 -18
  156. package/dist-cli/chunks/setup-YFP3KEQZ.js +4 -0
  157. package/dist-cli/chunks/{sim-client-LQUZSO45.js → sim-client-KLAYIFOC.js} +2 -2
  158. package/dist-cli/chunks/skills-N4D3POIS.js +50 -0
  159. package/dist-cli/chunks/{state-RUVM4Z4S.js → state-ES6TFQZF.js} +2 -2
  160. package/dist-cli/chunks/{storage-GQ33UTYN.js → storage-52DR5V2C.js} +2 -2
  161. package/dist-cli/chunks/store-HOL45WCI.js +4 -0
  162. package/dist-cli/chunks/telemetry-BV6OTYPF.js +4 -0
  163. package/dist-cli/chunks/timeline-NRVNB5JR.js +24 -0
  164. package/dist-cli/chunks/{upgrade-AZDZLUIT.js → upgrade-LNED5YQ2.js} +2 -2
  165. package/dist-cli/chunks/upload-RXKHFIBU.js +4 -0
  166. package/dist-cli/chunks/{version-N3ALB75G.js → version-VEF2DYGG.js} +2 -2
  167. package/dist-cli/chunks/{web-XPHFZATA.js → web-CGDE6S73.js} +2 -2
  168. package/dist-cli/chunks/welcome-FT2AMUWW.js +5 -0
  169. package/dist-cli/chunks/what-happened-FSIDWL32.js +25 -0
  170. package/dist-cli/chunks/{ws-bridge-RUXOYOU6.js → ws-bridge-QXFQLRE7.js} +2 -2
  171. package/dist-lib/agent-daemon-client.cjs +1 -1
  172. package/dist-lib/agent-events.cjs +1 -1
  173. package/dist-lib/agent-identity.cjs +1 -1
  174. package/dist-lib/agent-sessions.cjs +1 -1
  175. package/dist-lib/attached-projects.cjs +1 -1
  176. package/dist-lib/auth/shared-session.cjs +1 -1
  177. package/dist-lib/backend-origin.cjs +1 -1
  178. package/dist-lib/beta.cjs +1 -1
  179. package/dist-lib/beta.mjs +1 -1
  180. package/dist-lib/bridge-constants.cjs +1 -1
  181. package/dist-lib/bridge-contract-input.cjs +1 -1
  182. package/dist-lib/bridge-contract-input.mjs +1 -1
  183. package/dist-lib/bridge-contract.cjs +1 -1
  184. package/dist-lib/bridge-contract.mjs +1 -1
  185. package/dist-lib/cli-constants.cjs +1 -1
  186. package/dist-lib/config.cjs +1 -1
  187. package/dist-lib/detox/index.cjs +1 -1
  188. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  189. package/dist-lib/home-paths.cjs +1 -1
  190. package/dist-lib/host/bridge-host.cjs +1 -1
  191. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  192. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  193. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  194. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  195. package/dist-lib/host/websocket-proxy.cjs +1 -1
  196. package/dist-lib/index.cjs +1 -1
  197. package/dist-lib/jump-to-source-babel.cjs +1 -1
  198. package/dist-lib/menu.cjs +1 -1
  199. package/dist-lib/menu.mjs +1 -1
  200. package/dist-lib/metro-production-bundle.cjs +1 -1
  201. package/dist-lib/metro-production-bundle.mjs +1 -1
  202. package/dist-lib/metro.cjs +1 -1
  203. package/dist-lib/profiles.cjs +1 -1
  204. package/dist-lib/public-brand.cjs +1 -1
  205. package/dist-lib/react-native-host-modules.cjs +2 -1
  206. package/dist-lib/react-native-host-modules.mjs +2 -1
  207. package/dist-lib/render-mode.cjs +1 -1
  208. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  209. package/dist-lib/sdk.cjs +1 -1
  210. package/dist-lib/sdk.mjs +1 -1
  211. package/dist-lib/skills.cjs +79 -47
  212. package/dist-lib/vite.cjs +1 -1
  213. package/package.json +1 -1
  214. package/src/react-native-host-modules.ts +1 -0
  215. package/dist-cli/chunks/app-fonts-66V7TL26.js +0 -4
  216. package/dist-cli/chunks/auth-3FMWUVJH.js +0 -12
  217. package/dist-cli/chunks/chunk-3NLB5LCN.js +0 -28
  218. package/dist-cli/chunks/chunk-5RWUFIZW.js +0 -24
  219. package/dist-cli/chunks/chunk-COXCR6UU.js +0 -7
  220. package/dist-cli/chunks/chunk-ROISJKH3.js +0 -99
  221. package/dist-cli/chunks/chunk-SUHAD6N2.js +0 -30
  222. package/dist-cli/chunks/chunk-TIB3CTRX.js +0 -497
  223. package/dist-cli/chunks/chunk-YFZLDFZK.js +0 -74
  224. package/dist-cli/chunks/cli-version-MJWLDXBW.js +0 -4
  225. package/dist-cli/chunks/config-WK7467KI.js +0 -13
  226. package/dist-cli/chunks/control-ESI7IZNN.js +0 -4
  227. package/dist-cli/chunks/daemon-UCLO27YP.js +0 -4
  228. package/dist-cli/chunks/desktop-FF34Z5X4.js +0 -31
  229. package/dist-cli/chunks/detox-Q3CWY5UX.js +0 -52
  230. package/dist-cli/chunks/device-WN4ZWLES.js +0 -18
  231. package/dist-cli/chunks/drivers-OR2JPAXD.js +0 -4
  232. package/dist-cli/chunks/flow-4GWW5DYT.js +0 -4
  233. package/dist-cli/chunks/help-MIIWOT3C.js +0 -4
  234. package/dist-cli/chunks/inspect-3ZGNJENJ.js +0 -4
  235. package/dist-cli/chunks/install-desktop-BYOJVTLS.js +0 -4
  236. package/dist-cli/chunks/login-GNIFSAFE.js +0 -26
  237. package/dist-cli/chunks/mode-YVMX7OJY.js +0 -26
  238. package/dist-cli/chunks/privacy-EDC7PF7G.js +0 -4
  239. package/dist-cli/chunks/record-N4KTTVDI.js +0 -72
  240. package/dist-cli/chunks/report-issue-PP752HAD.js +0 -29
  241. package/dist-cli/chunks/reset-DRMKGVP4.js +0 -4
  242. package/dist-cli/chunks/resolve-target-7WWI32R3.js +0 -4
  243. package/dist-cli/chunks/runtime-EKJV2ZVI.js +0 -4
  244. package/dist-cli/chunks/screenshot-layers-GOCJVM2G.js +0 -20
  245. package/dist-cli/chunks/screenshots-capture-YYJLYA3V.js +0 -42
  246. package/dist-cli/chunks/setup-FVPVIYE4.js +0 -4
  247. package/dist-cli/chunks/skills-V5TE57FN.js +0 -50
  248. package/dist-cli/chunks/store-IKNBDDKM.js +0 -4
  249. package/dist-cli/chunks/telemetry-2ZVU6WLK.js +0 -4
  250. package/dist-cli/chunks/timeline-LP7DMJYT.js +0 -24
  251. package/dist-cli/chunks/upload-DFQK2Q7X.js +0 -4
  252. package/dist-cli/chunks/welcome-2NFYLWLJ.js +0 -5
  253. package/dist-cli/chunks/what-happened-EJ5PHKT7.js +0 -25
@@ -1,7 +0,0 @@
1
- /*! rnx v0.1.369 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- import{a as me,b as qe}from"./chunk-OROUEG22.js";import{e as tt}from"./chunk-X3PEDNLV.js";import{c as Ke}from"./chunk-RYGQ6LZN.js";import{a as Ye,b as Xe,d as nt}from"./chunk-AKJYEX54.js";import{a as Le,c as Ae,d as I,e as ce,f as D,g as de,h as Ne,i as ue,j as Fe,k as je,m as Ge,n as Qe,o as Je}from"./chunk-UDXQCEJU.js";import{m as L}from"./chunk-2APXX4RN.js";import{a as He,b as We}from"./chunk-A56GQVNF.js";import{h as Ze,p as et}from"./chunk-D6MGELKZ.js";import{a as ze}from"./chunk-USHV3QFZ.js";import{a as Ve}from"./chunk-UQJY6O72.js";import{b as se,e as Ee}from"./chunk-F4OTMARL.js";import{b as Me,f as Oe,g as B,h as $,i as _,n as Be,o as ae,p as le,r as _e,s as De,t as R,u as P,v as T}from"./chunk-H2GB2PLY.js";import{f as Te}from"./chunk-IYPMULI7.js";import{a as Re}from"./chunk-A72MIIJI.js";import{D as Ce,M as oe,P as ie,R as O,T as Ue,l as re}from"./chunk-FBMNYSSW.js";import{a as ne}from"./chunk-MXWME7ET.js";import{spawn as lt,spawnSync as ct}from"node:child_process";import E from"node:fs";import Lt from"node:os";import C from"node:path";import{WebSocket as pe}from"ws";function rt(e){return new Error(`could not resolve a native bundle for ${e}. pass an explicit bundle URL or open Connect and choose the app there.`)}function Tt(e,n){return e?.includes("/one/metro-entry.bundle")?"one":typeof n=="string"&&n?"expo":"unknown"}function Et(e,n,t){return`${e}//${n}:${t}`}function Mt(e){if(typeof window>"u")return!1;try{let n=new URL(e);return I(n.hostname)&&I(window.location.hostname)&&n.origin!==window.location.origin}catch{return!1}}async function ot(e,n){let t={...n,cache:n?.cache??"no-store"};return Mt(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,t):fetch(e,t)}function Ot(e){return e==="https:"?443:80}function Bt(e){let n=e.pathname||"/";return(n==="/"||n==="")&&!e.search&&!e.hash}async function it(e){try{let n=await fetch("/__server-scan",{cache:"no-store"});if(!n.ok||!(n.headers.get("content-type")||"").toLowerCase().includes("json"))return null;let t=await n.json();if(!Array.isArray(t))return null;let r=t.find(o=>!!o&&typeof o=="object"&&o.port===e&&typeof o.bundleUrl=="string");return r?{bundleUrl:ue(r.bundleUrl),port:e,framework:typeof r.framework=="string"?r.framework:"unknown",projectName:typeof r.projectName=="string"?r.projectName:void 0}:null}catch{return null}}async function st(e,n){let t=e.replace(/\/+$/,"");try{let r=await ot(`${t}/`,{headers:{"expo-platform":"ios"}});if(r.ok){let o=await r.json(),i=o?.extra?.expoClient||o?.extra||{},a=typeof o?.launchAsset?.url=="string"?o.launchAsset.url:void 0,s=a?Ne(a,t):void 0;if(s||i.name)return{bundleUrl:ue(s||`${t}${de}`),port:n,framework:Tt(s,i.sdkVersion),projectName:i.name}}}catch{}try{let r=await ot(`${t}/status`);if(r.ok&&(await r.text()).includes("packager-status:running"))return{bundleUrl:`${t}${de}`,port:n,framework:"metro"}}catch{}return null}async function _t(e,n){try{if(I(new URL(e).hostname)){let t=await it(n);if(t)return t}}catch{}return st(e,n)}async function Dt(e){let n=await it(e);return n||((await Promise.all(Le.map(r=>st(Ae("http:",r,e),e)))).find(r=>r!==null)??null)}async function at(e){let n=e.trim();if(/^\d+$/.test(n)){let s=parseInt(n,10),l=await Dt(s);if(l)return l;throw rt(`localhost:${s}`)}let t=n.startsWith("http")?n:`http://${n}`,r;try{r=new URL(t)}catch{throw new Error(`could not parse "${e}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let o=r.protocol||"http:",i=r.port?parseInt(r.port,10):Ot(o),a=Et(o,r.hostname,i);if(Bt(r)){let s=await _t(a,i);if(s)return s;throw rt(a)}return{bundleUrl:r.toString(),port:i,framework:"unknown"}}var At=12e4,dt=100,Nt=5e3,ut=1e4,Ft={rn:"/rn",connectrn:"/rn","connect-rn":"/rn",clock:"/app/clock","native-ui":"/app/native-ui",tamagui:"/app/tamagui",settings:"/app/settings",photos:"/app/photos",camera:"/app/camera"};function S(e){return new Promise(n=>setTimeout(n,e))}function mt(e){let n=process.env[e]?.trim();if(!n)return null;let t=Number(n);return Number.isInteger(t)&&t>0?t:null}function jt(){let e=mt("SOOTSIM_DRIVER_CONNECT_TIMEOUT_MS")??mt("SOOTSIM_PW_CONNECT_TIMEOUT_MS")??At;return{timeoutMs:e,hostTimeoutMs:e+Nt,intervalMs:dt,attempts:Math.max(1,Math.ceil(e/dt))}}function pt(e){return e==="electron"||e==="playwright"}function fe(e,n){return n==="playwright"?e.meta?.sootsimHostDriver==="playwright":e.userAgent?.includes("Electron/")===!0}function Ht(e,n){return e.includes("--headless")?!0:e.includes("--headed")?!1:n==="playwright"&&process.platform==="linux"&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY?(console.error(" no display detected \u2192 running playwright headless (override with --headed)"),!0):!1}function z(e){return e.trim()}async function Wt(e,n=!1){let t=ie();ft(e,n,t);let r=ae(e);if((n||r!==null)&&await ge(e,250))return e;if(t&&O(t)&&await ge(t.bridgePort,500))return t.bridgePort;if(t&&O(t))throw new Error(`rnx bridge lockfile is fresh (port ${t.bridgePort}) but the bridge is not reachable. run \`rnx daemon restart\` or \`rnx daemon uninstall\`.`);await Kt();let o=qt(["serve","--quiet","--port",String(e)]),i=null;o.once("exit",(s,l)=>{i=String(s??l??"unknown")}),o.unref();let a=Date.now()+ut;for(;Date.now()<a;){let s=ie();if(ft(e,n,s),s&&O(s)&&await ge(s.bridgePort,250))return console.error(` Started a local bridge on port ${s.bridgePort}. Run \`rnx daemon install\` to keep it ready between commands.`),s.bridgePort;if(i)throw new Error(`rnx bridge exited before becoming ready (exit ${i})`);await S(150)}throw new Error(`rnx bridge did not start within ${Math.round(ut/1e3)}s`)}function ft(e,n,t){if(!(!n||!t||!O(t)||t.bridgePort===e))throw new Error(`${ne.commandName} open: requested bridge port ${e}, but the active daemon owns port ${t.bridgePort}. explicit --port never selects another bridge; stop that daemon or use an isolated SOOTSIM_HOME.`)}async function Kt(){let e=oe();if(e&&E.existsSync(re(e)))return;console.error(" installing rnx engine runtime...");let{runRuntime:n}=await import("./runtime-EKJV2ZVI.js");await n(["install"],{})}function qt(e){let n=process.argv[1];return n&&E.existsSync(n)?lt(process.execPath,[n,...e],{detached:!0,stdio:"ignore",env:process.env}):lt(ne.commandName,e,{detached:!0,stdio:"ignore",env:process.env})}function ge(e,n){return new Promise(t=>{let r=new pe(`ws://127.0.0.1:${e}`,{handshakeTimeout:n}),o=!1,i=a=>{o||(o=!0,r.readyState===pe.OPEN?r.close():r.readyState===pe.CONNECTING&&r.terminate(),t(a))};r.once("open",()=>i(!0)),r.on("error",()=>i(!1)),setTimeout(()=>i(!1),n)})}function we(e){try{let n=new URL(e),t=n.pathname.replace(/\/+$/,"")||"/";return n.searchParams.has("open")||n.searchParams.has("port")||n.searchParams.has("bundle")||n.searchParams.has("demo")||n.pathname.includes("/sootsim/index.html")||t==="/sootsim"||n.pathname==="/__soot"||n.pathname==="/__soot/"||t==="/rn"||/^\/rn\/[^/]+$/i.test(t)||/^\/app\/[^/]+$/i.test(t)||t==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(t)||/^\/__soot\/app\/[^/]+$/i.test(t)}catch{return!1}}function Vt(e){try{let n=new URL(e,"http://sootsim.local");if(n.origin!=="http://sootsim.local")return!1;let t=n.pathname.replace(/\/+$/,"")||"/";return t==="/rn"||/^\/rn\/[^/]+$/i.test(t)||/^\/app\/[^/]+$/i.test(t)||t==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(t)||/^\/__soot\/app\/[^/]+$/i.test(t)}catch{return!1}}function zt(e,n){let t=new URL(e,"http://sootsim.local"),r=new URL(n),o=G(r.pathname),i=t.pathname.startsWith("/__soot/")?t.pathname.slice(7):t.pathname;return r.pathname=`${o}${i}`,r.search=t.search,r.hash=t.hash,r.toString()}function Gt(e){try{let n=new URL(e).pathname.replace(/\/+$/,"")||"/";return/^\/preview\/[^/]+$/.test(n)||/^\/build\/.+/.test(n)}catch{return!1}}async function or(e){let n=z(e);return(await ve(n)).bundleUrl}function Qt(e){try{let n=new URL(e.startsWith("http")?e:`http://${e}`),t=n.pathname||"/";if(t!=="/"&&t!==""||n.search||n.hash||!I(n.hostname))return null;let r=n.port?Number(n.port):n.protocol==="https:"?443:80;return Number.isFinite(r)&&r>0?r:null}catch{return null}}async function ve(e){let n=z(e),t=/^\d+$/.test(n)?Number(n):Qt(n);if(t&&t>0){let r=await je(t);if(r)return{bundleUrl:r.bundleUrl,port:r.port,framework:r.framework,projectName:r.projectName}}return at(n)}function G(e){let n=e.replace(/\/+$/,"")||"/";return n==="/__soot"||n.startsWith("/__soot/")?"/__soot":""}function Jt(e,n){let t=z(e),r=new URL(n),o=G(r.pathname);return r.pathname=`${o}/rn`,r.searchParams.delete("bundle"),r.searchParams.delete("demo"),r.searchParams.delete("app"),r.searchParams.delete("open"),r.searchParams.delete("port"),/^\d+$/.test(t)?r.pathname=`${o}/rn/${t}`:(r.pathname=`${o}/rn`,r.searchParams.set("open",t)),r.toString()}function yt(e){let n=z(e);return/^\d+$/.test(n)||/^https?:\/\//i.test(n)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(n)}async function Yt(e,n,t={}){let r=t.resolvedBundle??await ve(e),o=new URL(n),i=G(o.pathname);o.pathname=`${i}/rn`,o.searchParams.delete("open"),o.searchParams.delete("port"),o.searchParams.delete("demo"),o.searchParams.delete("app");let a=t.hot===void 0?r.bundleUrl:Fe(r.bundleUrl,t.hot);return o.searchParams.set("bundle",a),o.toString()}function Xt(e){return e.startsWith("~/")?C.join(Lt.homedir(),e.slice(2)):C.isAbsolute(e)?e:C.resolve(process.cwd(),e)}function Zt(e){let n={},t={};for(let o=0;o<e.length;o++){if(e[o]==="--replace"){let i=e[o+1];i||(console.error(" rnx open: --replace expects <module>=<file>"),process.exit(1));let a=i.indexOf("=");(a<=0||a===i.length-1)&&(console.error(" rnx open: --replace expects <module>=<file>"),process.exit(1));let s=i.slice(0,a).trim(),l=Xt(i.slice(a+1).trim());E.existsSync(l)||(console.error(` rnx open: replacement file not found: ${l}`),process.exit(1)),n[s]={file:l},o++;continue}if(e[o]==="--remap"){let i=e[o+1],a=i?i.indexOf("="):-1;(!i||a<=0||a===i.length-1)&&(console.error(" rnx open: --remap expects <host:port>=<host:port>"),process.exit(1)),t[i.slice(0,a).trim()]=i.slice(a+1).trim(),o++;continue}}let r={};return Object.keys(n).length>0&&(r.modules=n),Object.keys(t).length>0&&(r.network={remap:t}),r.modules||r.network?r:void 0}async function en(e){if(!e)return null;let n=await Qe(e.bundleUrl);return n?Ve(n):null}async function tn(e){if(E.existsSync(C.join(re(e),"index.html")))return;console.error(` installing configured engine runtime ${e}...`);let n=await Te.install({version:e,setActive:!1,protectVersions:Ue()});console.error(` installed engine runtime ${n.version}`)}function nn(e,n){let t=n??(me()?void 0:oe()??void 0);if(!t)return e;let r=new URL(e);if(!I(r.hostname)){if(!n)return e;throw new Error(`runtimeVersion ${t} requires a local rnx host; got ${r.origin}`)}return r.hostname=qe(t),r.toString()}function St(){return Be().shellBaseUrl}function rn(e){return ae(e)?.shellBaseUrl??Me(e)??St()}async function on(e,n){try{let t=new URL(e),r=t.searchParams.get("bundle")||"";if(!r||!n)return e;let o=Ge({bundleUrl:r,projectDir:n.appDir});if(o.length===0)return e;let i=await sn(o);return i.length===0?e:(t.searchParams.set("appFonts",Je(i)),t.toString())}catch{return e}}async function sn(e){let n=await Promise.all(e.map(async r=>{let o=new AbortController,i=setTimeout(()=>o.abort(),1500);try{let a=await fetch(r.url,{method:"HEAD",signal:o.signal});return a.status>=200&&a.status<400?r:null}catch{return null}finally{clearTimeout(i)}})),t=[];for(let r of n)r!==null&&t.push(r);return t}async function an(e,n,t={}){if(!e)return new URL(n).toString();if(we(e))return new URL(e).toString();if(Vt(e))return zt(e,n);let r=Ft[e.toLowerCase()];if(r){let o=new URL(n),i=G(o.pathname);return o.pathname=`${i}${r}`,o.toString()}return yt(e)?Yt(e,n,t):Jt(e,n)}async function ln(e,n){try{let t=new URL(e),r=t.searchParams.get("bundle")||"";if(!r||!n)return e;let o=Ye({bundleUrl:r,projectDir:n.appDir});return!o||o.imageUrl&&!await cn(o.imageUrl)?e:(t.searchParams.set("appSplash",Xe(o)),t.toString())}catch{return e}}async function cn(e){let n=new AbortController,t=setTimeout(()=>n.abort(),1500);try{let r=await fetch(e,{method:"HEAD",signal:n.signal});return r.status>=200&&r.status<400}catch{return!1}finally{clearTimeout(t)}}async function V(e,n=St(),t={}){let r=await an(e,n,t),o=await ln(await on(r,t.project),t.project);if(!t.device)return o;let i=new URL(o);return i.searchParams.set("device",t.device),i.toString()}function gt(e,n){let t=e?.url||e?.origin||n;try{let r=new URL(t);return r.searchParams.delete("bundle"),r.searchParams.delete("demo"),r.searchParams.delete("app"),r.searchParams.delete("open"),r.searchParams.delete("port"),r.searchParams.delete("inspectOpen"),r.searchParams.delete("appFonts"),r.searchParams.delete("appSplash"),r.toString()}catch{return n}}async function dn(e,n,t,r={}){let o=new URL(await V(e,n,r));return o.searchParams.set("inspectOpen",t),o.toString()}async function un(e,n,t,r={}){let o=r.attempts??30,i=r.intervalMs??500,a=r.minNodeCount??10;for(let s=0;s<o;s++){let l=P(e,{commandTimeoutMs:n,simId:t,simIdSource:"flag"});try{let d=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof d=="number"&&d>a)return{bridge:l,count:d}}catch{}l.close(),await S(i)}return null}function mn(e){if(!e)return null;try{let n=new URL(e);if(n.searchParams.has("bundle")){let t=n.searchParams.get("bundle")||"";try{let r=new URL(t),o=r.pathname.length>36?`...${r.pathname.slice(-36)}`:r.pathname;return`bundle ${r.host}${o}`}catch{return"bundle"}}return n.searchParams.has("port")?`connect :${n.searchParams.get("port")||""}`:n.searchParams.has("open")?`connect ${n.searchParams.get("open")||""}`:n.searchParams.has("demo")?`demo ${n.searchParams.get("demo")||"default"}`:n.pathname.includes("/sootsim/index.html")||n.pathname==="/sootsim/"||n.pathname==="/sootsim"?"embedded rnx":null}catch{return null}}function pn(e){let n=e.indexOf(":");if(n<=0)return e.length>24?`${e.slice(0,21)}\u2026`:e;let t=e.slice(0,n),r=e.slice(n+1),o=r.length>12?`${r.slice(0,8)}\u2026`:r;return t==="TM_SESSION"||t==="CLAUDE_CODE_SESSION_ID"||t==="CODEX_THREAD_ID"?`agent ${o}`:`${t} ${o}`}function ir(e,n){if(e.length===0){console.log(" no sims connected");return}console.log(` connected sims (${e.length}):
5
- `);for(let t of e){let r=t.lockedBy&&t.lockExpiresAt?`locked by ${pn(t.lockedBy)} (${Math.max(0,Math.round((t.lockExpiresAt-Date.now())/1e3))}s)`:"",o=[t.isPrimary?"primary":"",t.id===n?"selected":"",t.readyState,t.userVisible===!1?"hidden":t.userVisible===!0?"visible":"",t.attachedCliCount&&t.attachedCliCount>0?"in use":"",t.userFocused?"focused":"",r].filter(Boolean);console.log(` ${t.id}${o.length?` [${o.join(", ")}]`:""}`);let i=mn(t.url);if(i)console.log(` loaded: ${i}`);else if(t.url){let s=t.url.length>96?`${t.url.slice(0,93)}\u2026`:t.url;console.log(` url: ${s}`)}else t.origin&&console.log(` origin: ${t.origin}`);let a=fn(t);a&&console.log(` engine: ${a}`),t.title&&console.log(` title: ${t.title}`),t.visibilityState&&t.visibilityState!=="visible"&&console.log(` visibility: ${t.visibilityState}`),console.log(` connected: ${ht(Date.now()-t.connectedAt)}`),t.lastActiveAt&&t.lastActiveAt>0&&console.log(` last active: ${ht(Date.now()-t.lastActiveAt)}`)}}function fn(e){let n=e.url||e.origin||"";if(!n)return null;try{let t=new URL(n).port;return t==="5173"?"dev \u2014 local source (:5173)":t==="3000"?"Contrast app embedded (:3000)":me()?`dev \u2014 local build (:${t||"?"})`:`runtime \u2014 published engine (:${t||"?"})`}catch{return null}}function ht(e){let n=Math.max(0,Math.round(e/1e3));return n<60?`${n}s ago`:n<3600?`${Math.round(n/60)}m ago`:n<86400?`${Math.round(n/3600)}h ago`:`${Math.round(n/86400)}d ago`}async function sr(e,n,t,r={}){let o=r.attempts??30,i=r.intervalMs??500;for(let a=0;a<o;a++){let s=P(e,{commandTimeoutMs:n});try{let d=(await s.listSims()).find(t);if(d)return d}catch{}finally{s.close()}await S(i)}return null}async function gn(e,n,t,r,o={}){let i=o.attempts??30,a=o.intervalMs??500,s=!!r&&Number.isInteger(r)&&r>1,l=()=>s&&r!==void 0&&!be(r);for(let d=0;d<i;d++){if(l())return{kind:"host-exit"};let u=P(e,{commandTimeoutMs:n});try{let g=(await u.listSims()).find(t);if(g)return l()?{kind:"host-exit"}:{kind:"match",sim:g}}catch{}finally{u.close()}if(l())return{kind:"host-exit"};await S(a)}return{kind:"timeout"}}async function hn(e,n,t,r={}){let o=r.attempts??20,i=r.intervalMs??250;for(let a=0;a<o;a++){let s=P(e,{commandTimeoutMs:n});try{let d=(await s.listSims()).find(u=>u.id===t);if(!d||d.readyState!=="open")return!0}catch{return!0}finally{s.close()}await S(i)}return!1}function wn(e){let n=e.meta;if(!n||n.sootsimHostDriver!=="playwright")return null;let t=Number(n.sootsimHostPid);return!Number.isInteger(t)||t<=1||t===process.pid?null:t}function bn(e){if(!e.connectAckFile)return!1;try{return E.writeFileSync(e.connectAckFile,`${JSON.stringify({connectedAt:Date.now(),pid:e.pid??null})}
6
- `,{flag:"w"}),!0}catch{return!1}}function wt(e){if(e.diagnosticLogPath)try{let n=E.readFileSync(e.diagnosticLogPath,"utf8").trim();if(!n){console.error(` ${C.basename(e.diagnosticLogPath)} was empty`);return}let t=n.length>4e3?`\u2026
7
- ${n.slice(-4e3)}`:n;console.error(` ${C.basename(e.diagnosticLogPath)}:`),console.error(t)}catch(n){let t=n instanceof Error?n.message:String(n);console.error(` failed to read ${C.basename(e.diagnosticLogPath)}: ${t}`)}}function be(e){try{return process.kill(e,0),!0}catch(n){return n?.code==="EPERM"}}async function vn(e,n=2500){let t=Date.now()+n;for(;Date.now()<t;){if(!be(e))return!0;await S(100)}return!be(e)}function yn(e){let n=ct("ps",["-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),t=ct("ps",["eww","-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(n.status!==0||t.status!==0)return!1;let r=(n.stdout||"").trimEnd(),o=(t.stdout||"").trimEnd();return(o.startsWith(r)?o.slice(r.length):o).includes("SOOTSIM_PW_URL=")}async function he(e,n){let t=new Set(n),r=new Set;for(let o of e){if(!t.has(o.id))continue;let i=wn(o);i&&r.add(i)}for(let o of r){if(!yn(o)){console.log(` skipped pid ${o}: not a rnx playwright host (stale sim record)`);continue}try{process.kill(o,"SIGTERM")}catch{}if(await vn(o)){console.log(` closed playwright host process ${o}`);continue}try{process.kill(o,"SIGKILL"),console.log(` force-closed playwright host process ${o}`)}catch{}}}function Q(e,n){if(n){let o=n.trim(),i=e.find(a=>a.id===o);if(!i)throw new Error(`no sim connected with id ${o}`);return i}let t=e.find(o=>o.isPrimary&&o.readyState==="open");if(t)return t;let r=e.find(o=>o.readyState==="open");if(r)return r;throw new Error("no sim connected")}function bt(e,n,t,r=!1){let[o,i]=[e,n.url].map(a=>{if(!a)return a;try{let s=new URL(a);if(s.searchParams.has("sootsimConfig"))return s.searchParams.set("sootsimConfig","[redacted]"),s.toString()}catch{}return a});if(r){console.log(` Opened ConnectRN [${t}]`);return}console.log(` ${t==="current sim"?"loaded":"opened"}: ${o} [${t}]`),console.log(` current sim: ${n.id}`),console.log(JSON.stringify({simId:n.id,url:i},null,2))}async function vt(e,n,t){if(t.includes("--no-describe"))return;let r=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Sn(e,n,{stableMs:150,maxMs:400});let o=P(e,{commandTimeoutMs:3e3,simId:n,cliLabel:"open --describe",simIdSource:"flag"});try{let i=null;try{i=await et(o,1)}catch{}if(i&&!i.ready){let s=i.loadingText?`still showing "${i.loadingText}"`:i.flag!==!0?"guest ready event has not fired":i.targets<=0?"no visible app content is inspectable yet":"app tree is still stabilizing";console.log(` app still loading: ${s} (nodes: ${i.nodes}, targets: ${i.targets})`),console.log(" before interacting, run: rnx wait ready --max-ms 120000")}let a=await Ze(o,{describe:!0,verbose:!1,filter:"",compact:!0,hideXy:!1,maxDepth:12});if(!a?.tree)return;console.log(""),console.log(a.tree)}finally{o.close()}}catch{}finally{r===void 0?delete process.env.SOOTSIM_QUIET_TARGET_NOTICE:process.env.SOOTSIM_QUIET_TARGET_NOTICE=r}}async function Sn(e,n,t){let r=Date.now()+t.maxMs,o="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",i=P(e,{commandTimeoutMs:2e3,simId:n,simIdSource:"flag"});try{let a=-1,s=0;for(;Date.now()<r;){let l=-1;try{let d=await i.send({type:"evaluate",code:o});typeof d=="number"&&(l=d)}catch{}if(l>=0&&l===a){if(Date.now()-s>=t.stableMs)return}else a=l,s=Date.now();await S(50)}}finally{i.close()}}async function xn(e,n={}){let t=R(e,{port:n.port,commandTimeoutMs:n.timeoutMs});t.positional.length!==1&&(console.error(" rnx open: expected exactly one <url-or-route>"),console.error(" examples: rnx open /settings | rnx open myapp://settings"),process.exit(1));let r=T(t),o=t.simId?` --sim ${t.simId}`:"";try{let i=await We(r,t.positional[0]??"");console.log(` opened deep link: ${i}`)}catch(i){console.error(` link failed: ${i instanceof Error?i.message:String(i)}`),await L(r,{errorsCommand:`rnx get errors 5${o}`,warningsCommand:`rnx get warnings 5${o}`,requestsCommand:`rnx get requests 5${o}`}),process.exit(1)}finally{r.close()}}async function ar(e,n={}){let t=R(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--new","--headless","--headed","--ephemeral","--hot","--no-hmr","--no-describe","--quiet"],stripValueFlags:["--base-url","--replace","--driver","--profile","--cdp-port","--device","--viewport"]}),r=e.find((p,m)=>e[m-1]==="--profile"),o=e.includes("--quiet"),i=e.includes("--ephemeral"),a=e.find((p,m)=>e[m-1]==="--cdp-port"),s=a?Number(a):void 0;a&&(!Number.isFinite(s)||s<=0)&&(console.error(` rnx open: --cdp-port must be a positive port number, got "${a}"`),process.exit(1)),r&&i&&(console.error(" rnx open: --profile cannot be combined with --ephemeral"),process.exit(1));let l=r?Ke(r).id:void 0,d=e.includes("--new")||!!l||i,u=Zt(e);d&&t.simIdSource==="flag"&&(console.error(" rnx open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let c=t.positional[0]||"";if(He(c)){d&&(console.error(" rnx open: deep links target the current app; remove --new, --profile, or --ephemeral"),process.exit(1)),await xn(e,n);return}if(Gt(c)){let p=(()=>{try{return I(new URL(c).hostname)}catch{return!1}})();console.log(" that\u2019s an rnx preview/build link \u2014 a full player page, not a driveable sim."),console.log(" opening it in your browser for viewing\u2026");try{await nt(c,{background:!1})}catch(m){console.error(` could not launch a browser: ${m instanceof Error?m.message:String(m)}`),console.error(` open it yourself: ${c}`),process.exit(1)}console.log(p?" to drive it under the CLI, point `rnx open` at the app\u2019s dev port instead (e.g. `rnx open 8081`).":" the CLI can\u2019t drive a remote preview (the engine only attaches to the local bridge from localhost). to drive the app, run it locally and `rnx open <port>`.");return}let g=yt(c)?await ve(c):void 0,A=await en(g),J=await ze(A),N=J?.runtimeVersion,F=ce(ce(J?{...J,runtimeVersion:void 0}:void 0,n.runtimeConfig),u);N&&await tn(N);let Y=e.find((p,m)=>e[m-1]==="--base-url");if(Y&&!t.explicitPort){let p=le(Y);p&&(t.wsPort=p)}t.wsPort=await Wt(t.wsPort,t.explicitPort);let M=e.find((p,m)=>e[m-1]==="--driver")||"";M&&!pt(M)&&(console.error(` unknown driver "${M}" \u2014 run \`rnx list --drivers\``),process.exit(1));let b=pt(M)?M:process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"||Re()||!process.stdin.isTTY?"playwright":Ce()||"playwright",$t=Ht(e,b);s&&b!=="playwright"&&(console.error(" rnx open: --cdp-port is only honored by the playwright driver"),process.exit(1));let ye=e.includes("--hot"),Se=e.includes("--no-hmr");ye&&Se&&(console.error(" rnx open: --hot and --no-hmr cannot be combined"),process.exit(1));let Pt=ye?!0:Se?!1:b!=="playwright",k=e.find((p,m)=>e[m-1]==="--device");k&&!(k in se)&&(console.error(` rnx open: unknown device "${k}"`),console.error(` known devices: ${Ee().join(", ")}`),process.exit(1));let X=k?se[k]:void 0,j=e.find((p,m)=>e[m-1]==="--viewport"),H=j?/^(\d+)x(\d+)$/.exec(j):null;j&&!H&&(console.error(` rnx open: --viewport must be <width>x<height>, got "${j}"`),process.exit(1));let It=H?{width:Number(H[1]),height:Number(H[2])}:void 0,W={hot:Pt,device:k,resolvedBundle:g,project:A},kt=N?`http://localhost:${t.wsPort}/`:Y||rn(t.wsPort),x=nn(kt,N),xe=e.includes("--base-url");_e(t.wsPort,x);let Ct=B();if(!d){let p=T(t),m=t.simId?` --sim ${t.simId}`:"",te=!1;try{let f=null,q=null;try{let h=await p.listSims();if(t.simIdSource==="saved")f=h.find(w=>w.id===Ct&&w.readyState==="open"&&fe(w,b))??null,f||_();else if(t.simIdSource==="flag"&&(f=Q(h,t.simId),!fe(f,b)))throw new Error(`sim ${f.id} is not managed by the ${b} driver`);if(!f&&t.simIdSource!=="flag"){q=await V(c,D(x,F),W);let w=new URL(q);w.searchParams.delete("inspectOpen"),f=h.find(y=>{if(y.readyState!=="open"||!y.url||!fe(y,b))return!1;try{let ke=new URL(y.url);return ke.searchParams.delete("inspectOpen"),ke.toString()===w.toString()}catch{return!1}})??null}if(!f)if(t.simIdSource!=="flag")te=!0;else throw new Error("no sim connected");if(!te&&f){let w=xe||we(c)?x:gt(f,x),y=q??await V(c,D(w,F),W);p.send({type:"evaluate",simId:f.id,code:`window.location.href = ${JSON.stringify(y)}`}).catch(()=>{})}}catch(h){console.error(` open failed: ${h instanceof Error?h.message:String(h)}`),await L(p,{errorsCommand:`rnx get errors 5${m}`,warningsCommand:`rnx get warnings 5${m}`,requestsCommand:`rnx get requests 5${m}`}),process.exit(1)}if(!te&&f){await S(1500);let h=await un(t.wsPort,t.commandTimeoutMs,f.id);h||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),h.bridge.close(),$(f.id);let w=xe||we(c)?x:gt(f,x),y=q??await V(c,D(w,F),W);return bt(y,{...f,url:y},"current sim",o),await vt(t.wsPort,f.id,e),t.wsPort}}finally{p.close()}}let Ut=D(x,F),$e=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,Pe=await dn(c,Ut,$e,W),Ie=Oe();Ie||(console.error(" could not resolve a stable owning process; refusing unsupervised sim host"),process.exit(1));let Rt=p=>p.url?.includes(`inspectOpen=${$e}`)??!1,U=tt(b);U||(console.error(` unknown driver "${b}" \u2014 run \`rnx list --drivers\``),process.exit(1));let K=jt(),v=await U.launch({url:Pe,bridgePort:le(x)??t.wsPort,headless:$t,profileId:l,ephemeralProfile:i,cdpPort:s,device:k,ownerPid:Ie,viewport:It??(X?{width:X.width+120,height:X.height+60}:void 0),connectTimeoutMs:K.hostTimeoutMs});v.launched||(console.error(` ${U.name} driver: ${v.message}`),process.exit(1));let Z=await gn(t.wsPort,t.commandTimeoutMs,Rt,v.pid,{attempts:K.attempts,intervalMs:K.intervalMs});if(Z.kind==="host-exit"&&(wt(v),console.error(` ${U.name} host crashed \u2014 sim is no longer attached`),process.exit(1)),Z.kind==="timeout"){if(v.pid)try{process.kill(v.pid,"SIGTERM"),console.error(` closed ${U.name} host process ${v.pid}`)}catch{}wt(v),console.error(` timed out after ${K.timeoutMs}ms waiting for opened sim to connect`),process.exit(1)}let ee=Z.sim;return $(ee.id),bn(v),bt(Pe,ee,`${U.name} driver`,o),await vt(t.wsPort,ee.id,e),t.wsPort}async function xt(e,n={}){let t=R(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--force"]}),r=e.includes("--force"),o=T(t),i=t.simId?` --sim ${t.simId}`:"";try{try{let a=await o.listSims(),s=Q(a,t.positional[0]||t.simId);if(s.lockedBy&&s.lockExpiresAt&&s.lockExpiresAt>Date.now()){let l=Math.max(0,Math.round((s.lockExpiresAt-Date.now())/1e3));s.lockedByKind==="user-active"&&(console.error(` refused: ${s.id} is locked by the active user (${l}s) \u2014 that's a live human tab`),console.error(" run `rnx open --new` for a fresh investigation sim"),process.exit(1)),r||(console.error(` refused: ${s.id} is leased by ${s.lockedBy} (${l}s)`),console.error(` \`sootsim use ${s.id} --force\` to take it, or \`rnx open --new\` for a fresh sim`),process.exit(1))}await o.focusSim(s.id),$(s.id),console.log(` using: ${s.id}`)}catch(a){console.error(` use failed: ${a instanceof Error?a.message:String(a)}`),await L(o,{errorsCommand:`rnx get errors 5${i}`,warningsCommand:`rnx get warnings 5${i}`,requestsCommand:`rnx get requests 5${i}`}),process.exit(1)}}finally{o.close()}}async function lr(e,n={}){await xt(e,n)}async function cr(e,n={}){await xt(e,n)}async function dr(e,n={}){let t=R(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--force"]}),r=e.includes("--force"),o=T(t);try{try{let i=await o.listSims(),a=Q(i,t.positional[0]||t.simId),s=r&&a.lockedBy&&a.lockedByKind!=="user-active"?a.lockedBy:null,l=await o.claim(a.id,{force:r});$(a.id);let d=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),u=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${d}s]${u}`),s&&console.log(` took over from: ${s}`)}catch(i){if(i instanceof De){let a=Math.max(0,Math.round(i.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${i.lock.by} for ${a}s more`),console.error(" use --force to take it, or `rnx open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}}finally{o.close()}}async function $n(e,n,t,r){if(r.length===0)return{closed:[],remaining:[]};await Promise.all(r.map(i=>e.closeSim(i).catch(()=>{})));let o=new Set(r);for(let i=0;i<40;i++){let a=[];try{let s=P(n,{commandTimeoutMs:t});try{a=(await s.listSims()).filter(d=>o.has(d.id)&&d.readyState==="open").map(d=>d.id)}finally{s.close()}}catch{a=[]}if(a.length===0)return{closed:[...o],remaining:[]};if(i===39)return{closed:[...o].filter(s=>!a.includes(s)),remaining:a};await S(250)}return{closed:[...o],remaining:[]}}function Pn(e,n){let t=e.filter(c=>c.readyState==="open"),r=t.map(c=>c.id),o=n.explicitKeepId?.trim()||"",i=n.savedKeepId?.trim()||"",a=i?t.some(c=>c.id===i):!1,s=i&&!a?i:null,l=null,d=null,u=null;if(n.closeOthers)if(o){let c=t.find(g=>g.id===o);c?l=c.id:d=o}else if(i&&a)l=i;else{let c=t.find(g=>g.isPrimary)??t[0]??null;c&&(l=c.id,i&&!a&&(u=c.id))}return{openIds:r,keepId:l,targets:d?[]:r.filter(c=>c!==l),staleSavedId:s,missingExplicitKeepId:d,fallbackKeepId:u}}async function ur(e,n={}){let t=R(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--all","--others"]}),r=T(t),o=t.simId?` --sim ${t.simId}`:"",i=e.includes("--all"),a=e.includes("--others");if(i||a){try{let s=await r.listSims(),l=B(),d=t.positional[0]||(t.simIdSource==="flag"?t.simId:void 0),u=Pn(s,{closeOthers:a,explicitKeepId:d,savedKeepId:l});if(u.staleSavedId&&_(),u.fallbackKeepId&&($(u.fallbackKeepId),console.log(` saved sim ${u.staleSavedId} is gone \u2014 keeping primary ${u.fallbackKeepId}`)),u.missingExplicitKeepId&&(console.error(` close failed: keep sim ${u.missingExplicitKeepId} is not connected; not closing other sims`),process.exit(1)),u.targets.length===0){console.log(u.keepId?` nothing to close \u2014 only the kept sim ${u.keepId} is connected`:u.staleSavedId?` nothing to close \u2014 no sims connected (cleared stale current sim ${u.staleSavedId})`:" nothing to close \u2014 no sims connected");return}let c=await $n(r,t.wsPort,t.commandTimeoutMs,u.targets);await he(s,u.targets);let g=B();g&&c.closed.includes(g)&&(u.keepId?$(u.keepId):_());let A=` closed ${c.closed.length} sim(s)${u.keepId?` (kept ${u.keepId})`:""}`;console.log(A),c.remaining.length>0&&(console.error(` close failed: still connected: ${c.remaining.join(", ")}`),process.exit(1))}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}finally{r.close()}return}try{try{let s=await r.listSims(),l=Q(s,t.positional[0]||t.simId),d=s.find(c=>c.id!==l.id&&c.readyState==="open");await r.closeSim(l.id),await hn(t.wsPort,t.commandTimeoutMs,l.id)||(await he(s,[l.id]),console.error(` close failed: ${l.id} is still connected`),process.exit(1)),await he(s,[l.id]),B()===l.id&&(d?$(d.id):_()),console.log(` closed: ${l.id}`)}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await L(r,{errorsCommand:`rnx get errors 5${o}`,warningsCommand:`rnx get warnings 5${o}`,requestsCommand:`rnx get requests 5${o}`}),process.exit(1)}}finally{r.close()}}export{jt as a,Wt as b,or as c,nn as d,St as e,rn as f,V as g,dn as h,mn as i,ir as j,sr as k,gn as l,wn as m,bn as n,he as o,xn as p,ar as q,lr as r,cr as s,dr as t,$n as u,Pn as v,ur as w};
@@ -1,99 +0,0 @@
1
- /*! rnx v0.1.369 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- import{a as q,b as G,c as Ne}from"./chunk-JH5KE2OI.js";import{c as _e,d as $e}from"./chunk-AKJYEX54.js";import{p as Pe}from"./chunk-UDXQCEJU.js";import{t as Ae,v as Ue,x}from"./chunk-H2GB2PLY.js";import{a as Ie}from"./chunk-MXWME7ET.js";import{createHash as wt}from"crypto";import{readFileSync as b}from"fs";import De from"path";import{gzipSync as me,gunzipSync as Mt}from"zlib";function Fe(e){let t=(e||"").toLowerCase().split(";")[0].trim();return t?!(t.startsWith("image/")||t.startsWith("video/")||t.startsWith("audio/")||t==="font/woff2"||t==="application/font-woff2"||t==="application/zip"||t==="application/gzip"):!0}import{brotliCompressSync as it,constants as at}from"node:zlib";var lt=9;function Le(e){return it(e,{params:{[at.BROTLI_PARAM_QUALITY]:lt}})}var le={initMs:3e4,putMs:12e4,finalizeMs:18e4};function ue(e,t){let r=new AbortController,s=setTimeout(()=>r.abort(new Error(`${t} timed out after ${e/1e3}s`)),e);return{signal:r.signal,cancel:()=>clearTimeout(s)}}async function ut(e){let t=ue(le.putMs,`PUT ${e.url}`),r;try{r=await fetch(e.url,{method:"PUT",headers:{"content-type":e.contentType},body:e.bytes,signal:t.signal})}finally{t.cancel()}if(!r.ok){let s=await r.text().catch(()=>"");throw new Error(`PUT ${e.url} failed ${r.status}: ${s.slice(0,200)}`)}}async function ct(e,t=8,r){let s=0,o=0,i=e.length;await Promise.all(Array.from({length:Math.min(t,i)},async()=>{for(;s<i;){let l=e[s++];await ut(l),o++,r?.(o,i)}}))}function dt(e,t,r,s){let o=[];o.push({url:e.bundle.putUrl,contentType:e.bundle.contentType,bytes:t});for(let i of e.files){let l=r.get(i.urlhash);l&&o.push({url:i.putUrl,contentType:i.contentType,bytes:l})}e.events&&s?.eventsBytes&&o.push({url:e.events.putUrl,contentType:e.events.contentType,bytes:s.eventsBytes}),e.timeline&&s?.timelineBytes&&o.push({url:e.timeline.putUrl,contentType:e.timeline.contentType,bytes:s.timelineBytes}),e.flowVideo&&s?.videoBytes&&o.push({url:e.flowVideo.putUrl,contentType:e.flowVideo.contentType,bytes:s.videoBytes}),e.storage&&s?.storageBytes&&o.push({url:e.storage.putUrl,contentType:e.storage.contentType,bytes:s.storageBytes}),e.failureBundle&&s?.failureBundleBytes&&o.push({url:e.failureBundle.putUrl,contentType:e.failureBundle.contentType,bytes:s.failureBundleBytes});for(let i of e.snapshots??[]){let l=s?.snapshotBytes?.get(i.id);l&&o.push({url:i.putUrl,contentType:i.contentType,bytes:l})}return o}function pt(e){return e.replace(/\/+$/,"")}var J=class extends Error{constructor(r,s,o,i=""){super(r);this.status=s;this.phase=o;this.responseText=i;this.name="PresignedUploadError"}};async function Ce(e){let t=pt(e.originBase),r={"content-type":"application/json"};e.authHeader&&(r.authorization=e.authHeader),e.adminBypassToken&&(r["x-contrast-admin-upload-bypass"]=e.adminBypassToken);let s=ue(le.initMs,"init"),o;try{o=await fetch(`${t}/api/preview/upload/init`,{method:"POST",headers:r,body:JSON.stringify(e.initBody),signal:s.signal})}finally{s.cancel()}if(!o.ok){let w=await o.text().catch(()=>"");throw new J(`init failed: ${o.status} ${w.slice(0,200)}`,o.status,"init",w)}let i=await o.json(),l=dt(i,e.bundleBytes,e.filesByHash,e.extras);await ct(l,e.concurrency??8,e.onPutProgress);let f=ue(le.finalizeMs,"finalize"),c;try{c=await fetch(`${t}/api/preview/upload/finalize`,{method:"POST",headers:r,body:JSON.stringify({token:i.token}),signal:f.signal})}finally{f.cancel()}if(!c.ok){let w=await c.text().catch(()=>"");throw new J(`finalize failed: ${c.status} ${w.slice(0,200)}`,c.status,"finalize",w)}let h=await c.json();return{init:i,finalize:h}}function ft(e){return e!==null&&typeof e=="object"?e:null}function Oe(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function ce(e){let t=ft(e);return t?t.schemaVersion===1&&Oe(t.t)!==void 0&&Oe(t.seq)!==void 0&&typeof t.context=="string"&&typeof t.kind=="string"&&"data"in t:!1}function mt(e,t){let r=[];for(let s of e.split(`
5
- `)){let o=s.trim();if(o)try{let i=JSON.parse(o);t(i)&&r.push(i)}catch{}}return r}function ze(e){return mt(e,ce)}import{execSync as gt}from"child_process";function pe(e){try{return gt(e,{stdio:["ignore","pipe","ignore"],timeout:3e3,encoding:"utf8"}).trim()||null}catch{return null}}function de(e){let t=e?.trim();return!t||!/^\d+$/.test(t)?null:Number(t)}function ht(){let e=pe("git remote get-url origin");if(!e)return null;let t=e.match(/github\.com[/:]([^/\s]+)\/([^/\s]+?)(?:\.git)?\/?$/i);return t?{owner:t[1],repo:t[2]}:null}function fe(){let e=process.env.GITHUB_ACTIONS==="true",t=process.env.CONTRAST_BRANCH?.trim()||null,r=process.env.CONTRAST_SHA?.trim()||null,s=process.env.CONTRAST_PR_TITLE?.trim()||null,o=(process.env.CONTRAST_REPO||process.env.GITHUB_REPOSITORY||"").trim(),[i,l]=o.includes("/")?o.split("/",2):[null,null];if(e){let h=process.env.GITHUB_REF?.match(/^refs\/pull\/(\d+)\//)?.[1];return{owner:i,repo:l,branch:t||process.env.GITHUB_HEAD_REF?.trim()||process.env.GITHUB_REF_NAME?.trim()||null,commitSha:r||process.env.GITHUB_SHA?.trim()||null,githubUsername:process.env.GITHUB_ACTOR?.trim()||null,pullRequestNumber:de(process.env.CONTRAST_PR_NUMBER)??de(h),pullRequestTitle:s,githubRunId:process.env.GITHUB_RUN_ID?.trim()||null,source:"ci"}}let f=t??pe("git rev-parse --abbrev-ref HEAD"),c=i?null:ht();return{owner:i??c?.owner??null,repo:l??c?.repo??null,branch:f==="HEAD"?null:f,commitSha:r??pe("git rev-parse HEAD"),githubUsername:null,pullRequestNumber:de(process.env.CONTRAST_PR_NUMBER),pullRequestTitle:s,githubRunId:null,source:"cli"}}function Jt(e){if(e.length===0)return{stepCount:null,failedStepIndex:null};let t=e.find(r=>r.status==="failure");return{stepCount:e.length,failedStepIndex:t?t.stepIndex:null}}function Kt(e){return e.auth?e.uploadedShare?!0:e.auth.kind==="github"||process.env.GITHUB_ACTIONS==="true":!1}async function Vt(e){let t=e.auth??q();if(!t)return null;let r=fe(),s=e.owner??(t.kind==="github"?t.owner:null)??r.owner,o=e.repo??(t.kind==="github"?t.repo:null)??r.repo;try{let i=await fetch(`${e.origin.replace(/\/$/,"")}/api/sootsim/test-runs`,{method:"POST",headers:{"content-type":"application/json",authorization:G(t)},body:JSON.stringify({kind:e.kind,source:r.source,name:e.name??void 0,prompt:e.prompt??void 0,summary:e.summary??void 0,status:e.status,failureMessage:e.failureMessage??void 0,previewShareId:e.previewShareId??void 0,owner:s??void 0,repo:o??void 0,branch:r.branch??void 0,commitSha:r.commitSha??void 0,githubUsername:r.githubUsername??void 0,pullRequestNumber:r.pullRequestNumber??void 0,githubRunId:r.githubRunId??void 0,stepCount:e.stepCount??void 0,failedStepIndex:e.failedStepIndex??void 0,durationMs:e.durationMs??void 0,flowYamlSizeBytes:e.flowYamlSizeBytes??void 0})});if(!i.ok){let f=await i.text().catch(()=>"");return console.warn(` warn: run registration failed: /api/sootsim/test-runs ${i.status}${f?`: ${f.slice(0,200)}`:""}`),null}let l=await i.json();return l.run?.id?{id:l.run.id,previewUrl:l.run.previewUrl??null,traceUrl:l.run.traceUrl??null}:(console.warn(" warn: run registration returned no id"),null)}catch(i){return console.warn(` warn: run registration failed: ${i instanceof Error?i.message:String(i)}`),null}}function Tt(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.message=="string"&&t.message?t.message:null}catch{return null}}function St(e){let t=JSON.parse(b(e,"utf8"));if(!Array.isArray(t))throw new Error("snapshot manifest must be an array");let r=new Set;return t.map((s,o)=>{if(s===null||typeof s!="object")throw new Error(`snapshot manifest entry ${o} must be an object`);let i=Reflect.get(s,"id"),l=Reflect.get(s,"label"),f=Reflect.get(s,"path"),c=Reflect.get(s,"t");if(typeof i!="string"||!i||r.has(i))throw new Error(`snapshot manifest entry ${o} has an invalid or duplicate id`);if(typeof f!="string"||!f)throw new Error(`snapshot manifest entry ${o} has no PNG path`);if(typeof c!="number"||!Number.isFinite(c)||c<0)throw new Error(`snapshot manifest entry ${o} has an invalid capture time`);r.add(i);let h=b(f);return{meta:{id:i,label:typeof l=="string"&&l?l:i,kind:"interaction",t:Math.round(c),contentType:"image/png",sizeBytes:h.byteLength},bytes:h}})}var Je=process.env.SOOTSIM_UPLOAD_ORIGIN||"https://contrast.dev",Ke=process.env.SOOTSIM_PREVIEW_ORIGIN||Ie.origin;async function vt(e){return e||(process.env.SOOTSIM_UPLOAD_ORIGIN?process.env.SOOTSIM_UPLOAD_ORIGIN:Je)}function $(e){return e.replace(/\/$/,"")}function xt(e){try{let r=new URL(e).hostname.replace(/^\[|\]$/g,"").toLowerCase();return r==="localhost"||r.endsWith(".localhost")||r==="0.0.0.0"||r==="::1"||/^127(?:\.\d{1,3}){3}$/.test(r)}catch{return!1}}function Rt(e){try{let t=new URL(e).hostname.toLowerCase();return t==="contrast.dev"||t.endsWith(".contrast.dev")}catch{return!1}}function kt(e,t){return t?$(t):process.env.SOOTSIM_PREVIEW_ORIGIN?$(process.env.SOOTSIM_PREVIEW_ORIGIN):xt(e)?$(e):Rt(e)?$(Ke):$(e)}function Bt(){console.log(`
6
- rnx record upload \u2014 publish the current recorded bundle as a /preview/<id> link
7
-
8
- usage:
9
- rnx record upload [--origin <url>] [--public-origin <url>] (--events <path> | --video <path>) [--screenshot <path>] [--owner <org> --repo <repo>] [--sim <sim>] [--open] [--assets-only]
10
-
11
- options:
12
- --origin <url> upload target (default: ${Je})
13
- override with SOOTSIM_UPLOAD_ORIGIN env var
14
- --public-origin <url>
15
- public /preview link origin (default: ${Ke}
16
- for prod uploads, upload origin for localhost/custom origins).
17
- override with SOOTSIM_PREVIEW_ORIGIN env var
18
- --events <path> path to a gzipped events .jsonl.gz file to attach
19
- required unless --video is present; previews must
20
- have replay or recording playback data
21
- --screenshot <path>
22
- path to a PNG thumbnail to attach to the share
23
- --snapshot-manifest <path>
24
- JSON manifest of existing interaction PNGs to attach
25
- --video <path> path to a mp4/gif flow recording. embedded inline
26
- in the pr sticky comment served at
27
- /api/preview/flow-video?id=<share-id>
28
- --video-duration-ms <ms>
29
- duration hint for attached flow video
30
- --timeline-events <path>
31
- extra trace timeline rows, JSONL or JSONL gz
32
- --trace-frame-stats <path>
33
- frame stats JSON returned by the recorder bridge
34
- --failure-bundle <dir>
35
- per-failure debug bundle dir written by the flow runner
36
- (error.json, describe.json, a11y.txt, tree.txt,
37
- console.json, screenshot.png). uploaded with the share
38
- so failed CI runs are debuggable from the dashboard
39
- --owner <org> associate a session upload with a linked org repo
40
- --repo <repo> repo name for --owner; the signed-in user must belong
41
- to the local/org team that owns the link
42
- --billing-kind test_run
43
- meter this upload as a natural-language test run
44
- --sim <sim> target a specific sim (see: rnx list)
45
- --open open the resulting /preview/<id> url in the browser
46
- --assets-only drop API/JSON/HTML records before upload; keep images,
47
- fonts, css, js, and binary blobs. live-data demos hit
48
- the real network at replay time instead of serving
49
- recorded API snapshots
50
- -h, --help
51
-
52
- examples:
53
- rnx record upload --events ./my-session.jsonl.gz
54
- rnx record upload --origin https://contrast.localhost:3000 --events ./my-session.jsonl.gz --open
55
- rnx record upload --video /tmp/sootsim-flow.mp4 --video-duration-ms 12000
56
- `)}function p(e,t){let r=e.findIndex(o=>o===t);if(r<0)return;let s=e[r+1];return e.splice(r,2),s}function He(e,t){let r=e.findIndex(s=>s===t);return r<0?!1:(e.splice(r,1),!0)}function je(e,t){if(!e)return;let r=Number(e);return(!Number.isFinite(r)||r<=0)&&(console.error(` invalid ${t}: ${e}`),process.exit(1)),Math.round(r)}function qe(e){let t=(e||"").toLowerCase().split(";")[0].trim();return t?!!(t.startsWith("image/")||t.startsWith("font/")||t.startsWith("video/")||t.startsWith("audio/")||t.startsWith("model/")||t==="text/css"||t==="application/javascript"||t==="text/javascript"||t==="application/wasm"||t==="application/font-woff"||t==="application/font-woff2"||t==="application/octet-stream"):!1}async function Ge(e){let t=await fetch(e);if(!t.ok)throw new Error(`fetch ${e} -> ${t.status} ${t.statusText}`);return new Uint8Array(await t.arrayBuffer())}function Et(e){return/\.bundle($|\?)/.test(e)||/\.js($|\?)/.test(e)?"application/javascript":/\.zip($|\?)/.test(e)?"application/zip":"application/javascript"}function It(e){try{return new URL(e).searchParams.get("appFonts")||""}catch{return""}}function At(e){try{return new URL(e).searchParams.get("appSplash")||""}catch{return""}}function Ut(e){try{let t=new URL(e);return t.searchParams.get("lazy")==="true"?(t.searchParams.set("lazy","false"),t.toString()):e}catch{return e}}async function Pt(e,t){let s=[];for(let o=0;o<t;o+=15e5){let i=Math.min(o+15e5,t),l=await x(e,`(window.__sootsimLastTransformedBundle?.text || "").slice(${o}, ${i})`);if(typeof l!="string")return null;s.push(l)}return s.join("")}function _t(e){return e.recordedDurationMs&&e.recordingStartedAtMs?{since:e.recordingStartedAtMs-1e4,until:e.recordingStartedAtMs+e.recordedDurationMs+5e3,limit:2e3}:{limit:2e3}}function $t(e){let t=b(e),s=(t[0]===31&&t[1]===139?Mt(t):t).toString("utf8");return ze(s)}function Nt(e){return JSON.parse(b(e,"utf8"))}function Ft(e){if(e===null||typeof e!="object")return[];let t=e,r=typeof t.startedAtEpochMs=="number"&&t.startedAtEpochMs>0?t.startedAtEpochMs:null;if(r===null||!Array.isArray(t.samples))return[];let s=[];for(let o of t.samples){if(!Array.isArray(o)||typeof o[0]!="number")continue;let i=l=>typeof l=="number"&&Number.isFinite(l)?Math.round(l*100)/100:0;s.push({schemaVersion:1,t:r+Math.round(o[0]),seq:s.length+1,context:"tenant",kind:"frame",data:{totalMs:i(o[1]),layoutMs:i(o[2]),renderMs:i(o[3]),copyMs:i(o[4])}})}return s}function Lt(e){if(e===null||typeof e!="object")return e;let{samples:t,...r}=e;return r}function ge(e){let t=new Map;for(let r of e)t.set(r.urlhash||r.url,r);return Array.from(t.values())}async function pn(e,t){(e.includes("--help")||e.includes("-h"))&&(Bt(),process.exit(0));let r=[...e],s=await vt(p(r,"--origin")),o=kt(s,p(r,"--public-origin")),i=p(r,"--events"),l=p(r,"--screenshot"),f=p(r,"--snapshot-manifest"),c=p(r,"--video"),h=p(r,"--timeline-events"),w=p(r,"--trace-frame-stats"),K=p(r,"--failure-bundle"),V=p(r,"--video-duration-ms"),he=je(p(r,"--recorded-duration-ms"),"--recorded-duration-ms"),ye=je(p(r,"--recording-started-at-ms"),"--recording-started-at-ms"),W=p(r,"--owner"),Y=p(r,"--repo"),C=p(r,"--billing-kind"),Ve=p(r,"--run-scope"),We=He(r,"--open");(W&&!Y||!W&&Y)&&(console.error(" --owner and --repo must be provided together"),process.exit(1)),C&&C!=="test_run"&&(console.error(` invalid --billing-kind: ${C}`),process.exit(1)),!i&&!c&&(console.error(" preview uploads require playback data: pass --events or --video.\n for a normal local preview, use `rnx record --mode combined --open`\n or `rnx maestro test --preview` instead of uploading a bundle-only snapshot."),process.exit(1));let be=He(r,"--assets-only"),Ye=Ae(r,{stripBooleanFlags:[],stripValueFlags:[]}),M=Ue(Ye),d,we=[],R=[],k=h?$t(h):[],Me=w?Nt(w):null;k.push(...Ft(Me));let Te=k.length,Q=null;try{if(d=await x(M,'(typeof window.__sootsimCaptureBundle === "function") ? window.__sootsimCaptureBundle() : null'),d?.bundleUrl){let u=new URL(d.bundleUrl).origin,[m,U]=await Promise.all([x(M,`(window.__sootsimPreviewRecorder?.list?.(${JSON.stringify(u)}) || [])`),x(M,`(async () => {
57
- const list = window.__sootsimListWorkerFetchRecorder
58
- return typeof list === 'function'
59
- ? await list(${JSON.stringify(u)})
60
- : []
61
- })()`)]);we=ge([...m,...U]).filter(g=>{try{return!new URL(g.url).pathname.startsWith("/api/")}catch{return!0}});let _=await x(M,`(async () => {
62
- const rec = window.__sootsimPreviewRecorder
63
- const workerList = window.__sootsimListWorkerFetchRecorder
64
- return {
65
- main: rec?.list ? rec.list() : [],
66
- worker: typeof workerList === 'function' ? await workerList() : [],
67
- }
68
- })()`),L=(_?ge([..._.main,..._.worker]):[]).filter(g=>{try{return new URL(g.url).origin!==u}catch{return!1}}),v=L.length>0?{count:L.length,totalBytes:L.reduce((g,ie)=>g+(ie.size||0),0)}:null;if(v&&v.count>0){console.log(` ${v.count} recorded cross-origin responses (${(v.totalBytes/1024).toFixed(1)} KiB)`);let g=await x(M,`(async () => {
69
- const rec = window.__sootsimPreviewRecorder
70
- const workerDump = window.__sootsimDumpWorkerFetchRecorder
71
- const bundleUrl = ${JSON.stringify(d.bundleUrl)}
72
- const keep = (r) => {
73
- try {
74
- const u = new URL(r.url)
75
- if (u.origin !== ${JSON.stringify(u)}) return true
76
- // bundle-origin api responses came from the rewritten
77
- // /__app-api proxy at record time (re-keyed by the
78
- // recorder's unwrap step). they need bodies attached the
79
- // same way as cross-origin records \u2014 direct re-fetch from
80
- // the dev server lacks the bundle's session cookies.
81
- if (r.url !== bundleUrl && u.pathname.startsWith('/api/')) return true
82
- return false
83
- } catch { return false }
84
- }
85
- return {
86
- main: rec?.dump ? rec.dump().filter(keep) : [],
87
- worker: typeof workerDump === 'function'
88
- ? (await workerDump()).filter(keep)
89
- : [],
90
- }
91
- })()`);if(R=ge([...g.main,...g.worker]),be){let ie=R.length;R=R.filter(ae=>qe(ae.contentType));let st=v.totalBytes-R.reduce((ae,ot)=>ae+(ot.size||0),0);console.log(` --assets-only: kept ${R.length}/${ie} records (dropped ${(st/1024).toFixed(1)} KiB of API responses)`)}}}d?.transformedBundle&&(Q=await Pt(M,d.transformedBundle.byteLength));let n=await x(M,`(() => {
92
- const bridge = window.SootSim?.bridges?.timeline ?? window.__sootsimTimeline
93
- if (!bridge || typeof bridge.recent !== 'function') return null
94
- return bridge.recent(${JSON.stringify(_t({recordedDurationMs:he,recordingStartedAtMs:ye}))})
95
- })()`).catch(u=>(console.warn(` warning: failed to capture trace timeline: ${u instanceof Error?u.message:String(u)}`),null)),a=Array.isArray(n?.events)?n.events:[];k=[...k,...a.filter(ce)].sort((u,m)=>u.t-m.t||u.seq-m.seq)}finally{M.close()}d||(console.error(" could not read bundle snapshot \u2014 is rnx running and is the bundle loaded?"),process.exit(2)),d.bundleUrl||(console.error(` no ?bundle= URL on the current rnx tab.
96
- open the app you want to share first (e.g. rnx open 8082), then run upload.`),process.exit(2));let T,Se=!1;if(Q!==null)T=new TextEncoder().encode(Q),Se=!0,console.log(` using post-transform bundle: ${(T.byteLength/1024).toFixed(1)} KiB`);else{let n=Ut(d.bundleUrl);n!==d.bundleUrl&&console.log(" forcing lazy=false for self-contained bundle"),console.log(` capturing: ${n}`),T=await Ge(n),console.log(` main bundle: ${(T.byteLength/1024).toFixed(1)} KiB`)}let O=we.filter(n=>n.url!==d.bundleUrl);be&&(O=O.filter(n=>qe(n.contentType))),console.log(` fetching ${O.length} extra files\u2026`);let X=(await Promise.all(O.map(async n=>{try{let a=await Ge(n.url);return{...n,bytes:a}}catch(a){return console.error(` warning: failed to re-fetch ${n.url}: ${a instanceof Error?a.message:a}`),null}}))).filter(n=>!!n),Qe=X.reduce((n,a)=>n+a.bytes.byteLength,0);console.log(` ${X.length} extra files: ${(Qe/1024).toFixed(1)} KiB`);let P;i&&(P=b(i)),k.sort((n,a)=>n.t-a.t||n.seq-a.seq);let ve=k.map(n=>JSON.stringify(n)).join(`
97
- `),Z=me(ve?`${ve}
98
- `:"");console.log(` trace timeline: ${k.length} events${Te?` (${Te} from runner sidecars)`:""}`);let S;l&&(S=b(l),console.log(` attaching screenshot: ${(S.byteLength/1024).toFixed(1)} KiB`));let N=f?St(f):[];N.length>0&&console.log(` attaching ${N.length} interaction snapshots`);let B,E;if(K){let n=m=>{try{return b(De.join(K,m),"utf8")}catch{return null}},a=m=>{let U=n(m);if(U===null)return null;try{return JSON.parse(U)}catch{return U}},u={error:a("error.json"),describe:a("describe.json"),console:a("console.json"),a11y:n("a11y.txt"),tree:n("tree.txt")};Object.values(u).some(m=>m!==null)&&(B=me(JSON.stringify(u)),console.log(` attaching failure bundle: ${(B.byteLength/1024).toFixed(1)} KiB gz`));try{E=b(De.join(K,"screenshot.png"))}catch{}}let I,F,xe;if(c){if(I=b(c),F=c.endsWith(".mp4")?"video/mp4":c.endsWith(".gif")?"image/gif":void 0,F||(console.error(" preview flow videos must be mp4 or gif"),process.exit(1)),V){let n=Number(V);(!Number.isFinite(n)||n<=0)&&(console.error(` invalid --video-duration-ms: ${V}`),process.exit(1)),xe=Math.round(n)}console.log(` attaching flow video: ${(I.byteLength/1024).toFixed(1)} KiB (${F})`)}let ee=q(),z=Ne(ee),A=fe();ee||(console.error(" preview uploads need auth."),console.error(" set RNX_API_KEY=sk_rnx_..., run `rnx login`, or use the Contrast github runner."),process.exit(1));let Xe=G(ee),Ze=(()=>{try{return new URL(d.bundleUrl).origin}catch{return null}})(),D=(n,a,u,m,U,_,Ee,L)=>{let v=Fe(_),g=v?me(n):n;return{url:a,urlhash:u,method:m,bodyHash:U,requestVaryHash:L,contentType:_,responseHeaders:Ee,bytes:g,encoding:v?"gzip":void 0}},Re=[],te=It(d.pageHref)||"";if(te){let n=await Pe(te,{onStaged:({url:a,byteLength:u})=>console.log(` staged app font: ${a} (${(u/1024).toFixed(1)} KiB)`),onError:(a,u)=>console.error(` warning: failed to fetch app font ${a}: ${u instanceof Error?u.message:u}`)});for(let a of n)Re.push(D(Buffer.from(a.bytes),a.url,a.urlhash,"GET","-",a.contentType))}let ke=[],ne=At(d.pageHref)||"";if(ne){let n=await _e(ne,{onStaged:({url:a,byteLength:u})=>console.log(` staged splash image: ${a} (${(u/1024).toFixed(1)} KiB)`),onError:(a,u)=>console.error(` warning: failed to fetch splash image ${a}: ${u instanceof Error?u.message:u}`)});for(let a of n)ke.push(D(Buffer.from(a.bytes),a.url,a.urlhash,"GET","-",a.contentType))}let re=[...X.map(n=>D(n.bytes,n.url,n.urlhash,"GET","-",n.contentType,n.responseHeaders,n.requestVaryHash)),...R.map(n=>D(Buffer.from(n.bodyBase64,"base64"),n.url,n.urlhash,n.method||"GET",n.bodyHash||"-",n.contentType,n.responseHeaders,n.requestVaryHash)),...Re,...ke],se=Le(T),et=wt("sha256").update(T).digest("hex");console.log(` bundle raw=${(T.byteLength/1024).toFixed(1)} KiB br=${(se.byteLength/1024).toFixed(1)} KiB`);let tt={contentHash:et,bundleSizeBytes:T.byteLength,bundleContentType:Et(d.bundleUrl),bundleEncoding:"br",bundleMinified:!1,bundleOrigin:Ze,runtimeVersion:d.runtimeVersion??void 0,appFonts:te||void 0,appSplash:ne||void 0,entry:d.entry,isTransformed:Se,deviceSpec:d.deviceSpec,installationId:z?.installationId??void 0,repoId:z?.repoId,owner:W??z?.owner??A.owner??void 0,repo:Y??z?.repo??A.repo??void 0,branch:A.branch??void 0,commitSha:A.commitSha??void 0,githubUsername:A.githubUsername??void 0,pullRequestNumber:A.pullRequestNumber??void 0,pullRequestTitle:A.pullRequestTitle??void 0,billingKind:C==="test_run"?"test_run":void 0,runScope:Ve||void 0,files:re.map(n=>({url:n.url,urlhash:n.urlhash,method:n.method,bodyHash:n.bodyHash,contentType:n.contentType,responseHeaders:n.responseHeaders,requestVaryHash:n.requestVaryHash,encoding:n.encoding,sizeBytes:n.bytes.byteLength})),events:P?{sizeBytes:P.byteLength}:void 0,timeline:{sizeBytes:Z.byteLength,encoding:"gzip"},traceFrameStats:Lt(Me),recordedDurationMs:he,recordingStartedAtMs:ye,failureBundle:B?{sizeBytes:B.byteLength,encoding:"gzip"}:void 0,snapshots:(()=>{let n=[];S&&n.push({id:"landing",label:"Landing",kind:"landing",t:0,contentType:"image/png",sizeBytes:S.byteLength}),E&&n.push({id:"failure",label:"Failure",kind:"failure",contentType:"image/png",sizeBytes:E.byteLength});for(let a of N)n.push(a.meta);return n.length>0?n:void 0})(),flowVideo:I&&F?{sizeBytes:I.byteLength,contentType:F,durationMs:xe}:void 0},Be=new Map;for(let n of re)Be.set(n.urlhash,n.bytes);let H=new Map;S&&H.set("landing",S),E&&H.set("failure",E);for(let n of N)H.set(n.meta.id,n.bytes);let nt=Date.now(),y=se.byteLength;for(let n of re)y+=n.bytes.byteLength;P&&(y+=P.byteLength),y+=Z.byteLength,S&&(y+=S.byteLength),E&&(y+=E.byteLength);for(let n of N)y+=n.bytes.byteLength;B&&(y+=B.byteLength),I&&(y+=I.byteLength);let rt=`${$(s)}/api/preview/upload/init`;console.log(` init: ${rt}`);let j;try{let n=await Ce({originBase:s,initBody:tt,bundleBytes:se,filesByHash:Be,extras:{eventsBytes:P,timelineBytes:Z,videoBytes:I,failureBundleBytes:B,snapshotBytes:H},authHeader:Xe,concurrency:16});j=n.finalize;let a=1+n.init.files.length+(n.init.events?1:0)+(n.init.timeline?1:0)+n.init.snapshots.length+(n.init.flowVideo?1:0)+(n.init.failureBundle?1:0);console.log(` PUT ${a} objects in ${Date.now()-nt}ms (${(y/1024).toFixed(1)} KiB)`)}catch(n){let a=n;a.phase==="init"&&a.status===401&&(console.error(" preview upload requires a valid login."),console.error(" run `rnx login` and retry."),process.exit(1)),a.status===402&&(console.error(` ${Tt(a.responseText)??"preview uploads require Personal, Team, or an active trial \u2014 upgrade from the billing dialog."}`),process.exit(1)),console.error(` ${a.message??`${a.phase??"upload"} failed: ${String(n)}`}`),process.exit(1)}let oe=`${o}${j.url}`;return console.log(`
99
- stored ${j.filesStored??0} extra files`),console.log(` preview: ${oe}`),We&&await $e(oe),{previewUrl:oe,shareId:j.id}}export{fe as a,Jt as b,Kt as c,Vt as d,vt as e,kt as f,pn as g};
@@ -1,30 +0,0 @@
1
- /*! rnx v0.1.369 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- import{b as $}from"./chunk-USHV3QFZ.js";import{q as x}from"./chunk-H2GB2PLY.js";import{b as y,c as R,d as f,e as w,f as a}from"./chunk-IYPMULI7.js";import{L as g,M as u,N as d,T as h,l as p}from"./chunk-FBMNYSSW.js";import O from"fs";import{WebSocket as E}from"ws";function C(t){if(!t||typeof t!="object")return!1;let e=Reflect.get(t,"sections");return typeof Reflect.get(t,"title")=="string"&&Array.isArray(e)&&e.every(o=>o&&typeof o=="object"&&typeof Reflect.get(o,"title")=="string"&&Array.isArray(Reflect.get(o,"items"))&&Reflect.get(o,"items").every(n=>n&&typeof n=="object"&&typeof Reflect.get(n,"summary")=="string"&&typeof Reflect.get(n,"hash")=="string"))}async function b(t,e=fetch){try{let o=new URL(w);o.searchParams.set("version",t);let n=await e(o,{headers:{accept:"application/json"},signal:AbortSignal.timeout(5e3)});if(!n.ok)return null;let s=await n.json();if(!s||typeof s!="object")return null;let i=Reflect.get(s,"entries");return!Array.isArray(i)||!C(i[0])?null:i[0]}catch{return null}}function A(t,e){let o=[`what's new in rnx engine v${t}:`];if(!e||e.sections.length===0)o.push(" release notes are not available yet");else for(let n of e.sections){o.push(` ${n.title}:`);for(let s of n.items)o.push(` \u2022 ${s.summary}`)}return o.push(` full changelog: ${f}`),o.join(`
5
- `)}async function Q(t,e={}){let[o,...n]=t;if(!o||o==="--help"||o==="-h"){S();return}switch(o){case"install":return L(n,e);case"list":return j(n);case"use":return T(n);case"remove":return D(n);case"which":return G();case"notes":return U(n);default:console.error(` unknown runtime subcommand: ${o}`),S(),process.exit(1)}}function S(){console.log(`
6
- rnx runtime \u2014 manage engine runtimes under ~/.sootsim/runtimes/
7
-
8
- usage:
9
- rnx runtime install [version] install a version (default: channel latest)
10
- rnx runtime list show installed + available versions
11
- rnx runtime use <version> switch active runtime
12
- rnx runtime remove <version> delete an installed runtime
13
- rnx runtime which print active runtime version
14
- rnx runtime notes print repo or default engine release notes
15
-
16
- flags:
17
- --channel <name> channel to resolve 'latest' from (default: stable)
18
- --force reinstall even if the version is already on disk
19
- --set-active=false do not switch active runtime after install
20
-
21
- environment:
22
- SOOTSIM_CDN_ORIGIN override the CDN base URL (default: ${R})
23
-
24
- examples:
25
- rnx runtime install
26
- rnx runtime install 1.2.3
27
- rnx runtime install --channel beta
28
- rnx runtime use 1.2.3
29
- rnx runtime notes
30
- `)}async function L(t,e){let{version:o,flags:n}=F(t),s=n.channel??e.channel??"stable",i=n.force===!0,l=n.setActive!==!1;g(),console.log("rnx runtime install"),console.log(` cdn: ${a.resolveCdnOrigin()}`);try{let r=await a.install({version:o,channel:s,force:i,setActive:l,protectVersions:h()});return console.log(` version: ${r.version} (channel: ${r.channel})`),r.installed?console.log(` installed ${r.version}`):console.log(` already installed at ${r.runtimeDir}`),l&&await k(r.version),r}catch(r){console.error(` ${I(r)}`),process.exit(1)}}async function k(t){d(t),console.log(` active: ${t}`),await _(t)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${t})`)}async function _(t){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-RFI2QRC3.js"),n=o();if(!e(n))return!1;let s=x();return new Promise(i=>{let l=!1,r=!1,m=N=>{l||(l=!0,i(N))},c=new E(`ws://127.0.0.1:${s}`,{handshakeTimeout:800}),v=setTimeout(()=>{try{c.close()}catch{}m(r)},1500);c.on("open",()=>{try{c.send(JSON.stringify({type:"runtime:use",version:t,id:0})),r=!0}catch{}setTimeout(()=>{try{c.close()}catch{}},100)}),c.on("close",()=>{clearTimeout(v),m(r)}),c.on("error",()=>{clearTimeout(v),m(!1)})})}async function j(t){g();let e=a.listInstalled(),o=u();if(console.log("installed:"),e.length===0)console.log(" (none)");else for(let n of e)console.log(` ${n===o?"*":" "} ${n}`);try{let n=await a.fetchManifest();console.log("available (latest per channel):");for(let[i,l]of Object.entries(n.channels))console.log(` ${i.padEnd(8)} ${l.latest}`);let s=Object.keys(n.versions).sort(y).reverse();if(s.length>1){console.log("hosted versions:");for(let i of s)console.log(` ${i}`)}}catch(n){console.log(`available: (could not fetch manifest: ${I(n)})`)}}async function T(t){let e=t[0];e||(console.error(" usage: rnx runtime use <version>"),process.exit(1));let o=a.listInstalled();o.includes(e)||(console.error(` version ${e} is not installed`),console.error(` installed: ${o.join(", ")||"(none)"}`),console.error(` run \`rnx runtime install ${e}\` first`),process.exit(1)),await k(e)}async function D(t){let e=t[0];e||(console.error(" usage: rnx runtime remove <version>"),process.exit(1)),u()===e&&(console.error(` cannot remove active runtime ${e}`),console.error(" switch with `rnx runtime use <other>` first, or install another version"),process.exit(1)),h().includes(e)&&(console.error(` cannot remove runtime ${e} while a project is using it`),process.exit(1));let n=p(e);if(!O.existsSync(n)){console.error(` ${e} is not installed`);return}O.rmSync(n,{recursive:!0,force:!0}),console.log(` removed ${e}`)}async function G(){let t=u();if(!t){console.log(" no active runtime");return}console.log(t)}async function U(t){t.length>0&&(console.error(" usage: rnx runtime notes"),process.exit(1));let{config:e}=await $(),o=e?.runtimeVersion??u();if(!o){console.log(" no active runtime"),console.log(` release notes: ${f}`);return}console.log(A(o,await b(o)))}function F(t){let e={},o=[];for(let n=0;n<t.length;n++){let s=t[n];if(s==="--channel"&&n+1<t.length){e.channel=t[n+1],n++;continue}if(s.startsWith("--channel=")){e.channel=s.slice(10);continue}if(s==="--force"){e.force=!0;continue}if(s==="--set-active=false"||s==="--no-set-active"){e.setActive=!1;continue}o.push(s)}return{version:o[0]??null,flags:e}}function I(t){return t instanceof Error?t.message:String(t)}export{b as a,A as b,Q as c};