rnxsim 0.1.335 → 0.1.337

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 (272) hide show
  1. package/README.md +104 -76
  2. package/cli/auth.ts +2 -2
  3. package/cli/bin.ts +7 -3
  4. package/cli/bridge-flow-runner.ts +2 -2
  5. package/cli/commands/agent-wrapper.ts +1 -1
  6. package/cli/commands/agent.ts +12 -12
  7. package/cli/commands/app-fonts.ts +1 -1
  8. package/cli/commands/assert.ts +7 -7
  9. package/cli/commands/auth.ts +4 -4
  10. package/cli/commands/camera.ts +13 -13
  11. package/cli/commands/cleanup.ts +6 -6
  12. package/cli/commands/compat.ts +4 -4
  13. package/cli/commands/config.ts +2 -2
  14. package/cli/commands/control.ts +37 -43
  15. package/cli/commands/cpu-profile.ts +2 -2
  16. package/cli/commands/daemon-mac-app.ts +2 -2
  17. package/cli/commands/daemon.ts +12 -12
  18. package/cli/commands/debug.ts +22 -22
  19. package/cli/commands/desktop.ts +3 -3
  20. package/cli/commands/detox.ts +17 -17
  21. package/cli/commands/device.ts +9 -9
  22. package/cli/commands/diagnose.ts +11 -11
  23. package/cli/commands/electron.ts +7 -7
  24. package/cli/commands/film.ts +6 -6
  25. package/cli/commands/inspect/core.ts +6 -7
  26. package/cli/commands/inspect/find.ts +2 -2
  27. package/cli/commands/inspect.ts +36 -36
  28. package/cli/commands/install-desktop.ts +8 -8
  29. package/cli/commands/login.ts +6 -6
  30. package/cli/commands/maestro-generate.ts +2 -2
  31. package/cli/commands/maestro.ts +23 -23
  32. package/cli/commands/mode.ts +4 -4
  33. package/cli/commands/no-bridge-hint.ts +9 -9
  34. package/cli/commands/perf.ts +11 -11
  35. package/cli/commands/permissions.ts +5 -5
  36. package/cli/commands/profile.ts +11 -11
  37. package/cli/commands/react.ts +15 -15
  38. package/cli/commands/record.ts +15 -15
  39. package/cli/commands/report-issue.ts +2 -2
  40. package/cli/commands/reset.ts +2 -2
  41. package/cli/commands/runtime.ts +18 -18
  42. package/cli/commands/screenshot-mode.ts +5 -5
  43. package/cli/commands/screenshot.ts +12 -12
  44. package/cli/commands/screenshots-capture.ts +7 -7
  45. package/cli/commands/screenshots.ts +6 -6
  46. package/cli/commands/serve.ts +6 -6
  47. package/cli/commands/setup.ts +13 -15
  48. package/cli/commands/skills.ts +14 -14
  49. package/cli/commands/slides.ts +19 -23
  50. package/cli/commands/state.ts +2 -2
  51. package/cli/commands/storage.ts +3 -3
  52. package/cli/commands/telemetry.ts +1 -1
  53. package/cli/commands/three-mode.ts +16 -16
  54. package/cli/commands/timeline.ts +4 -4
  55. package/cli/commands/upgrade.ts +1 -1
  56. package/cli/commands/upload.ts +11 -11
  57. package/cli/commands/version.ts +3 -5
  58. package/cli/commands/what-happened.ts +11 -11
  59. package/cli/drivers/electron.ts +3 -3
  60. package/cli/hints.ts +8 -8
  61. package/cli/recording-access.ts +1 -1
  62. package/cli/ws-bridge.ts +5 -5
  63. package/dist-cli/bin.js +5 -5
  64. package/dist-cli/chunks/{agent-XSJMAFVA.js → agent-QQ3RJNRY.js} +14 -14
  65. package/dist-cli/chunks/{agent-wrapper-NFLJ5K64.js → agent-wrapper-M6SQSMRY.js} +3 -3
  66. package/dist-cli/chunks/app-fonts-F6NDV3XC.js +4 -0
  67. package/dist-cli/chunks/{assert-ILAXIYB5.js → assert-5VB3KQNK.js} +12 -12
  68. package/dist-cli/chunks/auth-PFXODKFN.js +12 -0
  69. package/dist-cli/chunks/{beta-TDR6UKJU.js → beta-WUWYHT4F.js} +2 -2
  70. package/dist-cli/chunks/camera-V3MMTKP7.js +33 -0
  71. package/dist-cli/chunks/{chunk-INBPUR4T.js → chunk-2ANFH72P.js} +11 -11
  72. package/dist-cli/chunks/chunk-2GIA5T6B.js +74 -0
  73. package/dist-cli/chunks/{chunk-GP6QEBZA.js → chunk-4FRSEZ7Z.js} +1 -1
  74. package/dist-cli/chunks/{chunk-USGOQ3YJ.js → chunk-4GXBZHNA.js} +2 -2
  75. package/dist-cli/chunks/{chunk-R3CMECGC.js → chunk-4HESY5E7.js} +4 -4
  76. package/dist-cli/chunks/{chunk-WKT7YM5Q.js → chunk-4VJEXQGD.js} +1 -1
  77. package/dist-cli/chunks/{chunk-FE6ZHPKD.js → chunk-5LJNNHZH.js} +1 -1
  78. package/dist-cli/chunks/{chunk-I2HQB5NN.js → chunk-5QXGSTYI.js} +2 -2
  79. package/dist-cli/chunks/{chunk-FJSHIWAM.js → chunk-5SHAOQHJ.js} +2 -2
  80. package/dist-cli/chunks/{chunk-CGZWLSYD.js → chunk-5UPRBMIG.js} +1 -1
  81. package/dist-cli/chunks/{chunk-ZTM2MKNI.js → chunk-5ZEFRPCC.js} +1 -1
  82. package/dist-cli/chunks/{chunk-RTD3CPDQ.js → chunk-6ART4XVJ.js} +23 -23
  83. package/dist-cli/chunks/{chunk-MTD6IAEA.js → chunk-6CAUT2LH.js} +1 -1
  84. package/dist-cli/chunks/{chunk-ZYHCWCMM.js → chunk-7ATIH7OU.js} +1 -1
  85. package/dist-cli/chunks/{chunk-RVUGKXJD.js → chunk-7Q4QKHMA.js} +1 -1
  86. package/dist-cli/chunks/{chunk-MTNIDSOA.js → chunk-ABK2V2PR.js} +1 -1
  87. package/dist-cli/chunks/{chunk-TL4DNDDY.js → chunk-B53ILAHI.js} +2 -2
  88. package/dist-cli/chunks/{chunk-POC3QTA6.js → chunk-BSSVLFZR.js} +2 -2
  89. package/dist-cli/chunks/chunk-BVOBXTPN.js +30 -0
  90. package/dist-cli/chunks/{chunk-4KC35DMK.js → chunk-CPDEUWL5.js} +2 -2
  91. package/dist-cli/chunks/{chunk-HNQLZZJA.js → chunk-DINU267S.js} +2 -2
  92. package/dist-cli/chunks/{chunk-DCDKJ4NC.js → chunk-DQQ4CZVC.js} +2 -2
  93. package/dist-cli/chunks/{chunk-JWAY6DIH.js → chunk-EDWN2HOO.js} +18 -18
  94. package/dist-cli/chunks/{chunk-3CS4EUMG.js → chunk-EWVG4A3B.js} +2 -2
  95. package/dist-cli/chunks/{chunk-RTEJXUXN.js → chunk-F3NKCQHM.js} +6 -6
  96. package/dist-cli/chunks/{chunk-M7CBQ5I4.js → chunk-GEAGFYKP.js} +1 -1
  97. package/dist-cli/chunks/chunk-GGNH44PZ.js +5 -0
  98. package/dist-cli/chunks/{chunk-YSUIYK6B.js → chunk-HAHJJJUC.js} +2 -2
  99. package/dist-cli/chunks/chunk-HPJ5EKIZ.js +4 -0
  100. package/dist-cli/chunks/{chunk-IN2PZBQD.js → chunk-IBTHGFKE.js} +2 -2
  101. package/dist-cli/chunks/{chunk-ZZWO6Y7X.js → chunk-J6BYRRZQ.js} +2 -2
  102. package/dist-cli/chunks/{chunk-6Y3PVPTF.js → chunk-JK4OZ2TQ.js} +5 -5
  103. package/dist-cli/chunks/{chunk-PO3TOAED.js → chunk-KGQAO25M.js} +2 -2
  104. package/dist-cli/chunks/{chunk-J7XFINJG.js → chunk-L6UUIQE7.js} +2 -2
  105. package/dist-cli/chunks/{chunk-35XNGT5C.js → chunk-LXYLCETR.js} +1 -1
  106. package/dist-cli/chunks/{chunk-JWK5WD44.js → chunk-LZAL3DMP.js} +2 -2
  107. package/dist-cli/chunks/{chunk-3ZDOPKHE.js → chunk-M43UU7UG.js} +4 -4
  108. package/dist-cli/chunks/{chunk-ROPHZJ6P.js → chunk-M4LGUVBM.js} +2 -2
  109. package/dist-cli/chunks/{chunk-RELRA5VW.js → chunk-NCG6C5AH.js} +2 -2
  110. package/dist-cli/chunks/{chunk-42KDXJUD.js → chunk-NR5TSR2Y.js} +2 -2
  111. package/dist-cli/chunks/{chunk-R2UL5VFY.js → chunk-OCPWXT73.js} +3 -3
  112. package/dist-cli/chunks/{chunk-VV4MXLFR.js → chunk-ODKS6JUJ.js} +1 -1
  113. package/dist-cli/chunks/{chunk-F33DUJGG.js → chunk-R2WBREGQ.js} +1 -1
  114. package/dist-cli/chunks/chunk-RKY3ZNTA.js +5 -0
  115. package/dist-cli/chunks/{chunk-MGGRL2Z2.js → chunk-SW7BHOMO.js} +9 -9
  116. package/dist-cli/chunks/{chunk-GVKISFQ3.js → chunk-TJTLXG3R.js} +1 -1
  117. package/dist-cli/chunks/chunk-TNI4PW75.js +124 -0
  118. package/dist-cli/chunks/{chunk-CL3PREIE.js → chunk-UWEDNDND.js} +2 -2
  119. package/dist-cli/chunks/{chunk-IV36DY6M.js → chunk-WRID5SBV.js} +1 -1
  120. package/dist-cli/chunks/{chunk-42ALI64M.js → chunk-WUYI3XJ5.js} +2 -2
  121. package/dist-cli/chunks/{chunk-6VN5ULGQ.js → chunk-X7MHCEGG.js} +2 -2
  122. package/dist-cli/chunks/chunk-XIQFYLWD.js +15 -0
  123. package/dist-cli/chunks/{chunk-LCVUJCRJ.js → chunk-ZUK5ZQU7.js} +1 -1
  124. package/dist-cli/chunks/{cleanup-X6ZRPFDV.js → cleanup-6WBS3MUO.js} +10 -10
  125. package/dist-cli/chunks/cli-version-HUQCDGMA.js +4 -0
  126. package/dist-cli/chunks/{compat-VRXJ5J56.js → compat-2WOPKJYK.js} +9 -9
  127. package/dist-cli/chunks/{config-LHPPE4EP.js → config-FPD7WUYB.js} +5 -5
  128. package/dist-cli/chunks/{control-TVTNGSSF.js → control-B3XNER7I.js} +2 -2
  129. package/dist-cli/chunks/daemon-T4D4X2P5.js +4 -0
  130. package/dist-cli/chunks/{debug-EUHBBPGM.js → debug-LKV5CEAV.js} +17 -17
  131. package/dist-cli/chunks/desktop-EMDPOYQT.js +31 -0
  132. package/dist-cli/chunks/detox-4J4UTZE7.js +52 -0
  133. package/dist-cli/chunks/{device-PONITUZJ.js → device-PMZ7RPXQ.js} +11 -11
  134. package/dist-cli/chunks/{diagnose-2PN4K4L2.js → diagnose-MLEP727D.js} +12 -12
  135. package/dist-cli/chunks/{disk-cleanup-U2PQLOEW.js → disk-cleanup-CVEDIPEE.js} +2 -2
  136. package/dist-cli/chunks/drivers-NTUKJEL6.js +4 -0
  137. package/dist-cli/chunks/{film-XGZCFTQL.js → film-4RNECABF.js} +9 -9
  138. package/dist-cli/chunks/flow-5IOCAHVO.js +4 -0
  139. package/dist-cli/chunks/help-NUJUYEWP.js +4 -0
  140. package/dist-cli/chunks/{hidden-runtime-alias-I4MYF5CO.js → hidden-runtime-alias-YIF25W4F.js} +2 -2
  141. package/dist-cli/chunks/{home-paths-YRAPZ5LE.js → home-paths-WNJCCCCZ.js} +2 -2
  142. package/dist-cli/chunks/inspect-MFEIYUCN.js +4 -0
  143. package/dist-cli/chunks/install-desktop-NB65KI4D.js +4 -0
  144. package/dist-cli/chunks/{login-ZMAIAQ6F.js → login-VEHHGN42.js} +6 -6
  145. package/dist-cli/chunks/{logout-UQZ5JBJU.js → logout-VE7PNXL2.js} +2 -2
  146. package/dist-cli/chunks/{maestro-BQYKDUC4.js → maestro-ZXHTDEOI.js} +25 -25
  147. package/dist-cli/chunks/{maestro-generate-VQYMMQJ5.js → maestro-generate-TK33E2Z6.js} +3 -3
  148. package/dist-cli/chunks/mode-ZDKJ56NT.js +26 -0
  149. package/dist-cli/chunks/{optional-demo-registry-DUWHCLGD.js → optional-demo-registry-GBZ3WVDW.js} +2 -2
  150. package/dist-cli/chunks/{perf-7RAU7WRZ.js → perf-JXNZOUKW.js} +28 -28
  151. package/dist-cli/chunks/permissions-WQ62PW7Y.js +13 -0
  152. package/dist-cli/chunks/record-4S3ZMDIO.js +72 -0
  153. package/dist-cli/chunks/{report-issue-P376KFFU.js → report-issue-KKBADTWO.js} +4 -4
  154. package/dist-cli/chunks/reset-H5XIISJE.js +4 -0
  155. package/dist-cli/chunks/runtime-FK7EEMWA.js +4 -0
  156. package/dist-cli/chunks/{screenshot-command-NE7BKTQ2.js → screenshot-command-42U5MVQL.js} +34 -34
  157. package/dist-cli/chunks/{screenshot-layers-UE4R64PZ.js → screenshot-layers-4G42AHOX.js} +2 -2
  158. package/dist-cli/chunks/{screenshots-capture-ULXPLXMC.js → screenshots-capture-HMQ2OO3I.js} +11 -11
  159. package/dist-cli/chunks/{serve-P7BT4XHR.js → serve-S4V5EDW2.js} +16 -16
  160. package/dist-cli/chunks/setup-T43V7GA6.js +32 -0
  161. package/dist-cli/chunks/{skills-NTRYKJSF.js → skills-O426K26J.js} +16 -16
  162. package/dist-cli/chunks/{state-4D5YAM47.js → state-ZEEPDKJG.js} +5 -5
  163. package/dist-cli/chunks/storage-4GQLOFGG.js +37 -0
  164. package/dist-cli/chunks/store-RFMSNWLJ.js +4 -0
  165. package/dist-cli/chunks/telemetry-NFAAPSMN.js +4 -0
  166. package/dist-cli/chunks/{timeline-GZNFGD3Q.js → timeline-ONCYX7KW.js} +6 -6
  167. package/dist-cli/chunks/{upgrade-A46D6PEY.js → upgrade-A36T52AM.js} +2 -2
  168. package/dist-cli/chunks/upload-36O32DII.js +4 -0
  169. package/dist-cli/chunks/version-67HA253N.js +6 -0
  170. package/dist-cli/chunks/{web-H2IXO5SC.js → web-PWXQHQIE.js} +2 -2
  171. package/dist-cli/chunks/{what-happened-Z7UII5GH.js → what-happened-WNXE622R.js} +16 -16
  172. package/dist-lib/agent-daemon-client.cjs +5 -5
  173. package/dist-lib/agent-events.cjs +1 -1
  174. package/dist-lib/agent-identity.cjs +1 -1
  175. package/dist-lib/agent-sessions.cjs +4 -4
  176. package/dist-lib/attached-projects.cjs +1 -1
  177. package/dist-lib/auth/shared-session.cjs +1 -1
  178. package/dist-lib/backend-origin.cjs +1 -1
  179. package/dist-lib/beta.cjs +1 -1
  180. package/dist-lib/beta.mjs +1 -1
  181. package/dist-lib/bridge-constants.cjs +1 -1
  182. package/dist-lib/bridge-contract.cjs +1 -1
  183. package/dist-lib/cli-constants.cjs +1 -1
  184. package/dist-lib/config.cjs +1 -1
  185. package/dist-lib/detox/index.cjs +1 -1
  186. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  187. package/dist-lib/home-paths.cjs +1 -1
  188. package/dist-lib/host/bridge-host.cjs +7 -7
  189. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  190. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  191. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  192. package/dist-lib/host/websocket-proxy.cjs +1 -1
  193. package/dist-lib/index.cjs +248 -98
  194. package/dist-lib/jump-to-source-babel.cjs +1 -1
  195. package/dist-lib/menu.cjs +2 -2
  196. package/dist-lib/menu.mjs +2 -2
  197. package/dist-lib/metro-host-modules/react-dom.js +6 -0
  198. package/dist-lib/metro-host-modules/react-native-web.js +6 -0
  199. package/dist-lib/metro-host-modules/react-native.js +6 -0
  200. package/dist-lib/metro-host-modules/react.js +6 -0
  201. package/dist-lib/metro-host-modules/react__jsx-dev-runtime.js +6 -0
  202. package/dist-lib/metro-host-modules/react__jsx-runtime.js +6 -0
  203. package/dist-lib/metro-production-bundle.cjs +72 -0
  204. package/dist-lib/metro-production-bundle.mjs +44 -0
  205. package/dist-lib/metro.cjs +152 -8
  206. package/dist-lib/profiles.cjs +1 -1
  207. package/dist-lib/public-brand.cjs +2 -2
  208. package/dist-lib/react-native-host-modules.cjs +50 -0
  209. package/dist-lib/render-mode.cjs +1 -1
  210. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  211. package/dist-lib/sdk.cjs +6 -7
  212. package/dist-lib/sdk.mjs +6 -7
  213. package/dist-lib/skills.cjs +71 -77
  214. package/dist-lib/vite.cjs +104 -85
  215. package/package.json +15 -2
  216. package/scripts/preuninstall.cjs +1 -1
  217. package/skills/contrast/SKILL.md +67 -75
  218. package/skills/rnx-debug/SKILL.md +84 -84
  219. package/skills/rnx-perf/SKILL.md +8 -8
  220. package/skills/rnx-setup/SKILL.md +54 -54
  221. package/skills/rnx-test/SKILL.md +35 -35
  222. package/skills/rnx-visual/SKILL.md +18 -18
  223. package/src/agent-daemon-client.ts +2 -2
  224. package/src/agent-sessions.ts +2 -2
  225. package/src/connect.ts +6 -6
  226. package/src/disk-cleanup.ts +1 -1
  227. package/src/home-paths.ts +1 -1
  228. package/src/host/bridge-host.ts +6 -6
  229. package/src/index.ts +1 -1
  230. package/src/metro-host-modules/react-dom.js +6 -0
  231. package/src/metro-host-modules/react-native-web.js +6 -0
  232. package/src/metro-host-modules/react-native.js +6 -0
  233. package/src/metro-host-modules/react.js +6 -0
  234. package/src/metro-host-modules/react__jsx-dev-runtime.js +6 -0
  235. package/src/metro-host-modules/react__jsx-runtime.js +6 -0
  236. package/src/metro-plugin.ts +249 -10
  237. package/src/metro-production-bundle.ts +51 -0
  238. package/src/public-brand.ts +1 -1
  239. package/src/react-native-host-modules.ts +25 -0
  240. package/src/runtime-assets.ts +1 -1
  241. package/src/sim-client.ts +1 -1
  242. package/src/vite-plugin-one.ts +171 -145
  243. package/dist-cli/chunks/app-fonts-L3UXFYVE.js +0 -4
  244. package/dist-cli/chunks/auth-ISX2EUQL.js +0 -12
  245. package/dist-cli/chunks/camera-4SWTNJUA.js +0 -33
  246. package/dist-cli/chunks/chunk-BRHZEZKN.js +0 -124
  247. package/dist-cli/chunks/chunk-EJPYPJWP.js +0 -5
  248. package/dist-cli/chunks/chunk-KWCD5MOK.js +0 -15
  249. package/dist-cli/chunks/chunk-MJ7QGY7Z.js +0 -4
  250. package/dist-cli/chunks/chunk-RSA4XWHN.js +0 -5
  251. package/dist-cli/chunks/chunk-S3EIOAWZ.js +0 -74
  252. package/dist-cli/chunks/chunk-TYANJQLO.js +0 -30
  253. package/dist-cli/chunks/cli-version-NZUSWKZR.js +0 -4
  254. package/dist-cli/chunks/daemon-XUEC47EC.js +0 -4
  255. package/dist-cli/chunks/desktop-LLHMP4A3.js +0 -31
  256. package/dist-cli/chunks/detox-QLNWLXA4.js +0 -52
  257. package/dist-cli/chunks/drivers-7IU37M2E.js +0 -4
  258. package/dist-cli/chunks/flow-NZZLR4BN.js +0 -4
  259. package/dist-cli/chunks/help-D7URIJRD.js +0 -4
  260. package/dist-cli/chunks/inspect-TJYWKY56.js +0 -4
  261. package/dist-cli/chunks/install-desktop-LD3W5RS7.js +0 -4
  262. package/dist-cli/chunks/mode-ZQ6H7KWM.js +0 -26
  263. package/dist-cli/chunks/permissions-DRZ3HCFL.js +0 -13
  264. package/dist-cli/chunks/record-J5JAYW4Y.js +0 -72
  265. package/dist-cli/chunks/reset-KXYRDEFU.js +0 -4
  266. package/dist-cli/chunks/runtime-66CEPOG6.js +0 -4
  267. package/dist-cli/chunks/setup-QO5KZAX3.js +0 -32
  268. package/dist-cli/chunks/storage-X2K2MDPX.js +0 -37
  269. package/dist-cli/chunks/store-TUJPIRTT.js +0 -4
  270. package/dist-cli/chunks/telemetry-CF5DVEKI.js +0 -4
  271. package/dist-cli/chunks/upload-UIQJIBEZ.js +0 -4
  272. package/dist-cli/chunks/version-CMBB3FXL.js +0 -6
@@ -0,0 +1,44 @@
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+
3
+ // src/metro-production-bundle.ts
4
+ var RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION = "rnxsim";
5
+ var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
6
+ function toRNXProductionBundleUrl(bundleUrl) {
7
+ const relative = bundleUrl.startsWith("/");
8
+ const url = new URL(bundleUrl, "http://rnxsim.local");
9
+ url.searchParams.set("dev", "false");
10
+ url.searchParams.set("hot", "false");
11
+ url.searchParams.set("minify", "true");
12
+ url.searchParams.set(`resolver.${RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION}`, "true");
13
+ url.searchParams.set(`transform.${RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION}`, "true");
14
+ return relative ? `${url.pathname}${url.search}${url.hash}` : url.toString();
15
+ }
16
+ function createRNXMetroModulePathsFooter(modulePaths) {
17
+ const payload = JSON.stringify(modulePaths).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
18
+ return `
19
+ ${RNXSIM_METRO_MODULE_PATHS_PREFIX}${payload};`;
20
+ }
21
+ function readRNXMetroModuleIdentity(bundleText) {
22
+ const footerPrefix = `
23
+ ${RNXSIM_METRO_MODULE_PATHS_PREFIX}`;
24
+ const footerStart = bundleText.lastIndexOf(footerPrefix);
25
+ if (footerStart < 0 || !bundleText.endsWith(";")) return null;
26
+ const parsed = JSON.parse(
27
+ bundleText.slice(footerStart + footerPrefix.length, -1)
28
+ );
29
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
30
+ return null;
31
+ }
32
+ const modulePaths = {};
33
+ for (const [moduleId, modulePath] of Object.entries(parsed)) {
34
+ if (typeof modulePath !== "string") return null;
35
+ modulePaths[moduleId] = modulePath;
36
+ }
37
+ return { source: bundleText.slice(0, footerStart), modulePaths };
38
+ }
39
+ export {
40
+ RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION,
41
+ createRNXMetroModulePathsFooter,
42
+ readRNXMetroModuleIdentity,
43
+ toRNXProductionBundleUrl
44
+ };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -33,12 +33,33 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
33
33
  var metro_plugin_exports = {};
34
34
  __export(metro_plugin_exports, {
35
35
  default: () => metro_plugin_default,
36
- withSootsim: () => withSootsim
36
+ toRNXProductionBundleUrl: () => toRNXProductionBundleUrl,
37
+ withRNX: () => withRNX
37
38
  });
38
39
  module.exports = __toCommonJS(metro_plugin_exports);
39
40
  var import_fs2 = __toESM(require("fs"), 1);
41
+ var import_module = require("module");
40
42
  var import_path2 = __toESM(require("path"), 1);
41
43
 
44
+ // src/metro-production-bundle.ts
45
+ var RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION = "rnxsim";
46
+ var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
47
+ function toRNXProductionBundleUrl(bundleUrl) {
48
+ const relative = bundleUrl.startsWith("/");
49
+ const url = new URL(bundleUrl, "http://rnxsim.local");
50
+ url.searchParams.set("dev", "false");
51
+ url.searchParams.set("hot", "false");
52
+ url.searchParams.set("minify", "true");
53
+ url.searchParams.set(`resolver.${RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION}`, "true");
54
+ url.searchParams.set(`transform.${RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION}`, "true");
55
+ return relative ? `${url.pathname}${url.search}${url.hash}` : url.toString();
56
+ }
57
+ function createRNXMetroModulePathsFooter(modulePaths) {
58
+ const payload = JSON.stringify(modulePaths).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029").replace(/<\//g, "<\\/");
59
+ return `
60
+ ${RNXSIM_METRO_MODULE_PATHS_PREFIX}${payload};`;
61
+ }
62
+
42
63
  // src/runtime-assets.ts
43
64
  var import_fs = __toESM(require("fs"), 1);
44
65
  var import_path = __toESM(require("path"), 1);
@@ -80,7 +101,7 @@ function readActiveRuntime() {
80
101
  var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
81
102
 
82
103
  // src/runtime-assets.ts
83
- var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[rnx] no engine runtime installed \u2014 run `rnxsim setup`, or `rnxsim runtime install`";
104
+ var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[rnx] no engine runtime installed \u2014 run `rnx setup`, or `rnx runtime install`";
84
105
  var _monorepoRootCache;
85
106
  function findMonorepoRoot() {
86
107
  if (_monorepoRootCache !== void 0) return _monorepoRootCache;
@@ -217,11 +238,129 @@ function serveRuntimeFile(req, res, fullPath) {
217
238
 
218
239
  // src/metro-plugin.ts
219
240
  var prefix = "/__soot";
220
- function withSootsim(config, options = {}) {
221
- if (options.enabled === false) return config;
241
+ var hostModuleSpecifiers = [
242
+ "react",
243
+ "react-dom",
244
+ "react/jsx-runtime",
245
+ "react/jsx-dev-runtime",
246
+ "react-native",
247
+ "react-native-web"
248
+ ];
249
+ function isRNXProductionBundle(graph) {
250
+ return graph.transformOptions?.dev === false && graph.transformOptions.customTransformOptions?.[RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION] === "true";
251
+ }
252
+ function assertProductionEnvironment() {
253
+ if (process.env.NODE_ENV === "production") return;
254
+ throw new Error(
255
+ "rnxsim: production bundle requests require NODE_ENV=production; restart Metro with NODE_ENV=production"
256
+ );
257
+ }
258
+ function hostModuleFileName(specifier) {
259
+ return `${specifier.replaceAll("/", "__")}.js`;
260
+ }
261
+ function resolveHostModules() {
262
+ const root = import_path2.default.join(__dirname, "metro-host-modules");
263
+ const files = /* @__PURE__ */ new Map();
264
+ for (const specifier of hostModuleSpecifiers) {
265
+ const filePath = import_path2.default.join(root, hostModuleFileName(specifier));
266
+ files.set(specifier, filePath);
267
+ }
268
+ return { root, files };
269
+ }
270
+ function readCallableMetroExport(moduleValue, label) {
271
+ const callable = typeof moduleValue === "function" ? moduleValue : typeof moduleValue === "object" && moduleValue !== null ? Reflect.get(moduleValue, "default") : void 0;
272
+ if (typeof callable !== "function") {
273
+ throw new Error(`rnxsim: Metro ${label} module did not export a function`);
274
+ }
275
+ return (...args) => Reflect.apply(callable, void 0, args);
276
+ }
277
+ function createMetroDefaultSerializer(projectRoot) {
278
+ const projectRequire = (0, import_module.createRequire)(import_path2.default.join(projectRoot, "package.json"));
279
+ const metroRoot = import_path2.default.dirname(projectRequire.resolve("metro/package.json"));
280
+ const baseJSBundle = readCallableMetroExport(
281
+ projectRequire(import_path2.default.join(metroRoot, "src/DeltaBundler/Serializers/baseJSBundle.js")),
282
+ "baseJSBundle"
283
+ );
284
+ const bundleToString = readCallableMetroExport(
285
+ projectRequire(import_path2.default.join(metroRoot, "src/lib/bundleToString.js")),
286
+ "bundleToString"
287
+ );
288
+ return (entryPoint, preModules, graph, options) => {
289
+ const serialized = bundleToString(
290
+ baseJSBundle(entryPoint, preModules, graph, options)
291
+ );
292
+ const code = typeof serialized === "object" && serialized !== null ? Reflect.get(serialized, "code") : void 0;
293
+ if (typeof code !== "string") {
294
+ throw new Error("rnxsim: Metro bundleToString did not return bundle code");
295
+ }
296
+ return code;
297
+ };
298
+ }
299
+ function prependRNXModulePaths(result, graph, options, projectRoot) {
300
+ const dependencies = graph.dependencies;
301
+ const createModuleId = options.createModuleId;
302
+ if (!dependencies || !createModuleId) {
303
+ throw new Error(
304
+ "rnxsim: Metro did not provide the production module graph and createModuleId"
305
+ );
306
+ }
307
+ const modulePaths = {};
308
+ for (const module2 of dependencies.values()) {
309
+ modulePaths[String(createModuleId(module2.path))] = import_path2.default.relative(projectRoot, module2.path).replaceAll(import_path2.default.sep, "/");
310
+ }
311
+ if (Object.keys(modulePaths).length !== dependencies.size) {
312
+ throw new Error("rnxsim: production module IDs were not unique");
313
+ }
314
+ const footer = createRNXMetroModulePathsFooter(modulePaths);
315
+ return typeof result === "string" ? result + footer : { ...result, code: result.code + footer };
316
+ }
317
+ function withRNX(config, options = {}) {
318
+ if (!options.devServer && !options.productionBundles) return config;
222
319
  const bundleUrl = options.bundleUrl || "/index.bundle?platform=ios&dev=true&hot=true&minify=false";
223
320
  const cfgServer = config.server;
321
+ const cfgResolver = config.resolver;
322
+ const cfgSerializer = config.serializer;
323
+ const cfgProjectRoot = config.projectRoot || process.cwd();
224
324
  const existingEnhance = cfgServer?.enhanceMiddleware;
325
+ const existingResolveRequest = cfgResolver?.resolveRequest;
326
+ const existingSerializer = cfgSerializer?.customSerializer;
327
+ let productionConfig = {};
328
+ if (options.productionBundles) {
329
+ const hostModules = resolveHostModules();
330
+ let defaultSerializer;
331
+ productionConfig = {
332
+ watchFolders: [
333
+ ...config.watchFolders || [],
334
+ hostModules.root
335
+ ],
336
+ resolver: {
337
+ ...cfgResolver,
338
+ resolveRequest: (context, moduleName, platform) => {
339
+ if (context.customResolverOptions?.[RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION] === "true") {
340
+ assertProductionEnvironment();
341
+ const hostModule = hostModules.files.get(moduleName);
342
+ if (hostModule) return { type: "sourceFile", filePath: hostModule };
343
+ }
344
+ return existingResolveRequest ? existingResolveRequest(context, moduleName, platform) : context.resolveRequest(context, moduleName, platform);
345
+ }
346
+ },
347
+ serializer: {
348
+ ...cfgSerializer,
349
+ customSerializer: async (entryPoint, preModules, graph, serializerOptions) => {
350
+ const serializer = existingSerializer || (defaultSerializer ||= createMetroDefaultSerializer(cfgProjectRoot));
351
+ const productionBundle = isRNXProductionBundle(graph);
352
+ if (productionBundle) assertProductionEnvironment();
353
+ const result = await serializer(
354
+ entryPoint,
355
+ preModules,
356
+ graph,
357
+ serializerOptions
358
+ );
359
+ return productionBundle ? prependRNXModulePaths(result, graph, serializerOptions, cfgProjectRoot) : result;
360
+ }
361
+ }
362
+ };
363
+ }
225
364
  const serverConfig = {
226
365
  ...cfgServer,
227
366
  enhanceMiddleware: (metroMiddleware, metroServer) => {
@@ -288,10 +427,15 @@ function withSootsim(config, options = {}) {
288
427
  return server;
289
428
  }
290
429
  };
291
- return { ...config, server: serverConfig };
430
+ return {
431
+ ...config,
432
+ ...productionConfig,
433
+ ...options.devServer ? { server: serverConfig } : {}
434
+ };
292
435
  }
293
- var metro_plugin_default = withSootsim;
436
+ var metro_plugin_default = withRNX;
294
437
  // Annotate the CommonJS export names for ESM import in node:
295
438
  0 && (module.exports = {
296
- withSootsim
439
+ toRNXProductionBundleUrl,
440
+ withRNX
297
441
  });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -29,7 +29,7 @@ var name = "rnx";
29
29
  var rnxPublicBrand = Object.freeze({
30
30
  name,
31
31
  packageName: "rnxsim",
32
- commandName: "rnxsim",
32
+ commandName: "rnx",
33
33
  domain: "rnxsim.com",
34
34
  origin: "https://rnxsim.com"
35
35
  });
@@ -0,0 +1,50 @@
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/react-native-host-modules.ts
23
+ var react_native_host_modules_exports = {};
24
+ __export(react_native_host_modules_exports, {
25
+ REACT_NATIVE_PASSTHROUGH_SPECIFIERS: () => REACT_NATIVE_PASSTHROUGH_SPECIFIERS,
26
+ isReactNativePassthroughSpecifier: () => isReactNativePassthroughSpecifier
27
+ });
28
+ module.exports = __toCommonJS(react_native_host_modules_exports);
29
+ var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
30
+ "react-native/Libraries/vendor/emitter",
31
+ "react-native/Libraries/Components/View/ReactNativeStyleAttributes",
32
+ "react-native/Libraries/StyleSheet",
33
+ "react-native/Libraries/Utilities/differ",
34
+ "react-native/Libraries/Utilities/stringifySafe",
35
+ "react-native/src/private/featureflags",
36
+ "react-native/Libraries/TurboModule/TurboModuleRegistry",
37
+ "react-native/Libraries/Utilities/Platform",
38
+ "react-native/Libraries/Utilities/NativePlatformConstants",
39
+ "react-native/src/private/specs_DEPRECATED/modules/NativePlatformConstants"
40
+ ];
41
+ function isReactNativePassthroughSpecifier(specifier) {
42
+ return REACT_NATIVE_PASSTHROUGH_SPECIFIERS.some(
43
+ (passthrough) => specifier === passthrough || specifier.startsWith(`${passthrough}/`)
44
+ );
45
+ }
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ REACT_NATIVE_PASSTHROUGH_SPECIFIERS,
49
+ isReactNativePassthroughSpecifier
50
+ });
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1491,13 +1491,12 @@ function scoreInteractive(n) {
1491
1491
  return score;
1492
1492
  }
1493
1493
  function tapCommandForNode(n) {
1494
- if (n.testID) return `rnxsim do tap-id ${shellEscape(n.testID)}`;
1494
+ if (n.testID) return `rnx do tap-id ${shellEscape(n.testID)}`;
1495
1495
  const text = typeof n.text === "string" ? n.text.trim() : "";
1496
- if (text.length > 0 && text.length <= 80)
1497
- return `rnxsim do tap-text ${shellEscape(text)}`;
1496
+ if (text.length > 0 && text.length <= 80) return `rnx do tap-text ${shellEscape(text)}`;
1498
1497
  const x = Math.round(((n.absolutePosition?.x ?? 0) + (n.layout?.width ?? 0) / 2) * 10) / 10;
1499
1498
  const y = Math.round(((n.absolutePosition?.y ?? 0) + (n.layout?.height ?? 0) / 2) * 10) / 10;
1500
- return `rnxsim do tap ${x} ${y}`;
1499
+ return `rnx do tap ${x} ${y}`;
1501
1500
  }
1502
1501
  function shellEscape(value) {
1503
1502
  if (/^[A-Za-z0-9_./@:-]+$/.test(value)) return value;
@@ -1517,7 +1516,7 @@ var WAIT_READY_PROBE = `(async () => {
1517
1516
  const loadingSignal = (value) => {
1518
1517
  const text = cleanText(value)
1519
1518
  if (!text) return ''
1520
- return /^(opening app\\b|looking for your app\\b|building bundle\\b|preparing rnxsim runtime\\b|loading native bundle\\b|loading rnx stubs\\b|loading bundle loader\\b|loading native stubs\\b|loading compat bridge\\b|loading react-native shim\\b|loading react bridge\\b|loading reconciler\\b|loading replacement modules\\b|injecting rnx modules\\b|warming sqlite engine\\b|capturing root component\\b|reloading app\\b|loading(?:[.!\u2026]*)?$|connecting(?:[.!\u2026]*)?$)/i.test(text)
1519
+ return /^(opening app\\b|looking for your app\\b|building bundle\\b|preparing rnx runtime\\b|loading native bundle\\b|loading rnx stubs\\b|loading bundle loader\\b|loading native stubs\\b|loading compat bridge\\b|loading react-native shim\\b|loading react bridge\\b|loading reconciler\\b|loading replacement modules\\b|injecting rnx modules\\b|warming sqlite engine\\b|capturing root component\\b|reloading app\\b|loading(?:[.!\u2026]*)?$|connecting(?:[.!\u2026]*)?$)/i.test(text)
1521
1520
  ? text
1522
1521
  : ''
1523
1522
  }
@@ -1657,7 +1656,7 @@ function readyProbeHasTargetContent(probe) {
1657
1656
  }
1658
1657
  function waitReadyReason(status) {
1659
1658
  if (status.bridgeError) {
1660
- return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`rnxsim list\`, reopen with \`rnxsim open\`)`;
1659
+ return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`rnx list\`, reopen with \`rnx open\`)`;
1661
1660
  }
1662
1661
  const base = status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
1663
1662
  return !status.externalError && status.suppressedEntryError ? `${base} (suppressed entry error: ${status.suppressedEntryError})` : base;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.335 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.337 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1393,13 +1393,12 @@ function scoreInteractive(n) {
1393
1393
  return score;
1394
1394
  }
1395
1395
  function tapCommandForNode(n) {
1396
- if (n.testID) return `rnxsim do tap-id ${shellEscape(n.testID)}`;
1396
+ if (n.testID) return `rnx do tap-id ${shellEscape(n.testID)}`;
1397
1397
  const text = typeof n.text === "string" ? n.text.trim() : "";
1398
- if (text.length > 0 && text.length <= 80)
1399
- return `rnxsim do tap-text ${shellEscape(text)}`;
1398
+ if (text.length > 0 && text.length <= 80) return `rnx do tap-text ${shellEscape(text)}`;
1400
1399
  const x = Math.round(((n.absolutePosition?.x ?? 0) + (n.layout?.width ?? 0) / 2) * 10) / 10;
1401
1400
  const y = Math.round(((n.absolutePosition?.y ?? 0) + (n.layout?.height ?? 0) / 2) * 10) / 10;
1402
- return `rnxsim do tap ${x} ${y}`;
1401
+ return `rnx do tap ${x} ${y}`;
1403
1402
  }
1404
1403
  function shellEscape(value) {
1405
1404
  if (/^[A-Za-z0-9_./@:-]+$/.test(value)) return value;
@@ -1419,7 +1418,7 @@ var WAIT_READY_PROBE = `(async () => {
1419
1418
  const loadingSignal = (value) => {
1420
1419
  const text = cleanText(value)
1421
1420
  if (!text) return ''
1422
- return /^(opening app\\b|looking for your app\\b|building bundle\\b|preparing rnxsim runtime\\b|loading native bundle\\b|loading rnx stubs\\b|loading bundle loader\\b|loading native stubs\\b|loading compat bridge\\b|loading react-native shim\\b|loading react bridge\\b|loading reconciler\\b|loading replacement modules\\b|injecting rnx modules\\b|warming sqlite engine\\b|capturing root component\\b|reloading app\\b|loading(?:[.!\u2026]*)?$|connecting(?:[.!\u2026]*)?$)/i.test(text)
1421
+ return /^(opening app\\b|looking for your app\\b|building bundle\\b|preparing rnx runtime\\b|loading native bundle\\b|loading rnx stubs\\b|loading bundle loader\\b|loading native stubs\\b|loading compat bridge\\b|loading react-native shim\\b|loading react bridge\\b|loading reconciler\\b|loading replacement modules\\b|injecting rnx modules\\b|warming sqlite engine\\b|capturing root component\\b|reloading app\\b|loading(?:[.!\u2026]*)?$|connecting(?:[.!\u2026]*)?$)/i.test(text)
1423
1422
  ? text
1424
1423
  : ''
1425
1424
  }
@@ -1559,7 +1558,7 @@ function readyProbeHasTargetContent(probe) {
1559
1558
  }
1560
1559
  function waitReadyReason(status) {
1561
1560
  if (status.bridgeError) {
1562
- return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`rnxsim list\`, reopen with \`rnxsim open\`)`;
1561
+ return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`rnx list\`, reopen with \`rnx open\`)`;
1563
1562
  }
1564
1563
  const base = status.externalError ? `guest app errored: ${status.externalError}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
1565
1564
  return !status.externalError && status.suppressedEntryError ? `${base} (suppressed entry error: ${status.suppressedEntryError})` : base;