rnxsim 0.1.376 → 0.1.378

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 (295) hide show
  1. package/README.md +28 -25
  2. package/cli/app-config.ts +9 -12
  3. package/cli/app-fonts.ts +3 -3
  4. package/cli/app-project.ts +8 -8
  5. package/cli/auth.ts +7 -9
  6. package/cli/bin.ts +16 -31
  7. package/cli/bridge-flow-runner.ts +3 -3
  8. package/cli/browser-backend.ts +44 -0
  9. package/cli/command-contract.ts +221 -0
  10. package/cli/command-registry.ts +291 -0
  11. package/cli/commands/agent-wrapper.ts +2 -2
  12. package/cli/commands/app-fonts.ts +2 -2
  13. package/cli/commands/assert.ts +3 -3
  14. package/cli/commands/auth.ts +1 -1
  15. package/cli/commands/box/cloud-box.ts +1 -1
  16. package/cli/commands/box/plane-share.ts +2 -2
  17. package/cli/commands/box.ts +4 -6
  18. package/cli/commands/compat.ts +1 -1
  19. package/cli/commands/config.ts +2 -2
  20. package/cli/commands/control.ts +29 -29
  21. package/cli/commands/cpu-profile.ts +7 -7
  22. package/cli/commands/daemon-mac-app.ts +7 -7
  23. package/cli/commands/daemon.ts +10 -10
  24. package/cli/commands/debug.ts +11 -11
  25. package/cli/commands/detox.ts +13 -13
  26. package/cli/commands/diagnose.ts +6 -6
  27. package/cli/commands/do-chain.ts +1 -2
  28. package/cli/commands/electron.ts +1 -3
  29. package/cli/commands/film.ts +3 -3
  30. package/cli/commands/flow.ts +43 -43
  31. package/cli/commands/inspect/count.ts +1 -1
  32. package/cli/commands/inspect/describe.ts +1 -1
  33. package/cli/commands/inspect/env.ts +2 -2
  34. package/cli/commands/inspect/get-layout.ts +1 -1
  35. package/cli/commands/inspect/keyboard.ts +1 -1
  36. package/cli/commands/inspect/list.ts +1 -1
  37. package/cli/commands/inspect/memory.ts +1 -1
  38. package/cli/commands/inspect/resolve-target.ts +1 -1
  39. package/cli/commands/inspect/screens.ts +1 -1
  40. package/cli/commands/inspect/tree.ts +1 -1
  41. package/cli/commands/inspect/url.ts +1 -1
  42. package/cli/commands/inspect/wait-event.ts +5 -5
  43. package/cli/commands/inspect.ts +34 -34
  44. package/cli/commands/install-desktop.ts +3 -3
  45. package/cli/commands/login.ts +6 -6
  46. package/cli/commands/maestro-generate.ts +5 -5
  47. package/cli/commands/maestro.ts +5 -5
  48. package/cli/commands/profile.ts +1 -1
  49. package/cli/commands/record.ts +9 -9
  50. package/cli/commands/runtime.ts +18 -18
  51. package/cli/commands/screenshot-command.ts +1 -1
  52. package/cli/commands/screenshot-layers.ts +5 -5
  53. package/cli/commands/screenshot-mode.ts +1 -1
  54. package/cli/commands/screenshot.ts +8 -8
  55. package/cli/commands/screenshots-capture.ts +5 -5
  56. package/cli/commands/serve.ts +3 -3
  57. package/cli/commands/setup.ts +20 -12
  58. package/cli/commands/skills.ts +5 -5
  59. package/cli/commands/slides.ts +1 -1
  60. package/cli/commands/telemetry.ts +1 -1
  61. package/cli/commands/three-mode.ts +1 -1
  62. package/cli/commands/timeline.ts +8 -8
  63. package/cli/commands/upgrade.ts +116 -131
  64. package/cli/commands/upload.ts +12 -12
  65. package/cli/commands/version.ts +7 -7
  66. package/cli/commands/what-happened.ts +9 -9
  67. package/cli/current-sim.ts +3 -3
  68. package/cli/desktop-companion.ts +1 -1
  69. package/cli/drivers/playwright.ts +9 -9
  70. package/cli/drivers/registry.ts +1 -1
  71. package/cli/drivers/types.ts +1 -1
  72. package/cli/flow-file.ts +2 -2
  73. package/cli/flow-session.ts +1 -1
  74. package/cli/help-core.ts +136 -0
  75. package/cli/help.ts +17 -53
  76. package/cli/hints.ts +5 -5
  77. package/cli/inspect-notice-state.ts +1 -1
  78. package/cli/maestro-js.ts +1 -1
  79. package/cli/outbound-endpoints.ts +23 -5
  80. package/cli/parse-args.ts +19 -66
  81. package/cli/recording-access.ts +1 -1
  82. package/cli/registry.ts +1 -0
  83. package/cli/run-registry.ts +1 -1
  84. package/cli/run-rnx-core.ts +148 -0
  85. package/cli/run-rnx.ts +6 -9
  86. package/cli/runtime-notes.ts +3 -3
  87. package/cli/standalone.ts +4 -0
  88. package/cli/ws-bridge.ts +8 -8
  89. package/detox/config-loader.ts +2 -2
  90. package/detox/index.ts +8 -8
  91. package/detox/jest-preset.cjs +1 -1
  92. package/detox/navigation.ts +2 -2
  93. package/dist-lib/agent-daemon-client.cjs +5 -5
  94. package/dist-lib/agent-events.cjs +1 -1
  95. package/dist-lib/agent-identity.cjs +2 -2
  96. package/dist-lib/agent-sessions.cjs +10 -10
  97. package/dist-lib/attached-projects.cjs +6 -6
  98. package/dist-lib/auth/shared-session.cjs +6 -6
  99. package/dist-lib/backend-origin.cjs +1 -1
  100. package/dist-lib/beta.cjs +1 -1
  101. package/dist-lib/beta.mjs +1 -1
  102. package/dist-lib/bridge-constants.cjs +1 -1
  103. package/dist-lib/bridge-contract-input.cjs +1 -1
  104. package/dist-lib/bridge-contract-input.mjs +1 -1
  105. package/dist-lib/bridge-contract.cjs +1 -1
  106. package/dist-lib/bridge-contract.mjs +1 -1
  107. package/dist-lib/cli-constants.cjs +1 -1
  108. package/dist-lib/config.cjs +25 -25
  109. package/dist-lib/detox/index.cjs +73 -31
  110. package/dist-lib/detox/jest-preset.cjs +1 -1
  111. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  112. package/dist-lib/home-paths.cjs +29 -29
  113. package/dist-lib/host/bridge-host.cjs +128 -49
  114. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  115. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  116. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  117. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +14 -14
  120. package/dist-lib/jump-to-source-babel.cjs +1 -1
  121. package/dist-lib/menu.cjs +1 -1
  122. package/dist-lib/menu.mjs +1 -1
  123. package/dist-lib/metro-production-bundle.cjs +1 -1
  124. package/dist-lib/metro-production-bundle.mjs +1 -1
  125. package/dist-lib/metro.cjs +8 -8
  126. package/dist-lib/profiles.cjs +12 -12
  127. package/dist-lib/public-brand.cjs +1 -1
  128. package/dist-lib/react-native-host-modules.cjs +1 -1
  129. package/dist-lib/react-native-host-modules.mjs +1 -1
  130. package/dist-lib/render-mode.cjs +1 -1
  131. package/dist-lib/scripts/dev-server-scanner.cjs +8 -8
  132. package/dist-lib/sdk.cjs +1 -1
  133. package/dist-lib/sdk.mjs +1 -1
  134. package/dist-lib/skills.cjs +329 -160
  135. package/dist-lib/vite.cjs +9 -9
  136. package/package.json +4 -11
  137. package/scripts/dev-server-scanner.ts +2 -2
  138. package/scripts/optional-demo-registry.ts +1 -1
  139. package/skills/contrast/SKILL.md +3 -3
  140. package/skills/rnx-debug/SKILL.md +1 -1
  141. package/skills/rnx-test/SKILL.md +2 -2
  142. package/src/agent-identity.ts +1 -1
  143. package/src/agent-sessions.ts +7 -5
  144. package/src/cli-version.ts +12 -4
  145. package/src/config.ts +26 -28
  146. package/src/disk-cleanup.ts +11 -11
  147. package/src/home-paths.ts +28 -28
  148. package/src/host/bridge-host.ts +16 -16
  149. package/src/metro-plugin.ts +2 -2
  150. package/src/profiles.ts +2 -2
  151. package/src/runtime-assets.ts +7 -7
  152. package/src/runtime-delivery.ts +13 -13
  153. package/src/screenshots/orchestrate.ts +1 -1
  154. package/src/screenshots/schema.ts +2 -2
  155. package/src/skills/builtin/a11y-review.ts +2 -2
  156. package/src/skills/builtin/compat-check.ts +2 -2
  157. package/src/skills/builtin/maestro-test.ts +2 -2
  158. package/src/skills/builtin/perf-profile.ts +2 -2
  159. package/src/skills/builtin/screenshot-all.ts +2 -2
  160. package/src/skills/builtin/visual-diff.ts +2 -2
  161. package/src/skills/registry.ts +8 -8
  162. package/src/skills/types.ts +1 -1
  163. package/src/vite-plugin-one.ts +3 -3
  164. package/src/vite-plugin.ts +15 -2
  165. package/dist-cli/bin.js +0 -15
  166. package/dist-cli/chunks/agent-H42FCKFF.js +0 -48
  167. package/dist-cli/chunks/agent-wrapper-BBZKTZS6.js +0 -17
  168. package/dist-cli/chunks/app-fonts-43VXIKF4.js +0 -4
  169. package/dist-cli/chunks/assert-IXOLVO5Z.js +0 -49
  170. package/dist-cli/chunks/auth-KFMFB6FU.js +0 -12
  171. package/dist-cli/chunks/beta-5AO3SJB7.js +0 -4
  172. package/dist-cli/chunks/box-ZHM66L6K.js +0 -1730
  173. package/dist-cli/chunks/camera-FNJVFCDQ.js +0 -33
  174. package/dist-cli/chunks/chunk-37MCSPTE.js +0 -71
  175. package/dist-cli/chunks/chunk-3PEMSUAQ.js +0 -30
  176. package/dist-cli/chunks/chunk-4TQ5HOK3.js +0 -7
  177. package/dist-cli/chunks/chunk-5YZYDEMI.js +0 -4
  178. package/dist-cli/chunks/chunk-6CV3R3XD.js +0 -15
  179. package/dist-cli/chunks/chunk-7LGK5XU6.js +0 -4
  180. package/dist-cli/chunks/chunk-7R2TK2NY.js +0 -4
  181. package/dist-cli/chunks/chunk-7VZZQQEE.js +0 -497
  182. package/dist-cli/chunks/chunk-AFOVILIL.js +0 -130
  183. package/dist-cli/chunks/chunk-BEU7CD7E.js +0 -9
  184. package/dist-cli/chunks/chunk-CE4JQJ6Y.js +0 -6
  185. package/dist-cli/chunks/chunk-CIE6CZXL.js +0 -142
  186. package/dist-cli/chunks/chunk-CSJ7L7ZL.js +0 -312
  187. package/dist-cli/chunks/chunk-CWCQP53A.js +0 -27
  188. package/dist-cli/chunks/chunk-DCS5FK5N.js +0 -7
  189. package/dist-cli/chunks/chunk-DEV3E3MV.js +0 -4
  190. package/dist-cli/chunks/chunk-DGJMIVZM.js +0 -5
  191. package/dist-cli/chunks/chunk-DGX3MN65.js +0 -5
  192. package/dist-cli/chunks/chunk-DNPQMTW5.js +0 -4
  193. package/dist-cli/chunks/chunk-DOVBJBVD.js +0 -5
  194. package/dist-cli/chunks/chunk-DPBJ3S3J.js +0 -3
  195. package/dist-cli/chunks/chunk-FVZBGPCU.js +0 -4
  196. package/dist-cli/chunks/chunk-GDKMOIUT.js +0 -4
  197. package/dist-cli/chunks/chunk-GIF2NJCS.js +0 -32
  198. package/dist-cli/chunks/chunk-GZE57ORL.js +0 -4
  199. package/dist-cli/chunks/chunk-H3U56DKI.js +0 -24
  200. package/dist-cli/chunks/chunk-HZLOYAPH.js +0 -4
  201. package/dist-cli/chunks/chunk-J2IKAEU2.js +0 -4
  202. package/dist-cli/chunks/chunk-JXAXYK7W.js +0 -11
  203. package/dist-cli/chunks/chunk-KJE2O2GK.js +0 -4
  204. package/dist-cli/chunks/chunk-KMNVDZZI.js +0 -423
  205. package/dist-cli/chunks/chunk-LC3QRIRB.js +0 -10
  206. package/dist-cli/chunks/chunk-LGFTAQYC.js +0 -4
  207. package/dist-cli/chunks/chunk-LQMUA5IY.js +0 -4
  208. package/dist-cli/chunks/chunk-MFIQTWC5.js +0 -4
  209. package/dist-cli/chunks/chunk-MGALNF2F.js +0 -7
  210. package/dist-cli/chunks/chunk-MLBZZHOY.js +0 -4
  211. package/dist-cli/chunks/chunk-NNRF7GIB.js +0 -107
  212. package/dist-cli/chunks/chunk-NORLYTTO.js +0 -7
  213. package/dist-cli/chunks/chunk-P6KVGV3H.js +0 -14
  214. package/dist-cli/chunks/chunk-PAJTUK33.js +0 -4
  215. package/dist-cli/chunks/chunk-QELIC5XP.js +0 -4
  216. package/dist-cli/chunks/chunk-QRDF33WD.js +0 -11
  217. package/dist-cli/chunks/chunk-R76BA7C7.js +0 -535
  218. package/dist-cli/chunks/chunk-RVEB4CZ2.js +0 -4
  219. package/dist-cli/chunks/chunk-SK4M7NXT.js +0 -5
  220. package/dist-cli/chunks/chunk-SKMG5DD7.js +0 -5
  221. package/dist-cli/chunks/chunk-TEESPOYR.js +0 -4
  222. package/dist-cli/chunks/chunk-TH2UFGVP.js +0 -4
  223. package/dist-cli/chunks/chunk-TLP3T3VO.js +0 -4
  224. package/dist-cli/chunks/chunk-TZUABDIJ.js +0 -38
  225. package/dist-cli/chunks/chunk-UB2W6OQM.js +0 -99
  226. package/dist-cli/chunks/chunk-UYVXALPB.js +0 -506
  227. package/dist-cli/chunks/chunk-VQDYFFIG.js +0 -5
  228. package/dist-cli/chunks/chunk-VWCNJPCJ.js +0 -5
  229. package/dist-cli/chunks/chunk-VZIK4WIS.js +0 -74
  230. package/dist-cli/chunks/chunk-W3FNXAQP.js +0 -4
  231. package/dist-cli/chunks/chunk-XCDNVNP3.js +0 -4
  232. package/dist-cli/chunks/chunk-XSVILA4Z.js +0 -4
  233. package/dist-cli/chunks/chunk-XUTJ7ZWD.js +0 -4
  234. package/dist-cli/chunks/chunk-YTXY3MHW.js +0 -4
  235. package/dist-cli/chunks/chunk-ZF7PVX44.js +0 -28
  236. package/dist-cli/chunks/chunk-ZSSG7OR7.js +0 -4
  237. package/dist-cli/chunks/cleanup-MLOK2OZA.js +0 -25
  238. package/dist-cli/chunks/cli-version-OBNR366V.js +0 -4
  239. package/dist-cli/chunks/compat-SHMFSKU7.js +0 -23
  240. package/dist-cli/chunks/config-TPEAEUJ2.js +0 -13
  241. package/dist-cli/chunks/connect-3LEXWTE5.js +0 -4
  242. package/dist-cli/chunks/control-Z3FWA6BO.js +0 -4
  243. package/dist-cli/chunks/daemon-RSVYSC65.js +0 -4
  244. package/dist-cli/chunks/debug-GUVAK2KR.js +0 -200
  245. package/dist-cli/chunks/desktop-OOP2PTKP.js +0 -31
  246. package/dist-cli/chunks/detox-C2ILVBEC.js +0 -52
  247. package/dist-cli/chunks/device-NXIQQJWR.js +0 -18
  248. package/dist-cli/chunks/diagnose-2JBGYE5L.js +0 -43
  249. package/dist-cli/chunks/disk-cleanup-VURWJYQV.js +0 -4
  250. package/dist-cli/chunks/do-chain-DJ4UQC7A.js +0 -5
  251. package/dist-cli/chunks/drivers-JMA2OIKU.js +0 -4
  252. package/dist-cli/chunks/env-KTNPKEZR.js +0 -4
  253. package/dist-cli/chunks/film-DCPS7EID.js +0 -74
  254. package/dist-cli/chunks/flow-4DZ7B2OA.js +0 -4
  255. package/dist-cli/chunks/help-34CJMQY2.js +0 -4
  256. package/dist-cli/chunks/hidden-runtime-alias-HHT2C7WE.js +0 -4
  257. package/dist-cli/chunks/home-paths-KTPGCPMS.js +0 -4
  258. package/dist-cli/chunks/inspect-JF5WYJRD.js +0 -4
  259. package/dist-cli/chunks/install-desktop-ZIC4CDXI.js +0 -4
  260. package/dist-cli/chunks/login-TTJAOI2Q.js +0 -26
  261. package/dist-cli/chunks/logout-ERAQ6SKW.js +0 -4
  262. package/dist-cli/chunks/maestro-W46QCF77.js +0 -108
  263. package/dist-cli/chunks/maestro-generate-VBLM3MTU.js +0 -36
  264. package/dist-cli/chunks/mode-ZEDZK7R7.js +0 -26
  265. package/dist-cli/chunks/optional-demo-registry-ZUTPSVYQ.js +0 -4
  266. package/dist-cli/chunks/perf-YVT2WXT4.js +0 -48
  267. package/dist-cli/chunks/permissions-L7VVDHFP.js +0 -13
  268. package/dist-cli/chunks/platform-7TJOU2FB.js +0 -6
  269. package/dist-cli/chunks/privacy-57UOTB5J.js +0 -4
  270. package/dist-cli/chunks/record-VXG37P7U.js +0 -72
  271. package/dist-cli/chunks/report-issue-WNNOBZHC.js +0 -29
  272. package/dist-cli/chunks/reset-H5NBFE5U.js +0 -4
  273. package/dist-cli/chunks/resolve-target-57TK5WLE.js +0 -4
  274. package/dist-cli/chunks/runtime-QU2NIF2K.js +0 -4
  275. package/dist-cli/chunks/screenshot-command-AN56TTG7.js +0 -159
  276. package/dist-cli/chunks/screenshot-layers-3W5R7DB2.js +0 -20
  277. package/dist-cli/chunks/screenshots-capture-6AWJY7XZ.js +0 -42
  278. package/dist-cli/chunks/serve-GLYO5Q7J.js +0 -56
  279. package/dist-cli/chunks/setup-UA2HLD7S.js +0 -4
  280. package/dist-cli/chunks/sim-client-5C2RDQQO.js +0 -4
  281. package/dist-cli/chunks/skills-EYXWBRNQ.js +0 -50
  282. package/dist-cli/chunks/state-REJ7W6K3.js +0 -14
  283. package/dist-cli/chunks/storage-CFMDHI3V.js +0 -37
  284. package/dist-cli/chunks/store-XMCUA45G.js +0 -4
  285. package/dist-cli/chunks/telemetry-FBL3NAKB.js +0 -4
  286. package/dist-cli/chunks/timeline-HMCHN5FO.js +0 -24
  287. package/dist-cli/chunks/upgrade-2QSPAA3P.js +0 -7
  288. package/dist-cli/chunks/upload-DUQBKZYV.js +0 -4
  289. package/dist-cli/chunks/version-IOA6QFGB.js +0 -6
  290. package/dist-cli/chunks/web-NCGUYVCJ.js +0 -4
  291. package/dist-cli/chunks/welcome-QYGSQCWQ.js +0 -5
  292. package/dist-cli/chunks/what-happened-YTOUK4LO.js +0 -25
  293. package/dist-cli/chunks/ws-bridge-OF4OZARG.js +0 -4
  294. package/scripts/postinstall.cjs +0 -3
  295. package/scripts/preuninstall.cjs +0 -118
@@ -1,33 +0,0 @@
1
- /*! rnx v0.1.376 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- import{m as O}from"./chunk-TZUABDIJ.js";import"./chunk-CSJ7L7ZL.js";import{t as E,v as F,x as N}from"./chunk-CWCQP53A.js";import"./chunk-DGX3MN65.js";import{r as S}from"./chunk-QRDF33WD.js";import"./chunk-ZSSG7OR7.js";import{createHash as I,randomUUID as q}from"node:crypto";import{createReadStream as D}from"node:fs";import m from"node:fs/promises";import f from"node:path";var T="/__camera-fixtures/",J=new Set([".m4v",".mov",".mp4",".webm"]);function _(){console.log(`
5
- rnx camera \u2014 control the simulator camera source
6
-
7
- usage:
8
- rnx camera play <file> [--loop] [--rate <number>]
9
- rnx camera stop
10
- rnx camera status [--json]
11
- rnx do scan <text> [--format <web-format>]
12
-
13
- subcommands:
14
- play <file> replace the active camera source with a local video fixture
15
- stop clear fixture mode and restore the live camera source
16
- status report live, fixture, or idle source state
17
- scan <text> inject a synthetic barcode result into an active scan session
18
-
19
- options:
20
- --loop loop fixture playback
21
- --rate <n> fixture playback rate (default: 1)
22
- --format <f> synthetic BarcodeDetector format (default: qr_code)
23
- --json print status/result as JSON
24
- --sim <id> target a specific sim
25
- --port <p> WS bridge port (default: 7668)
26
-
27
- examples:
28
- rnx camera play ./fixtures/qr.mp4 --loop
29
- rnx camera play ./fixtures/document.webm --rate 2
30
- rnx camera status
31
- rnx camera stop
32
- rnx do scan "https://example.com" --format qr_code
33
- `)}function U(e){if(!e||typeof e!="object")return!1;let i=Reflect.get(e,"ok"),t=Reflect.get(e,"source");return typeof i=="boolean"&&(t==="live"||t==="fixture"||t==="idle")}async function b(e,i){let t=await e.send({type:"camera",camera:i});if(!U(t))throw new Error("camera bridge returned an invalid result");return t}function $(e,i){if(i){console.log(JSON.stringify(e));return}e.source==="fixture"?console.log(` camera source: fixture (${e.url??"unknown url"}, ${e.loop?"looping":"once"}, ${e.rate??1}x)`):e.source==="live"?console.log(" camera source: live"):e.url?console.log(` camera source: idle (fixture queued: ${e.url}, ${e.loop?"looping":"once"}, ${e.rate??1}x)`):console.log(" camera source: idle"),!e.ok&&e.error&&console.error(` camera failed: ${e.error}`)}async function M(e,i={}){let t=E(e,{port:i.port,stripBooleanFlags:["--help","-h","--json","--loop"],stripValueFlags:["--format","--rate"]}),p=t.positional,n=p[0];if(!n||n==="help"||e.includes("--help")||e.includes("-h"))return _(),n?0:1;let c=F(t),d=e.includes("--json");try{if(n==="scan"){let r=p[1];if(!r)return console.error(" usage: rnx do scan <text>"),1;let a=e.indexOf("--format"),s=a>=0?e[a+1]:"qr_code";return s?await N(c,`globalThis.__sootsimCameraInjectScan?.(${JSON.stringify(r)}, ${JSON.stringify(s)}) ?? false`)?(console.log(` injected ${s} scan: ${r}`),0):(console.error(" no active barcode scan session. open a scanning <CameraView> first"),1):(console.error(" --format requires a value"),1)}if(n==="status"){let r=await b(c,{action:"status"});return $(r,d),r.ok?0:1}if(n==="stop"){let r=await b(c,{action:"stop"});return $(r,d),r.ok?0:1}if(n==="play"){let r=p[1];if(!r)return console.error(" usage: rnx camera play <file> [--loop] [--rate <number>]"),1;let a=f.resolve(r),s=f.extname(a).toLowerCase();if(!J.has(s))return console.error(` unsupported camera fixture extension ${s||"(none)"}. use mp4, webm, mov, or m4v`),1;let u;try{u=await m.stat(a)}catch{return console.error(` camera fixture not found: ${a}`),1}if(!u.isFile()||u.size===0)return console.error(` camera fixture must be a non-empty file: ${a}`),1;let v=e.indexOf("--rate"),C=v>=0?e[v+1]:void 0,x=C===void 0?1:Number(C);if(!Number.isFinite(x)||x<=0)return console.error(" --rate must be a positive finite number"),1;let g=S();await m.mkdir(g,{recursive:!0});let j=I("sha256");await new Promise((o,l)=>{let h=D(a);h.on("data",P=>j.update(P)),h.once("error",l),h.once("end",o)});let w=`${j.digest("hex")}${s}`,y=f.join(g,w),k=!1;try{if(!(await m.lstat(y)).isFile())throw new Error(`camera fixture cache entry is not a file: ${y}`);k=!0}catch(o){if(!o||typeof o!="object"||Reflect.get(o,"code")!=="ENOENT")throw o}if(!k){let o=f.join(g,`.${w}.${process.pid}-${q()}.tmp`);await m.copyFile(a,o);try{await m.link(o,y)}catch(l){if(!l||typeof l!="object"||Reflect.get(l,"code")!=="EEXIST")throw l}finally{await m.unlink(o).catch(()=>{})}}let B=`http://127.0.0.1:${t.wsPort}${T}${w}`,R=await b(c,{action:"play",url:B,loop:e.includes("--loop"),rate:x});return $(R,d),R.ok?0:1}return console.error(` unknown camera subcommand: ${n}`),_(),1}catch(r){return console.error(` camera failed: ${r instanceof Error?r.message:r}`),await O(c),1}finally{c.close()}}export{M as runCamera};
@@ -1,71 +0,0 @@
1
- /*! rnx v0.1.376 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- function t(_){return`(async () => {
5
- const __t = window.__sootsimTest
6
- if (!__t) throw new Error('__sootsimTest not available')
7
- const __id = ${JSON.stringify(_.id||"")}
8
- const __text = ${JSON.stringify(_.text||"")}
9
- let __node = null
10
- if (__id) {
11
- __node = (__t.findByTestId && await __t.findByTestId(__id)) ||
12
- (__t.findById && await __t.findById(__id)) || null
13
- } else if (__text) {
14
- __node = __t.findByText ? await __t.findByText(__text) : null
15
- }
16
- if (!__node) return null
17
- const __pos = __node.absolutePosition || { x: __node.layout?.x || 0, y: __node.layout?.y || 0 }
18
- const __layout = __node.layout || {}
19
- return {
20
- x: __pos.x,
21
- y: __pos.y,
22
- w: __layout.width || 1,
23
- h: __layout.height || 1,
24
- }
25
- })()`}function e(_){return`(async () => {
26
- const __rect = ${JSON.stringify(_)}
27
- const __screenshot = window.__sootsimScreenshot
28
- if (typeof __screenshot !== 'function') {
29
- throw new Error('screenshot bridge not installed')
30
- }
31
- const __dataUrl = await __screenshot({ crop: __rect })
32
- const __img = await new Promise((res, rej) => {
33
- const img = new Image()
34
- img.onload = () => res(img)
35
- img.onerror = () => rej(new Error('failed to decode cropped screenshot'))
36
- img.src = __dataUrl
37
- })
38
- const __w = __img.naturalWidth
39
- const __h = __img.naturalHeight
40
- const __canvas = document.createElement('canvas')
41
- __canvas.width = __w
42
- __canvas.height = __h
43
- const __ctx = __canvas.getContext('2d')
44
- if (!__ctx) throw new Error('could not acquire 2d context')
45
- __ctx.drawImage(__img, 0, 0)
46
- const __data = __ctx.getImageData(0, 0, __w, __h).data
47
- const __n = __data.length / 4
48
- let __r = 0, __g = 0, __b = 0, __a = 0
49
- for (let __i = 0; __i < __data.length; __i += 4) {
50
- __r += __data[__i]
51
- __g += __data[__i + 1]
52
- __b += __data[__i + 2]
53
- __a += __data[__i + 3]
54
- }
55
- const __round = (v) => Math.round(v / __n)
56
- const __rr = __round(__r), __gg = __round(__g), __bb = __round(__b), __aa = __round(__a)
57
- const __hex =
58
- '#' +
59
- [__rr, __gg, __bb]
60
- .map((v) => v.toString(16).padStart(2, '0'))
61
- .join('')
62
- const __dpr = window.devicePixelRatio || 1
63
- return {
64
- r: __rr, g: __gg, b: __bb, a: __aa,
65
- hex: __hex,
66
- samples: __n,
67
- rect: { x: __rect.x, y: __rect.y, w: __rect.w, h: __rect.h },
68
- deviceWidth: __w / __dpr,
69
- deviceHeight: __h / __dpr,
70
- }
71
- })()`}export{t as a,e as b};
@@ -1,30 +0,0 @@
1
- /*! rnx v0.1.376 | (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}from"./chunk-FVZBGPCU.js";import{q as x}from"./chunk-CWCQP53A.js";import{c as l}from"./chunk-TH2UFGVP.js";import{b as R,c as w,d as m,e as $,f as u}from"./chunk-CE4JQJ6Y.js";import{L as h,M as f,N as y,T as v,l as d}from"./chunk-QRDF33WD.js";import S from"fs";import{WebSocket as L}from"ws";function E(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 A(t,e=fetch){try{let o=new URL($);o.searchParams.set("version",t);let n=await e(o,{headers:{accept:"application/json"},signal:AbortSignal.timeout(5e3)});if(!n.ok)return null;let r=await n.json();if(!r||typeof r!="object")return null;let i=Reflect.get(r,"entries");return!Array.isArray(i)||!E(i[0])?null:i[0]}catch{return null}}function O(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 r of n.items)o.push(` \u2022 ${r.summary}`)}return o.push(` full changelog: ${m}`),o.join(`
5
- `)}async function Y(t,e={}){let[o,...n]=t;if(!o||o==="--help"||o==="-h"){k();return}switch(o){case"install":return _(n,e);case"list":return T(n);case"use":return D(n);case"remove":return G(n);case"which":return U();case"notes":return F(n);default:console.error(` unknown runtime subcommand: ${o}`),k(),l(1)}}function k(){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: ${w})
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 _(t,e){let{version:o,flags:n}=M(t),r=n.channel??e.channel??"stable",i=n.force===!0,a=n.setActive!==!1;h(),console.log("rnx runtime install"),console.log(` cdn: ${u.resolveCdnOrigin()}`);try{let s=await u.install({version:o,channel:r,force:i,setActive:a,protectVersions:v()});return console.log(` version: ${s.version} (channel: ${s.channel})`),s.installed?console.log(` installed ${s.version}`):console.log(` already installed at ${s.runtimeDir}`),a&&await I(s.version),s}catch(s){console.error(` ${N(s)}`),l(1)}}async function I(t){y(t),console.log(` active: ${t}`),await j(t)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${t})`)}async function j(t){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-KTPGCPMS.js"),n=o();if(!e(n))return!1;let r=x();return new Promise(i=>{let a=!1,s=!1,g=C=>{a||(a=!0,i(C))},c=new L(`ws://127.0.0.1:${r}`,{handshakeTimeout:800}),p=setTimeout(()=>{try{c.close()}catch{}g(s)},1500);c.on("open",()=>{try{c.send(JSON.stringify({type:"runtime:use",version:t,id:0})),s=!0}catch{}setTimeout(()=>{try{c.close()}catch{}},100)}),c.on("close",()=>{clearTimeout(p),g(s)}),c.on("error",()=>{clearTimeout(p),g(!1)})})}async function T(t){h();let e=u.listInstalled(),o=f();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 u.fetchManifest();console.log("available (latest per channel):");for(let[i,a]of Object.entries(n.channels))console.log(` ${i.padEnd(8)} ${a.latest}`);let r=Object.keys(n.versions).sort(R).reverse();if(r.length>1){console.log("hosted versions:");for(let i of r)console.log(` ${i}`)}}catch(n){console.log(`available: (could not fetch manifest: ${N(n)})`)}}async function D(t){let e=t[0];e||(console.error(" usage: rnx runtime use <version>"),l(1));let o=u.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`),l(1)),await I(e)}async function G(t){let e=t[0];e||(console.error(" usage: rnx runtime remove <version>"),l(1)),f()===e&&(console.error(` cannot remove active runtime ${e}`),console.error(" switch with `rnx runtime use <other>` first, or install another version"),l(1)),v().includes(e)&&(console.error(` cannot remove runtime ${e} while a project is using it`),l(1));let n=d(e);if(!S.existsSync(n)){console.error(` ${e} is not installed`);return}S.rmSync(n,{recursive:!0,force:!0}),console.log(` removed ${e}`)}async function U(){let t=f();if(!t){console.log(" no active runtime");return}console.log(t)}async function F(t){t.length>0&&(console.error(" usage: rnx runtime notes"),l(1));let{config:e}=await b(),o=e?.runtimeVersion??f();if(!o){console.log(" no active runtime"),console.log(` release notes: ${m}`);return}console.log(O(o,await A(o)))}function M(t){let e={},o=[];for(let n=0;n<t.length;n++){let r=t[n];if(r==="--channel"&&n+1<t.length){e.channel=t[n+1],n++;continue}if(r.startsWith("--channel=")){e.channel=r.slice(10);continue}if(r==="--force"){e.force=!0;continue}if(r==="--set-active=false"||r==="--no-set-active"){e.setActive=!1;continue}o.push(r)}return{version:o[0]??null,flags:e}}function N(t){return t instanceof Error?t.message:String(t)}export{A as a,O as b,Y as c};
@@ -1,7 +0,0 @@
1
- /*! rnx v0.1.376 | (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 ge,b as ze}from"./chunk-KJE2O2GK.js";import{e as ot}from"./chunk-UYVXALPB.js";import{c as Ge}from"./chunk-VWCNJPCJ.js";import{a as et,b as tt,d as it}from"./chunk-XUTJ7ZWD.js";import{a as Fe,c as He,d as k,e as A,f as me,g as L,h as pe,i as je,j as fe,k as We,l as Ke,n as Je,o as Xe,p as Ze}from"./chunk-P6KVGV3H.js";import{m as N}from"./chunk-TZUABDIJ.js";import{a as qe,b as Ve}from"./chunk-QELIC5XP.js";import{h as nt,p as rt}from"./chunk-CSJ7L7ZL.js";import{a as Ye}from"./chunk-FVZBGPCU.js";import{a as Qe}from"./chunk-GZE57ORL.js";import{b as ce,e as Oe}from"./chunk-DGJMIVZM.js";import{b as Be,f as De,g as B,h as x,i as D,n as Ae,o as de,p as ue,r as Le,s as Ne,t as T,u as I,v as _}from"./chunk-CWCQP53A.js";import{b as z,c as m}from"./chunk-TH2UFGVP.js";import{f as Me}from"./chunk-CE4JQJ6Y.js";import{a as Ee}from"./chunk-W3FNXAQP.js";import{D as Te,M as ae,P as le,R as O,T as _e,l as se}from"./chunk-QRDF33WD.js";import{a as ie}from"./chunk-5YZYDEMI.js";import{spawn as pt,spawnSync as ft}from"node:child_process";import E from"node:fs";import qt from"node:os";import U from"node:path";import{WebSocket as he}from"ws";function st(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 Bt(e,n){return e?.includes("/one/metro-entry.bundle")?"one":typeof n=="string"&&n?"expo":"unknown"}function Dt(e,n,t){return`${e}//${n}:${t}`}function At(e){if(typeof window>"u")return!1;try{let n=new URL(e);return k(n.hostname)&&k(window.location.hostname)&&n.origin!==window.location.origin}catch{return!1}}async function ct(e,n){let t={...n,cache:n?.cache??"no-store"};return At(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,t):fetch(e,t)}function Lt(e){return e==="https:"?443:80}function Nt(e){let n=e.pathname||"/";return(n==="/"||n==="")&&!e.search&&!e.hash}async function dt(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||r.bundleUrlProvisional?null:{bundleUrl:fe(r.bundleUrl),port:e,framework:typeof r.framework=="string"?r.framework:"unknown",projectName:typeof r.projectName=="string"?r.projectName:void 0}}catch{return null}}var Ft=5e3,Ht=3e4,jt=1e3;async function at(e,n){let t,r=ct(`${e}/`,{headers:{"expo-platform":"ios"}}).then(async c=>c.ok?{ok:!0,body:await c.text()}:null,()=>{}),o=await Promise.race([r,new Promise(c=>setTimeout(()=>c("timeout"),Ft).unref?.())]);if(o==="timeout"||o===void 0)return{state:"no-answer"};if(o===null)return{state:"no-manifest"};if(t=o.body,!t.trim())return{state:"no-answer"};let i;try{i=JSON.parse(t)}catch{return{state:"no-manifest"}}let a=i?.extra?.expoClient||i?.extra||{},s=typeof i?.launchAsset?.url=="string"?i.launchAsset.url:void 0,l=s?je(s,e):void 0;return!l&&!a.name?{state:"no-manifest"}:{state:"resolved",bundle:{bundleUrl:fe(l||`${e}${pe}`),port:n,framework:Bt(l,a.sdkVersion),projectName:a.name}}}async function lt(e){try{let n=await ct(`${e}/status`);return n.ok?(await n.text()).includes("packager-status:running"):!1}catch{return!1}}async function ut(e,n){let t=e.replace(/\/+$/,""),r=await at(t,n),o=!1;if(r.state==="no-answer"){if(o=await lt(t),!o)return null;let i=Date.now()+Ht;for(;r.state==="no-answer"&&Date.now()<i;)await new Promise(a=>setTimeout(a,jt)),r=await at(t,n)}return r.state==="resolved"?r.bundle:r.state==="no-answer"||!o&&!await lt(t)?null:{bundleUrl:`${t}${pe}`,port:n,framework:"metro"}}async function Wt(e,n){try{if(k(new URL(e).hostname)){let t=await dt(n);if(t)return t}}catch{}return ut(e,n)}async function Kt(e){let n=await dt(e);return n||((await Promise.all(Fe.map(r=>ut(He("http:",r,e),e)))).find(r=>r!==null)??null)}async function mt(e){let n=e.trim();if(/^\d+$/.test(n)){let s=parseInt(n,10),l=await Kt(s);if(l)return l;throw st(`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):Lt(o),a=Dt(o,r.hostname,i);if(Nt(r)){let s=await Wt(a,i);if(s)return s;throw st(a)}return{bundleUrl:r.toString(),port:i,framework:"unknown"}}var Vt=12e4,gt=100,Gt=5e3,ht=1e4,zt={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 $(e){return new Promise(n=>setTimeout(n,e))}function wt(e){let n=process.env[e]?.trim();if(!n)return null;let t=Number(n);return Number.isInteger(t)&&t>0?t:null}function Qt(){let e=wt("SOOTSIM_DRIVER_CONNECT_TIMEOUT_MS")??wt("SOOTSIM_PW_CONNECT_TIMEOUT_MS")??Vt;return{timeoutMs:e,hostTimeoutMs:e+Gt,intervalMs:gt,attempts:Math.max(1,Math.ceil(e/gt))}}function bt(e){return e==="electron"||e==="playwright"}function we(e,n){return n==="playwright"?e.meta?.sootsimHostDriver==="playwright":e.userAgent?.includes("Electron/")===!0}function Yt(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 Y(e){return e.trim()}async function Jt(e,n=!1){let t=le();vt(e,n,t);let r=de(e);if((n||r!==null)&&await be(e,250))return e;if(t&&O(t)&&await be(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 Xt();let o=Zt(["serve","--quiet","--port",String(e)]),i=null;o.once("exit",(s,l)=>{i=String(s??l??"unknown")}),o.unref();let a=Date.now()+ht;for(;Date.now()<a;){let s=le();if(vt(e,n,s),s&&O(s)&&await be(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 $(150)}throw new Error(`rnx bridge did not start within ${Math.round(ht/1e3)}s`)}function vt(e,n,t){if(!(!n||!t||!O(t)||t.bridgePort===e))throw new Error(`${ie.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 Xt(){let e=ae();if(e&&E.existsSync(se(e)))return;console.error(" installing rnx engine runtime...");let{runRuntime:n}=await import("./runtime-QU2NIF2K.js");await n(["install"],{})}function Zt(e){let n=process.argv[1];return n&&E.existsSync(n)?pt(process.execPath,[n,...e],{detached:!0,stdio:"ignore",env:process.env}):pt(ie.commandName,e,{detached:!0,stdio:"ignore",env:process.env})}function be(e,n){return new Promise(t=>{let r=new he(`ws://127.0.0.1:${e}`,{handshakeTimeout:n}),o=!1,i=a=>{o||(o=!0,r.readyState===he.OPEN?r.close():r.readyState===he.CONNECTING&&r.terminate(),t(a))};r.once("open",()=>i(!0)),r.on("error",()=>i(!1)),setTimeout(()=>i(!1),n)})}function ye(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 en(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 tn(e,n){let t=new URL(e,"http://sootsim.local"),r=new URL(n),o=J(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 nn(e){try{let n=new URL(e).pathname.replace(/\/+$/,"")||"/";return/^\/preview\/[^/]+$/.test(n)||/^\/build\/.+/.test(n)}catch{return!1}}async function pr(e){let n=Y(e);return(await $e(n)).bundleUrl}function rn(e){try{let n=new URL(e.startsWith("http")?e:`http://${e}`),t=n.pathname||"/";if(t!=="/"&&t!==""||n.search||n.hash||!k(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 $e(e){let n=Y(e),t=/^\d+$/.test(n)?Number(n):rn(n);if(t&&t>0){let r=await Ke(t);if(r&&!r.bundleUrlProvisional)return{bundleUrl:r.bundleUrl,port:r.port,framework:r.framework,projectName:r.projectName}}return mt(n)}function J(e){let n=e.replace(/\/+$/,"")||"/";return n==="/__soot"||n.startsWith("/__soot/")?"/__soot":""}function on(e,n){let t=Y(e),r=new URL(n),o=J(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 It(e){let n=Y(e);return/^\d+$/.test(n)||/^https?:\/\//i.test(n)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(n)}async function sn(e,n,t={}){let r=t.resolvedBundle??await $e(e),o=new URL(n),i=J(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:We(r.bundleUrl,t.hot);return o.searchParams.set("bundle",a),o.toString()}function an(e){return e.startsWith("~/")?U.join(qt.homedir(),e.slice(2)):U.isAbsolute(e)?e:U.resolve(process.cwd(),e)}function ln(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>"),m(1));let a=i.indexOf("=");(a<=0||a===i.length-1)&&(console.error(" rnx open: --replace expects <module>=<file>"),m(1));let s=i.slice(0,a).trim(),l=an(i.slice(a+1).trim());E.existsSync(l)||(console.error(` rnx open: replacement file not found: ${l}`),m(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>"),m(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 cn(e){if(!e)return null;let n=await Xe(e.bundleUrl);return n?Qe(n):null}async function dn(e){if(E.existsSync(U.join(se(e),"index.html")))return;console.error(` installing configured engine runtime ${e}...`);let n=await Me.install({version:e,setActive:!1,protectVersions:_e()});console.error(` installed engine runtime ${n.version}`)}function un(e,n){let t=n??(ge()?void 0:ae()??void 0);if(!t)return e;let r=new URL(e);if(!k(r.hostname)){if(!n)return e;throw new Error(`runtimeVersion ${t} requires a local rnx host; got ${r.origin}`)}return r.hostname=ze(t),r.toString()}function kt(){return Ae().shellBaseUrl}function mn(e){return de(e)?.shellBaseUrl??Be(e)??kt()}async function pn(e,n){try{let t=new URL(e),r=t.searchParams.get("bundle")||"";if(!r||!n)return e;let o=Je({bundleUrl:r,projectDir:n.appDir});if(o.length===0)return e;let i=await fn(o);return i.length===0?e:(t.searchParams.set("appFonts",Ze(i)),t.toString())}catch{return e}}async function fn(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 gn(e,n,t={}){if(!e)return new URL(n).toString();if(ye(e))return new URL(e).toString();if(en(e))return tn(e,n);let r=zt[e.toLowerCase()];if(r){let o=new URL(n),i=J(o.pathname);return o.pathname=`${i}${r}`,o.toString()}return It(e)?sn(e,n,t):on(e,n)}async function hn(e,n){try{let t=new URL(e),r=t.searchParams.get("bundle")||"";if(!r||!n)return e;let o=et({bundleUrl:r,projectDir:n.appDir});return!o||o.imageUrl&&!await wn(o.imageUrl)?e:(t.searchParams.set("appSplash",tt(o)),t.toString())}catch{return e}}async function wn(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 Q(e,n=kt(),t={}){let r=await gn(e,n,t),o=await hn(await pn(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 yt(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 bn(e,n,t,r={}){let o=new URL(await Q(e,n,r));return o.searchParams.set("inspectOpen",t),o.toString()}async function vn(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=I(e,{commandTimeoutMs:n,simId:t,simIdSource:"flag"});try{let c=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof c=="number"&&c>a)return{bridge:l,count:c}}catch{}l.close(),await $(i)}return null}function yn(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 Sn(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 fr(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 ${Sn(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=yn(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=$n(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: ${St(Date.now()-t.connectedAt)}`),t.lastActiveAt&&t.lastActiveAt>0&&console.log(` last active: ${St(Date.now()-t.lastActiveAt)}`)}}function $n(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)":ge()?`dev \u2014 local build (:${t||"?"})`:`runtime \u2014 published engine (:${t||"?"})`}catch{return null}}function St(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 gr(e,n,t,r={}){let o=r.attempts??30,i=r.intervalMs??500;for(let a=0;a<o;a++){let s=I(e,{commandTimeoutMs:n});try{let c=(await s.listSims()).find(t);if(c)return c}catch{}finally{s.close()}await $(i)}return null}async function Pn(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&&!Se(r);for(let c=0;c<i;c++){if(l())return{kind:"host-exit"};let u=I(e,{commandTimeoutMs:n});try{let h=(await u.listSims()).find(t);if(h)return l()?{kind:"host-exit"}:{kind:"match",sim:h}}catch{}finally{u.close()}if(l())return{kind:"host-exit"};await $(a)}return{kind:"timeout"}}async function xn(e,n,t,r={}){let o=r.attempts??20,i=r.intervalMs??250;for(let a=0;a<o;a++){let s=I(e,{commandTimeoutMs:n});try{let c=(await s.listSims()).find(u=>u.id===t);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{s.close()}await $(i)}return!1}function In(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 kn(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 $t(e){if(e.diagnosticLogPath)try{let n=E.readFileSync(e.diagnosticLogPath,"utf8").trim();if(!n){console.error(` ${U.basename(e.diagnosticLogPath)} was empty`);return}let t=n.length>4e3?`\u2026
7
- ${n.slice(-4e3)}`:n;console.error(` ${U.basename(e.diagnosticLogPath)}:`),console.error(t)}catch(n){let t=n instanceof Error?n.message:String(n);console.error(` failed to read ${U.basename(e.diagnosticLogPath)}: ${t}`)}}function Se(e){try{return process.kill(e,0),!0}catch(n){return n?.code==="EPERM"}}async function Cn(e,n=2500){let t=Date.now()+n;for(;Date.now()<t;){if(!Se(e))return!0;await $(100)}return!Se(e)}function Un(e){let n=ft("ps",["-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),t=ft("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 ve(e,n){let t=new Set(n),r=new Set;for(let o of e){if(!t.has(o.id))continue;let i=In(o);i&&r.add(i)}for(let o of r){if(!Un(o)){console.log(` skipped pid ${o}: not a rnx playwright host (stale sim record)`);continue}try{process.kill(o,"SIGTERM")}catch{}if(await Cn(o)){console.log(` closed playwright host process ${o}`);continue}try{process.kill(o,"SIGKILL"),console.log(` force-closed playwright host process ${o}`)}catch{}}}function X(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 Pt(e,n,t,r=!1){let[o,i]=[e,n.url].map(a=>{if(!a)return a;try{let s=new URL(a),l=!1;s.searchParams.has(A)&&(s.searchParams.set(A,"[redacted]"),l=!0);let c=s.searchParams.get("bundle");if(c)try{let u=new URL(c);u.searchParams.has(A)&&(u.searchParams.set(A,"[redacted]"),s.searchParams.set("bundle",u.toString()),l=!0)}catch{}if(l)return 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 xt(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 Rn(e,n,{stableMs:150,maxMs:400});let o=I(e,{commandTimeoutMs:3e3,simId:n,cliLabel:"open --describe",simIdSource:"flag"});try{let i=null;try{i=await rt(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 nt(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 Rn(e,n,t){let r=Date.now()+t.maxMs,o="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",i=I(e,{commandTimeoutMs:2e3,simId:n,simIdSource:"flag"});try{let a=-1,s=0;for(;Date.now()<r;){let l=-1;try{let c=await i.send({type:"evaluate",code:o});typeof c=="number"&&(l=c)}catch{}if(l>=0&&l===a){if(Date.now()-s>=t.stableMs)return}else a=l,s=Date.now();await $(50)}}finally{i.close()}}async function Tn(e,n={}){let t=T(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"),m(1));let r=_(t),o=t.simId?` --sim ${t.simId}`:"";try{let i=await Ve(r,t.positional[0]??"");console.log(` opened deep link: ${i}`)}catch(i){console.error(` link failed: ${i instanceof Error?i.message:String(i)}`),await N(r,{errorsCommand:`rnx get errors 5${o}`,warningsCommand:`rnx get warnings 5${o}`,requestsCommand:`rnx get requests 5${o}`}),m(1)}finally{r.close()}}async function hr(e,n={}){let t=T(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((f,p)=>e[p-1]==="--profile"),o=e.includes("--quiet"),i=e.includes("--ephemeral"),a=e.find((f,p)=>e[p-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}"`),m(1)),r&&i&&(console.error(" rnx open: --profile cannot be combined with --ephemeral"),m(1));let l=r?Ge(r).id:void 0,c=e.includes("--new")||!!l||i,u=ln(e);c&&t.simIdSource==="flag"&&(console.error(" rnx open: --new, --profile, and --ephemeral cannot be combined with --sim"),m(1));let d=t.positional[0]||"";if(qe(d)){c&&(console.error(" rnx open: deep links target the current app; remove --new, --profile, or --ephemeral"),m(1)),await Tn(e,n);return}if(nn(d)){let f=(()=>{try{return k(new URL(d).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 it(d,{background:!1})}catch(p){console.error(` could not launch a browser: ${p instanceof Error?p.message:String(p)}`),console.error(` open it yourself: ${d}`),m(1)}console.log(f?" 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 h=It(d)?await $e(d):void 0,F=await cn(h),Z=await Ye(F),H=Z?.runtimeVersion,j=me(me(Z?{...Z,runtimeVersion:void 0}:void 0,n.runtimeConfig),u);H&&await dn(H);let ee=e.find((f,p)=>e[p-1]==="--base-url");if(ee&&!t.explicitPort){let f=ue(ee);f&&(t.wsPort=f)}t.wsPort=await Jt(t.wsPort,t.explicitPort);let M=e.find((f,p)=>e[p-1]==="--driver")||"";M&&!bt(M)&&(console.error(` unknown driver "${M}" \u2014 run \`rnx list --drivers\``),m(1));let v=bt(M)?M:process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"||Ee()||!process.stdin.isTTY?"playwright":Te()||"playwright",Ut=Yt(e,v);s&&v!=="playwright"&&(console.error(" rnx open: --cdp-port is only honored by the playwright driver"),m(1));let Pe=e.includes("--hot"),xe=e.includes("--no-hmr");Pe&&xe&&(console.error(" rnx open: --hot and --no-hmr cannot be combined"),m(1));let Rt=Pe?!0:xe?!1:v!=="playwright",C=e.find((f,p)=>e[p-1]==="--device");C&&!(C in ce)&&(console.error(` rnx open: unknown device "${C}"`),console.error(` known devices: ${Oe().join(", ")}`),m(1));let te=C?ce[C]:void 0,W=e.find((f,p)=>e[p-1]==="--viewport"),K=W?/^(\d+)x(\d+)$/.exec(W):null;W&&!K&&(console.error(` rnx open: --viewport must be <width>x<height>, got "${W}"`),m(1));let Tt=K?{width:Number(K[1]),height:Number(K[2])}:void 0,q={hot:Rt,device:C,resolvedBundle:h,project:F},_t=H?`http://localhost:${t.wsPort}/`:ee||mn(t.wsPort),P=un(_t,H),Ie=e.includes("--base-url");Le(t.wsPort,P);let Et=B();if(!c){let f=_(t),p=t.simId?` --sim ${t.simId}`:"",oe=!1;try{let g=null,G=null;try{let w=await f.listSims();if(t.simIdSource==="saved")g=w.find(b=>b.id===Et&&b.readyState==="open"&&we(b,v))??null,g||D();else if(t.simIdSource==="flag"&&(g=X(w,t.simId),!we(g,v)))throw new Error(`sim ${g.id} is not managed by the ${v} driver`);if(!g&&t.simIdSource!=="flag"){G=await Q(d,L(P,j),q);let b=new URL(G);b.searchParams.delete("inspectOpen"),g=w.find(S=>{if(S.readyState!=="open"||!S.url||!we(S,v))return!1;try{let Re=new URL(S.url);return Re.searchParams.delete("inspectOpen"),Re.toString()===b.toString()}catch{return!1}})??null}if(!g)if(t.simIdSource!=="flag")oe=!0;else throw new Error("no sim connected");if(!oe&&g){let b=Ie||ye(d)?P:yt(g,P),S=G??await Q(d,L(b,j),q);f.send({type:"evaluate",simId:g.id,code:`window.location.href = ${JSON.stringify(S)}`}).catch(()=>{})}}catch(w){console.error(` open failed: ${w instanceof Error?w.message:String(w)}`),await N(f,{errorsCommand:`rnx get errors 5${p}`,warningsCommand:`rnx get warnings 5${p}`,requestsCommand:`rnx get requests 5${p}`}),m(1)}if(!oe&&g){await $(1500);let w=await vn(t.wsPort,t.commandTimeoutMs,g.id);w||(console.error(" timed out waiting for current sim to load target"),m(1)),w.bridge.close(),x(g.id);let b=Ie||ye(d)?P:yt(g,P),S=G??await Q(d,L(b,j),q);return Pt(S,{...g,url:S},"current sim",o),await xt(t.wsPort,g.id,e),t.wsPort}}finally{f.close()}}let Mt=L(P,j),ke=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,Ce=await bn(d,Mt,ke,q),Ue=De();Ue||(console.error(" could not resolve a stable owning process; refusing unsupervised sim host"),m(1));let Ot=f=>f.url?.includes(`inspectOpen=${ke}`)??!1,R=ot(v);R||(console.error(` unknown driver "${v}" \u2014 run \`rnx list --drivers\``),m(1));let V=Qt(),y=await R.launch({url:Ce,bridgePort:ue(P)??t.wsPort,headless:Ut,profileId:l,ephemeralProfile:i,cdpPort:s,device:C,ownerPid:Ue,viewport:Tt??(te?{width:te.width+120,height:te.height+60}:void 0),connectTimeoutMs:V.hostTimeoutMs});y.launched||(console.error(` ${R.name} driver: ${y.message}`),m(1));let ne=await Pn(t.wsPort,t.commandTimeoutMs,Ot,y.pid,{attempts:V.attempts,intervalMs:V.intervalMs});if(ne.kind==="host-exit"&&($t(y),console.error(` ${R.name} host crashed \u2014 sim is no longer attached`),m(1)),ne.kind==="timeout"){if(y.pid)try{process.kill(y.pid,"SIGTERM"),console.error(` closed ${R.name} host process ${y.pid}`)}catch{}$t(y),console.error(` timed out after ${V.timeoutMs}ms waiting for opened sim to connect`),m(1)}let re=ne.sim;return x(re.id),kn(y),Pt(Ce,re,`${R.name} driver`,o),await xt(t.wsPort,re.id,e),t.wsPort}async function Ct(e,n={}){let t=T(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--force"]}),r=e.includes("--force"),o=_(t),i=t.simId?` --sim ${t.simId}`:"";try{try{let a=await o.listSims(),s=X(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"),m(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`),m(1))}await o.focusSim(s.id),x(s.id),console.log(` using: ${s.id}`)}catch(a){z(a),console.error(` use failed: ${a instanceof Error?a.message:String(a)}`),await N(o,{errorsCommand:`rnx get errors 5${i}`,warningsCommand:`rnx get warnings 5${i}`,requestsCommand:`rnx get requests 5${i}`}),m(1)}}finally{o.close()}}async function wr(e,n={}){await Ct(e,n)}async function br(e,n={}){await Ct(e,n)}async function vr(e,n={}){let t=T(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--force"]}),r=e.includes("--force"),o=_(t);try{try{let i=await o.listSims(),a=X(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});x(a.id);let c=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),u=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${c}s]${u}`),s&&console.log(` took over from: ${s}`)}catch(i){if(i instanceof Ne){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"),m(1)}console.error(` claim failed: ${i instanceof Error?i.message:String(i)}`),m(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=I(n,{commandTimeoutMs:t});try{a=(await s.listSims()).filter(c=>o.has(c.id)&&c.readyState==="open").map(c=>c.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 $(250)}return{closed:[...o],remaining:[]}}function En(e,n){let t=e.filter(d=>d.readyState==="open"),r=t.map(d=>d.id),o=n.explicitKeepId?.trim()||"",i=n.savedKeepId?.trim()||"",a=i?t.some(d=>d.id===i):!1,s=i&&!a?i:null,l=null,c=null,u=null;if(n.closeOthers)if(o){let d=t.find(h=>h.id===o);d?l=d.id:c=o}else if(i&&a)l=i;else{let d=t.find(h=>h.isPrimary)??t[0]??null;d&&(l=d.id,i&&!a&&(u=d.id))}return{openIds:r,keepId:l,targets:c?[]:r.filter(d=>d!==l),staleSavedId:s,missingExplicitKeepId:c,fallbackKeepId:u}}async function yr(e,n={}){let t=T(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--all","--others"]}),r=_(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(),c=t.positional[0]||(t.simIdSource==="flag"?t.simId:void 0),u=En(s,{closeOthers:a,explicitKeepId:c,savedKeepId:l});if(u.staleSavedId&&D(),u.fallbackKeepId&&(x(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`),m(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 d=await _n(r,t.wsPort,t.commandTimeoutMs,u.targets);await ve(s,u.targets);let h=B();h&&d.closed.includes(h)&&(u.keepId?x(u.keepId):D());let F=` closed ${d.closed.length} sim(s)${u.keepId?` (kept ${u.keepId})`:""}`;console.log(F),d.remaining.length>0&&(console.error(` close failed: still connected: ${d.remaining.join(", ")}`),m(1))}catch(s){z(s),console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),m(1)}finally{r.close()}return}try{try{let s=await r.listSims(),l=X(s,t.positional[0]||t.simId),c=s.find(d=>d.id!==l.id&&d.readyState==="open");await r.closeSim(l.id),await xn(t.wsPort,t.commandTimeoutMs,l.id)||(await ve(s,[l.id]),console.error(` close failed: ${l.id} is still connected`),m(1)),await ve(s,[l.id]),B()===l.id&&(c?x(c.id):D()),console.log(` closed: ${l.id}`)}catch(s){z(s),console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await N(r,{errorsCommand:`rnx get errors 5${o}`,warningsCommand:`rnx get warnings 5${o}`,requestsCommand:`rnx get requests 5${o}`}),m(1)}}finally{r.close()}}export{Qt as a,Jt as b,pr as c,un as d,kt as e,mn as f,Q as g,bn as h,yn as i,fr as j,gr as k,Pn as l,In as m,kn as n,ve as o,Pt as p,Tn as q,hr as r,wr as s,br as t,vr as u,_n as v,En as w,yr as x};
@@ -1,4 +0,0 @@
1
- /*! rnx v0.1.376 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- var n=Object.freeze({name:"rnx",packageName:"rnxsim",commandName:"rnx",domain:"rnxsim.com",origin:"https://rnxsim.com"});export{n as a};
@@ -1,15 +0,0 @@
1
- /*! rnx v0.1.376 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- import{m as a}from"./chunk-TZUABDIJ.js";import{t as l,v as i}from"./chunk-CWCQP53A.js";function c(r){if(!r||typeof r!="object")return!1;let t=Reflect.get(r,"strategy");return typeof Reflect.get(r,"ok")=="boolean"&&(t==="data"||t==="full")&&Array.isArray(Reflect.get(r,"cleared"))&&typeof Reflect.get(r,"relaunched")=="boolean"}function d(){console.log(`
5
- rnx reset - clear the current guest app and relaunch it
6
-
7
- usage:
8
- rnx reset [--full] [--json] [--sim <id>]
9
-
10
- options:
11
- --full also clear keychain, user defaults, and permissions
12
- --json print the structured reset result
13
- --sim <id> target a specific sim
14
- --port <p> WS bridge port
15
- `)}async function f(r,t={}){if(r.includes("--help")||r.includes("-h"))return d(),0;let o=l(r,{port:t.port,stripBooleanFlags:["--full","--json"]});if(o.positional.length>0)return console.error(` unexpected reset argument: ${o.positional[0]}`),1;let n=i(o);try{let e=await n.send({type:"reset",resetOptions:{strategy:r.includes("--full")?"full":"data"}});if(!c(e))throw new Error("reset bridge returned an invalid result");if(r.includes("--json"))console.log(JSON.stringify(e));else{console.log(` ${e.strategy} reset ${e.ok?"complete":"failed"}`),console.log(e.cleared.length>0?` cleared: ${e.cleared.join(", ")}`:" cleared: none");for(let s of e.skipped??[])console.log(` skipped ${s.store}: ${s.reason}`);console.log(` app: ${e.relaunched?"relaunched":"not relaunched"}`),console.log(` worker: ${e.workerReloaded?"restarted":"preserved in place"}`),e.error&&console.error(` error: ${e.error}`)}return e.ok?0:1}catch(e){return console.error(` reset failed: ${e instanceof Error?e.message:e}`),await a(n),1}finally{n.close()}}export{f as a};
@@ -1,4 +0,0 @@
1
- /*! rnx v0.1.376 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- import{i as s}from"./chunk-BEU7CD7E.js";import{a as t}from"./chunk-W3FNXAQP.js";import{F as o,G as n}from"./chunk-QRDF33WD.js";function a(){return process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"}function c(){return process.stdin.isTTY===!0&&!a()&&!t()}function l(e=o()){let r=process.env.DO_NOT_TRACK;return r==="1"||r==="true"||!c()?!1:e.configured&&e.productAnalytics}async function P(e){let r=o();if(r.configured)return r;if(!e.prompt||!c())return{productAnalytics:!1,crashReports:!1,configured:!1};let i=await s("Share anonymous package incompatibilities and error classes to improve rnx?",!1);return n({productAnalytics:i,crashReports:!1}),o()}export{c as a,l as b,P as c};
@@ -1,4 +0,0 @@
1
- /*! rnx v0.1.376 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- var a=["Cache","Code Cache","DawnCache","DawnGraphiteCache","DawnWebGPUCache","GPUCache","GrShaderCache","ShaderCache"],r=new Set(a);function s(e){return r.has(e)}export{a,s as b};