rnxsim 0.1.365 → 0.1.366

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 (184) hide show
  1. package/README.md +2 -0
  2. package/cli/bridge-flow-runner.ts +2 -2
  3. package/cli/commands/control.ts +3 -44
  4. package/cli/commands/detox.ts +18 -1
  5. package/cli/commands/flow.ts +2 -1
  6. package/detox/index.ts +3 -1
  7. package/dist-cli/bin.js +5 -5
  8. package/dist-cli/chunks/{agent-BVMNQFKF.js → agent-SO6IOPRK.js} +2 -2
  9. package/dist-cli/chunks/{agent-wrapper-B6YFXGC3.js → agent-wrapper-PMYCB2KO.js} +2 -2
  10. package/dist-cli/chunks/{app-fonts-MEI6R6XR.js → app-fonts-LULQGFY7.js} +2 -2
  11. package/dist-cli/chunks/{assert-JGHI53HV.js → assert-WGNCD4ZU.js} +2 -2
  12. package/dist-cli/chunks/{auth-STEOXUS7.js → auth-G7CCHH3M.js} +2 -2
  13. package/dist-cli/chunks/{beta-HT3FLS5T.js → beta-N4LXL5TO.js} +2 -2
  14. package/dist-cli/chunks/{camera-ZCLFSLON.js → camera-4JHCYBQS.js} +2 -2
  15. package/dist-cli/chunks/{chunk-5AS7S6HY.js → chunk-2S7BKUP2.js} +2 -2
  16. package/dist-cli/chunks/{chunk-RI3NS77J.js → chunk-2UXU53MG.js} +1 -1
  17. package/dist-cli/chunks/{chunk-XPOTXF5Q.js → chunk-34IQM22N.js} +2 -2
  18. package/dist-cli/chunks/{chunk-52ES4API.js → chunk-3X6IBUBX.js} +2 -2
  19. package/dist-cli/chunks/{chunk-TULWPOAY.js → chunk-5DAIA77C.js} +2 -2
  20. package/dist-cli/chunks/{chunk-FIXRGPUT.js → chunk-5NMCF5VF.js} +1 -1
  21. package/dist-cli/chunks/{chunk-QIQL7Y5V.js → chunk-5OK3LCEJ.js} +2 -2
  22. package/dist-cli/chunks/{chunk-NEH4T67X.js → chunk-6PL2CCGP.js} +2 -2
  23. package/dist-cli/chunks/{chunk-MRNW4GVL.js → chunk-77ZHQJZR.js} +2 -2
  24. package/dist-cli/chunks/chunk-7B37IZBN.js +15 -0
  25. package/dist-cli/chunks/{chunk-CYIE65QN.js → chunk-A5FXX5PJ.js} +1 -1
  26. package/dist-cli/chunks/{chunk-JRPU5TFI.js → chunk-AFV32WZT.js} +3 -3
  27. package/dist-cli/chunks/{chunk-M5KJCLUW.js → chunk-CN6XYYEA.js} +12 -12
  28. package/dist-cli/chunks/{chunk-J66US2OZ.js → chunk-CTG7HBCA.js} +1 -1
  29. package/dist-cli/chunks/{chunk-ZGD7GZRI.js → chunk-DMPF2D24.js} +2 -2
  30. package/dist-cli/chunks/{chunk-622E4JET.js → chunk-DW37EVX5.js} +1 -1
  31. package/dist-cli/chunks/{chunk-XKRUNS7A.js → chunk-DWFIH7CB.js} +2 -2
  32. package/dist-cli/chunks/{chunk-WGNDJARS.js → chunk-EFR5DVNP.js} +1 -1
  33. package/dist-cli/chunks/{chunk-6BAF6GFS.js → chunk-EGAGZHO6.js} +1 -1
  34. package/dist-cli/chunks/{chunk-MACI34ST.js → chunk-EQK5MJCU.js} +2 -2
  35. package/dist-cli/chunks/{chunk-JAFF4RAU.js → chunk-GAJQSITE.js} +1 -1
  36. package/dist-cli/chunks/{chunk-ZGH5U4AJ.js → chunk-GUI3PDH2.js} +2 -2
  37. package/dist-cli/chunks/{chunk-DBJZUCFP.js → chunk-GXAB52K7.js} +2 -2
  38. package/dist-cli/chunks/{chunk-O6P4N2JD.js → chunk-H23KWIKA.js} +2 -2
  39. package/dist-cli/chunks/{chunk-2CXHDTQ5.js → chunk-HT6GFZOZ.js} +1 -1
  40. package/dist-cli/chunks/{chunk-BGRGP3QR.js → chunk-I6KIM6PN.js} +1 -1
  41. package/dist-cli/chunks/{chunk-XRO5WQXP.js → chunk-IZKHOM37.js} +1 -1
  42. package/dist-cli/chunks/{chunk-EVBQDQVY.js → chunk-JHXETDVC.js} +1 -1
  43. package/dist-cli/chunks/{chunk-2JFZ5Z7Q.js → chunk-KLF3K6ZZ.js} +1 -1
  44. package/dist-cli/chunks/{chunk-EFXNSJ55.js → chunk-LN3RNW6X.js} +2 -2
  45. package/dist-cli/chunks/{chunk-TKCGP3DD.js → chunk-M3BNCF7E.js} +2 -2
  46. package/dist-cli/chunks/{chunk-YE3M3YD4.js → chunk-M5QCGLXR.js} +3 -3
  47. package/dist-cli/chunks/{chunk-4WFN4DFR.js → chunk-M6SKQGAN.js} +2 -2
  48. package/dist-cli/chunks/{chunk-R4FQZXJC.js → chunk-MGDSJZ37.js} +2 -2
  49. package/dist-cli/chunks/{chunk-2SFMW5K6.js → chunk-N3UC7HIX.js} +1 -1
  50. package/dist-cli/chunks/{chunk-OSZ5HZSI.js → chunk-NAYLPOC5.js} +2 -2
  51. package/dist-cli/chunks/{chunk-XR4KID25.js → chunk-NM2L2QV4.js} +2 -2
  52. package/dist-cli/chunks/{chunk-67ATAITF.js → chunk-NQFJOCSF.js} +2 -2
  53. package/dist-cli/chunks/{chunk-HIDS3PYC.js → chunk-ONORMKWX.js} +2 -2
  54. package/dist-cli/chunks/{chunk-XXNPISER.js → chunk-ORWP2E7R.js} +2 -2
  55. package/dist-cli/chunks/{chunk-GK7PGYFH.js → chunk-OW5XHAA4.js} +1 -1
  56. package/dist-cli/chunks/{chunk-GZEUDDAW.js → chunk-RYIMSKDO.js} +2 -2
  57. package/dist-cli/chunks/{chunk-X5ZOZVHC.js → chunk-SA6XVI55.js} +1 -1
  58. package/dist-cli/chunks/{chunk-ZTWUNK45.js → chunk-TIAEYO6I.js} +2 -2
  59. package/dist-cli/chunks/{chunk-5VHWQGGF.js → chunk-TTASWLKM.js} +1 -1
  60. package/dist-cli/chunks/{chunk-O2ORLK6W.js → chunk-UCHW7ZHR.js} +2 -2
  61. package/dist-cli/chunks/{chunk-EFL2ASZO.js → chunk-VIND4SP3.js} +1 -1
  62. package/dist-cli/chunks/{chunk-UR345KM3.js → chunk-XJU2QIRY.js} +2 -2
  63. package/dist-cli/chunks/{chunk-W3UIDI3W.js → chunk-XXNLYR64.js} +3 -3
  64. package/dist-cli/chunks/{chunk-25BTVHK2.js → chunk-YCCCPFWT.js} +2 -2
  65. package/dist-cli/chunks/chunk-YGMEDJKJ.js +4 -0
  66. package/dist-cli/chunks/{chunk-FHWZPUGC.js → chunk-YXXKSL6R.js} +1 -1
  67. package/dist-cli/chunks/{chunk-ZCP4CRP6.js → chunk-ZFM24DOX.js} +2 -2
  68. package/dist-cli/chunks/{chunk-EAFKG5R3.js → chunk-ZJIS3CTW.js} +2 -2
  69. package/dist-cli/chunks/{chunk-DQFOHIRF.js → chunk-ZLVRYXZ7.js} +1 -1
  70. package/dist-cli/chunks/{chunk-MR3YPNUI.js → chunk-ZMJ75EDG.js} +2 -2
  71. package/dist-cli/chunks/{cleanup-G4TEYVKY.js → cleanup-KRIATKFH.js} +2 -2
  72. package/dist-cli/chunks/cli-version-SYGNHGFR.js +4 -0
  73. package/dist-cli/chunks/{compat-EZ5NP32J.js → compat-6PTQ3QEA.js} +2 -2
  74. package/dist-cli/chunks/{config-27M2DGCS.js → config-ETGDUANO.js} +2 -2
  75. package/dist-cli/chunks/control-RBTNOLQM.js +4 -0
  76. package/dist-cli/chunks/daemon-N3SC5DK6.js +4 -0
  77. package/dist-cli/chunks/{debug-EXU3D7PC.js → debug-WIIB6ZKC.js} +3 -3
  78. package/dist-cli/chunks/{desktop-SHHPZAWQ.js → desktop-TD7Q5LNB.js} +3 -3
  79. package/dist-cli/chunks/detox-7GNR33VM.js +52 -0
  80. package/dist-cli/chunks/{device-4NI26HG6.js → device-QOR3PGUF.js} +2 -2
  81. package/dist-cli/chunks/{diagnose-P4SFXH6J.js → diagnose-RRCBLP6E.js} +2 -2
  82. package/dist-cli/chunks/{disk-cleanup-BUAKWYMY.js → disk-cleanup-MJUGJPXT.js} +2 -2
  83. package/dist-cli/chunks/drivers-W6E3BZH4.js +4 -0
  84. package/dist-cli/chunks/{film-Y2BAQINB.js → film-D7Y64LID.js} +3 -3
  85. package/dist-cli/chunks/flow-7QAE2V5Y.js +4 -0
  86. package/dist-cli/chunks/help-NLD6KWVG.js +4 -0
  87. package/dist-cli/chunks/{hidden-runtime-alias-U2MAY2XV.js → hidden-runtime-alias-JGURVR2Z.js} +2 -2
  88. package/dist-cli/chunks/{home-paths-PAJMZCOS.js → home-paths-4ICFIGXO.js} +2 -2
  89. package/dist-cli/chunks/inspect-C347BG52.js +4 -0
  90. package/dist-cli/chunks/install-desktop-YR6TWZYK.js +4 -0
  91. package/dist-cli/chunks/{login-D53XKBEO.js → login-RU33QR2G.js} +2 -2
  92. package/dist-cli/chunks/{logout-HZQKLNUJ.js → logout-2IUG3Y5J.js} +2 -2
  93. package/dist-cli/chunks/{maestro-XSS2KX6L.js → maestro-2MXTGG7I.js} +3 -3
  94. package/dist-cli/chunks/{maestro-generate-DNDQX3JQ.js → maestro-generate-2PYIFGLR.js} +3 -3
  95. package/dist-cli/chunks/{mode-LEVGOKI3.js → mode-3DAPG3HF.js} +2 -2
  96. package/dist-cli/chunks/{optional-demo-registry-2XZIJNDG.js → optional-demo-registry-BWSDJF2Z.js} +2 -2
  97. package/dist-cli/chunks/{perf-OKMAXDLB.js → perf-2TKPWB4N.js} +2 -2
  98. package/dist-cli/chunks/{permissions-VG5TBUTN.js → permissions-5CSMHYNA.js} +2 -2
  99. package/dist-cli/chunks/privacy-PWWC2BXO.js +4 -0
  100. package/dist-cli/chunks/{record-BQYGZOMV.js → record-I2HJCFP3.js} +3 -3
  101. package/dist-cli/chunks/{report-issue-HCPZESWE.js → report-issue-A4FZWBOC.js} +2 -2
  102. package/dist-cli/chunks/reset-Y3PBPFYA.js +4 -0
  103. package/dist-cli/chunks/runtime-IC6NVVGA.js +4 -0
  104. package/dist-cli/chunks/{screenshot-command-DWEYPJE7.js → screenshot-command-UFW5BFHP.js} +3 -3
  105. package/dist-cli/chunks/{screenshot-layers-5GMBXLO7.js → screenshot-layers-5BIAL4YN.js} +2 -2
  106. package/dist-cli/chunks/{screenshots-capture-5KCI7IZD.js → screenshots-capture-EHYS3BV2.js} +2 -2
  107. package/dist-cli/chunks/{serve-QNKTA2HR.js → serve-O4FDM3AC.js} +2 -2
  108. package/dist-cli/chunks/setup-Y4QGSJBM.js +4 -0
  109. package/dist-cli/chunks/{skills-DOEALD3X.js → skills-ZK55SY32.js} +2 -2
  110. package/dist-cli/chunks/{state-3HH2IHIF.js → state-KFLAZNEY.js} +2 -2
  111. package/dist-cli/chunks/{storage-E7WUWN3E.js → storage-WP33ISEM.js} +2 -2
  112. package/dist-cli/chunks/store-VEE22CAY.js +4 -0
  113. package/dist-cli/chunks/telemetry-PZV4BISJ.js +4 -0
  114. package/dist-cli/chunks/{timeline-IKNUGQ2A.js → timeline-DKGW5S4I.js} +2 -2
  115. package/dist-cli/chunks/{upgrade-VS3OKXE2.js → upgrade-LL7G4B7G.js} +2 -2
  116. package/dist-cli/chunks/upload-Y4C3YZDK.js +4 -0
  117. package/dist-cli/chunks/{version-F4XHNTBZ.js → version-YLWR5G4F.js} +2 -2
  118. package/dist-cli/chunks/{web-F72724QL.js → web-QELZ4CP6.js} +2 -2
  119. package/dist-cli/chunks/welcome-ZPKA5PZJ.js +5 -0
  120. package/dist-cli/chunks/{what-happened-APK7YKOV.js → what-happened-MIOMZWM5.js} +2 -2
  121. package/dist-lib/agent-daemon-client.cjs +1 -1
  122. package/dist-lib/agent-events.cjs +1 -1
  123. package/dist-lib/agent-identity.cjs +1 -1
  124. package/dist-lib/agent-sessions.cjs +1 -1
  125. package/dist-lib/attached-projects.cjs +1 -1
  126. package/dist-lib/auth/shared-session.cjs +1 -1
  127. package/dist-lib/backend-origin.cjs +1 -1
  128. package/dist-lib/beta.cjs +1 -1
  129. package/dist-lib/beta.mjs +1 -1
  130. package/dist-lib/bridge-constants.cjs +1 -1
  131. package/dist-lib/bridge-contract.cjs +1 -1
  132. package/dist-lib/cli-constants.cjs +1 -1
  133. package/dist-lib/config.cjs +1 -1
  134. package/dist-lib/detox/index.cjs +4 -2
  135. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  136. package/dist-lib/home-paths.cjs +1 -1
  137. package/dist-lib/host/bridge-host.cjs +1 -1
  138. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  139. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  140. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  141. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  142. package/dist-lib/host/websocket-proxy.cjs +1 -1
  143. package/dist-lib/index.cjs +31 -1
  144. package/dist-lib/jump-to-source-babel.cjs +1 -1
  145. package/dist-lib/mcp.cjs +673 -0
  146. package/dist-lib/mcp.mjs +641 -0
  147. package/dist-lib/menu.cjs +1 -1
  148. package/dist-lib/menu.mjs +1 -1
  149. package/dist-lib/metro-production-bundle.cjs +1 -1
  150. package/dist-lib/metro-production-bundle.mjs +1 -1
  151. package/dist-lib/metro.cjs +1 -1
  152. package/dist-lib/profiles.cjs +1 -1
  153. package/dist-lib/public-brand.cjs +1 -1
  154. package/dist-lib/react-native-host-modules.cjs +1 -1
  155. package/dist-lib/react-native-host-modules.mjs +1 -1
  156. package/dist-lib/render-mode.cjs +1 -1
  157. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  158. package/dist-lib/sdk.cjs +31 -1
  159. package/dist-lib/sdk.mjs +31 -1
  160. package/dist-lib/skills.cjs +67 -53
  161. package/dist-lib/vite.cjs +1 -1
  162. package/package.json +7 -1
  163. package/src/app-url.ts +40 -0
  164. package/src/mcp.ts +791 -0
  165. package/src/sim-client.ts +12 -6
  166. package/dist-cli/chunks/chunk-IWPS3EKJ.js +0 -15
  167. package/dist-cli/chunks/chunk-MCHKBFUL.js +0 -4
  168. package/dist-cli/chunks/cli-version-ZM3PVKQ5.js +0 -4
  169. package/dist-cli/chunks/control-4QR43FXV.js +0 -4
  170. package/dist-cli/chunks/daemon-2U4CJ6AT.js +0 -4
  171. package/dist-cli/chunks/detox-RQ6FFSBS.js +0 -52
  172. package/dist-cli/chunks/drivers-OVCUPQTM.js +0 -4
  173. package/dist-cli/chunks/flow-ELTLKKZ3.js +0 -4
  174. package/dist-cli/chunks/help-CDEZAG2L.js +0 -4
  175. package/dist-cli/chunks/inspect-VVQRPJLS.js +0 -4
  176. package/dist-cli/chunks/install-desktop-YXSRKR35.js +0 -4
  177. package/dist-cli/chunks/privacy-MNRHREME.js +0 -4
  178. package/dist-cli/chunks/reset-R4E4W4YI.js +0 -4
  179. package/dist-cli/chunks/runtime-XRQZ7W34.js +0 -4
  180. package/dist-cli/chunks/setup-RNMM5GO5.js +0 -4
  181. package/dist-cli/chunks/store-HUPZUCFG.js +0 -4
  182. package/dist-cli/chunks/telemetry-IJ53XR2Y.js +0 -4
  183. package/dist-cli/chunks/upload-A57NAAHF.js +0 -4
  184. package/dist-cli/chunks/welcome-B72RRMBW.js +0 -5
@@ -0,0 +1,15 @@
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import { createRequire as __sootsimCreateRequire } from 'node:module'
3
+ var require = __sootsimCreateRequire(import.meta.url)
4
+ import{a as me,b as We}from"./chunk-RYIMSKDO.js";import{a as Je,b as Qe,d as et}from"./chunk-ORWP2E7R.js";import{a as Ae,c as Le,d as I,e as ce,f as D,g as de,h as Ne,i as ue,j as Fe,k as je,m as Ve,n as ze,o as Ge}from"./chunk-EQK5MJCU.js";import{m as A}from"./chunk-3X6IBUBX.js";import{m as Ye,p as Ze}from"./chunk-DW37EVX5.js";import{e as Xe}from"./chunk-5DAIA77C.js";import{c as He}from"./chunk-NQFJOCSF.js";import{a as qe}from"./chunk-6PL2CCGP.js";import{a as Ke}from"./chunk-HT6GFZOZ.js";import{b as se,d as Te}from"./chunk-XXNLYR64.js";import{b as _e,f as Oe,g as B,h as $,i as M,k as Be,l as ae,m as le,o as Me,p as De,q as U,r as P,s as E}from"./chunk-GUI3PDH2.js";import{f as Ee}from"./chunk-77ZHQJZR.js";import{a as Ue}from"./chunk-IZKHOM37.js";import{D as Ce,M as oe,P as ie,R as O,T as Re,l as re}from"./chunk-YXXKSL6R.js";import{a as ne}from"./chunk-5NMCF5VF.js";import{spawn as ct,spawnSync as dt}from"node:child_process";import T from"node:fs";import Nt from"node:os";import C from"node:path";import{WebSocket as pe}from"ws";var tt=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Tt(e){let n=e.trim();if(!n)throw new Error("expected <url-or-route>");return tt.test(n)||n.startsWith("/")?n:`/${n}`}function nt(e){let n=e.trim();return n?n.startsWith("/")?!0:tt.test(n)?!/^https?:\/\//i.test(n):!1:!1}async function rt(e,n){let t=Tt(n),r=await e.send({type:"call",path:"SootSim.bridges.test.openDeepLink",args:[t]});if(r!==null&&typeof r=="object"&&Reflect.get(r,"ok")===!1){let o=Reflect.get(r,"error");throw new Error(typeof o=="string"?o:"deep-link dispatch failed")}return t}function ot(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 _t(e,n){return e?.includes("/one/metro-entry.bundle")?"one":typeof n=="string"&&n?"expo":"unknown"}function Ot(e,n,t){return`${e}//${n}:${t}`}function Bt(e){if(typeof window>"u")return!1;try{let n=new URL(e);return I(n.hostname)&&I(window.location.hostname)&&n.origin!==window.location.origin}catch{return!1}}async function it(e,n){let t={...n,cache:n?.cache??"no-store"};return Bt(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,t):fetch(e,t)}function Mt(e){return e==="https:"?443:80}function Dt(e){let n=e.pathname||"/";return(n==="/"||n==="")&&!e.search&&!e.hash}async function st(e){try{let n=await fetch("/__server-scan",{cache:"no-store"});if(!n.ok||!(n.headers.get("content-type")||"").toLowerCase().includes("json"))return null;let t=await n.json();if(!Array.isArray(t))return null;let r=t.find(o=>!!o&&typeof o=="object"&&o.port===e&&typeof o.bundleUrl=="string");return r?{bundleUrl:ue(r.bundleUrl),port:e,framework:typeof r.framework=="string"?r.framework:"unknown",projectName:typeof r.projectName=="string"?r.projectName:void 0}:null}catch{return null}}async function at(e,n){let t=e.replace(/\/+$/,"");try{let r=await it(`${t}/`,{headers:{"expo-platform":"ios"}});if(r.ok){let o=await r.json(),i=o?.extra?.expoClient||o?.extra||{},a=typeof o?.launchAsset?.url=="string"?o.launchAsset.url:void 0,s=a?Ne(a,t):void 0;if(s||i.name)return{bundleUrl:ue(s||`${t}${de}`),port:n,framework:_t(s,i.sdkVersion),projectName:i.name}}}catch{}try{let r=await it(`${t}/status`);if(r.ok&&(await r.text()).includes("packager-status:running"))return{bundleUrl:`${t}${de}`,port:n,framework:"metro"}}catch{}return null}async function At(e,n){try{if(I(new URL(e).hostname)){let t=await st(n);if(t)return t}}catch{}return at(e,n)}async function Lt(e){let n=await st(e);return n||((await Promise.all(Ae.map(r=>at(Le("http:",r,e),e)))).find(r=>r!==null)??null)}async function lt(e){let n=e.trim();if(/^\d+$/.test(n)){let s=parseInt(n,10),l=await Lt(s);if(l)return l;throw ot(`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):Mt(o),a=Ot(o,r.hostname,i);if(Dt(r)){let s=await At(a,i);if(s)return s;throw ot(a)}return{bundleUrl:r.toString(),port:i,framework:"unknown"}}var Ft=12e4,ut=100,jt=5e3,mt=1e4,Ht={rn:"/rn",connectrn:"/rn","connect-rn":"/rn",clock:"/app/clock","native-ui":"/app/native-ui",tamagui:"/app/tamagui",settings:"/app/settings",photos:"/app/photos",camera:"/app/camera"};function S(e){return new Promise(n=>setTimeout(n,e))}function pt(e){let n=process.env[e]?.trim();if(!n)return null;let t=Number(n);return Number.isInteger(t)&&t>0?t:null}function Wt(){let e=pt("SOOTSIM_DRIVER_CONNECT_TIMEOUT_MS")??pt("SOOTSIM_PW_CONNECT_TIMEOUT_MS")??Ft;return{timeoutMs:e,hostTimeoutMs:e+jt,intervalMs:ut,attempts:Math.max(1,Math.ceil(e/ut))}}function ft(e){return e==="electron"||e==="playwright"}function fe(e,n){return n==="playwright"?e.meta?.sootsimHostDriver==="playwright":e.userAgent?.includes("Electron/")===!0}function Kt(e,n){return e.includes("--headless")?!0:e.includes("--headed")?!1:n==="playwright"&&process.platform==="linux"&&!process.env.DISPLAY&&!process.env.WAYLAND_DISPLAY?(console.error(" no display detected \u2192 running playwright headless (override with --headed)"),!0):!1}function z(e){return e.trim()}async function qt(e,n=!1){let t=ie();gt(e,n,t);let r=ae(e);if((n||r!==null)&&await ge(e,250))return e;if(t&&O(t)&&await ge(t.bridgePort,500))return t.bridgePort;if(t&&O(t))throw new Error(`rnx bridge lockfile is fresh (port ${t.bridgePort}) but the bridge is not reachable. run \`rnx daemon restart\` or \`rnx daemon uninstall\`.`);await Vt();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()+mt;for(;Date.now()<a;){let s=ie();if(gt(e,n,s),s&&O(s)&&await ge(s.bridgePort,250))return console.error(` Started a local bridge on port ${s.bridgePort}. Run \`rnx daemon install\` to keep it ready between commands.`),s.bridgePort;if(i)throw new Error(`rnx bridge exited before becoming ready (exit ${i})`);await S(150)}throw new Error(`rnx bridge did not start within ${Math.round(mt/1e3)}s`)}function gt(e,n,t){if(!(!n||!t||!O(t)||t.bridgePort===e))throw new Error(`${ne.commandName} open: requested bridge port ${e}, but the active daemon owns port ${t.bridgePort}. explicit --port never selects another bridge; stop that daemon or use an isolated SOOTSIM_HOME.`)}async function Vt(){let e=oe();if(e&&T.existsSync(re(e)))return;console.error(" installing rnx engine runtime...");let{runRuntime:n}=await import("./runtime-IC6NVVGA.js");await n(["install"],{})}function zt(e){let n=process.argv[1];return n&&T.existsSync(n)?ct(process.execPath,[n,...e],{detached:!0,stdio:"ignore",env:process.env}):ct(ne.commandName,e,{detached:!0,stdio:"ignore",env:process.env})}function ge(e,n){return new Promise(t=>{let r=new pe(`ws://127.0.0.1:${e}`,{handshakeTimeout:n}),o=!1,i=a=>{o||(o=!0,r.readyState===pe.OPEN?r.close():r.readyState===pe.CONNECTING&&r.terminate(),t(a))};r.once("open",()=>i(!0)),r.on("error",()=>i(!1)),setTimeout(()=>i(!1),n)})}function we(e){try{let n=new URL(e),t=n.pathname.replace(/\/+$/,"")||"/";return n.searchParams.has("open")||n.searchParams.has("port")||n.searchParams.has("bundle")||n.searchParams.has("demo")||n.pathname.includes("/sootsim/index.html")||t==="/sootsim"||n.pathname==="/__soot"||n.pathname==="/__soot/"||t==="/rn"||/^\/rn\/[^/]+$/i.test(t)||/^\/app\/[^/]+$/i.test(t)||t==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(t)||/^\/__soot\/app\/[^/]+$/i.test(t)}catch{return!1}}function Gt(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 Jt(e,n){let t=new URL(e,"http://sootsim.local"),r=new URL(n),o=G(r.pathname),i=t.pathname.startsWith("/__soot/")?t.pathname.slice(7):t.pathname;return r.pathname=`${o}${i}`,r.search=t.search,r.hash=t.hash,r.toString()}function Qt(e){try{let n=new URL(e).pathname.replace(/\/+$/,"")||"/";return/^\/preview\/[^/]+$/.test(n)||/^\/build\/.+/.test(n)}catch{return!1}}async function ar(e){let n=z(e);return(await ve(n)).bundleUrl}function Yt(e){try{let n=new URL(e.startsWith("http")?e:`http://${e}`),t=n.pathname||"/";if(t!=="/"&&t!==""||n.search||n.hash||!I(n.hostname))return null;let r=n.port?Number(n.port):n.protocol==="https:"?443:80;return Number.isFinite(r)&&r>0?r:null}catch{return null}}async function ve(e){let n=z(e),t=/^\d+$/.test(n)?Number(n):Yt(n);if(t&&t>0){let r=await je(t);if(r)return{bundleUrl:r.bundleUrl,port:r.port,framework:r.framework,projectName:r.projectName}}return lt(n)}function G(e){let n=e.replace(/\/+$/,"")||"/";return n==="/__soot"||n.startsWith("/__soot/")?"/__soot":""}function Zt(e,n){let t=z(e),r=new URL(n),o=G(r.pathname);return r.pathname=`${o}/rn`,r.searchParams.delete("bundle"),r.searchParams.delete("demo"),r.searchParams.delete("app"),r.searchParams.delete("open"),r.searchParams.delete("port"),/^\d+$/.test(t)?r.pathname=`${o}/rn/${t}`:(r.pathname=`${o}/rn`,r.searchParams.set("open",t)),r.toString()}function St(e){let n=z(e);return/^\d+$/.test(n)||/^https?:\/\//i.test(n)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(n)}async function Xt(e,n,t={}){let r=t.resolvedBundle??await ve(e),o=new URL(n),i=G(o.pathname);o.pathname=`${i}/rn`,o.searchParams.delete("open"),o.searchParams.delete("port"),o.searchParams.delete("demo"),o.searchParams.delete("app");let a=t.hot===void 0?r.bundleUrl:Fe(r.bundleUrl,t.hot);return o.searchParams.set("bundle",a),o.toString()}function en(e){return e.startsWith("~/")?C.join(Nt.homedir(),e.slice(2)):C.isAbsolute(e)?e:C.resolve(process.cwd(),e)}function tn(e){let n={},t={};for(let o=0;o<e.length;o++){if(e[o]==="--replace"){let i=e[o+1];i||(console.error(" rnx open: --replace expects <module>=<file>"),process.exit(1));let a=i.indexOf("=");(a<=0||a===i.length-1)&&(console.error(" rnx open: --replace expects <module>=<file>"),process.exit(1));let s=i.slice(0,a).trim(),l=en(i.slice(a+1).trim());T.existsSync(l)||(console.error(` rnx open: replacement file not found: ${l}`),process.exit(1)),n[s]={file:l},o++;continue}if(e[o]==="--remap"){let i=e[o+1],a=i?i.indexOf("="):-1;(!i||a<=0||a===i.length-1)&&(console.error(" rnx open: --remap expects <host:port>=<host:port>"),process.exit(1)),t[i.slice(0,a).trim()]=i.slice(a+1).trim(),o++;continue}}let r={};return Object.keys(n).length>0&&(r.modules=n),Object.keys(t).length>0&&(r.network={remap:t}),r.modules||r.network?r:void 0}async function nn(e){if(!e)return null;let n=await ze(e.bundleUrl);return n?Ke(n):null}async function rn(e){if(T.existsSync(C.join(re(e),"index.html")))return;console.error(` installing configured engine runtime ${e}...`);let n=await Ee.install({version:e,setActive:!1,protectVersions:Re()});console.error(` installed engine runtime ${n.version}`)}function on(e,n){let t=n??(me()?void 0:oe()??void 0);if(!t)return e;let r=new URL(e);if(!I(r.hostname)){if(!n)return e;throw new Error(`runtimeVersion ${t} requires a local rnx host; got ${r.origin}`)}return r.hostname=We(t),r.toString()}function xt(){return Be().shellBaseUrl}function sn(e){return ae(e)?.shellBaseUrl??_e(e)??xt()}async function an(e,n){try{let t=new URL(e),r=t.searchParams.get("bundle")||"";if(!r||!n)return e;let o=Ve({bundleUrl:r,projectDir:n.appDir});if(o.length===0)return e;let i=await ln(o);return i.length===0?e:(t.searchParams.set("appFonts",Ge(i)),t.toString())}catch{return e}}async function ln(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 cn(e,n,t={}){if(!e)return new URL(n).toString();if(we(e))return new URL(e).toString();if(Gt(e))return Jt(e,n);let r=Ht[e.toLowerCase()];if(r){let o=new URL(n),i=G(o.pathname);return o.pathname=`${i}${r}`,o.toString()}return St(e)?Xt(e,n,t):Zt(e,n)}async function dn(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});return!o||o.imageUrl&&!await un(o.imageUrl)?e:(t.searchParams.set("appSplash",Qe(o)),t.toString())}catch{return e}}async function un(e){let n=new AbortController,t=setTimeout(()=>n.abort(),1500);try{let r=await fetch(e,{method:"HEAD",signal:n.signal});return r.status>=200&&r.status<400}catch{return!1}finally{clearTimeout(t)}}async function V(e,n=xt(),t={}){let r=await cn(e,n,t),o=await dn(await an(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 ht(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 mn(e,n,t,r={}){let o=new URL(await V(e,n,r));return o.searchParams.set("inspectOpen",t),o.toString()}async function pn(e,n,t,r={}){let o=r.attempts??30,i=r.intervalMs??500,a=r.minNodeCount??10;for(let s=0;s<o;s++){let l=P(e,{commandTimeoutMs:n,simId:t,simIdSource:"flag"});try{let 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 S(i)}return null}function fn(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 gn(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 lr(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 ${gn(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=fn(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=hn(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: ${wt(Date.now()-t.connectedAt)}`),t.lastActiveAt&&t.lastActiveAt>0&&console.log(` last active: ${wt(Date.now()-t.lastActiveAt)}`)}}function hn(e){let n=e.url||e.origin||"";if(!n)return null;try{let t=new URL(n).port;return t==="5173"?"dev \u2014 local source (:5173)":t==="3000"?"Contrast app embedded (:3000)":me()?`dev \u2014 local build (:${t||"?"})`:`runtime \u2014 published engine (:${t||"?"})`}catch{return null}}function wt(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 cr(e,n,t,r={}){let o=r.attempts??30,i=r.intervalMs??500;for(let a=0;a<o;a++){let s=P(e,{commandTimeoutMs:n});try{let c=(await s.listSims()).find(t);if(c)return c}catch{}finally{s.close()}await S(i)}return null}async function wn(e,n,t,r,o={}){let i=o.attempts??30,a=o.intervalMs??500,s=!!r&&Number.isInteger(r)&&r>1,l=()=>s&&r!==void 0&&!be(r);for(let c=0;c<i;c++){if(l())return{kind:"host-exit"};let u=P(e,{commandTimeoutMs:n});try{let g=(await u.listSims()).find(t);if(g)return l()?{kind:"host-exit"}:{kind:"match",sim:g}}catch{}finally{u.close()}if(l())return{kind:"host-exit"};await S(a)}return{kind:"timeout"}}async function bn(e,n,t,r={}){let o=r.attempts??20,i=r.intervalMs??250;for(let a=0;a<o;a++){let s=P(e,{commandTimeoutMs:n});try{let c=(await s.listSims()).find(u=>u.id===t);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{s.close()}await S(i)}return!1}function vn(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 yn(e){if(!e.connectAckFile)return!1;try{return T.writeFileSync(e.connectAckFile,`${JSON.stringify({connectedAt:Date.now(),pid:e.pid??null})}
6
+ `,{flag:"w"}),!0}catch{return!1}}function bt(e){if(e.diagnosticLogPath)try{let n=T.readFileSync(e.diagnosticLogPath,"utf8").trim();if(!n){console.error(` ${C.basename(e.diagnosticLogPath)} was empty`);return}let t=n.length>4e3?`\u2026
7
+ ${n.slice(-4e3)}`:n;console.error(` ${C.basename(e.diagnosticLogPath)}:`),console.error(t)}catch(n){let t=n instanceof Error?n.message:String(n);console.error(` failed to read ${C.basename(e.diagnosticLogPath)}: ${t}`)}}function be(e){try{return process.kill(e,0),!0}catch(n){return n?.code==="EPERM"}}async function Sn(e,n=2500){let t=Date.now()+n;for(;Date.now()<t;){if(!be(e))return!0;await S(100)}return!be(e)}function xn(e){let n=dt("ps",["-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),t=dt("ps",["eww","-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(n.status!==0||t.status!==0)return!1;let r=(n.stdout||"").trimEnd(),o=(t.stdout||"").trimEnd();return(o.startsWith(r)?o.slice(r.length):o).includes("SOOTSIM_PW_URL=")}async function he(e,n){let t=new Set(n),r=new Set;for(let o of e){if(!t.has(o.id))continue;let i=vn(o);i&&r.add(i)}for(let o of r){if(!xn(o)){console.log(` skipped pid ${o}: not a rnx playwright host (stale sim record)`);continue}try{process.kill(o,"SIGTERM")}catch{}if(await Sn(o)){console.log(` closed playwright host process ${o}`);continue}try{process.kill(o,"SIGKILL"),console.log(` force-closed playwright host process ${o}`)}catch{}}}function J(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 vt(e,n,t,r=!1){let[o,i]=[e,n.url].map(a=>{if(!a)return a;try{let s=new URL(a);if(s.searchParams.has("sootsimConfig"))return s.searchParams.set("sootsimConfig","[redacted]"),s.toString()}catch{}return a});if(r){console.log(` Opened ConnectRN [${t}]`);return}console.log(` ${t==="current sim"?"loaded":"opened"}: ${o} [${t}]`),console.log(` current sim: ${n.id}`),console.log(JSON.stringify({simId:n.id,url:i},null,2))}async function yt(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 $n(e,n,{stableMs:150,maxMs:400});let o=P(e,{commandTimeoutMs:3e3,simId:n,cliLabel:"open --describe",simIdSource:"flag"});try{let i=null;try{i=await o.send({type:"evaluate",code:Ye})}catch{}if(i&&!(i.flag===!0&&!i.loadingText&&Ze(i))){let u=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: ${u} (nodes: ${i.nodes}, targets: ${i.targets})`),console.log(" before interacting, run: rnx wait ready --max-ms 120000")}let s=`(async () => {
8
+ const t = window.__sootsimTest
9
+ const ms = window.SootSim?.bridges?.mainShell
10
+ if (!t) return null
11
+ let shell = null
12
+ try { shell = ms?.getState ? await ms.getState() : null } catch {}
13
+ const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
14
+ return { tree, shell }
15
+ })()`,l=await o.send({type:"evaluate",code:s});if(!l?.tree)return;if(console.log(""),l.shell?.state){let c=[`state=${l.shell.state}`,l.shell.activeApp?`app=${l.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${c.join(" ")}`)}console.log(l.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 $n(e,n,t){let r=Date.now()+t.maxMs,o="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",i=P(e,{commandTimeoutMs:2e3,simId:n,simIdSource:"flag"});try{let a=-1,s=0;for(;Date.now()<r;){let l=-1;try{let 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 S(50)}}finally{i.close()}}async function Pn(e,n={}){let t=U(e,{port:n.port,commandTimeoutMs:n.timeoutMs});t.positional.length!==1&&(console.error(" rnx open: expected exactly one <url-or-route>"),console.error(" examples: rnx open /settings | rnx open myapp://settings"),process.exit(1));let r=E(t),o=t.simId?` --sim ${t.simId}`:"";try{let i=await rt(r,t.positional[0]??"");console.log(` opened deep link: ${i}`)}catch(i){console.error(` link failed: ${i instanceof Error?i.message:String(i)}`),await A(r,{errorsCommand:`rnx get errors 5${o}`,warningsCommand:`rnx get warnings 5${o}`,requestsCommand:`rnx get requests 5${o}`}),process.exit(1)}finally{r.close()}}async function dr(e,n={}){let t=U(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--new","--headless","--headed","--ephemeral","--hot","--no-hmr","--no-describe","--quiet"],stripValueFlags:["--base-url","--replace","--driver","--profile","--cdp-port","--device","--viewport"]}),r=e.find((p,m)=>e[m-1]==="--profile"),o=e.includes("--quiet"),i=e.includes("--ephemeral"),a=e.find((p,m)=>e[m-1]==="--cdp-port"),s=a?Number(a):void 0;a&&(!Number.isFinite(s)||s<=0)&&(console.error(` rnx open: --cdp-port must be a positive port number, got "${a}"`),process.exit(1)),r&&i&&(console.error(" rnx open: --profile cannot be combined with --ephemeral"),process.exit(1));let l=r?He(r).id:void 0,c=e.includes("--new")||!!l||i,u=tn(e);c&&t.simIdSource==="flag"&&(console.error(" rnx open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let d=t.positional[0]||"";if(nt(d)){c&&(console.error(" rnx open: deep links target the current app; remove --new, --profile, or --ephemeral"),process.exit(1)),await Pn(e,n);return}if(Qt(d)){let p=(()=>{try{return I(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 et(d,{background:!1})}catch(m){console.error(` could not launch a browser: ${m instanceof Error?m.message:String(m)}`),console.error(` open it yourself: ${d}`),process.exit(1)}console.log(p?" to drive it under the CLI, point `rnx open` at the app\u2019s dev port instead (e.g. `rnx open 8081`).":" the CLI can\u2019t drive a remote preview (the engine only attaches to the local bridge from localhost). to drive the app, run it locally and `rnx open <port>`.");return}let g=St(d)?await ve(d):void 0,L=await nn(g),Q=await qe(L),N=Q?.runtimeVersion,F=ce(ce(Q?{...Q,runtimeVersion:void 0}:void 0,n.runtimeConfig),u);N&&await rn(N);let Y=e.find((p,m)=>e[m-1]==="--base-url");if(Y&&!t.explicitPort){let p=le(Y);p&&(t.wsPort=p)}t.wsPort=await qt(t.wsPort,t.explicitPort);let _=e.find((p,m)=>e[m-1]==="--driver")||"";_&&!ft(_)&&(console.error(` unknown driver "${_}" \u2014 run \`rnx list --drivers\``),process.exit(1));let b=ft(_)?_:process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"||Ue()||!process.stdin.isTTY?"playwright":Ce()||"playwright",Pt=Kt(e,b);s&&b!=="playwright"&&(console.error(" rnx open: --cdp-port is only honored by the playwright driver"),process.exit(1));let ye=e.includes("--hot"),Se=e.includes("--no-hmr");ye&&Se&&(console.error(" rnx open: --hot and --no-hmr cannot be combined"),process.exit(1));let It=ye?!0:Se?!1:b!=="playwright",k=e.find((p,m)=>e[m-1]==="--device");k&&!(k in se)&&(console.error(` rnx open: unknown device "${k}"`),console.error(` known devices: ${Te().join(", ")}`),process.exit(1));let Z=k?se[k]:void 0,j=e.find((p,m)=>e[m-1]==="--viewport"),H=j?/^(\d+)x(\d+)$/.exec(j):null;j&&!H&&(console.error(` rnx open: --viewport must be <width>x<height>, got "${j}"`),process.exit(1));let kt=H?{width:Number(H[1]),height:Number(H[2])}:void 0,W={hot:It,device:k,resolvedBundle:g,project:L},Ct=N?`http://localhost:${t.wsPort}/`:Y||sn(t.wsPort),x=on(Ct,N),xe=e.includes("--base-url");Me(t.wsPort,x);let Rt=B();if(!c){let p=E(t),m=t.simId?` --sim ${t.simId}`:"",te=!1;try{let f=null,q=null;try{let h=await p.listSims();if(t.simIdSource==="saved")f=h.find(w=>w.id===Rt&&w.readyState==="open"&&fe(w,b))??null,f||M();else if(t.simIdSource==="flag"&&(f=J(h,t.simId),!fe(f,b)))throw new Error(`sim ${f.id} is not managed by the ${b} driver`);if(!f&&t.simIdSource!=="flag"){q=await V(d,D(x,F),W);let w=new URL(q);w.searchParams.delete("inspectOpen"),f=h.find(y=>{if(y.readyState!=="open"||!y.url||!fe(y,b))return!1;try{let ke=new URL(y.url);return ke.searchParams.delete("inspectOpen"),ke.toString()===w.toString()}catch{return!1}})??null}if(!f)if(t.simIdSource!=="flag")te=!0;else throw new Error("no sim connected");if(!te&&f){let w=xe||we(d)?x:ht(f,x),y=q??await V(d,D(w,F),W);p.send({type:"evaluate",simId:f.id,code:`window.location.href = ${JSON.stringify(y)}`}).catch(()=>{})}}catch(h){console.error(` open failed: ${h instanceof Error?h.message:String(h)}`),await A(p,{errorsCommand:`rnx get errors 5${m}`,warningsCommand:`rnx get warnings 5${m}`,requestsCommand:`rnx get requests 5${m}`}),process.exit(1)}if(!te&&f){await S(1500);let h=await pn(t.wsPort,t.commandTimeoutMs,f.id);h||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),h.bridge.close(),$(f.id);let w=xe||we(d)?x:ht(f,x),y=q??await V(d,D(w,F),W);return vt(y,{...f,url:y},"current sim",o),await yt(t.wsPort,f.id,e),t.wsPort}}finally{p.close()}}let Ut=D(x,F),$e=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,Pe=await mn(d,Ut,$e,W),Ie=Oe();Ie||(console.error(" could not resolve a stable owning process; refusing unsupervised sim host"),process.exit(1));let Et=p=>p.url?.includes(`inspectOpen=${$e}`)??!1,R=Xe(b);R||(console.error(` unknown driver "${b}" \u2014 run \`rnx list --drivers\``),process.exit(1));let K=Wt(),v=await R.launch({url:Pe,bridgePort:le(x)??t.wsPort,headless:Pt,profileId:l,ephemeralProfile:i,cdpPort:s,device:k,ownerPid:Ie,viewport:kt??(Z?{width:Z.width+120,height:Z.height+60}:void 0),connectTimeoutMs:K.hostTimeoutMs});v.launched||(console.error(` ${R.name} driver: ${v.message}`),process.exit(1));let X=await wn(t.wsPort,t.commandTimeoutMs,Et,v.pid,{attempts:K.attempts,intervalMs:K.intervalMs});if(X.kind==="host-exit"&&(bt(v),console.error(` ${R.name} host crashed \u2014 sim is no longer attached`),process.exit(1)),X.kind==="timeout"){if(v.pid)try{process.kill(v.pid,"SIGTERM"),console.error(` closed ${R.name} host process ${v.pid}`)}catch{}bt(v),console.error(` timed out after ${K.timeoutMs}ms waiting for opened sim to connect`),process.exit(1)}let ee=X.sim;return $(ee.id),yn(v),vt(Pe,ee,`${R.name} driver`,o),await yt(t.wsPort,ee.id,e),t.wsPort}async function $t(e,n={}){let t=U(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--force"]}),r=e.includes("--force"),o=E(t),i=t.simId?` --sim ${t.simId}`:"";try{try{let a=await o.listSims(),s=J(a,t.positional[0]||t.simId);if(s.lockedBy&&s.lockExpiresAt&&s.lockExpiresAt>Date.now()){let l=Math.max(0,Math.round((s.lockExpiresAt-Date.now())/1e3));s.lockedByKind==="user-active"&&(console.error(` refused: ${s.id} is locked by the active user (${l}s) \u2014 that's a live human tab`),console.error(" run `rnx open --new` for a fresh investigation sim"),process.exit(1)),r||(console.error(` refused: ${s.id} is leased by ${s.lockedBy} (${l}s)`),console.error(` \`sootsim use ${s.id} --force\` to take it, or \`rnx open --new\` for a fresh sim`),process.exit(1))}await o.focusSim(s.id),$(s.id),console.log(` using: ${s.id}`)}catch(a){console.error(` use failed: ${a instanceof Error?a.message:String(a)}`),await A(o,{errorsCommand:`rnx get errors 5${i}`,warningsCommand:`rnx get warnings 5${i}`,requestsCommand:`rnx get requests 5${i}`}),process.exit(1)}}finally{o.close()}}async function ur(e,n={}){await $t(e,n)}async function mr(e,n={}){await $t(e,n)}async function pr(e,n={}){let t=U(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--force"]}),r=e.includes("--force"),o=E(t);try{try{let i=await o.listSims(),a=J(i,t.positional[0]||t.simId),s=r&&a.lockedBy&&a.lockedByKind!=="user-active"?a.lockedBy:null,l=await o.claim(a.id,{force:r});$(a.id);let 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 De){let a=Math.max(0,Math.round(i.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${i.lock.by} for ${a}s more`),console.error(" use --force to take it, or `rnx open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}}finally{o.close()}}async function In(e,n,t,r){if(r.length===0)return{closed:[],remaining:[]};await Promise.all(r.map(i=>e.closeSim(i).catch(()=>{})));let o=new Set(r);for(let i=0;i<40;i++){let a=[];try{let s=P(n,{commandTimeoutMs:t});try{a=(await s.listSims()).filter(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 S(250)}return{closed:[...o],remaining:[]}}function kn(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(g=>g.id===o);d?l=d.id:c=o}else if(i&&a)l=i;else{let d=t.find(g=>g.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 fr(e,n={}){let t=U(e,{port:n.port,commandTimeoutMs:n.timeoutMs,stripBooleanFlags:["--all","--others"]}),r=E(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=kn(s,{closeOthers:a,explicitKeepId:c,savedKeepId:l});if(u.staleSavedId&&M(),u.fallbackKeepId&&($(u.fallbackKeepId),console.log(` saved sim ${u.staleSavedId} is gone \u2014 keeping primary ${u.fallbackKeepId}`)),u.missingExplicitKeepId&&(console.error(` close failed: keep sim ${u.missingExplicitKeepId} is not connected; not closing other sims`),process.exit(1)),u.targets.length===0){console.log(u.keepId?` nothing to close \u2014 only the kept sim ${u.keepId} is connected`:u.staleSavedId?` nothing to close \u2014 no sims connected (cleared stale current sim ${u.staleSavedId})`:" nothing to close \u2014 no sims connected");return}let d=await In(r,t.wsPort,t.commandTimeoutMs,u.targets);await he(s,u.targets);let g=B();g&&d.closed.includes(g)&&(u.keepId?$(u.keepId):M());let L=` closed ${d.closed.length} sim(s)${u.keepId?` (kept ${u.keepId})`:""}`;console.log(L),d.remaining.length>0&&(console.error(` close failed: still connected: ${d.remaining.join(", ")}`),process.exit(1))}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}finally{r.close()}return}try{try{let s=await r.listSims(),l=J(s,t.positional[0]||t.simId),c=s.find(d=>d.id!==l.id&&d.readyState==="open");await r.closeSim(l.id),await bn(t.wsPort,t.commandTimeoutMs,l.id)||(await he(s,[l.id]),console.error(` close failed: ${l.id} is still connected`),process.exit(1)),await he(s,[l.id]),B()===l.id&&(c?$(c.id):M()),console.log(` closed: ${l.id}`)}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await A(r,{errorsCommand:`rnx get errors 5${o}`,warningsCommand:`rnx get warnings 5${o}`,requestsCommand:`rnx get requests 5${o}`}),process.exit(1)}}finally{r.close()}}export{Wt as a,qt as b,ar as c,on as d,xt as e,sn as f,V as g,mn as h,fn as i,lr as j,cr as k,wn as l,vn as m,yn as n,he as o,Pn as p,dr as q,ur as r,mr as s,pr as t,In as u,kn as v,fr as w};
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
4
  function t(_){return`(async () => {
@@ -1,7 +1,7 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{b as $}from"./chunk-NEH4T67X.js";import{n as x}from"./chunk-ZGH5U4AJ.js";import{b as y,c as R,d as f,e as w,f as a}from"./chunk-MRNW4GVL.js";import{L as g,M as u,N as d,T as h,l as p}from"./chunk-FHWZPUGC.js";import O from"fs";import{WebSocket as E}from"ws";function C(t){if(!t||typeof t!="object")return!1;let e=Reflect.get(t,"sections");return typeof Reflect.get(t,"title")=="string"&&Array.isArray(e)&&e.every(o=>o&&typeof o=="object"&&typeof Reflect.get(o,"title")=="string"&&Array.isArray(Reflect.get(o,"items"))&&Reflect.get(o,"items").every(n=>n&&typeof n=="object"&&typeof Reflect.get(n,"summary")=="string"&&typeof Reflect.get(n,"hash")=="string"))}async function b(t,e=fetch){try{let o=new URL(w);o.searchParams.set("version",t);let n=await e(o,{headers:{accept:"application/json"},signal:AbortSignal.timeout(5e3)});if(!n.ok)return null;let s=await n.json();if(!s||typeof s!="object")return null;let i=Reflect.get(s,"entries");return!Array.isArray(i)||!C(i[0])?null:i[0]}catch{return null}}function A(t,e){let o=[`what's new in rnx engine v${t}:`];if(!e||e.sections.length===0)o.push(" release notes are not available yet");else for(let n of e.sections){o.push(` ${n.title}:`);for(let s of n.items)o.push(` \u2022 ${s.summary}`)}return o.push(` full changelog: ${f}`),o.join(`
4
+ import{b as $}from"./chunk-6PL2CCGP.js";import{n as x}from"./chunk-GUI3PDH2.js";import{b as y,c as R,d as f,e as w,f as a}from"./chunk-77ZHQJZR.js";import{L as g,M as u,N as d,T as h,l as p}from"./chunk-YXXKSL6R.js";import O from"fs";import{WebSocket as E}from"ws";function C(t){if(!t||typeof t!="object")return!1;let e=Reflect.get(t,"sections");return typeof Reflect.get(t,"title")=="string"&&Array.isArray(e)&&e.every(o=>o&&typeof o=="object"&&typeof Reflect.get(o,"title")=="string"&&Array.isArray(Reflect.get(o,"items"))&&Reflect.get(o,"items").every(n=>n&&typeof n=="object"&&typeof Reflect.get(n,"summary")=="string"&&typeof Reflect.get(n,"hash")=="string"))}async function b(t,e=fetch){try{let o=new URL(w);o.searchParams.set("version",t);let n=await e(o,{headers:{accept:"application/json"},signal:AbortSignal.timeout(5e3)});if(!n.ok)return null;let s=await n.json();if(!s||typeof s!="object")return null;let i=Reflect.get(s,"entries");return!Array.isArray(i)||!C(i[0])?null:i[0]}catch{return null}}function A(t,e){let o=[`what's new in rnx engine v${t}:`];if(!e||e.sections.length===0)o.push(" release notes are not available yet");else for(let n of e.sections){o.push(` ${n.title}:`);for(let s of n.items)o.push(` \u2022 ${s.summary}`)}return o.push(` full changelog: ${f}`),o.join(`
5
5
  `)}async function Q(t,e={}){let[o,...n]=t;if(!o||o==="--help"||o==="-h"){S();return}switch(o){case"install":return L(n,e);case"list":return j(n);case"use":return T(n);case"remove":return D(n);case"which":return G();case"notes":return U(n);default:console.error(` unknown runtime subcommand: ${o}`),S(),process.exit(1)}}function S(){console.log(`
6
6
  rnx runtime \u2014 manage engine runtimes under ~/.sootsim/runtimes/
7
7
 
@@ -27,4 +27,4 @@ examples:
27
27
  rnx runtime install --channel beta
28
28
  rnx runtime use 1.2.3
29
29
  rnx runtime notes
30
- `)}async function L(t,e){let{version:o,flags:n}=F(t),s=n.channel??e.channel??"stable",i=n.force===!0,l=n.setActive!==!1;g(),console.log("rnx runtime install"),console.log(` cdn: ${a.resolveCdnOrigin()}`);try{let r=await a.install({version:o,channel:s,force:i,setActive:l,protectVersions:h()});return console.log(` version: ${r.version} (channel: ${r.channel})`),r.installed?console.log(` installed ${r.version}`):console.log(` already installed at ${r.runtimeDir}`),l&&await k(r.version),r}catch(r){console.error(` ${I(r)}`),process.exit(1)}}async function k(t){d(t),console.log(` active: ${t}`),await _(t)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${t})`)}async function _(t){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-PAJMZCOS.js"),n=o();if(!e(n))return!1;let s=x();return new Promise(i=>{let l=!1,r=!1,m=N=>{l||(l=!0,i(N))},c=new E(`ws://127.0.0.1:${s}`,{handshakeTimeout:800}),v=setTimeout(()=>{try{c.close()}catch{}m(r)},1500);c.on("open",()=>{try{c.send(JSON.stringify({type:"runtime:use",version:t,id:0})),r=!0}catch{}setTimeout(()=>{try{c.close()}catch{}},100)}),c.on("close",()=>{clearTimeout(v),m(r)}),c.on("error",()=>{clearTimeout(v),m(!1)})})}async function j(t){g();let e=a.listInstalled(),o=u();if(console.log("installed:"),e.length===0)console.log(" (none)");else for(let n of e)console.log(` ${n===o?"*":" "} ${n}`);try{let n=await a.fetchManifest();console.log("available (latest per channel):");for(let[i,l]of Object.entries(n.channels))console.log(` ${i.padEnd(8)} ${l.latest}`);let s=Object.keys(n.versions).sort(y).reverse();if(s.length>1){console.log("hosted versions:");for(let i of s)console.log(` ${i}`)}}catch(n){console.log(`available: (could not fetch manifest: ${I(n)})`)}}async function T(t){let e=t[0];e||(console.error(" usage: rnx runtime use <version>"),process.exit(1));let o=a.listInstalled();o.includes(e)||(console.error(` version ${e} is not installed`),console.error(` installed: ${o.join(", ")||"(none)"}`),console.error(` run \`rnx runtime install ${e}\` first`),process.exit(1)),await k(e)}async function D(t){let e=t[0];e||(console.error(" usage: rnx runtime remove <version>"),process.exit(1)),u()===e&&(console.error(` cannot remove active runtime ${e}`),console.error(" switch with `rnx runtime use <other>` first, or install another version"),process.exit(1)),h().includes(e)&&(console.error(` cannot remove runtime ${e} while a project is using it`),process.exit(1));let n=p(e);if(!O.existsSync(n)){console.error(` ${e} is not installed`);return}O.rmSync(n,{recursive:!0,force:!0}),console.log(` removed ${e}`)}async function G(){let t=u();if(!t){console.log(" no active runtime");return}console.log(t)}async function U(t){t.length>0&&(console.error(" usage: rnx runtime notes"),process.exit(1));let{config:e}=await $(),o=e?.runtimeVersion??u();if(!o){console.log(" no active runtime"),console.log(` release notes: ${f}`);return}console.log(A(o,await b(o)))}function F(t){let e={},o=[];for(let n=0;n<t.length;n++){let s=t[n];if(s==="--channel"&&n+1<t.length){e.channel=t[n+1],n++;continue}if(s.startsWith("--channel=")){e.channel=s.slice(10);continue}if(s==="--force"){e.force=!0;continue}if(s==="--set-active=false"||s==="--no-set-active"){e.setActive=!1;continue}o.push(s)}return{version:o[0]??null,flags:e}}function I(t){return t instanceof Error?t.message:String(t)}export{b as a,A as b,Q as c};
30
+ `)}async function L(t,e){let{version:o,flags:n}=F(t),s=n.channel??e.channel??"stable",i=n.force===!0,l=n.setActive!==!1;g(),console.log("rnx runtime install"),console.log(` cdn: ${a.resolveCdnOrigin()}`);try{let r=await a.install({version:o,channel:s,force:i,setActive:l,protectVersions:h()});return console.log(` version: ${r.version} (channel: ${r.channel})`),r.installed?console.log(` installed ${r.version}`):console.log(` already installed at ${r.runtimeDir}`),l&&await k(r.version),r}catch(r){console.error(` ${I(r)}`),process.exit(1)}}async function k(t){d(t),console.log(` active: ${t}`),await _(t)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${t})`)}async function _(t){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-4ICFIGXO.js"),n=o();if(!e(n))return!1;let s=x();return new Promise(i=>{let l=!1,r=!1,m=N=>{l||(l=!0,i(N))},c=new E(`ws://127.0.0.1:${s}`,{handshakeTimeout:800}),v=setTimeout(()=>{try{c.close()}catch{}m(r)},1500);c.on("open",()=>{try{c.send(JSON.stringify({type:"runtime:use",version:t,id:0})),r=!0}catch{}setTimeout(()=>{try{c.close()}catch{}},100)}),c.on("close",()=>{clearTimeout(v),m(r)}),c.on("error",()=>{clearTimeout(v),m(!1)})})}async function j(t){g();let e=a.listInstalled(),o=u();if(console.log("installed:"),e.length===0)console.log(" (none)");else for(let n of e)console.log(` ${n===o?"*":" "} ${n}`);try{let n=await a.fetchManifest();console.log("available (latest per channel):");for(let[i,l]of Object.entries(n.channels))console.log(` ${i.padEnd(8)} ${l.latest}`);let s=Object.keys(n.versions).sort(y).reverse();if(s.length>1){console.log("hosted versions:");for(let i of s)console.log(` ${i}`)}}catch(n){console.log(`available: (could not fetch manifest: ${I(n)})`)}}async function T(t){let e=t[0];e||(console.error(" usage: rnx runtime use <version>"),process.exit(1));let o=a.listInstalled();o.includes(e)||(console.error(` version ${e} is not installed`),console.error(` installed: ${o.join(", ")||"(none)"}`),console.error(` run \`rnx runtime install ${e}\` first`),process.exit(1)),await k(e)}async function D(t){let e=t[0];e||(console.error(" usage: rnx runtime remove <version>"),process.exit(1)),u()===e&&(console.error(` cannot remove active runtime ${e}`),console.error(" switch with `rnx runtime use <other>` first, or install another version"),process.exit(1)),h().includes(e)&&(console.error(` cannot remove runtime ${e} while a project is using it`),process.exit(1));let n=p(e);if(!O.existsSync(n)){console.error(` ${e} is not installed`);return}O.rmSync(n,{recursive:!0,force:!0}),console.log(` removed ${e}`)}async function G(){let t=u();if(!t){console.log(" no active runtime");return}console.log(t)}async function U(t){t.length>0&&(console.error(" usage: rnx runtime notes"),process.exit(1));let{config:e}=await $(),o=e?.runtimeVersion??u();if(!o){console.log(" no active runtime"),console.log(` release notes: ${f}`);return}console.log(A(o,await b(o)))}function F(t){let e={},o=[];for(let n=0;n<t.length;n++){let s=t[n];if(s==="--channel"&&n+1<t.length){e.channel=t[n+1],n++;continue}if(s.startsWith("--channel=")){e.channel=s.slice(10);continue}if(s==="--force"){e.force=!0;continue}if(s==="--set-active=false"||s==="--no-set-active"){e.setActive=!1;continue}o.push(s)}return{version:o[0]??null,flags:e}}function I(t){return t instanceof Error?t.message:String(t)}export{b as a,A as b,Q as c};
@@ -1,7 +1,7 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{a as ot}from"./chunk-RI3NS77J.js";import{a as at}from"./chunk-EAFKG5R3.js";import{e as st}from"./chunk-XPOTXF5Q.js";import{a as ye,b as be,c as rt,d as Se,e as ve,f as nt,g as te,h as it}from"./chunk-YE3M3YD4.js";import{a as tt}from"./chunk-UR345KM3.js";import{g as Ye,h as Xe,p as Ze,r as Qe,v as et}from"./chunk-IWPS3EKJ.js";import{l as Ue}from"./chunk-MACI34ST.js";import{h as Ke,m as qe}from"./chunk-52ES4API.js";import{J as we,m as je,n as We,o as Ve,p as Ge,q as Je}from"./chunk-622E4JET.js";import{b as He}from"./chunk-X5ZOZVHC.js";import{a as De,b as Be,c as Le}from"./chunk-W3UIDI3W.js";import{g as fe,h as Ne,q as me,r as ge,s as Ce}from"./chunk-ZGH5U4AJ.js";import{a as ze}from"./chunk-BGRGP3QR.js";import{b as Rt,d as Mt}from"./chunk-EVBQDQVY.js";var ut=Rt((gr,ct)=>{"use strict";var J=Object.freeze({channelThreshold:24,contentBandInsetFraction:.08,minimumContentPercent:.005}),Ot=3;function lt(i,e){return!i||!e||i.length!==e.length?!1:i.equals(e)}function dt(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("proof content measurement requires an input object");let{data:e,width:t,height:r}=i;if(!e||typeof e.length!="number"||!Number.isInteger(t)||!Number.isInteger(r)||t<=0||r<=0||e.length!==t*r*4)throw new Error("proof content measurement needs RGBA pixels and dimensions");let n=Math.floor(r*J.contentBandInsetFraction),o=Math.ceil(r*(1-J.contentBandInsetFraction)),s=new Uint32Array(1024*32),a=0;for(let g=n;g<o;g++)for(let f=0;f<t;f++){let v=(g*t+f)*4,P=e[v]>>3<<10|e[v+1]>>3<<5|e[v+2]>>3;s[P]++,a++}let l=0;for(let g=1;g<s.length;g++)s[g]>s[l]&&(l=g);let c={red:((l>>10&31)<<3)+4,green:((l>>5&31)<<3)+4,blue:((l&31)<<3)+4},u=0;for(let g=n;g<o;g++)for(let f=0;f<t;f++){let v=(g*t+f)*4;Math.max(Math.abs(e[v]-c.red),Math.abs(e[v+1]-c.green),Math.abs(e[v+2]-c.blue))>=J.channelThreshold&&u++}let m=u/a*100;return{contentPercent:m,contentPixels:u,dominant:c,passedMinimum:m>=J.minimumContentPercent,totalPixels:a}}function _t(i,e){if(!e)return{decision:"continue",content:null};let t=dt(e);return t.passedMinimum?i&&lt(i,e.data)?{decision:"identical",content:t}:{decision:"changed",content:t}:{decision:"insufficient-content",content:t}}ct.exports={PROOF_CONTENT_DEFINITION:J,REQUIRED_IDENTICAL_PROOF_FRAMES:Ot,framesIdentical:lt,measureProofFrameContent:dt,settleDecision:_t}});import*as k from"fs";import{createHash as nr,randomUUID as ir}from"node:crypto";import{tmpdir as Z}from"os";import*as y from"path";import*as I from"fs";import*as S from"path";var X=Mt(ut(),1);var Nt="inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121",ht=1;function Ct(i){let e=Le(i),t=e.scale,r=e.statusBarHeight>0&&!e.dynamicIsland&&e.homeIndicatorHeight===0&&e.cornerRadius===0,n=e.width,o=e.height,s=De(e),a=r?e.width+58:s.frameWidth,l=r?e.height+111+111:s.frameHeight,c=9.5,u=ht,m=a+c*2,g=l+ht*2,f=c+(r?29:s.screenLeft),v=r?111:s.screenTop,P=r?52:s.frameRadius,H=[{side:e.hardwareButtons.lock.side,top:e.hardwareButtons.lock.top,height:e.hardwareButtons.lock.height,width:e.hardwareButtons.width},{side:e.hardwareButtons.ringToggle.side,top:e.hardwareButtons.ringToggle.top,height:e.hardwareButtons.ringToggle.height,width:e.hardwareButtons.width},{side:e.hardwareButtons.volumeUp.side,top:e.hardwareButtons.volumeUp.top,height:e.hardwareButtons.volumeUp.height,width:e.hardwareButtons.width},{side:e.hardwareButtons.volumeDown.side,top:e.hardwareButtons.volumeDown.top,height:e.hardwareButtons.volumeDown.height,width:e.hardwareButtons.width}];return{model:i,renderScale:t,outerWidth:Math.round(m*t),outerHeight:Math.round(g*t),logicalOuterWidth:m,logicalOuterHeight:g,logicalFrameWidth:a,logicalFrameHeight:l,logicalFrameLeft:c,logicalFrameTop:u,logicalScreenWidth:n,logicalScreenHeight:o,logicalScreenLeft:f,logicalScreenTop:v,logicalScreenRadius:r?0:s.screenRadius,logicalFrameRadius:P,frameBackground:r?"linear-gradient(180deg, #1b1c20 0%, #0f1012 42%, #050608 100%)":"#000000",frameOutline:r?"0 0 0 1px #1f2125":"0 0 0 1px #333",metallicRingShadow:r?null:Nt,buttons:H,legacyHomeButton:r?{top:111+e.height+47/2,left:e.width/2-64/2+29,size:64,ring:1.5}:null,showHomeIndicator:e.homeIndicatorHeight>0,logicalHomeIndicatorStripHeight:e.homeIndicatorHeight}}function Ht(i){let e=i.side==="right",t=e?"inset(-3px -3px -3px 0)":"inset(-3px 0 -3px -3px)";return`
4
+ import{a as ot}from"./chunk-2UXU53MG.js";import{a as at}from"./chunk-ZJIS3CTW.js";import{e as st}from"./chunk-34IQM22N.js";import{a as be,b as Se,c as rt,d as ve,e as xe,f as nt,g as te,h as it}from"./chunk-M5QCGLXR.js";import{a as tt}from"./chunk-XJU2QIRY.js";import{f as Ye,g as Xe,o as Ze,q as Qe,u as et}from"./chunk-7B37IZBN.js";import{l as Ue}from"./chunk-EQK5MJCU.js";import{h as Ke,m as qe}from"./chunk-3X6IBUBX.js";import{J as ye,m as je,n as We,o as Ve,p as Ge,q as Je}from"./chunk-DW37EVX5.js";import{b as He}from"./chunk-SA6XVI55.js";import{a as Be,b as Le,c as Ne}from"./chunk-XXNLYR64.js";import{g as fe,h as me,q as ge,r as we,s as Ce}from"./chunk-GUI3PDH2.js";import{a as ze}from"./chunk-I6KIM6PN.js";import{b as Rt,d as Mt}from"./chunk-JHXETDVC.js";var ut=Rt((gr,ct)=>{"use strict";var J=Object.freeze({channelThreshold:24,contentBandInsetFraction:.08,minimumContentPercent:.005}),Ot=3;function lt(i,e){return!i||!e||i.length!==e.length?!1:i.equals(e)}function dt(i){if(!i||typeof i!="object"||Array.isArray(i))throw new Error("proof content measurement requires an input object");let{data:e,width:t,height:r}=i;if(!e||typeof e.length!="number"||!Number.isInteger(t)||!Number.isInteger(r)||t<=0||r<=0||e.length!==t*r*4)throw new Error("proof content measurement needs RGBA pixels and dimensions");let n=Math.floor(r*J.contentBandInsetFraction),o=Math.ceil(r*(1-J.contentBandInsetFraction)),s=new Uint32Array(1024*32),a=0;for(let g=n;g<o;g++)for(let f=0;f<t;f++){let v=(g*t+f)*4,P=e[v]>>3<<10|e[v+1]>>3<<5|e[v+2]>>3;s[P]++,a++}let l=0;for(let g=1;g<s.length;g++)s[g]>s[l]&&(l=g);let c={red:((l>>10&31)<<3)+4,green:((l>>5&31)<<3)+4,blue:((l&31)<<3)+4},u=0;for(let g=n;g<o;g++)for(let f=0;f<t;f++){let v=(g*t+f)*4;Math.max(Math.abs(e[v]-c.red),Math.abs(e[v+1]-c.green),Math.abs(e[v+2]-c.blue))>=J.channelThreshold&&u++}let m=u/a*100;return{contentPercent:m,contentPixels:u,dominant:c,passedMinimum:m>=J.minimumContentPercent,totalPixels:a}}function _t(i,e){if(!e)return{decision:"continue",content:null};let t=dt(e);return t.passedMinimum?i&&lt(i,e.data)?{decision:"identical",content:t}:{decision:"changed",content:t}:{decision:"insufficient-content",content:t}}ct.exports={PROOF_CONTENT_DEFINITION:J,REQUIRED_IDENTICAL_PROOF_FRAMES:Ot,framesIdentical:lt,measureProofFrameContent:dt,settleDecision:_t}});import*as k from"fs";import{createHash as nr,randomUUID as ir}from"node:crypto";import{tmpdir as Z}from"os";import*as y from"path";import*as I from"fs";import*as S from"path";var X=Mt(ut(),1);var Nt="inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121",ht=1;function Ct(i){let e=Ne(i),t=e.scale,r=e.statusBarHeight>0&&!e.dynamicIsland&&e.homeIndicatorHeight===0&&e.cornerRadius===0,n=e.width,o=e.height,s=Be(e),a=r?e.width+58:s.frameWidth,l=r?e.height+111+111:s.frameHeight,c=9.5,u=ht,m=a+c*2,g=l+ht*2,f=c+(r?29:s.screenLeft),v=r?111:s.screenTop,P=r?52:s.frameRadius,H=[{side:e.hardwareButtons.lock.side,top:e.hardwareButtons.lock.top,height:e.hardwareButtons.lock.height,width:e.hardwareButtons.width},{side:e.hardwareButtons.ringToggle.side,top:e.hardwareButtons.ringToggle.top,height:e.hardwareButtons.ringToggle.height,width:e.hardwareButtons.width},{side:e.hardwareButtons.volumeUp.side,top:e.hardwareButtons.volumeUp.top,height:e.hardwareButtons.volumeUp.height,width:e.hardwareButtons.width},{side:e.hardwareButtons.volumeDown.side,top:e.hardwareButtons.volumeDown.top,height:e.hardwareButtons.volumeDown.height,width:e.hardwareButtons.width}];return{model:i,renderScale:t,outerWidth:Math.round(m*t),outerHeight:Math.round(g*t),logicalOuterWidth:m,logicalOuterHeight:g,logicalFrameWidth:a,logicalFrameHeight:l,logicalFrameLeft:c,logicalFrameTop:u,logicalScreenWidth:n,logicalScreenHeight:o,logicalScreenLeft:f,logicalScreenTop:v,logicalScreenRadius:r?0:s.screenRadius,logicalFrameRadius:P,frameBackground:r?"linear-gradient(180deg, #1b1c20 0%, #0f1012 42%, #050608 100%)":"#000000",frameOutline:r?"0 0 0 1px #1f2125":"0 0 0 1px #333",metallicRingShadow:r?null:Nt,buttons:H,legacyHomeButton:r?{top:111+e.height+47/2,left:e.width/2-64/2+29,size:64,ring:1.5}:null,showHomeIndicator:e.homeIndicatorHeight>0,logicalHomeIndicatorStripHeight:e.homeIndicatorHeight}}function Ht(i){let e=i.side==="right",t=e?"inset(-3px -3px -3px 0)":"inset(-3px 0 -3px -3px)";return`
5
5
  <div
6
6
  aria-hidden="true"
7
7
  style="
@@ -377,7 +377,7 @@ process.stdin.on('end', async () => {
377
377
  visible: !!keyboard?.isVisible?.(),
378
378
  focused: !!test?.isTextInputFocused?.(),
379
379
  }
380
- })()`);if(!t?.visible&&!t?.focused){await w(80);return}await w(80)}}async eraseText(e){for(let t=0;t<e;t++)await this.bridge.send({type:"keyboard",simId:this.opts.simId,action:"dispatchKey",text:"Backspace"});await w(100)}async waitFor(e){let t=Date.now()+q(e.timeout||ne);for(;Date.now()<t;){if(await this.findElement(e))return;await w(200)}let r=await this.findElement(e),n=r?` (matched node y=${Math.round(r.absolutePosition.y)} \u2014 still off-screen at deadline)`:"";throw new Error(`waitFor: ${JSON.stringify(e)} not found after ${e.timeout||ne}ms${n}`)}async takeScreenshot(e){let t=er(e),r=Qt(this.opts.screenshotDir,t.path,{mode:this.opts.screenshotPathMode??"dir",flowDir:this.opts.flowDir});I.mkdirSync(S.dirname(r),{recursive:!0});let n=t.layers??this.opts.screenshotLayers,o={type:"screenshot",simId:this.opts.simId};n&&n!=="full"&&(o.layers=n);let s=null,a=1,l=null;for(let c=0;c<12;c++){await this.waitForVisualSettle();let u=await this.bridge.send(o),m=Buffer.from(u.replace(/^data:image\/png;base64,/,""),"base64");if((0,X.framesIdentical)(s,m)){if(a++,a>=X.REQUIRED_IDENTICAL_PROOF_FRAMES){l=m;break}}else a=1;s=m}if(!l)throw new Error(`screenshot did not reach ${X.REQUIRED_IDENTICAL_PROOF_FRAMES} identical idle frames`);if(t.withFrame){let c=await this.readCurrentDeviceModel();if(!c)throw new Error("could not read current device model for framed screenshot");let u=await ft(l,c);return I.writeFileSync(r,u),console.log(`[flow] screenshot: ${r} (frame: ${c})`),r}return I.writeFileSync(r,l),console.log(`[flow] screenshot: ${r}`),r}async readCurrentDeviceModel(){let e=await this.bridge.send({type:"call",simId:this.opts.simId,path:"SootSim.bridges.settings.get",args:[]}),t=e&&typeof e.deviceModel=="string"?e.deviceModel:null;return!t||!(t in Be)?null:t}async captureScreenshot(e){await this.takeScreenshot({path:e})}async captureFailureBundle(e,t){I.mkdirSync(e,{recursive:!0});let r=(u,m)=>{try{I.writeFileSync(S.join(e,u),m)}catch{}},n=async u=>{try{return await this.bridge.send({type:"evaluate",simId:this.opts.simId,code:u})}catch{return null}},o=await n(`(async () => {
380
+ })()`);if(!t?.visible&&!t?.focused){await w(80);return}await w(80)}}async eraseText(e){for(let t=0;t<e;t++)await this.bridge.send({type:"keyboard",simId:this.opts.simId,action:"dispatchKey",text:"Backspace"});await w(100)}async waitFor(e){let t=Date.now()+q(e.timeout||ne);for(;Date.now()<t;){if(await this.findElement(e))return;await w(200)}let r=await this.findElement(e),n=r?` (matched node y=${Math.round(r.absolutePosition.y)} \u2014 still off-screen at deadline)`:"";throw new Error(`waitFor: ${JSON.stringify(e)} not found after ${e.timeout||ne}ms${n}`)}async takeScreenshot(e){let t=er(e),r=Qt(this.opts.screenshotDir,t.path,{mode:this.opts.screenshotPathMode??"dir",flowDir:this.opts.flowDir});I.mkdirSync(S.dirname(r),{recursive:!0});let n=t.layers??this.opts.screenshotLayers,o={type:"screenshot",simId:this.opts.simId};n&&n!=="full"&&(o.layers=n);let s=null,a=1,l=null;for(let c=0;c<12;c++){await this.waitForVisualSettle();let u=await this.bridge.send(o),m=Buffer.from(u.replace(/^data:image\/png;base64,/,""),"base64");if((0,X.framesIdentical)(s,m)){if(a++,a>=X.REQUIRED_IDENTICAL_PROOF_FRAMES){l=m;break}}else a=1;s=m}if(!l)throw new Error(`screenshot did not reach ${X.REQUIRED_IDENTICAL_PROOF_FRAMES} identical idle frames`);if(t.withFrame){let c=await this.readCurrentDeviceModel();if(!c)throw new Error("could not read current device model for framed screenshot");let u=await ft(l,c);return I.writeFileSync(r,u),console.log(`[flow] screenshot: ${r} (frame: ${c})`),r}return I.writeFileSync(r,l),console.log(`[flow] screenshot: ${r}`),r}async readCurrentDeviceModel(){let e=await this.bridge.send({type:"call",simId:this.opts.simId,path:"SootSim.bridges.settings.get",args:[]}),t=e&&typeof e.deviceModel=="string"?e.deviceModel:null;return!t||!(t in Le)?null:t}async captureScreenshot(e){await this.takeScreenshot({path:e})}async captureFailureBundle(e,t){I.mkdirSync(e,{recursive:!0});let r=(u,m)=>{try{I.writeFileSync(S.join(e,u),m)}catch{}},n=async u=>{try{return await this.bridge.send({type:"evaluate",simId:this.opts.simId,code:u})}catch{return null}},o=await n(`(async () => {
381
381
  const out = {
382
382
  simId: window.__sootsimBridge?.id ?? window.SootSim?.state?.simId ?? null,
383
383
  url: location.href,
@@ -418,7 +418,7 @@ process.stdin.on('end', async () => {
418
418
  warnings: c?.getWarnings?.() ?? [],
419
419
  requests: (window.__sootsimGetFailedRequests?.() ?? []),
420
420
  }
421
- })()`);return c&&r("console.json",JSON.stringify(c,null,2)),e}async swipe(e="UP",t=300){let r=oe/2,n=C/2,o=200,s=r,a=n,l=r,c=n;switch(e.toUpperCase()){case"UP":a+=o,c-=o;break;case"DOWN":a-=o,c+=o;break;case"LEFT":s+=o,l-=o;break;case"RIGHT":s-=o,l+=o;break}let u=Math.max(10,Math.round(t/16));await this.drag(s,a,l,c,u,16)}async drag(e,t,r,n,o=12,s=16){let a=await this.perform([{type:"drag",fromX:e,fromY:t,toX:r,toY:n,steps:Math.max(1,Math.round(o)),stepMs:Math.max(0,Math.round(s))}]);if(!a?.ok)throw new Error(`drag failed: ${a?.error??"drag missed"}`);await w(300)}async swipeCoords(e,t,r=300){let n=ie(e),o=ie(t),s=Math.max(10,Math.round(r/16));await this.drag(n.x,n.y,o.x,o.y,s,16)}async swipeFrom(e,t="UP",r=300){let n=await this.findElement(e);if(!n)throw new Error(`swipeFrom: element not found: ${JSON.stringify(e)}`);let o=n.absolutePosition.x+n.layout.width/2,s=n.absolutePosition.y+n.layout.height/2,a=180,l=o,c=s;switch(t.toUpperCase()){case"UP":c-=a;break;case"DOWN":c+=a;break;case"LEFT":l-=a;break;case"RIGHT":l+=a;break}let u=Math.max(10,Math.round(r/16));await this.drag(o,s,l,c,u,16)}async scrollTo(e,t,r){let n=await this.callTest("scrollTo",e,t,r,!1);if(!n?.ok)throw new Error(`scrollTo failed: ${n?.reason||"unknown error"}`);await w(250)}async pinch(e){let t=await this.perform([{type:"pinch",fromX1:e.from[0],fromY1:e.from[1],fromX2:e.from[2],fromY2:e.from[3],toX1:e.to[0],toY1:e.to[1],toX2:e.to[2],toY2:e.to[3],steps:e.steps||12,stepMs:e.stepMs||16}]);if(!t?.ok)throw new Error(`pinch failed: ${t?.error||"unknown error"}`);await w(250)}async dumpTree(e=6){let t=await this.bridge.send({type:"tree",simId:this.opts.simId,depth:e});return console.log("[flow] tree:"),console.log(typeof t=="string"?t:JSON.stringify(t,null,2)),typeof t=="string"?t:JSON.stringify(t)}async assertTreeContains(e){if(!(await this.dumpTree(8)).includes(e))throw new Error(`assertTreeContains: "${e}" not in tree`)}async waitForAnimationToEnd(e=2e3){let t=Math.max(0,Math.round(e));if(t<=0)return;if(!(await te({bridge:this.bridge,simId:this.opts.simId,maxMs:t,pollMs:32,stablePolls:2,strict:!0})).settled)throw new Error(`animation did not settle within ${t}ms`)}async back(){try{await this.tapOn("\u2039")}catch{await this.tapOn("<")}}async scrollUntilVisible(e){let t=Date.now()+(e.timeout||15e3),r=e.direction?.toUpperCase()||"DOWN",n=r==="DOWN"?"UP":r==="UP"?"DOWN":r;for(;Date.now()<t;){let o=await this.findElement({text:e.element});if(o&&o.absolutePosition.y>=0&&o.absolutePosition.y+o.layout.height>0&&o.absolutePosition.y<C-50){if(e.centerElement){let s=C/2,a=o.absolutePosition.y-s;if(Math.abs(a)>100){let l=Math.min(150,Math.abs(a)*.5),c=a>0?s-l:s+l;await this.drag(oe/2,s,oe/2,c,10,16)}}return}await this.swipe(n,250),await w(500)}throw new Error(`scrollUntilVisible: "${e.element}" not found`)}async extendedWaitUntil(e){let t=Date.now()+q(e.timeout||ne);for(;Date.now()<t;){let r=e.visible?await this.isElementVisible(typeof e.visible=="string"?{text:e.visible}:e.visible):!0,n=e.notVisible?!await this.isElementVisible(typeof e.notVisible=="string"?{text:e.notVisible}:e.notVisible):!0;if(r&&n)return;await w(200)}throw new Error("extendedWaitUntil timed out")}async reloadGuestApp(){await this.evaluate("window.location.reload()").catch(()=>{}),await w(500),await this.refreshSimId()}async resetGuestAppData(e){let t=await this.bridge.send({type:"reset",simId:this.opts.simId,resetOptions:{strategy:"data",...e}},{timeoutMs:12e4});if(!t.ok)throw new Error(t.error??"guest app data reset failed");if(!t.relaunched)throw new Error("guest app data reset did not relaunch the app");if(t.workerReloaded!==!0)throw new Error("guest app data reset did not replace the tenant worker")}async reloadGuestAppRuntime(e){await this.bridge.send({type:"call",simId:this.opts.simId,path:"SootSim.bridges.hotRemount.reloadExternalApp",args:[e]},{timeoutMs:12e4})}async rearmCaptureAfterRuntimeReload(){if(!this.recordingEnabled&&!this.profilingEnabled)return;let e=Date.now()+1e4,t=null;for(;Date.now()<e;){await this.refreshSimId();try{this.recordingEnabled&&await this.ensureRecordingStarted(),this.profilingEnabled&&await this.startProfile();return}catch(r){t=r,await w(250)}}throw new Error(`capture re-arm failed after app reload: ${t instanceof Error?t.message:String(t)}`)}async launchApp(e){await this.refreshSimId();let t=!1,r;if(z(e)&&Object.prototype.hasOwnProperty.call(e,"arguments")){if(!z(e.arguments))throw new Error("launchApp.arguments must be a JSON object");t=!0,r=e.arguments}let n=!!(e&&typeof e=="object"&&e.clearState),o=Yt(e,"resetRuntime");if(!this.firstLaunchDone&&!n)this.firstLaunchDone=!0,t?(await this.launchShellAppFromHomeIfNeeded(e)&&await this.waitForTree(12e4),await this.reloadGuestAppRuntime({launchArguments:r,initialUrl:null}),await this.waitForTree(12e4)):o?(await this.launchShellAppFromHomeIfNeeded(e)&&await this.waitForTree(12e4),await this.reloadGuestAppRuntime({}),await this.waitForTree(12e4)):this.appStopped?(await this.launchShellAppFromHomeIfNeeded(e),await this.reloadGuestAppRuntime({launchArguments:null,initialUrl:null}),await this.waitForTree(12e4)):await this.launchShellAppFromHomeIfNeeded(e),await this.waitForTree(3e4);else if(this.firstLaunchDone=!0,n?await this.resetGuestAppData({launchArguments:t?r:null,initialUrl:null}):t||this.launchArgumentsActive||this.appStopped?await this.reloadGuestAppRuntime({launchArguments:t?r:null,initialUrl:null}):await this.reloadGuestApp(),await this.waitForTree(12e4),this.opts.onAfterLaunch)try{await this.opts.onAfterLaunch()}catch(s){console.warn(` warn: onAfterLaunch hook threw: ${s instanceof Error?s.message:s}`)}this.appStopped=!1,this.launchArgumentsActive=t,this.profilingEnabled&&await this.startProfile(),this.recordingEnabled&&(await this.waitForVisualSettle(),await this.ensureRecordingStarted())}async waitForVisualSettle(){let e=await te({bridge:this.bridge,simId:this.opts.simId,maxMs:1e4,pollMs:32,stablePolls:3,strict:!0});if(!e.settled)throw new Error(`visual state did not settle within ${e.elapsed}ms`)}resolveShellLaunchAppId(e,t){if(typeof e=="string"&&e.length>0)return e;if(z(e)){let r=Y(e,"appId")||Y(e,"id");if(r)return r}return Xt(t)||"connect"}async waitForShellAppLaunched(e,t){let r=Date.now()+t,n=null;for(;Date.now()<r;){try{n=await we(this.bridge)}catch{n=null}if(n?.state==="app"&&n.activeApp===e&&n.showSwitcher===!1&&typeof n.launchProgress=="number"&&n.launchProgress>=.98)return;await w(16)}}async launchShellAppFromHomeIfNeeded(e){let t=null;try{t=await we(this.bridge)}catch{return!1}if(t?.state!=="home"||t.activeApp!=null)return!1;let r=this.resolveShellLaunchAppId(e,t);return this.recordingEnabled&&await this.ensureRecordingStarted(),await Ke(this.bridge,"launchApp",1e3,r),await this.waitForShellAppLaunched(r,1e3),!0}async startProfile(){let e=await this.evaluate(`(() => {
421
+ })()`);return c&&r("console.json",JSON.stringify(c,null,2)),e}async swipe(e="UP",t=300){let r=oe/2,n=C/2,o=200,s=r,a=n,l=r,c=n;switch(e.toUpperCase()){case"UP":a+=o,c-=o;break;case"DOWN":a-=o,c+=o;break;case"LEFT":s+=o,l-=o;break;case"RIGHT":s-=o,l+=o;break}let u=Math.max(10,Math.round(t/16));await this.drag(s,a,l,c,u,16)}async drag(e,t,r,n,o=12,s=16){let a=await this.perform([{type:"drag",fromX:e,fromY:t,toX:r,toY:n,steps:Math.max(1,Math.round(o)),stepMs:Math.max(0,Math.round(s))}]);if(!a?.ok)throw new Error(`drag failed: ${a?.error??"drag missed"}`);await w(300)}async swipeCoords(e,t,r=300){let n=ie(e),o=ie(t),s=Math.max(10,Math.round(r/16));await this.drag(n.x,n.y,o.x,o.y,s,16)}async swipeFrom(e,t="UP",r=300){let n=await this.findElement(e);if(!n)throw new Error(`swipeFrom: element not found: ${JSON.stringify(e)}`);let o=n.absolutePosition.x+n.layout.width/2,s=n.absolutePosition.y+n.layout.height/2,a=180,l=o,c=s;switch(t.toUpperCase()){case"UP":c-=a;break;case"DOWN":c+=a;break;case"LEFT":l-=a;break;case"RIGHT":l+=a;break}let u=Math.max(10,Math.round(r/16));await this.drag(o,s,l,c,u,16)}async scrollTo(e,t,r){let n=await this.callTest("scrollTo",e,t,r,!1);if(!n?.ok)throw new Error(`scrollTo failed: ${n?.reason||"unknown error"}`);await w(250)}async pinch(e){let t=await this.perform([{type:"pinch",fromX1:e.from[0],fromY1:e.from[1],fromX2:e.from[2],fromY2:e.from[3],toX1:e.to[0],toY1:e.to[1],toX2:e.to[2],toY2:e.to[3],steps:e.steps||12,stepMs:e.stepMs||16}]);if(!t?.ok)throw new Error(`pinch failed: ${t?.error||"unknown error"}`);await w(250)}async dumpTree(e=6){let t=await this.bridge.send({type:"tree",simId:this.opts.simId,depth:e});return console.log("[flow] tree:"),console.log(typeof t=="string"?t:JSON.stringify(t,null,2)),typeof t=="string"?t:JSON.stringify(t)}async assertTreeContains(e){if(!(await this.dumpTree(8)).includes(e))throw new Error(`assertTreeContains: "${e}" not in tree`)}async waitForAnimationToEnd(e=2e3){let t=Math.max(0,Math.round(e));if(t<=0)return;if(!(await te({bridge:this.bridge,simId:this.opts.simId,maxMs:t,pollMs:32,stablePolls:2,strict:!0})).settled)throw new Error(`animation did not settle within ${t}ms`)}async back(){try{await this.tapOn("\u2039")}catch{await this.tapOn("<")}}async scrollUntilVisible(e){let t=Date.now()+(e.timeout||15e3),r=e.direction?.toUpperCase()||"DOWN",n=r==="DOWN"?"UP":r==="UP"?"DOWN":r;for(;Date.now()<t;){let o=await this.findElement({text:e.element});if(o&&o.absolutePosition.y>=0&&o.absolutePosition.y+o.layout.height>0&&o.absolutePosition.y<C-50){if(e.centerElement){let s=C/2,a=o.absolutePosition.y-s;if(Math.abs(a)>100){let l=Math.min(150,Math.abs(a)*.5),c=a>0?s-l:s+l;await this.drag(oe/2,s,oe/2,c,10,16)}}return}await this.swipe(n,250),await w(500)}throw new Error(`scrollUntilVisible: "${e.element}" not found`)}async extendedWaitUntil(e){let t=Date.now()+q(e.timeout||ne);for(;Date.now()<t;){let r=e.visible?await this.isElementVisible(typeof e.visible=="string"?{text:e.visible}:e.visible):!0,n=e.notVisible?!await this.isElementVisible(typeof e.notVisible=="string"?{text:e.notVisible}:e.notVisible):!0;if(r&&n)return;await w(200)}throw new Error("extendedWaitUntil timed out")}async reloadGuestApp(){await this.evaluate("window.location.reload()").catch(()=>{}),await w(500),await this.refreshSimId()}async resetGuestAppData(e){let t=await this.bridge.send({type:"reset",simId:this.opts.simId,resetOptions:{strategy:"data",...e}},{timeoutMs:12e4});if(!t.ok)throw new Error(t.error??"guest app data reset failed");if(!t.relaunched)throw new Error("guest app data reset did not relaunch the app");if(t.workerReloaded!==!0)throw new Error("guest app data reset did not replace the tenant worker")}async reloadGuestAppRuntime(e){await this.bridge.send({type:"call",simId:this.opts.simId,path:"SootSim.bridges.hotRemount.reloadExternalApp",args:[e]},{timeoutMs:12e4})}async rearmCaptureAfterRuntimeReload(){if(!this.recordingEnabled&&!this.profilingEnabled)return;let e=Date.now()+1e4,t=null;for(;Date.now()<e;){await this.refreshSimId();try{this.recordingEnabled&&await this.ensureRecordingStarted(),this.profilingEnabled&&await this.startProfile();return}catch(r){t=r,await w(250)}}throw new Error(`capture re-arm failed after app reload: ${t instanceof Error?t.message:String(t)}`)}async launchApp(e){await this.refreshSimId();let t=!1,r;if(z(e)&&Object.prototype.hasOwnProperty.call(e,"arguments")){if(!z(e.arguments))throw new Error("launchApp.arguments must be a JSON object");t=!0,r=e.arguments}let n=!!(e&&typeof e=="object"&&e.clearState),o=Yt(e,"resetRuntime");if(!this.firstLaunchDone&&!n)this.firstLaunchDone=!0,t?(await this.launchShellAppFromHomeIfNeeded(e)&&await this.waitForTree(12e4),await this.reloadGuestAppRuntime({launchArguments:r,initialUrl:null}),await this.waitForTree(12e4)):o?(await this.launchShellAppFromHomeIfNeeded(e)&&await this.waitForTree(12e4),await this.reloadGuestAppRuntime({}),await this.waitForTree(12e4)):this.appStopped?(await this.launchShellAppFromHomeIfNeeded(e),await this.reloadGuestAppRuntime({launchArguments:null,initialUrl:null}),await this.waitForTree(12e4)):await this.launchShellAppFromHomeIfNeeded(e),await this.waitForTree(3e4);else if(this.firstLaunchDone=!0,n?await this.resetGuestAppData({launchArguments:t?r:null,initialUrl:null}):t||this.launchArgumentsActive||this.appStopped?await this.reloadGuestAppRuntime({launchArguments:t?r:null,initialUrl:null}):await this.reloadGuestApp(),await this.waitForTree(12e4),this.opts.onAfterLaunch)try{await this.opts.onAfterLaunch(this.opts.simId)}catch(s){console.warn(` warn: onAfterLaunch hook threw: ${s instanceof Error?s.message:s}`)}this.appStopped=!1,this.launchArgumentsActive=t,this.profilingEnabled&&await this.startProfile(),this.recordingEnabled&&(await this.waitForVisualSettle(),await this.ensureRecordingStarted())}async waitForVisualSettle(){let e=await te({bridge:this.bridge,simId:this.opts.simId,maxMs:1e4,pollMs:32,stablePolls:3,strict:!0});if(!e.settled)throw new Error(`visual state did not settle within ${e.elapsed}ms`)}resolveShellLaunchAppId(e,t){if(typeof e=="string"&&e.length>0)return e;if(z(e)){let r=Y(e,"appId")||Y(e,"id");if(r)return r}return Xt(t)||"connect"}async waitForShellAppLaunched(e,t){let r=Date.now()+t,n=null;for(;Date.now()<r;){try{n=await ye(this.bridge)}catch{n=null}if(n?.state==="app"&&n.activeApp===e&&n.showSwitcher===!1&&typeof n.launchProgress=="number"&&n.launchProgress>=.98)return;await w(16)}}async launchShellAppFromHomeIfNeeded(e){let t=null;try{t=await ye(this.bridge)}catch{return!1}if(t?.state!=="home"||t.activeApp!=null)return!1;let r=this.resolveShellLaunchAppId(e,t);return this.recordingEnabled&&await this.ensureRecordingStarted(),await Ke(this.bridge,"launchApp",1e3,r),await this.waitForShellAppLaunched(r,1e3),!0}async startProfile(){let e=await this.evaluate(`(() => {
422
422
  if (!window.__sootsimShellPerf) {
423
423
  return { error: "shell frame profile unavailable (__sootsimShellPerf missing on the page)" }
424
424
  }
@@ -429,7 +429,7 @@ process.stdin.on('end', async () => {
429
429
  return { error: "shell frame profile unavailable (__sootsimShellPerf missing on the page)" }
430
430
  }
431
431
  return await window.__sootsimShellPerf.stop()
432
- })()`);if(this.profilingEnabled=!1,e?.error)throw new Error(e.error);return e}async stopApp(){await this.reloadGuestAppRuntime({relaunch:!1}),this.appStopped=!0}async clearState(){await this.resetGuestAppData(),await this.rearmCaptureAfterRuntimeReload()}clearKeychain(){console.warn("[flow] clearKeychain: rnx has no keychain surface \u2014 no-op (warning)")}async copyTextFrom(e){let t=typeof e=="string"?{id:e}:e,r=await this.findElement(t);if(!r)throw new Error(`copyTextFrom: element not found: ${JSON.stringify(t)}`);let n=r.text??r.testID??"";this.js.setCopiedText(n),this.js.putEnv("maestroCopiedText",n),console.log(`[flow] copied text: ${JSON.stringify(n)}`)}evalScript(e){let r=/(?<!\\)\$\{[^$]*\}/.test(e)?this.js.evaluateStringTemplate(e):this.js.evaluate(e);r!==void 0&&r!==""&&console.log("[flow] evalScript ->",r)}runScript(e){let t=typeof e=="string"?{file:e}:e;if(!t.file)throw new Error("runScript requires a file");let r=S.resolve(this.opts.flowDir,t.file),n=I.readFileSync(r,"utf8");this.js.evaluate(n,{env:t.env}),console.log(`[flow] runScript: ${t.file} done`)}async openLink(e){let t=typeof e=="string"?e:e.link;if(!t)throw new Error("openLink: missing link");await this.reloadGuestAppRuntime({initialUrl:null,launchArguments:null}),await this.waitForTree(12e4);let r=await this.callTest("openDeepLink",t);if(!r?.ok)throw new Error(`openLink failed: ${r?.error||"no test bridge"}`);this.appStopped=!1,this.launchArgumentsActive=!1,this.firstLaunchDone=!0}async evaluateWhen(e){if(e.visible!==void 0){let t=typeof e.visible=="string"?{text:e.visible}:e.visible;return!!await this.findElement(t)}if(e.notVisible!==void 0){let t=typeof e.notVisible=="string"?{text:e.notVisible}:e.notVisible;return!await this.findElement(t)}return e.platform!==void 0?e.platform.toLowerCase()===this.js.maestro.platform.toLowerCase():e.true!==void 0?gt(e.true):!0}isOptional(e){if(e.optional===!0)return!0;let r=Object.entries(e).find(([o])=>o!=="when"&&o!=="optional"),n=r?r[1]:void 0;return!!(n&&typeof n=="object"&&"optional"in n&&n.optional)}async runStep(e,t){let r=typeof e=="string"?wt(e):e,n=Object.keys(r).find(l=>l!=="when")||Object.keys(r)[0];console.log(`[flow] step ${t+1}: ${n}`);let o=Date.now(),s=this.flowStepTargetLabel(r,n),a;try{a=this.js.interpolateStep(r),s=this.flowStepTargetLabel(a,n)??s}catch(l){if(this.isOptional(r)){console.log(`[flow] (optional, skipped: ${l.message.slice(0,80)})`),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"skipped",error:l});return}throw this.lastFailedStep={index:t,kind:n,target:r[n]},this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"failure",error:l}),l}if(a.when&&!await this.evaluateWhen(a.when)){console.log("[flow] (when: predicate false, skipped)"),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"skipped"});return}try{let l=!!(a.extendedWaitUntil||a.waitFor||a.scrollUntilVisible||a.launchApp||a.runFlow||a.runScript),c=1e4,u=this.runStepInner(a),m;if(l){let f=await u;typeof f=="string"&&(m=f)}else{let f=null,v=new Promise((P,H)=>{f=setTimeout(()=>{H(new Error(`step watchdog: ${n} made no progress in ${c}ms \u2014 bridge or bundle probably hung`))},c)});try{let P=await Promise.race([u,v]);typeof P=="string"&&(m=P)}finally{f&&clearTimeout(f)}}let g=!!(a.assertVisible||a.assertNotVisible||a.extendedWaitUntil||a.waitFor);this.stepDelay>0&&!g&&await w(this.stepDelay),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"success",screenshotPath:m})}catch(l){if(this.isOptional(a)){console.log(`[flow] (optional, skipped: ${l.message.slice(0,80)})`),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"skipped",error:l});return}throw this.lastFailedStep={index:t,kind:n,target:a[n]},this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"failure",error:l}),l}}async runStepInner(e){if(e.tapOn)await this.tapOn(e.tapOn);else if(e.longPressOn)await this.longPressOn(e.longPressOn);else if(e.scrollUntilVisible)await this.scrollUntilVisible(e.scrollUntilVisible);else if(e.extendedWaitUntil)await this.extendedWaitUntil(e.extendedWaitUntil);else if(e.assertVisible)await this.assertVisible(e.assertVisible);else if(e.assertNotVisible)await this.assertNotVisible(e.assertNotVisible);else if(e.inputText)await this.inputText(e.inputText);else if(e.pressKey)await this.pressKey(e.pressKey);else if(e.dispatchKey)await this.dispatchKey(e.dispatchKey);else if(e.waitFor)await this.waitFor(e.waitFor);else{if(e.takeScreenshot)return this.takeScreenshot(e.takeScreenshot);if(e.swipe)e.swipe.start&&e.swipe.end?await this.swipeCoords(e.swipe.start,e.swipe.end,e.swipe.duration):e.swipe.from?await this.swipeFrom(e.swipe.from,e.swipe.direction,e.swipe.duration):await this.swipe(e.swipe.direction,e.swipe.duration);else if(e.scroll)await this.swipe(e.scroll.direction==="DOWN"?"UP":"DOWN");else if(e.scrollTo){let t=typeof e.scrollTo.nodeId=="number"?{nodeId:e.scrollTo.nodeId}:e.scrollTo.id;if(!t)throw new Error("scrollTo requires id or nodeId");await this.scrollTo(t,e.scrollTo.x,e.scrollTo.y)}else if(e.pinch)await this.pinch(e.pinch);else if(e.waitForAnimationToEnd){let t=e.waitForAnimationToEnd;await this.waitForAnimationToEnd(typeof t=="number"?t:typeof t=="object"&&typeof t.timeout=="number"?t.timeout:2e3)}else if(e.back)await this.back();else if(e.hideKeyboard)await this.hideKeyboard();else if(e.launchApp)await this.launchApp(e.launchApp);else if(typeof e.wait=="number")await w(e.wait);else if(e.dumpTree)await this.dumpTree(e.dumpTree);else if(e.tapAtCoords)await this.tapAtCoords(e.tapAtCoords.x,e.tapAtCoords.y);else if(e.doubleTapAtCoords)await this.doubleTapAtCoords(e.doubleTapAtCoords.x,e.doubleTapAtCoords.y,e.doubleTapAtCoords.gapMs);else if(e.assertTreeContains)await this.assertTreeContains(e.assertTreeContains);else if(typeof e.eraseText=="number")await this.eraseText(e.eraseText);else if(e.repeat&&Array.isArray(e.repeat.commands)){let t=e.repeat.times,r=t==null||t===""?Number.MAX_SAFE_INTEGER:Number(t);if(!Number.isFinite(r))throw new Error(`repeat.times is not a number: ${t}`);let n=e.repeat.when??e.repeat.condition,o=async()=>n?this.evaluateWhen(n):!0,s=n?r:Math.min(r,1e3),a=0;for(;a<s&&await o();){for(let l=0;l<e.repeat.commands.length;l++)await this.runStep(e.repeat.commands[l],l);a++}}else if(e.stopApp!==void 0)await this.stopApp();else if(e.clearState!==void 0)await this.clearState();else if(e.clearKeychain!==void 0)this.clearKeychain();else if(e.copyTextFrom!==void 0)await this.copyTextFrom(e.copyTextFrom);else if(typeof e.evalScript=="string")this.evalScript(e.evalScript);else if(e.runScript){let t=e.runScript,r=typeof t=="string"?void 0:t.when;if(r&&!await this.evaluateWhen(r)){console.log("[flow] runScript skipped (when predicate false)");return}this.runScript(t)}else if(e.openLink!==void 0)await this.openLink(e.openLink);else if(e.runFlow){let t=e.runFlow,r=typeof t=="string"?t:t.file,n=typeof t=="string"?void 0:t.commands,o=typeof t=="string"?void 0:t.env,s=typeof t=="string"?void 0:t.when;if(s&&!await this.evaluateWhen(s)){console.log(`[flow] runFlow skipped (when predicate false): ${r??"inline commands"}`);return}if(!r&&!n)throw new Error("runFlow requires either file or commands");this.js.enterEnvScope();try{if(o)for(let[a,l]of Object.entries(o))this.js.putEnv(a,l);if(r){let a=S.resolve(this.opts.flowDir,r),l=I.readFileSync(a,"utf8"),c=this.opts.flowDir;this.opts.flowDir=S.dirname(a);try{await this.runFlow(tr(l))}finally{this.opts.flowDir=c}}else if(n)for(let a=0;a<n.length;a++)await this.runStep(n[a],a)}finally{this.js.leaveEnvScope()}}else throw new Error(`unsupported flow step: ${JSON.stringify(e)}`)}}liveStatus=null;async runFlow(e){let t=[],r=[],n=[];for(let s of e){let a=Object.keys(s);if(a.length===1&&a[0]==="onFlowStart"&&Array.isArray(s.onFlowStart)){t.push(...s.onFlowStart);continue}if(a.length===1&&a[0]==="onFlowComplete"&&Array.isArray(s.onFlowComplete)){r.push(...s.onFlowComplete);continue}n.push(s)}if(this.liveStatus&&await this.liveStatus.plan(n.map((s,a)=>{let l=typeof s=="string"?wt(s):s,c=Object.keys(l).find(u=>u!=="when")??Object.keys(l)[0];return{index:a,name:c,target:this.flowStepTargetLabel(l,c)}})),t.length>0){console.log(`[flow] onFlowStart (${t.length} steps)`);for(let s=0;s<t.length;s++)await this.runStep(t[s],s)}let o=null;try{await this.runFlowBody(n)}catch(s){o=s instanceof Error?s:new Error(String(s))}if(r.length>0){console.log(`[flow] onFlowComplete (${r.length} steps)`);for(let s=0;s<r.length;s++)try{await this.runStep(r[s],s)}catch(a){console.warn(`[flow] onFlowComplete step ${s+1} failed: ${a instanceof Error?a.message:a}`)}}if(o)throw o}async runFlowBody(e){for(let t=0;t<e.length;t++){let r=e[t],n=typeof r.wait=="number"?r.wait:0,o=typeof r.waitFor?.timeout=="number"?r.waitFor.timeout:0,s=typeof r.extendedWaitUntil?.timeout=="number"?r.extendedWaitUntil.timeout:0,a=Math.max(6e4,n+15e3,q(o)+15e3,q(s)+15e3);this.liveStatus&&(await this.liveStatus.waitWhilePaused(),await this.liveStatus.step(t,"running"));let l=Date.now(),c=async(u,m)=>{if(!this.liveStatus)return;let g=this.flowTraceSteps[this.flowTraceSteps.length-1],f=g&&g.stepIndex===t&&g.startedAtMs>=l;await this.liveStatus.step(t,u?"failure":f&&g.status==="skipped"?"skipped":"success",{durationMs:Date.now()-l,error:u?m instanceof Error?m.message.slice(0,300):String(m).slice(0,300):f&&g.error||void 0})};try{r.runFlow||r.launchApp?await this.runStep(r,t):await Promise.race([this.runStep(r,t),new Promise((u,m)=>setTimeout(()=>m(new Error(`step ${t+1} (${Object.keys(r)[0]}) exceeded ${a}ms deadline`)),a))])}catch(u){let m=this.flowTraceSteps[this.flowTraceSteps.length-1];if(!(m&&m.stepIndex===t&&m.startedAtMs>=l)){let g=Object.keys(r)[0];this.lastFailedStep={index:t,kind:g,target:r[g]},this.recordFlowTraceStep({stepIndex:t,stepName:g,targetLabel:this.flowStepTargetLabel(r,g),startedAtMs:l,status:"failure",error:u})}throw await c(!0,u),u}await c(!1)}}};function rr(i){if(typeof i!="object"||i==null||!("control"in i))return!1;let e=i.control;return typeof e=="object"&&e!=null&&"paused"in e&&e.paused===!0}var ae=class{constructor(e,t,r){this.bridge=e;this.flowName=t;this.getSimId=r}disabled=!1;paused=!1;lastSimId;plannedSteps=null;completedSteps=new Map;runId=`flr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`;async send(e,t){let r=await this.bridge.send({type:"flowStatus",simId:t,status:{runId:this.runId,flowName:this.flowName,...e}});this.paused=rr(r)}async push(e){if(!this.disabled)try{let t=this.getSimId?.();if(t!==this.lastSimId&&this.lastSimId!=null&&this.plannedSteps&&e.phase!=="plan"){await this.send({phase:"plan",state:"running",steps:this.plannedSteps},t);for(let r of this.completedSteps.values())await this.send({phase:"step",state:"running",step:r},t)}this.lastSimId=t,await this.send(e,t)}catch(t){this.disabled=!0,console.log(`[flow] live status unavailable (${t instanceof Error?t.message.slice(0,120):t}) \u2014 continuing without the devtools rail`)}}async plan(e){this.plannedSteps=e.map(t=>({...t})),this.completedSteps.clear(),await this.push({phase:"plan",state:"running",steps:e})}async step(e,t,r){let n={index:e,status:t,...r};await this.push({phase:"step",state:"running",step:n}),this.completedSteps.set(e,n)}async end(e){await this.push({phase:"end",state:e})}async waitWhilePaused(){if(!this.disabled)for(;this.paused;){for(console.log("[flow] paused from devtools \u2014 waiting\u2026");this.paused&&!this.disabled;)await new Promise(e=>setTimeout(e,400)),await this.push({phase:"heartbeat",state:"paused"});this.disabled||console.log("[flow] resumed")}}};var Ie=null;function zr(){return Ie}var Fe=[];function Yr(){return Fe}async function or(i){if(!i)return{target:""};let e=i.trim();if(!e)return{target:""};if(/^\d+$/.test(e))return{target:e};if(e.startsWith("http://")||e.startsWith("https://"))return{target:e};let r=(await He()).find(n=>n.name.toLowerCase()===e.toLowerCase());return r?{target:String(r.preferredPort),runtimeConfig:r.runtimeConfig}:{target:e}}async function sr(){let i=await Ue(),e=i.find(r=>r.patched);if(e)return`http://localhost:${e.port}/__soot/`;let t=i[0];return t?`http://localhost:${t.port}/__soot/`:null}async function bt(i){Ie=null,Fe=[],(i.length===0||i.includes("--help")||i.includes("-h"))&&(console.log(`
432
+ })()`);if(this.profilingEnabled=!1,e?.error)throw new Error(e.error);return e}async stopApp(){await this.reloadGuestAppRuntime({relaunch:!1}),this.appStopped=!0}async clearState(){await this.resetGuestAppData(),await this.rearmCaptureAfterRuntimeReload()}clearKeychain(){console.warn("[flow] clearKeychain: rnx has no keychain surface \u2014 no-op (warning)")}async copyTextFrom(e){let t=typeof e=="string"?{id:e}:e,r=await this.findElement(t);if(!r)throw new Error(`copyTextFrom: element not found: ${JSON.stringify(t)}`);let n=r.text??r.testID??"";this.js.setCopiedText(n),this.js.putEnv("maestroCopiedText",n),console.log(`[flow] copied text: ${JSON.stringify(n)}`)}evalScript(e){let r=/(?<!\\)\$\{[^$]*\}/.test(e)?this.js.evaluateStringTemplate(e):this.js.evaluate(e);r!==void 0&&r!==""&&console.log("[flow] evalScript ->",r)}runScript(e){let t=typeof e=="string"?{file:e}:e;if(!t.file)throw new Error("runScript requires a file");let r=S.resolve(this.opts.flowDir,t.file),n=I.readFileSync(r,"utf8");this.js.evaluate(n,{env:t.env}),console.log(`[flow] runScript: ${t.file} done`)}async openLink(e){let t=typeof e=="string"?e:e.link;if(!t)throw new Error("openLink: missing link");await this.reloadGuestAppRuntime({initialUrl:null,launchArguments:null}),await this.waitForTree(12e4);let r=await this.callTest("openDeepLink",t);if(!r?.ok)throw new Error(`openLink failed: ${r?.error||"no test bridge"}`);this.appStopped=!1,this.launchArgumentsActive=!1,this.firstLaunchDone=!0}async evaluateWhen(e){if(e.visible!==void 0){let t=typeof e.visible=="string"?{text:e.visible}:e.visible;return!!await this.findElement(t)}if(e.notVisible!==void 0){let t=typeof e.notVisible=="string"?{text:e.notVisible}:e.notVisible;return!await this.findElement(t)}return e.platform!==void 0?e.platform.toLowerCase()===this.js.maestro.platform.toLowerCase():e.true!==void 0?gt(e.true):!0}isOptional(e){if(e.optional===!0)return!0;let r=Object.entries(e).find(([o])=>o!=="when"&&o!=="optional"),n=r?r[1]:void 0;return!!(n&&typeof n=="object"&&"optional"in n&&n.optional)}async runStep(e,t){let r=typeof e=="string"?wt(e):e,n=Object.keys(r).find(l=>l!=="when")||Object.keys(r)[0];console.log(`[flow] step ${t+1}: ${n}`);let o=Date.now(),s=this.flowStepTargetLabel(r,n),a;try{a=this.js.interpolateStep(r),s=this.flowStepTargetLabel(a,n)??s}catch(l){if(this.isOptional(r)){console.log(`[flow] (optional, skipped: ${l.message.slice(0,80)})`),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"skipped",error:l});return}throw this.lastFailedStep={index:t,kind:n,target:r[n]},this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"failure",error:l}),l}if(a.when&&!await this.evaluateWhen(a.when)){console.log("[flow] (when: predicate false, skipped)"),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"skipped"});return}try{let l=!!(a.extendedWaitUntil||a.waitFor||a.scrollUntilVisible||a.launchApp||a.runFlow||a.runScript),c=1e4,u=this.runStepInner(a),m;if(l){let f=await u;typeof f=="string"&&(m=f)}else{let f=null,v=new Promise((P,H)=>{f=setTimeout(()=>{H(new Error(`step watchdog: ${n} made no progress in ${c}ms \u2014 bridge or bundle probably hung`))},c)});try{let P=await Promise.race([u,v]);typeof P=="string"&&(m=P)}finally{f&&clearTimeout(f)}}let g=!!(a.assertVisible||a.assertNotVisible||a.extendedWaitUntil||a.waitFor);this.stepDelay>0&&!g&&await w(this.stepDelay),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"success",screenshotPath:m})}catch(l){if(this.isOptional(a)){console.log(`[flow] (optional, skipped: ${l.message.slice(0,80)})`),this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"skipped",error:l});return}throw this.lastFailedStep={index:t,kind:n,target:a[n]},this.recordFlowTraceStep({stepIndex:t,stepName:n,targetLabel:s,startedAtMs:o,status:"failure",error:l}),l}}async runStepInner(e){if(e.tapOn)await this.tapOn(e.tapOn);else if(e.longPressOn)await this.longPressOn(e.longPressOn);else if(e.scrollUntilVisible)await this.scrollUntilVisible(e.scrollUntilVisible);else if(e.extendedWaitUntil)await this.extendedWaitUntil(e.extendedWaitUntil);else if(e.assertVisible)await this.assertVisible(e.assertVisible);else if(e.assertNotVisible)await this.assertNotVisible(e.assertNotVisible);else if(e.inputText)await this.inputText(e.inputText);else if(e.pressKey)await this.pressKey(e.pressKey);else if(e.dispatchKey)await this.dispatchKey(e.dispatchKey);else if(e.waitFor)await this.waitFor(e.waitFor);else{if(e.takeScreenshot)return this.takeScreenshot(e.takeScreenshot);if(e.swipe)e.swipe.start&&e.swipe.end?await this.swipeCoords(e.swipe.start,e.swipe.end,e.swipe.duration):e.swipe.from?await this.swipeFrom(e.swipe.from,e.swipe.direction,e.swipe.duration):await this.swipe(e.swipe.direction,e.swipe.duration);else if(e.scroll)await this.swipe(e.scroll.direction==="DOWN"?"UP":"DOWN");else if(e.scrollTo){let t=typeof e.scrollTo.nodeId=="number"?{nodeId:e.scrollTo.nodeId}:e.scrollTo.id;if(!t)throw new Error("scrollTo requires id or nodeId");await this.scrollTo(t,e.scrollTo.x,e.scrollTo.y)}else if(e.pinch)await this.pinch(e.pinch);else if(e.waitForAnimationToEnd){let t=e.waitForAnimationToEnd;await this.waitForAnimationToEnd(typeof t=="number"?t:typeof t=="object"&&typeof t.timeout=="number"?t.timeout:2e3)}else if(e.back)await this.back();else if(e.hideKeyboard)await this.hideKeyboard();else if(e.launchApp)await this.launchApp(e.launchApp);else if(typeof e.wait=="number")await w(e.wait);else if(e.dumpTree)await this.dumpTree(e.dumpTree);else if(e.tapAtCoords)await this.tapAtCoords(e.tapAtCoords.x,e.tapAtCoords.y);else if(e.doubleTapAtCoords)await this.doubleTapAtCoords(e.doubleTapAtCoords.x,e.doubleTapAtCoords.y,e.doubleTapAtCoords.gapMs);else if(e.assertTreeContains)await this.assertTreeContains(e.assertTreeContains);else if(typeof e.eraseText=="number")await this.eraseText(e.eraseText);else if(e.repeat&&Array.isArray(e.repeat.commands)){let t=e.repeat.times,r=t==null||t===""?Number.MAX_SAFE_INTEGER:Number(t);if(!Number.isFinite(r))throw new Error(`repeat.times is not a number: ${t}`);let n=e.repeat.when??e.repeat.condition,o=async()=>n?this.evaluateWhen(n):!0,s=n?r:Math.min(r,1e3),a=0;for(;a<s&&await o();){for(let l=0;l<e.repeat.commands.length;l++)await this.runStep(e.repeat.commands[l],l);a++}}else if(e.stopApp!==void 0)await this.stopApp();else if(e.clearState!==void 0)await this.clearState();else if(e.clearKeychain!==void 0)this.clearKeychain();else if(e.copyTextFrom!==void 0)await this.copyTextFrom(e.copyTextFrom);else if(typeof e.evalScript=="string")this.evalScript(e.evalScript);else if(e.runScript){let t=e.runScript,r=typeof t=="string"?void 0:t.when;if(r&&!await this.evaluateWhen(r)){console.log("[flow] runScript skipped (when predicate false)");return}this.runScript(t)}else if(e.openLink!==void 0)await this.openLink(e.openLink);else if(e.runFlow){let t=e.runFlow,r=typeof t=="string"?t:t.file,n=typeof t=="string"?void 0:t.commands,o=typeof t=="string"?void 0:t.env,s=typeof t=="string"?void 0:t.when;if(s&&!await this.evaluateWhen(s)){console.log(`[flow] runFlow skipped (when predicate false): ${r??"inline commands"}`);return}if(!r&&!n)throw new Error("runFlow requires either file or commands");this.js.enterEnvScope();try{if(o)for(let[a,l]of Object.entries(o))this.js.putEnv(a,l);if(r){let a=S.resolve(this.opts.flowDir,r),l=I.readFileSync(a,"utf8"),c=this.opts.flowDir;this.opts.flowDir=S.dirname(a);try{await this.runFlow(tr(l))}finally{this.opts.flowDir=c}}else if(n)for(let a=0;a<n.length;a++)await this.runStep(n[a],a)}finally{this.js.leaveEnvScope()}}else throw new Error(`unsupported flow step: ${JSON.stringify(e)}`)}}liveStatus=null;async runFlow(e){let t=[],r=[],n=[];for(let s of e){let a=Object.keys(s);if(a.length===1&&a[0]==="onFlowStart"&&Array.isArray(s.onFlowStart)){t.push(...s.onFlowStart);continue}if(a.length===1&&a[0]==="onFlowComplete"&&Array.isArray(s.onFlowComplete)){r.push(...s.onFlowComplete);continue}n.push(s)}if(this.liveStatus&&await this.liveStatus.plan(n.map((s,a)=>{let l=typeof s=="string"?wt(s):s,c=Object.keys(l).find(u=>u!=="when")??Object.keys(l)[0];return{index:a,name:c,target:this.flowStepTargetLabel(l,c)}})),t.length>0){console.log(`[flow] onFlowStart (${t.length} steps)`);for(let s=0;s<t.length;s++)await this.runStep(t[s],s)}let o=null;try{await this.runFlowBody(n)}catch(s){o=s instanceof Error?s:new Error(String(s))}if(r.length>0){console.log(`[flow] onFlowComplete (${r.length} steps)`);for(let s=0;s<r.length;s++)try{await this.runStep(r[s],s)}catch(a){console.warn(`[flow] onFlowComplete step ${s+1} failed: ${a instanceof Error?a.message:a}`)}}if(o)throw o}async runFlowBody(e){for(let t=0;t<e.length;t++){let r=e[t],n=typeof r.wait=="number"?r.wait:0,o=typeof r.waitFor?.timeout=="number"?r.waitFor.timeout:0,s=typeof r.extendedWaitUntil?.timeout=="number"?r.extendedWaitUntil.timeout:0,a=Math.max(6e4,n+15e3,q(o)+15e3,q(s)+15e3);this.liveStatus&&(await this.liveStatus.waitWhilePaused(),await this.liveStatus.step(t,"running"));let l=Date.now(),c=async(u,m)=>{if(!this.liveStatus)return;let g=this.flowTraceSteps[this.flowTraceSteps.length-1],f=g&&g.stepIndex===t&&g.startedAtMs>=l;await this.liveStatus.step(t,u?"failure":f&&g.status==="skipped"?"skipped":"success",{durationMs:Date.now()-l,error:u?m instanceof Error?m.message.slice(0,300):String(m).slice(0,300):f&&g.error||void 0})};try{r.runFlow||r.launchApp?await this.runStep(r,t):await Promise.race([this.runStep(r,t),new Promise((u,m)=>setTimeout(()=>m(new Error(`step ${t+1} (${Object.keys(r)[0]}) exceeded ${a}ms deadline`)),a))])}catch(u){let m=this.flowTraceSteps[this.flowTraceSteps.length-1];if(!(m&&m.stepIndex===t&&m.startedAtMs>=l)){let g=Object.keys(r)[0];this.lastFailedStep={index:t,kind:g,target:r[g]},this.recordFlowTraceStep({stepIndex:t,stepName:g,targetLabel:this.flowStepTargetLabel(r,g),startedAtMs:l,status:"failure",error:u})}throw await c(!0,u),u}await c(!1)}}};function rr(i){if(typeof i!="object"||i==null||!("control"in i))return!1;let e=i.control;return typeof e=="object"&&e!=null&&"paused"in e&&e.paused===!0}var ae=class{constructor(e,t,r){this.bridge=e;this.flowName=t;this.getSimId=r}disabled=!1;paused=!1;lastSimId;plannedSteps=null;completedSteps=new Map;runId=`flr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`;async send(e,t){let r=await this.bridge.send({type:"flowStatus",simId:t,status:{runId:this.runId,flowName:this.flowName,...e}});this.paused=rr(r)}async push(e){if(!this.disabled)try{let t=this.getSimId?.();if(t!==this.lastSimId&&this.lastSimId!=null&&this.plannedSteps&&e.phase!=="plan"){await this.send({phase:"plan",state:"running",steps:this.plannedSteps},t);for(let r of this.completedSteps.values())await this.send({phase:"step",state:"running",step:r},t)}this.lastSimId=t,await this.send(e,t)}catch(t){this.disabled=!0,console.log(`[flow] live status unavailable (${t instanceof Error?t.message.slice(0,120):t}) \u2014 continuing without the devtools rail`)}}async plan(e){this.plannedSteps=e.map(t=>({...t})),this.completedSteps.clear(),await this.push({phase:"plan",state:"running",steps:e})}async step(e,t,r){let n={index:e,status:t,...r};await this.push({phase:"step",state:"running",step:n}),this.completedSteps.set(e,n)}async end(e){await this.push({phase:"end",state:e})}async waitWhilePaused(){if(!this.disabled)for(;this.paused;){for(console.log("[flow] paused from devtools \u2014 waiting\u2026");this.paused&&!this.disabled;)await new Promise(e=>setTimeout(e,400)),await this.push({phase:"heartbeat",state:"paused"});this.disabled||console.log("[flow] resumed")}}};var Fe=null;function zr(){return Fe}var Pe=[];function Yr(){return Pe}async function or(i){if(!i)return{target:""};let e=i.trim();if(!e)return{target:""};if(/^\d+$/.test(e))return{target:e};if(e.startsWith("http://")||e.startsWith("https://"))return{target:e};let r=(await He()).find(n=>n.name.toLowerCase()===e.toLowerCase());return r?{target:String(r.preferredPort),runtimeConfig:r.runtimeConfig}:{target:e}}async function sr(){let i=await Ue(),e=i.find(r=>r.patched);if(e)return`http://localhost:${e.port}/__soot/`;let t=i[0];return t?`http://localhost:${t.port}/__soot/`:null}async function bt(i){Fe=null,Pe=[],(i.length===0||i.includes("--help")||i.includes("-h"))&&(console.log(`
433
433
  sootsim maestro \u2014 author and run Maestro YAML flows
434
434
 
435
435
  usage:
@@ -508,13 +508,13 @@ flow extension:
508
508
  takeScreenshot:
509
509
  path: marketing/hero
510
510
  withFrame: true
511
- `),process.exit(0));let e=i[0];k.existsSync(e)||(console.error(` error: ${e} not found`),process.exit(1));let t=h=>i.find((d,b)=>i[b-1]===h),r=i.includes("--profile"),n=i.includes("--headed"),o=i.includes("--new")||n,s=t("--out")||"/tmp/sootsim-recordings",a=t("--screenshots")||(t("--out")?s:"/tmp/sootsim-flow"),l=t("--screenshot-paths")==="flow"?"flow":"dir",c=i.includes("--no-shell")?"tenant":i.includes("--shell-only")?"shell":void 0,u=t("--device")?.trim()||"",m=i.includes("--slow")?+(t("--slow")||"500"):0,g=i.includes("--electron"),f=i.includes("--preview"),v=f?await st(t("--preview-origin")):"",P=t("--preview-public-origin"),H=i.includes("--preview-open"),Pe=t("--owner")?.trim()||"",Ae=t("--repo")?.trim()||"",U=t("--billing-kind")?.trim()||"",St=f?`maestro:${process.env.GITHUB_RUN_ID?`github:${process.env.GITHUB_RUN_ID}:attempt:${process.env.GITHUB_RUN_ATTEMPT||"1"}:job:${process.env.GITHUB_JOB||"preview"}`:`local:${ir()}`}:flow:${nr("sha256").update(y.relative(process.cwd(),y.resolve(e))).digest("hex").slice(0,16)}`:"";U&&U!=="test_run"&&(console.error(` error: invalid --billing-kind: ${U}`),process.exit(1));let vt=i.flatMap((h,d)=>i[d-1]==="--replace"?["--replace",h]:[]),xt=i.flatMap((h,d)=>i[d-1]==="--remap"?["--remap",h]:[]),_=i.includes("--record")||f,Tt=i.includes("--tail-wait")?Math.max(0,+(t("--tail-wait")||"2000")):_?f?6e3:2e3:0,Et=k.readFileSync(e,"utf8"),{frontmatter:T,steps:D}=ye(Et);D.length===0&&(console.error(" error: flow file must contain a YAML array of steps"),process.exit(1));let j=u||T.device||"",ke=T.theme||"",le=g||T.electron===!0,It=T.app===void 0||T.app===null?"":typeof T.app=="number"?String(T.app):T.app,$e=await or(It),de=$e.target,Re={stripBooleanFlags:["--record","--profile","--electron","--new","--preview","--preview-open","--headless","--headed"],stripValueFlags:["--out","--device","--slow","--tail-wait","--url","--replace","--remap","--screenshots","--screenshot-paths","--preview-origin","--preview-public-origin","--driver","--billing-kind","--owner","--repo"]},x=me(i,Re),Ft=t("--url")||"";le&&!ze()&&(console.error(" error: desktop companion not found. install or build it first with `bun run build:electron`"),process.exit(1));let Pt=le?"desktop companion":"bridge",At=de?` | target: ${de}`:"";console.log(`
511
+ `),process.exit(0));let e=i[0];k.existsSync(e)||(console.error(` error: ${e} not found`),process.exit(1));let t=h=>i.find((d,b)=>i[b-1]===h),r=i.includes("--profile"),n=i.includes("--headed"),o=i.includes("--new")||n,s=t("--out")||"/tmp/sootsim-recordings",a=t("--screenshots")||(t("--out")?s:"/tmp/sootsim-flow"),l=t("--screenshot-paths")==="flow"?"flow":"dir",c=i.includes("--no-shell")?"tenant":i.includes("--shell-only")?"shell":void 0,u=t("--device")?.trim()||"",m=i.includes("--slow")?+(t("--slow")||"500"):0,g=i.includes("--electron"),f=i.includes("--preview"),v=f?await st(t("--preview-origin")):"",P=t("--preview-public-origin"),H=i.includes("--preview-open"),Ae=t("--owner")?.trim()||"",ke=t("--repo")?.trim()||"",U=t("--billing-kind")?.trim()||"",St=f?`maestro:${process.env.GITHUB_RUN_ID?`github:${process.env.GITHUB_RUN_ID}:attempt:${process.env.GITHUB_RUN_ATTEMPT||"1"}:job:${process.env.GITHUB_JOB||"preview"}`:`local:${ir()}`}:flow:${nr("sha256").update(y.relative(process.cwd(),y.resolve(e))).digest("hex").slice(0,16)}`:"";U&&U!=="test_run"&&(console.error(` error: invalid --billing-kind: ${U}`),process.exit(1));let vt=i.flatMap((h,d)=>i[d-1]==="--replace"?["--replace",h]:[]),xt=i.flatMap((h,d)=>i[d-1]==="--remap"?["--remap",h]:[]),_=i.includes("--record")||f,Tt=i.includes("--tail-wait")?Math.max(0,+(t("--tail-wait")||"2000")):_?f?6e3:2e3:0,Et=k.readFileSync(e,"utf8"),{frontmatter:T,steps:D}=be(Et);D.length===0&&(console.error(" error: flow file must contain a YAML array of steps"),process.exit(1));let j=u||T.device||"",$e=T.theme||"",le=g||T.electron===!0,It=T.app===void 0||T.app===null?"":typeof T.app=="number"?String(T.app):T.app,Re=await or(It),de=Re.target,Me={stripBooleanFlags:["--record","--profile","--electron","--new","--preview","--preview-open","--headless","--headed"],stripValueFlags:["--out","--device","--slow","--tail-wait","--url","--replace","--remap","--screenshots","--screenshot-paths","--preview-origin","--preview-public-origin","--driver","--billing-kind","--owner","--repo"]},x=ge(i,Me),Ft=t("--url")||"";le&&!ze()&&(console.error(" error: desktop companion not found. install or build it first with `bun run build:electron`"),process.exit(1));let Pt=le?"desktop companion":"bridge",At=de?` | target: ${de}`:"";console.log(`
512
512
  sootsim maestro \u2014 ${y.basename(e)}
513
513
  ${D.length} steps | ${Pt}${At}${_?" | recording":""}${r?" | profiling":""}${m?` | ${m}ms delay`:""}
514
- `);let $=Ft||de||"",ce=o||le&&x.simIdSource!=="flag",Me=t("--driver")||"",ue=!1,pe=new Set,Oe=!1;if(!$&&!ce&&x.simIdSource==="none"){let h=Ce(x);try{let d=await h.listSims(),b=d.find(O=>O.isPrimary&&O.readyState==="open"),A=d.find(O=>O.readyState==="open"),G=b??A;G&&(Oe=!0,console.log(` reusing active sim: ${G.id}`))}catch{}finally{h.close()}}if(!$&&!Oe&&(ce||x.simIdSource==="none")){let h=await sr();h||(console.error(" error: no current sim and no sootsim target found"),process.exit(1)),$=h}if($&&j){let h=new URL(await Xe($,Ye(x.wsPort)));h.searchParams.set("device",j),$=h.toString()}if($){let h=[$];if(h.push(...vt),h.push(...xt),ce&&h.push("--new"),h.push("--no-describe"),x.simIdSource==="flag"&&x.simId&&h.push("--sim",x.simId),Me&&(h.push("--driver",Me),ue=!0),i.includes("--headless")&&!n&&h.push("--headless"),await Qe(h,{port:x.wsPort,timeoutMs:x.commandTimeoutMs,runtimeConfig:$e.runtimeConfig}),ue){let d=fe();d&&pe.add(d)}}let B=me(i,Re),Q=B.simIdSource==="flag"?B.simId:fe()||B.simId,kt=B.simIdSource==="flag"?"flag":Q?"saved":"none",E=ge(B.wsPort,{commandTimeoutMs:B.commandTimeoutMs,simId:Q,simIdSource:kt}),p,_e=async()=>{let h=T.env?.SOOTSIM_STATUS_BAR_TIME;if(h){if(!/^(?:[1-9]|1[0-2]):[0-5][0-9]$/.test(h))throw new Error("SOOTSIM_STATUS_BAR_TIME must be a 12-hour time such as 9:41");await E.send({type:"evaluate",simId:p.simId,code:`window.dispatchEvent(new CustomEvent('sootsim:statusBarOverride', { detail: { time: ${JSON.stringify(h)} } }))`})}if(ke&&await E.send({type:"call",simId:p.simId,path:"SootSim.bridges.settings.set",args:["colorScheme",ke]}),!j)return!1;let d=await E.send({type:"evaluate",simId:p.simId,code:"window.location.href"});if(typeof d=="string"&&d.length>0){let b=new URL(d);b.searchParams.set("device",j),p.setSimRouteHint(b.toString())}return!!await E.send({type:"call",simId:p.simId,path:"SootSim.bridges.settings.set",args:["deviceModel",j]})};if(p=new se(E,{screenshotDir:a,flowDir:y.dirname(y.resolve(e)),screenshotPathMode:l,screenshotLayers:c,simId:Q,recordingOutputDir:_?s:void 0,recordingFormat:f?"mp4":"webm",billingOriginOverride:f?v:void 0,allowGitHubRecording:f,requireRecordingEntitlement:f,onAfterLaunch:async()=>{await _e()&&await p.waitForTree(12e4),f&&await E.send({type:"evaluate",simId:p.simId,code:`(() => {
514
+ `);let $=Ft||de||"",ce=o||le&&x.simIdSource!=="flag",Oe=t("--driver")||"",ue=!1,pe=new Set,_e=!1;if(!$&&!ce&&x.simIdSource==="none"){let h=Ce(x);try{let d=await h.listSims(),b=d.find(O=>O.isPrimary&&O.readyState==="open"),A=d.find(O=>O.readyState==="open"),G=b??A;G&&(_e=!0,console.log(` reusing active sim: ${G.id}`))}catch{}finally{h.close()}}if(!$&&!_e&&(ce||x.simIdSource==="none")){let h=await sr();h||(console.error(" error: no current sim and no sootsim target found"),process.exit(1)),$=h}if($&&j){let h=new URL(await Xe($,Ye(x.wsPort)));h.searchParams.set("device",j),$=h.toString()}if($){let h=[$];if(h.push(...vt),h.push(...xt),ce&&h.push("--new"),h.push("--no-describe"),x.simIdSource==="flag"&&x.simId&&h.push("--sim",x.simId),Oe&&(h.push("--driver",Oe),ue=!0),i.includes("--headless")&&!n&&h.push("--headless"),await Qe(h,{port:x.wsPort,timeoutMs:x.commandTimeoutMs,runtimeConfig:Re.runtimeConfig}),ue){let d=fe();d&&pe.add(d)}}let B=ge(i,Me),Q=B.simIdSource==="flag"?B.simId:fe()||B.simId,kt=B.simIdSource==="flag"?"flag":Q?"saved":"none",E=we(B.wsPort,{commandTimeoutMs:B.commandTimeoutMs,simId:Q,simIdSource:kt}),p,De=async()=>{let h=T.env?.SOOTSIM_STATUS_BAR_TIME;if(h){if(!/^(?:[1-9]|1[0-2]):[0-5][0-9]$/.test(h))throw new Error("SOOTSIM_STATUS_BAR_TIME must be a 12-hour time such as 9:41");await E.send({type:"evaluate",simId:p.simId,code:`window.dispatchEvent(new CustomEvent('sootsim:statusBarOverride', { detail: { time: ${JSON.stringify(h)} } }))`})}if($e&&await E.send({type:"call",simId:p.simId,path:"SootSim.bridges.settings.set",args:["colorScheme",$e]}),!j)return!1;let d=await E.send({type:"evaluate",simId:p.simId,code:"window.location.href"});if(typeof d=="string"&&d.length>0){let b=new URL(d);b.searchParams.set("device",j),p.setSimRouteHint(b.toString())}return!!await E.send({type:"call",simId:p.simId,path:"SootSim.bridges.settings.set",args:["deviceModel",j]})};if(p=new se(E,{screenshotDir:a,flowDir:y.dirname(y.resolve(e)),screenshotPathMode:l,screenshotLayers:c,simId:Q,recordingOutputDir:_?s:void 0,recordingFormat:f?"mp4":"webm",billingOriginOverride:f?v:void 0,allowGitHubRecording:f,requireRecordingEntitlement:f,onAfterLaunch:async h=>{h&&me(h),await De()&&await p.waitForTree(12e4),f&&await E.send({type:"evaluate",simId:p.simId,code:`(() => {
515
515
  const r = window.SootSim?.bridges?.eventRecorder ?? window.__sootsimEventRecorder
516
516
  return r?.start?.() ?? false
517
- })()`})}}),m&&(p.stepDelay=m),p.liveStatus=new ae(E,y.basename(e),()=>p.simId),p.js.putEnv("MAESTRO_FILENAME",y.basename(e,y.extname(e))),T.env&&typeof T.env=="object")for(let[h,d]of Object.entries(T.env))p.js.putEnv(h,d);let R=null,F=null,L=null,M=null,W=null,he=null,V=0,ee=!!D[0]?.launchApp;try{ee||await p.waitForTree(12e4),await _e()&&!ee&&await p.waitForTree(12e4),f&&!ee&&!process.env.SOOTSIM_PREVIEW_RESET_DONE&&await p.launchApp({clearState:!0}),_&&(ee?p.prepareRecording():await p.startRecording()),r&&await p.startProfile(),f&&(await E.send({type:"evaluate",simId:p.simId,code:`(() => {
517
+ })()`})}}),m&&(p.stepDelay=m),p.liveStatus=new ae(E,y.basename(e),()=>p.simId),p.js.putEnv("MAESTRO_FILENAME",y.basename(e,y.extname(e))),T.env&&typeof T.env=="object")for(let[h,d]of Object.entries(T.env))p.js.putEnv(h,d);let R=null,F=null,L=null,M=null,W=null,he=null,V=0,ee=!!D[0]?.launchApp;try{ee||await p.waitForTree(12e4),await De()&&!ee&&await p.waitForTree(12e4),f&&!ee&&!process.env.SOOTSIM_PREVIEW_RESET_DONE&&await p.launchApp({clearState:!0}),_&&(ee?p.prepareRecording():await p.startRecording()),r&&await p.startProfile(),f&&(await E.send({type:"evaluate",simId:p.simId,code:`(() => {
518
518
  const r = window.SootSim?.bridges?.eventRecorder ?? window.__sootsimEventRecorder
519
519
  return r?.start?.() ?? false
520
520
  })()`})||console.warn(" warn: eventRecorder.start() returned false \u2014 preview will upload bundle without replay events")),await p.runFlow(D),r&&(R=await p.stopProfile()),await p.waitForRecordingTail({maxMs:Tt,smart:f}),_&&(F=await p.stopRecording(),L=p.getLastRecordingDurationMs()),f&&(M=await E.send({type:"evaluate",simId:p.simId,code:`(() => {
@@ -526,10 +526,10 @@ flow extension:
526
526
  return r?.stop?.() ?? []
527
527
  })()`}),console.log(` captured ${M.length} partial replay events`)}catch(d){console.warn(` event recorder stop failed: ${d?.message||String(d)}`)}console.error(`
528
528
  x failed: ${h.message}
529
- `),R&&(console.log(" partial profile:"),yt(R)),F&&console.log(` partial video: ${F}`);try{let d=p.lastFailedStep,b=d?`step-${String(d.index+1).padStart(2,"0")}-${d.kind}`:"unstaged",A=y.join(a,b);await p.captureFailureBundle(A,{error:h,stepIndex:d?.index,stepKind:d?.kind,stepTarget:d?.target}),he=A,console.log(` failure bundle: ${A}`),console.log(" (contents: screenshot.png, describe.json, a11y.txt, tree.txt, console.json, error.json)")}catch(d){try{let b=y.join(a,"error.png");await p.captureScreenshot(b),console.log(` error screenshot: ${b}`)}catch{}console.log(` (failure bundle capture failed: ${d instanceof Error?d.message:String(d)})`)}await qe(E,{errorsCommand:`sootsim get errors 5${p.simId?` --sim ${p.simId}`:""}`,warningsCommand:`sootsim get warnings 5${p.simId?` --sim ${p.simId}`:""}`,requestsCommand:`sootsim get requests 5${p.simId?` --sim ${p.simId}`:""}`}),V=1}if(await p.liveStatus?.end(V===0?"passed":"failed"),f&&(V===0||F||M))try{let h=await lr(M??[]),d=["--origin",v,"--events",h];P&&d.push("--public-origin",P),F&&d.push("--video",F),W&&d.push("--screenshot",W),F&&L&&Number.isFinite(L)&&(d.push("--video-duration-ms",String(Math.round(L))),d.push("--recorded-duration-ms",String(Math.round(L))));let b=p.getLastRecordingStartedAtMs();b&&Number.isFinite(b)&&d.push("--recording-started-at-ms",String(Math.round(b))),x.wsPort&&d.push("--port",String(x.wsPort)),p.simId&&d.push("--sim",p.simId),H&&d.push("--open"),Pe&&d.push("--owner",Pe),Ae&&d.push("--repo",Ae),d.push("--run-scope",St),U&&d.push("--billing-kind",U),console.log(`
530
- preparing preview upload\u2026`);let A=p.getFlowTraceSteps();A.length>0&&d.push("--timeline-events",await dr(A));let G=await cr(A,b);G&&d.push("--snapshot-manifest",G),he&&d.push("--failure-bundle",he);let O=p.getLastRecordingFrameStats();O&&d.push("--trace-frame-stats",await ur(O));let{runUpload:$t}=await import("./upload-A57NAAHF.js");Ie=await $t(d,{})}catch(h){console.error(` preview upload failed: ${h?.message||h}`),V=1}return Fe=p.getFlowTraceSteps(),E.close(),ue?(p.simId&&pe.add(p.simId),await ar(x.wsPort,x.commandTimeoutMs,[...pe])):p.simId&&p.simId!==Q&&Ne(p.simId),V}async function ar(i,e,t){let r=[...new Set(t.filter(Boolean))];if(r.length===0)return;let n=ge(i,{commandTimeoutMs:e});try{let o=await n.listSims(),s=r.filter(l=>o.some(c=>c.id===l&&c.readyState==="open"));if(s.length===0)return;let a=await et(n,i,e,s);await Ze(o,s),a.closed.length>0&&console.log(` closed flow sim(s): ${a.closed.join(", ")}`),a.remaining.length>0&&console.warn(` warn: flow sim(s) still connected after close: ${a.remaining.join(", ")}`)}catch(o){console.warn(` warn: failed to close flow sim(s): ${o instanceof Error?o.message:String(o)}`)}finally{n.close()}}async function lr(i){let{gzipSync:e}=await import("zlib"),t=i.map(o=>JSON.stringify(o)).join(`
529
+ `),R&&(console.log(" partial profile:"),yt(R)),F&&console.log(` partial video: ${F}`);try{let d=p.lastFailedStep,b=d?`step-${String(d.index+1).padStart(2,"0")}-${d.kind}`:"unstaged",A=y.join(a,b);await p.captureFailureBundle(A,{error:h,stepIndex:d?.index,stepKind:d?.kind,stepTarget:d?.target}),he=A,console.log(` failure bundle: ${A}`),console.log(" (contents: screenshot.png, describe.json, a11y.txt, tree.txt, console.json, error.json)")}catch(d){try{let b=y.join(a,"error.png");await p.captureScreenshot(b),console.log(` error screenshot: ${b}`)}catch{}console.log(` (failure bundle capture failed: ${d instanceof Error?d.message:String(d)})`)}await qe(E,{errorsCommand:`sootsim get errors 5${p.simId?` --sim ${p.simId}`:""}`,warningsCommand:`sootsim get warnings 5${p.simId?` --sim ${p.simId}`:""}`,requestsCommand:`sootsim get requests 5${p.simId?` --sim ${p.simId}`:""}`}),V=1}if(await p.liveStatus?.end(V===0?"passed":"failed"),f&&(V===0||F||M))try{let h=await lr(M??[]),d=["--origin",v,"--events",h];P&&d.push("--public-origin",P),F&&d.push("--video",F),W&&d.push("--screenshot",W),F&&L&&Number.isFinite(L)&&(d.push("--video-duration-ms",String(Math.round(L))),d.push("--recorded-duration-ms",String(Math.round(L))));let b=p.getLastRecordingStartedAtMs();b&&Number.isFinite(b)&&d.push("--recording-started-at-ms",String(Math.round(b))),x.wsPort&&d.push("--port",String(x.wsPort)),p.simId&&d.push("--sim",p.simId),H&&d.push("--open"),Ae&&d.push("--owner",Ae),ke&&d.push("--repo",ke),d.push("--run-scope",St),U&&d.push("--billing-kind",U),console.log(`
530
+ preparing preview upload\u2026`);let A=p.getFlowTraceSteps();A.length>0&&d.push("--timeline-events",await dr(A));let G=await cr(A,b);G&&d.push("--snapshot-manifest",G),he&&d.push("--failure-bundle",he);let O=p.getLastRecordingFrameStats();O&&d.push("--trace-frame-stats",await ur(O));let{runUpload:$t}=await import("./upload-Y4C3YZDK.js");Fe=await $t(d,{})}catch(h){console.error(` preview upload failed: ${h?.message||h}`),V=1}return Pe=p.getFlowTraceSteps(),E.close(),ue?(p.simId&&pe.add(p.simId),await ar(x.wsPort,x.commandTimeoutMs,[...pe])):p.simId&&p.simId!==Q&&me(p.simId),V}async function ar(i,e,t){let r=[...new Set(t.filter(Boolean))];if(r.length===0)return;let n=we(i,{commandTimeoutMs:e});try{let o=await n.listSims(),s=r.filter(l=>o.some(c=>c.id===l&&c.readyState==="open"));if(s.length===0)return;let a=await et(n,i,e,s);await Ze(o,s),a.closed.length>0&&console.log(` closed flow sim(s): ${a.closed.join(", ")}`),a.remaining.length>0&&console.warn(` warn: flow sim(s) still connected after close: ${a.remaining.join(", ")}`)}catch(o){console.warn(` warn: failed to close flow sim(s): ${o instanceof Error?o.message:String(o)}`)}finally{n.close()}}async function lr(i){let{gzipSync:e}=await import("zlib"),t=i.map(o=>JSON.stringify(o)).join(`
531
531
  `)+(i.length?`
532
532
  `:""),r=e(Buffer.from(t,"utf8")),n=y.join(Z(),`sootsim-events-${Date.now()}.jsonl.gz`);return k.writeFileSync(n,r),console.log(` events: ${i.length} written to ${n} (${r.length} bytes gz)`),n}async function dr(i){let{gzipSync:e}=await import("zlib"),t=i.map((s,a)=>({schemaVersion:1,t:s.endedAtMs,seq:1e6+a,context:"host",kind:"flow-step",id:`flow-step-${s.stepIndex}`,data:{stepIndex:s.stepIndex,stepNumber:s.stepIndex+1,stepName:s.stepName,...s.targetLabel?{targetLabel:s.targetLabel}:{},status:s.status,durationMs:s.durationMs,startedAtMs:s.startedAtMs,endedAtMs:s.endedAtMs,...s.error?{error:s.error}:{}}})),r=t.map(s=>JSON.stringify(s)).join(`
533
533
  `)+`
534
- `,n=e(Buffer.from(r,"utf8")),o=y.join(Z(),`sootsim-flow-steps-${Date.now()}.jsonl.gz`);return k.writeFileSync(o,n),console.log(` flow trace: ${t.length} step events written to ${o} (${n.length} bytes gz)`),o}async function cr(i,e){if(!e)return null;let t=i.flatMap(n=>n.screenshotPath?[{id:`flow-step-${n.stepIndex}`,label:n.targetLabel??`Step ${n.stepIndex+1}`,kind:"interaction",t:Math.max(0,n.endedAtMs-e),path:n.screenshotPath}]:[]);if(t.length===0)return null;let r=y.join(Z(),`sootsim-flow-snapshots-${Date.now()}.json`);return k.writeFileSync(r,JSON.stringify(t)),console.log(` flow snapshots: ${t.length} written to ${r}`),r}async function ur(i){let e=y.join(Z(),`sootsim-frame-stats-${Date.now()}.json`);return k.writeFileSync(e,JSON.stringify(i)),console.log(` frame stats: written to ${e}`),e}async function pr(i){let e=i[0],t=r=>i.find((n,o)=>i[o-1]===r);switch(e){case"start":{let{path:r,state:n}=rt();console.log(" flow draft started"),console.log(` session: ${r}`),console.log(` steps: ${n.steps.length}`);return}case"keep":{let r=ve();if(r.active||(console.error(" no active flow draft \u2014 run `sootsim maestro start` first"),process.exit(1)),!r.kept){console.log(" no pending action to keep");return}console.log(` kept: ${r.candidate.summary}`),console.log(` steps: ${r.stepCount}`);return}case"end":{let r=t("--output")||(i[1]&&!i[1].startsWith("-")?i[1]:void 0),n=i.includes("--validate")||i.includes("--video"),o=i.includes("--video"),s=ve();s.active&&s.kept&&console.log(` auto-kept trailing action: ${s.candidate.summary}`);let a=nt(r||(n?fr():void 0));if(a.active||(console.error(" no active flow draft \u2014 run `sootsim maestro start` first"),process.exit(1)),!a.valid){console.error(" flow draft is not valid:");for(let l of a.issues)console.error(` - ${l}`);console.error(" draft preserved \u2014 keep at least one real interaction or run `sootsim maestro start` to reset"),process.exit(1)}if(n){let l=mr(i,a.outputPath),c=await bt(l);if(c!==0){console.error(`
535
- validation failed \u2014 draft preserved so you can keep iterating`),process.exitCode=c;return}Se(),console.log(` flow draft validated (${a.stepCount} step${a.stepCount===1?"":"s"})`),a.outputPath&&console.log(` saved: ${a.outputPath}`),o&&console.log(" video: recorded during validation run");return}if(Se(),console.log(` flow draft ended (${a.stepCount} step${a.stepCount===1?"":"s"})`),a.outputPath){console.log(` saved: ${a.outputPath}`),console.log(` next: sootsim maestro test ${a.outputPath} --record`);return}console.log(""),process.stdout.write(a.yaml);return}case"validate":{let r=i[1];(!r||r.startsWith("-"))&&(console.error(" usage: sootsim maestro validate <path>"),process.exit(1));let n=be(r);if(n.length>0){console.error(` x ${r} failed validation:`);for(let o of n)console.error(` - ${o}`);process.exit(1)}console.log(` + ${r} looks valid`);return}}}function hr(i){return i[0]==="--sim"&&i.length>=2?[...i.slice(2),"--sim",i[1]]:i}async function Xr(i){let e=hr(i),t=e[0];if(t==="start"||t==="keep"||t==="good"||t==="end"||t==="validate")return await pr(e),0;let r=await bt(e);return r!==0&&(process.exitCode=r),r}function yt(i){console.log(""),it(i)}function fr(){return y.join(Z(),`sootsim-flow-draft-${Date.now()}.yaml`)}function mr(i,e){if(!e)throw new Error("validated flow draft requires an output path");let t=[e];for(let r=1;r<i.length;r++){let n=i[r];if(!(n==="--validate"||n==="--video")){if(n==="--output"){r+=1;continue}r===1&&!n.startsWith("-")||t.push(n)}}return!t.includes("--record")&&i.includes("--video")&&t.push("--record"),t}export{ft as a,jt as b,zr as c,Yr as d,or as e,sr as f,bt as g,hr as h,Xr as i};
534
+ `,n=e(Buffer.from(r,"utf8")),o=y.join(Z(),`sootsim-flow-steps-${Date.now()}.jsonl.gz`);return k.writeFileSync(o,n),console.log(` flow trace: ${t.length} step events written to ${o} (${n.length} bytes gz)`),o}async function cr(i,e){if(!e)return null;let t=i.flatMap(n=>n.screenshotPath?[{id:`flow-step-${n.stepIndex}`,label:n.targetLabel??`Step ${n.stepIndex+1}`,kind:"interaction",t:Math.max(0,n.endedAtMs-e),path:n.screenshotPath}]:[]);if(t.length===0)return null;let r=y.join(Z(),`sootsim-flow-snapshots-${Date.now()}.json`);return k.writeFileSync(r,JSON.stringify(t)),console.log(` flow snapshots: ${t.length} written to ${r}`),r}async function ur(i){let e=y.join(Z(),`sootsim-frame-stats-${Date.now()}.json`);return k.writeFileSync(e,JSON.stringify(i)),console.log(` frame stats: written to ${e}`),e}async function pr(i){let e=i[0],t=r=>i.find((n,o)=>i[o-1]===r);switch(e){case"start":{let{path:r,state:n}=rt();console.log(" flow draft started"),console.log(` session: ${r}`),console.log(` steps: ${n.steps.length}`);return}case"keep":{let r=xe();if(r.active||(console.error(" no active flow draft \u2014 run `sootsim maestro start` first"),process.exit(1)),!r.kept){console.log(" no pending action to keep");return}console.log(` kept: ${r.candidate.summary}`),console.log(` steps: ${r.stepCount}`);return}case"end":{let r=t("--output")||(i[1]&&!i[1].startsWith("-")?i[1]:void 0),n=i.includes("--validate")||i.includes("--video"),o=i.includes("--video"),s=xe();s.active&&s.kept&&console.log(` auto-kept trailing action: ${s.candidate.summary}`);let a=nt(r||(n?fr():void 0));if(a.active||(console.error(" no active flow draft \u2014 run `sootsim maestro start` first"),process.exit(1)),!a.valid){console.error(" flow draft is not valid:");for(let l of a.issues)console.error(` - ${l}`);console.error(" draft preserved \u2014 keep at least one real interaction or run `sootsim maestro start` to reset"),process.exit(1)}if(n){let l=mr(i,a.outputPath),c=await bt(l);if(c!==0){console.error(`
535
+ validation failed \u2014 draft preserved so you can keep iterating`),process.exitCode=c;return}ve(),console.log(` flow draft validated (${a.stepCount} step${a.stepCount===1?"":"s"})`),a.outputPath&&console.log(` saved: ${a.outputPath}`),o&&console.log(" video: recorded during validation run");return}if(ve(),console.log(` flow draft ended (${a.stepCount} step${a.stepCount===1?"":"s"})`),a.outputPath){console.log(` saved: ${a.outputPath}`),console.log(` next: sootsim maestro test ${a.outputPath} --record`);return}console.log(""),process.stdout.write(a.yaml);return}case"validate":{let r=i[1];(!r||r.startsWith("-"))&&(console.error(" usage: sootsim maestro validate <path>"),process.exit(1));let n=Se(r);if(n.length>0){console.error(` x ${r} failed validation:`);for(let o of n)console.error(` - ${o}`);process.exit(1)}console.log(` + ${r} looks valid`);return}}}function hr(i){return i[0]==="--sim"&&i.length>=2?[...i.slice(2),"--sim",i[1]]:i}async function Xr(i){let e=hr(i),t=e[0];if(t==="start"||t==="keep"||t==="good"||t==="end"||t==="validate")return await pr(e),0;let r=await bt(e);return r!==0&&(process.exitCode=r),r}function yt(i){console.log(""),it(i)}function fr(){return y.join(Z(),`sootsim-flow-draft-${Date.now()}.yaml`)}function mr(i,e){if(!e)throw new Error("validated flow draft requires an output path");let t=[e];for(let r=1;r<i.length;r++){let n=i[r];if(!(n==="--validate"||n==="--video")){if(n==="--output"){r+=1;continue}r===1&&!n.startsWith("-")||t.push(n)}}return!t.includes("--record")&&i.includes("--video")&&t.push("--record"),t}export{ft as a,jt as b,zr as c,Yr as d,or as e,sr as f,bt as g,hr as h,Xr as i};
@@ -1,3 +1,3 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{c as P,k as m,l as S,m as R,n as _,o as v}from"./chunk-W3UIDI3W.js";var k="sootsim:settings",d=["productAnalytics","crashReports","colorScheme","reduceMotion","boldText","fontSize","largerAccessibilitySizes","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","alwaysShowLiveWebViews","showFrame","showMenuBar","showRail","solidWindow","ambientGlow","agentProvider"];function p(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function l(e){let t={};for(let n of d){if(!(n in e))continue;let o=e[n],i=S[n];i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||(t[n]=o)}return t}function K(e){let t={};for(let n of d)t[n]=e[n];return t}function M(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(k);return e?l(JSON.parse(e)):{}}catch{return{}}}function T(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(k,JSON.stringify(e))}catch{}}function x(){let t=p()?.sharedConfig?.settings;return!t||typeof t!="object"?{}:l(t)}function A(e){let t=p();if(t?.writeSharedConfig)try{t.writeSharedConfig({settings:e})}catch{}}async function L(e){let t=p();return t?.writeSharedConfig?(await t.writeSharedConfig({settings:e}),!0):!1}function b(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function O(){let e=b()?.settings;return!e||typeof e!="object"?{}:l(e)}function B(e){if(!b())return;let t={settings:e};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(t))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}async function F(e){if(!b()||typeof fetch>"u")return!1;let t=await fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:e}),keepalive:!0});if(!t.ok)throw new Error(`shared settings reset failed with HTTP ${t.status}`);return await t.text(),!0}function D(){let e=M(),t=O(),n=x();return{...e,...t,...n}}function V(e,t={}){let n=K(e);for(let o of d)t[o]!==void 0&&(n[o]=t[o]);T(n),A(n),B(n)}async function I(e,t={}){let n=K(e);for(let o of d)t[o]!==void 0&&(n[o]=t[o]);T(n),!await L(n)&&await F(n)}function j(e){if(typeof window>"u")return()=>{};let t=r=>{if(!(r.key!==k||r.newValue==null))try{e(l(JSON.parse(r.newValue)))}catch{}};window.addEventListener("storage",t);let n=p(),o;n?.onSharedConfigChanged&&(o=n.onSharedConfigChanged(r=>{let f=r?.settings;!f||typeof f!="object"||e(l(f))}));let a=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(r=>{let f=r?.settings;!f||typeof f!="object"||e(l(f))});return()=>{window.removeEventListener("storage",t),o?.(),a?.()}}var N=_(),q=v(),y=D(),c=new Set,g={};for(let e of d)N[e]!==void 0&&(c.add(e),y[e]!==void 0&&(g[e]=y[e]),delete y[e]);var s={...q,...y},w=[],u=null;function h(){for(let e of w)e()}function E(){h(),V(s,g)}function C(e,t){let n=S[e];return n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]===t?!1:(s={...s,[e]:t},e==="deviceModel"&&(u=null),!0)}j(e=>{let t={...s},n=!1;for(let[o,i]of Object.entries(e)){let a=o;if(c.has(a)){g[a]=i;continue}t[a]!==i&&(t[a]=i,n=!0)}n&&(s=t,u=null,h())});var z={get(e){return s[e]},set(e,t){C(e,t)&&E()},setRuntime(e,t){c.has(e)||(c.add(e),d.includes(e)&&(g[e]=s[e])),C(e,t)&&h()},isRuntimeControlled(e){return c.has(e)},getAll(){return s},apply(e){let t=!1,n={...s};for(let[o,i]of Object.entries(e)){if(i===void 0)continue;let a=o,r=S[a];r&&(r.validate&&!r.validate(i)||r.options&&!r.options.includes(i)||n[a]!==i&&(n[a]=i,t=!0))}t&&(s=n,u=null,E())},applyRuntime(e){let t=!1;for(let n of Object.keys(e)){let o=e[n];o!==void 0&&(c.has(n)||(c.add(n),d.includes(n)&&(g[n]=s[n])),C(n,o)&&(t=!0))}t&&h()},reset(){s=v(),u=null,E()},async resetDeviceContent(){let e=m.filter(n=>!c.has(n)).map(n=>[n,R[n]]),t=e.some(([n,o])=>s[n]!==o);s={...s,...Object.fromEntries(e)};for(let n of m)c.has(n)&&(g[n]=R[n]);t&&h(),await I(s,g)},subscribe(e){return w.push(e),()=>{w=w.filter(t=>t!==e)}},getDeviceSpec(){return u||(u=P(s.deviceModel)),u},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{z as a};
4
+ import{c as P,k as m,l as S,m as R,n as _,o as v}from"./chunk-XXNLYR64.js";var k="sootsim:settings",d=["productAnalytics","crashReports","colorScheme","reduceMotion","boldText","fontSize","largerAccessibilitySizes","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","alwaysShowLiveWebViews","showFrame","showMenuBar","showRail","solidWindow","ambientGlow","agentProvider"];function p(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function l(e){let t={};for(let n of d){if(!(n in e))continue;let o=e[n],i=S[n];i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||(t[n]=o)}return t}function K(e){let t={};for(let n of d)t[n]=e[n];return t}function M(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(k);return e?l(JSON.parse(e)):{}}catch{return{}}}function T(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(k,JSON.stringify(e))}catch{}}function x(){let t=p()?.sharedConfig?.settings;return!t||typeof t!="object"?{}:l(t)}function A(e){let t=p();if(t?.writeSharedConfig)try{t.writeSharedConfig({settings:e})}catch{}}async function L(e){let t=p();return t?.writeSharedConfig?(await t.writeSharedConfig({settings:e}),!0):!1}function b(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function O(){let e=b()?.settings;return!e||typeof e!="object"?{}:l(e)}function B(e){if(!b())return;let t={settings:e};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(t))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}async function F(e){if(!b()||typeof fetch>"u")return!1;let t=await fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:e}),keepalive:!0});if(!t.ok)throw new Error(`shared settings reset failed with HTTP ${t.status}`);return await t.text(),!0}function D(){let e=M(),t=O(),n=x();return{...e,...t,...n}}function V(e,t={}){let n=K(e);for(let o of d)t[o]!==void 0&&(n[o]=t[o]);T(n),A(n),B(n)}async function I(e,t={}){let n=K(e);for(let o of d)t[o]!==void 0&&(n[o]=t[o]);T(n),!await L(n)&&await F(n)}function j(e){if(typeof window>"u")return()=>{};let t=r=>{if(!(r.key!==k||r.newValue==null))try{e(l(JSON.parse(r.newValue)))}catch{}};window.addEventListener("storage",t);let n=p(),o;n?.onSharedConfigChanged&&(o=n.onSharedConfigChanged(r=>{let f=r?.settings;!f||typeof f!="object"||e(l(f))}));let a=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(r=>{let f=r?.settings;!f||typeof f!="object"||e(l(f))});return()=>{window.removeEventListener("storage",t),o?.(),a?.()}}var N=_(),q=v(),y=D(),c=new Set,g={};for(let e of d)N[e]!==void 0&&(c.add(e),y[e]!==void 0&&(g[e]=y[e]),delete y[e]);var s={...q,...y},w=[],u=null;function h(){for(let e of w)e()}function E(){h(),V(s,g)}function C(e,t){let n=S[e];return n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]===t?!1:(s={...s,[e]:t},e==="deviceModel"&&(u=null),!0)}j(e=>{let t={...s},n=!1;for(let[o,i]of Object.entries(e)){let a=o;if(c.has(a)){g[a]=i;continue}t[a]!==i&&(t[a]=i,n=!0)}n&&(s=t,u=null,h())});var z={get(e){return s[e]},set(e,t){C(e,t)&&E()},setRuntime(e,t){c.has(e)||(c.add(e),d.includes(e)&&(g[e]=s[e])),C(e,t)&&h()},isRuntimeControlled(e){return c.has(e)},getAll(){return s},apply(e){let t=!1,n={...s};for(let[o,i]of Object.entries(e)){if(i===void 0)continue;let a=o,r=S[a];r&&(r.validate&&!r.validate(i)||r.options&&!r.options.includes(i)||n[a]!==i&&(n[a]=i,t=!0))}t&&(s=n,u=null,E())},applyRuntime(e){let t=!1;for(let n of Object.keys(e)){let o=e[n];o!==void 0&&(c.has(n)||(c.add(n),d.includes(n)&&(g[n]=s[n])),C(n,o)&&(t=!0))}t&&h()},reset(){s=v(),u=null,E()},async resetDeviceContent(){let e=m.filter(n=>!c.has(n)).map(n=>[n,R[n]]),t=e.some(([n,o])=>s[n]!==o);s={...s,...Object.fromEntries(e)};for(let n of m)c.has(n)&&(g[n]=R[n]);t&&h(),await I(s,g)},subscribe(e){return w.push(e),()=>{w=w.filter(t=>t!==e)}},getDeviceSpec(){return u||(u=P(s.deviceModel)),u},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{z as a};
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
4
  function Q(t,e){let r=["--max-ms","--maxMs","--maxms","--max_ms"];for(let n of r){let o=t.indexOf(n);if(o>=0&&t[o+1]){let s=Number(t[o+1]);if(Number.isFinite(s))return Math.max(100,s)}}return e}var P=new Set(["tap","double-tap","tap-text","tap-id","long-press","touch"]);function N(t){return typeof t=="string"&&P.has(t)}async function M(t){return await t.send({type:"evaluate",code:"window.__sootsimEngineState?.inspectActive === true"})===!0}async function X(t,e){if(!N(e))return!1;try{return await M(t)}catch{return!1}}async function Z(t){let e=await t.send({type:"evaluate",code:"(async () => await window.__sootsimTest.getNodeCount())()"});return{nodes:typeof e=="number"?e:0}}async function ee(t,e=5,r){let n=r?.format?`, ${JSON.stringify(r)}`:"",o=await t.send({type:"evaluate",code:`(async () => await window.__sootsimTest.dumpTree(${e}${n}))()`});if(r?.format==="boxes"&&typeof o=="string")try{return{depth:e,tree:JSON.parse(o)}}catch{return{depth:e,tree:o}}return{depth:e,tree:o}}async function te(t){let e=await t.send({type:"evaluate",code:"window.location.href"});return{url:typeof e=="string"?e:""}}async function ne(t,e){let r=e.maxDepth??12,n=`(async () => {
@@ -1,7 +1,7 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{r as W}from"./chunk-IWPS3EKJ.js";import{b as Y,c as b}from"./chunk-EFXNSJ55.js";import{a as _}from"./chunk-OSZ5HZSI.js";import{a as G}from"./chunk-BGRGP3QR.js";import{f as l}from"./chunk-MRNW4GVL.js";import{c as J}from"./chunk-25BTVHK2.js";import{a as C}from"./chunk-XRO5WQXP.js";import{a as g,b as B,c as v,d as R,f as q,g as d,h as S,i as h,j as V}from"./chunk-2SFMW5K6.js";import{D as A,E,F as T,G as I,M,l as N}from"./chunk-FHWZPUGC.js";import{a as F}from"./chunk-HIDS3PYC.js";import{a}from"./chunk-FIXRGPUT.js";import Z from"node:os";import X from"node:path";import{spawn as oe}from"node:child_process";import p from"node:fs";import s from"node:path";function z(e){let n=s.resolve(e),r=null;for(;;){if(!r&&p.existsSync(s.join(n,"package.json"))&&(r=n),p.existsSync(s.join(n,".git")))return r;let o=s.dirname(n);if(o===n)return null;n=o}}function ie(e){let n=s.resolve(e);for(;;){if(p.existsSync(s.join(n,"bun.lock"))||p.existsSync(s.join(n,"bun.lockb")))return"bun";if(p.existsSync(s.join(n,"pnpm-lock.yaml")))return"pnpm";if(p.existsSync(s.join(n,"package-lock.json")))return"npm";let r=s.dirname(n);if(r===n)return"npm";n=r}}function H(e){let n=s.resolve(e.appDir),r=se(s.join(n,"package.json")),o=`${a.commandName} open`,t=r.scripts?.[a.commandName];if(t&&t!==o)throw new Error(`package.json already defines scripts.${a.commandName} as ${JSON.stringify(t)}; resolve that conflict before setup`);let i=ie(n),c=[];return r.devDependencies?.[a.packageName]!==e.cliVersion&&c.push(ae(i,e.cliVersion)),t!==o&&c.push(ue(i)),{appDir:n,packageManager:i,operations:c}}async function K(e,n){for(let r of e.operations)n.dryRun||await pe(r,e.appDir,n.json)}function k(e){return e.operations.map(n=>`${n.command} ${n.args.map(ce).join(" ")}`)}function se(e){let n;try{n=JSON.parse(p.readFileSync(e,"utf8"))}catch(t){let i=t instanceof Error?t.message:String(t);throw new Error(`could not read ${e}: ${i}`)}if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${e} must contain a JSON object`);let r=L(Reflect.get(n,"scripts")),o=L(Reflect.get(n,"devDependencies"));return{...r?{scripts:r}:{},...o?{devDependencies:o}:{}}}function L(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let n=Object.entries(e).filter(r=>typeof r[1]=="string");return Object.fromEntries(n)}function ae(e,n){let r=`${a.packageName}@${n}`;switch(e){case"bun":return{command:"bun",args:["add","--dev","--exact",r],description:`install ${r} as an exact dev dependency`};case"pnpm":return{command:"pnpm",args:["add","--save-dev","--save-exact",r],description:`install ${r} as an exact dev dependency`};case"npm":return{command:"npm",args:["install","--save-dev","--save-exact",r],description:`install ${r} as an exact dev dependency`}}}function ce(e){return/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:JSON.stringify(e)}function pe(e,n,r){return new Promise((o,t)=>{let i=oe(e.command,e.args,{cwd:n,stdio:r?["ignore",2,"inherit"]:"inherit"});i.once("error",t),i.once("exit",c=>{c===0?o():t(new Error(`${e.command} exited with code ${c??"unknown"}`))})})}function ue(e){return{command:e,args:e==="bun"?["pm","pkg","set",`scripts.${a.commandName}=${a.commandName} open`]:["pkg","set",`scripts.${a.commandName}=${a.commandName} open`],description:`add the \`${a.commandName}\` package script`}}async function Ge(e,n={}){if(e.includes("--help")||e.includes("-h")){Re();return}let r=de(e),o=n.launchConnectRN??(!r.ci&&!r.yes&&!r.json&&!r.dryRun&&process.stdin.isTTY);try{ve(r);let t=z(r.appDir),i=Y(),c=T(),x=await me(r,i);!x&&!i.installed&&!r.json&&console.log(` ${v("Enable it later with")} ${g("rnx daemon install")}`);let f=await ye(r),ne=r.json?await l.fetchManifest():await S("Checking the rnx runtime",()=>l.fetchManifest()),m=l.resolveVersion(ne,{channel:"stable"}).version,D=F();if(D==="0.0.0")throw new Error("could not resolve the installed rnx CLI version");let P=!1;if(!r.dryRun){let y=M(),j=()=>l.install({version:m,channel:"stable",setActive:!0,protectVersions:y?[y]:[]});P=(r.json?await j():await S(`Preparing runtime ${m}`,j)).installed}let O=i.installed;x&&!i.installed&&!r.dryRun&&(r.json?await b({port:7668,force:!1}):(console.log(`
4
+ import{q as W}from"./chunk-7B37IZBN.js";import{b as Y,c as b}from"./chunk-LN3RNW6X.js";import{a as _}from"./chunk-NAYLPOC5.js";import{a as G}from"./chunk-I6KIM6PN.js";import{f as l}from"./chunk-77ZHQJZR.js";import{c as J}from"./chunk-YCCCPFWT.js";import{a as C}from"./chunk-IZKHOM37.js";import{a as g,b as B,c as v,d as R,f as q,g as d,h as S,i as h,j as V}from"./chunk-N3UC7HIX.js";import{D as A,E,F as T,G as I,M,l as N}from"./chunk-YXXKSL6R.js";import{a as F}from"./chunk-ONORMKWX.js";import{a}from"./chunk-5NMCF5VF.js";import Z from"node:os";import X from"node:path";import{spawn as oe}from"node:child_process";import p from"node:fs";import s from"node:path";function z(e){let n=s.resolve(e),r=null;for(;;){if(!r&&p.existsSync(s.join(n,"package.json"))&&(r=n),p.existsSync(s.join(n,".git")))return r;let o=s.dirname(n);if(o===n)return null;n=o}}function ie(e){let n=s.resolve(e);for(;;){if(p.existsSync(s.join(n,"bun.lock"))||p.existsSync(s.join(n,"bun.lockb")))return"bun";if(p.existsSync(s.join(n,"pnpm-lock.yaml")))return"pnpm";if(p.existsSync(s.join(n,"package-lock.json")))return"npm";let r=s.dirname(n);if(r===n)return"npm";n=r}}function H(e){let n=s.resolve(e.appDir),r=se(s.join(n,"package.json")),o=`${a.commandName} open`,t=r.scripts?.[a.commandName];if(t&&t!==o)throw new Error(`package.json already defines scripts.${a.commandName} as ${JSON.stringify(t)}; resolve that conflict before setup`);let i=ie(n),c=[];return r.devDependencies?.[a.packageName]!==e.cliVersion&&c.push(ae(i,e.cliVersion)),t!==o&&c.push(ue(i)),{appDir:n,packageManager:i,operations:c}}async function K(e,n){for(let r of e.operations)n.dryRun||await pe(r,e.appDir,n.json)}function k(e){return e.operations.map(n=>`${n.command} ${n.args.map(ce).join(" ")}`)}function se(e){let n;try{n=JSON.parse(p.readFileSync(e,"utf8"))}catch(t){let i=t instanceof Error?t.message:String(t);throw new Error(`could not read ${e}: ${i}`)}if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${e} must contain a JSON object`);let r=L(Reflect.get(n,"scripts")),o=L(Reflect.get(n,"devDependencies"));return{...r?{scripts:r}:{},...o?{devDependencies:o}:{}}}function L(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let n=Object.entries(e).filter(r=>typeof r[1]=="string");return Object.fromEntries(n)}function ae(e,n){let r=`${a.packageName}@${n}`;switch(e){case"bun":return{command:"bun",args:["add","--dev","--exact",r],description:`install ${r} as an exact dev dependency`};case"pnpm":return{command:"pnpm",args:["add","--save-dev","--save-exact",r],description:`install ${r} as an exact dev dependency`};case"npm":return{command:"npm",args:["install","--save-dev","--save-exact",r],description:`install ${r} as an exact dev dependency`}}}function ce(e){return/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:JSON.stringify(e)}function pe(e,n,r){return new Promise((o,t)=>{let i=oe(e.command,e.args,{cwd:n,stdio:r?["ignore",2,"inherit"]:"inherit"});i.once("error",t),i.once("exit",c=>{c===0?o():t(new Error(`${e.command} exited with code ${c??"unknown"}`))})})}function ue(e){return{command:e,args:e==="bun"?["pm","pkg","set",`scripts.${a.commandName}=${a.commandName} open`]:["pkg","set",`scripts.${a.commandName}=${a.commandName} open`],description:`add the \`${a.commandName}\` package script`}}async function Ge(e,n={}){if(e.includes("--help")||e.includes("-h")){Re();return}let r=de(e),o=n.launchConnectRN??(!r.ci&&!r.yes&&!r.json&&!r.dryRun&&process.stdin.isTTY);try{ve(r);let t=z(r.appDir),i=Y(),c=T(),x=await me(r,i);!x&&!i.installed&&!r.json&&console.log(` ${v("Enable it later with")} ${g("rnx daemon install")}`);let f=await ye(r),ne=r.json?await l.fetchManifest():await S("Checking the rnx runtime",()=>l.fetchManifest()),m=l.resolveVersion(ne,{channel:"stable"}).version,D=F();if(D==="0.0.0")throw new Error("could not resolve the installed rnx CLI version");let P=!1;if(!r.dryRun){let y=M(),j=()=>l.install({version:m,channel:"stable",setActive:!0,protectVersions:y?[y]:[]});P=(r.json?await j():await S(`Preparing runtime ${m}`,j)).installed}let O=i.installed;x&&!i.installed&&!r.dryRun&&(r.json?await b({port:7668,force:!1}):(console.log(`
5
5
  ${g("\u25C6")} ${B("Enabling the background service")}`),await b({port:7668,force:!1})),O=!0),f==="electron"&&!r.dryRun&&!G()&&await _(["--yes"]),o&&(console.log(`
6
6
  ${g("\u25C6")} Opening ConnectRN`),await W(["ConnectRN","--driver",f,"--no-describe","--quiet"]));let re=await ge(r,c),te=!1,u=t?H({appDir:t,cliVersion:D}):null,w=await he(r,u);if(w&&u){if(!r.json)for(let y of k(u))console.log(` ${v(r.dryRun?"Would run":"Running")} ${y}`);await K(u,{dryRun:r.dryRun,json:r.json})}r.dryRun||(I({productAnalytics:re,crashReports:te}),E(f));let $={runtimeVersion:m,serviceInstalled:O,repositoryPrepared:w,simulatorDriver:f};return r.json?console.log(JSON.stringify({...$,runtimeInstalled:P,dryRun:r.dryRun,cache:we(m),repositoryOperations:w&&u?k(u):[]},null,2)):console.log(`
7
7
  ${R("\u2713")} ${o?"ConnectRN is open. ":""}rnx is ready.`),$}catch(t){throw J(t),t}}function de(e){let n=e.indexOf("--app"),r=n>=0?e[n+1]:void 0;if(n>=0&&(!r||r.startsWith("-")))throw new Error("--app requires a directory");return{appDir:X.resolve(r??process.cwd()),ci:e.includes("--ci")||C(),dryRun:e.includes("--dry-run"),json:e.includes("--json"),yes:e.includes("--yes")||e.includes("-y"),service:Q(e,"--service","--no-service"),repository:Q(e,"--repo","--no-repo"),productAnalytics:fe(e,"--analytics"),simulatorDriver:le(e)}}function le(e){let n=e.includes("--desktop"),r=e.includes("--browser");if(n&&r)throw new Error("--desktop and --browser cannot be used together");if(n)return"electron";if(r)return"playwright"}function Q(e,n,r){if(e.includes(n)&&e.includes(r))throw new Error(`${n} and ${r} cannot be used together`);if(e.includes(n))return!0;if(e.includes(r))return!1}function fe(e,n){let r=e.find(i=>i.startsWith(`${n}=`)),o=e.indexOf(n),t=r?.slice(n.length+1)??(o>=0?e[o+1]:void 0);if(t!==void 0){if(t==="on"||t==="yes"||t==="true")return!0;if(t==="off"||t==="no"||t==="false")return!1;throw new Error(`${n} must be on or off`)}}async function me(e,n){if(e.ci){if(e.service===!0)throw new Error("--ci cannot install a machine service");return!1}return n.supported?n.installed&&e.service===void 0?(e.json||console.log(` ${R("\u2713")} Background service is ready`),!0):e.service!==void 0?e.service:e.yes?!0:(ee(e,"--service or --no-service"),d("Background service",["Keeps the local bridge and runtime ready between commands.","Agent inspection, interaction, and test commands start much faster."]),h("Enable the background service?",!0)):(e.json||d("Background service",["The persistent service is currently available on macOS and Linux.","rnx will start the bridge when needed on this platform."]),!1)}async function ye(e){if(e.simulatorDriver)return e.simulatorDriver;let n=A();if(n)return n;if(e.ci||e.yes)return"playwright";ee(e,"--desktop or --browser");let r=process.platform==="darwin"?"Desktop downloads a DMG and installs rnx.app.":process.platform==="win32"?"Desktop downloads and runs the rnx installer.":"Desktop downloads the matching rnx AppImage.",o=process.platform==="darwin"?"Desktop app Installs rnx.app from a DMG":process.platform==="win32"?"Desktop app Runs the rnx installer":"Desktop app Installs the matching AppImage";return d("Simulator window",["Browser opens immediately in an isolated Chrome window.",r,"The Desktop app opens in a dedicated native window."]),await V("Where should rnx open?",["Browser (recommended) No additional download",o])===0?"playwright":"electron"}async function ge(e,n){return e.productAnalytics!==void 0?e.productAnalytics:n.configured?n.productAnalytics:e.yes||e.ci||!process.stdin.isTTY?!1:(d("Private by default",["Diagnostics stay off unless you opt in.","Reports can contain package compatibility or an error class.","They never contain your code or app data."]),h("Share bounded diagnostics to improve rnx?",!1))}async function he(e,n){if(!n){if(e.repository===!0)throw new Error("--repo requires a package.json inside a Git repository");return!1}return n.operations.length===0?!0:e.repository!==void 0?e.repository:e.yes||e.ci||!process.stdin.isTTY?!1:(d("Share rnx with your team",["rnx already works here with no project setup.","This only adds an exact rnxsim dev dependency and an rnx script for teammates."]),h(`Add rnx to ${X.basename(n.appDir)}?`,!1))}function ee(e,n){if(!(process.stdin.isTTY&&!e.ci))throw new Error(`non-interactive setup requires ${n}, or --yes to accept defaults`)}function we(e){let n=Z.platform(),r=Z.arch();return{path:N(e),key:`sootsim-runtime-${n}-${r}-${e}`,inputs:{platform:n,arch:r,runtimeVersion:e}}}function ve(e){e.json||q("Run any React Native app in a local simulator. No project setup required.")}function Re(){console.log(`
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
4
  var o=!0,e="public beta",t=e,n="we send anonymous error and dependency data while you use it";export{o as a,e as b,t as c,n as d};
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.365 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
4
  var t=Object.freeze({id:"ios",displayName:"iOS",isIOS:!0,isAndroid:!1,select:e=>e.ios}),r=Object.freeze({id:"android",displayName:"Android",isIOS:!1,isAndroid:!0,select:e=>e.android}),i=Object.freeze({ios:t,android:r});