rnxsim 0.1.335 → 0.1.336
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.
- package/README.md +104 -76
- package/cli/auth.ts +2 -2
- package/cli/bin.ts +7 -3
- package/cli/bridge-flow-runner.ts +2 -2
- package/cli/commands/agent-wrapper.ts +1 -1
- package/cli/commands/agent.ts +12 -12
- package/cli/commands/app-fonts.ts +1 -1
- package/cli/commands/assert.ts +7 -7
- package/cli/commands/auth.ts +4 -4
- package/cli/commands/camera.ts +13 -13
- package/cli/commands/cleanup.ts +6 -6
- package/cli/commands/compat.ts +4 -4
- package/cli/commands/config.ts +2 -2
- package/cli/commands/control.ts +37 -43
- package/cli/commands/cpu-profile.ts +2 -2
- package/cli/commands/daemon-mac-app.ts +2 -2
- package/cli/commands/daemon.ts +12 -12
- package/cli/commands/debug.ts +22 -22
- package/cli/commands/desktop.ts +3 -3
- package/cli/commands/detox.ts +17 -17
- package/cli/commands/device.ts +9 -9
- package/cli/commands/diagnose.ts +11 -11
- package/cli/commands/electron.ts +7 -7
- package/cli/commands/film.ts +6 -6
- package/cli/commands/inspect/core.ts +6 -7
- package/cli/commands/inspect/find.ts +2 -2
- package/cli/commands/inspect.ts +36 -36
- package/cli/commands/install-desktop.ts +8 -8
- package/cli/commands/login.ts +6 -6
- package/cli/commands/maestro-generate.ts +2 -2
- package/cli/commands/maestro.ts +23 -23
- package/cli/commands/mode.ts +4 -4
- package/cli/commands/no-bridge-hint.ts +9 -9
- package/cli/commands/perf.ts +11 -11
- package/cli/commands/permissions.ts +5 -5
- package/cli/commands/profile.ts +11 -11
- package/cli/commands/react.ts +15 -15
- package/cli/commands/record.ts +15 -15
- package/cli/commands/report-issue.ts +2 -2
- package/cli/commands/reset.ts +2 -2
- package/cli/commands/runtime.ts +18 -18
- package/cli/commands/screenshot-mode.ts +5 -5
- package/cli/commands/screenshot.ts +12 -12
- package/cli/commands/screenshots-capture.ts +7 -7
- package/cli/commands/screenshots.ts +6 -6
- package/cli/commands/serve.ts +6 -6
- package/cli/commands/setup.ts +13 -15
- package/cli/commands/skills.ts +14 -14
- package/cli/commands/slides.ts +19 -23
- package/cli/commands/state.ts +2 -2
- package/cli/commands/storage.ts +3 -3
- package/cli/commands/telemetry.ts +1 -1
- package/cli/commands/three-mode.ts +16 -16
- package/cli/commands/timeline.ts +4 -4
- package/cli/commands/upgrade.ts +1 -1
- package/cli/commands/upload.ts +11 -11
- package/cli/commands/version.ts +3 -5
- package/cli/commands/what-happened.ts +11 -11
- package/cli/drivers/electron.ts +3 -3
- package/cli/hints.ts +8 -8
- package/cli/recording-access.ts +1 -1
- package/cli/ws-bridge.ts +5 -5
- package/dist-cli/bin.js +5 -5
- package/dist-cli/chunks/{agent-XSJMAFVA.js → agent-PZLF36FY.js} +14 -14
- package/dist-cli/chunks/{agent-wrapper-NFLJ5K64.js → agent-wrapper-6TA43SJ2.js} +3 -3
- package/dist-cli/chunks/app-fonts-MTZTCJUY.js +4 -0
- package/dist-cli/chunks/{assert-ILAXIYB5.js → assert-2CVO2TYX.js} +12 -12
- package/dist-cli/chunks/auth-LKXFRFOT.js +12 -0
- package/dist-cli/chunks/{beta-TDR6UKJU.js → beta-OATC5IPA.js} +2 -2
- package/dist-cli/chunks/camera-VX65VO5N.js +33 -0
- package/dist-cli/chunks/{chunk-DCDKJ4NC.js → chunk-262YA5CJ.js} +2 -2
- package/dist-cli/chunks/{chunk-JWAY6DIH.js → chunk-2J4OBR7W.js} +18 -18
- package/dist-cli/chunks/{chunk-VV4MXLFR.js → chunk-2PFDFGOG.js} +1 -1
- package/dist-cli/chunks/{chunk-R3CMECGC.js → chunk-2Q6S7X5O.js} +4 -4
- package/dist-cli/chunks/{chunk-MGGRL2Z2.js → chunk-2VOFUIKQ.js} +9 -9
- package/dist-cli/chunks/chunk-3QCSDI3B.js +5 -0
- package/dist-cli/chunks/{chunk-R2UL5VFY.js → chunk-4532OPNZ.js} +3 -3
- package/dist-cli/chunks/{chunk-RTD3CPDQ.js → chunk-5YCVNKD7.js} +23 -23
- package/dist-cli/chunks/{chunk-RTEJXUXN.js → chunk-6ALTVOXE.js} +6 -6
- package/dist-cli/chunks/chunk-6TN3YWA6.js +124 -0
- package/dist-cli/chunks/{chunk-ZZWO6Y7X.js → chunk-7FHAHI5V.js} +2 -2
- package/dist-cli/chunks/{chunk-3ZDOPKHE.js → chunk-7PMNRG53.js} +4 -4
- package/dist-cli/chunks/{chunk-GVKISFQ3.js → chunk-ARFQOYRO.js} +1 -1
- package/dist-cli/chunks/chunk-BHXQ7MUW.js +5 -0
- package/dist-cli/chunks/{chunk-WKT7YM5Q.js → chunk-BIZE6NBI.js} +1 -1
- package/dist-cli/chunks/{chunk-POC3QTA6.js → chunk-BOZARB6P.js} +2 -2
- package/dist-cli/chunks/chunk-BVGUTE2T.js +74 -0
- package/dist-cli/chunks/{chunk-IV36DY6M.js → chunk-BYOFHYKS.js} +1 -1
- package/dist-cli/chunks/{chunk-35XNGT5C.js → chunk-DMD24WAG.js} +1 -1
- package/dist-cli/chunks/{chunk-IN2PZBQD.js → chunk-EAPHUH2R.js} +2 -2
- package/dist-cli/chunks/{chunk-3CS4EUMG.js → chunk-FMWEQNK2.js} +2 -2
- package/dist-cli/chunks/{chunk-TL4DNDDY.js → chunk-FWGDP2J4.js} +2 -2
- package/dist-cli/chunks/{chunk-ROPHZJ6P.js → chunk-G3FVXFPF.js} +2 -2
- package/dist-cli/chunks/{chunk-MTNIDSOA.js → chunk-GI3GZ54J.js} +1 -1
- package/dist-cli/chunks/{chunk-42ALI64M.js → chunk-HDHHEWEA.js} +2 -2
- package/dist-cli/chunks/{chunk-MTD6IAEA.js → chunk-JIWE66VU.js} +1 -1
- package/dist-cli/chunks/{chunk-M7CBQ5I4.js → chunk-KDRDDPNN.js} +1 -1
- package/dist-cli/chunks/{chunk-USGOQ3YJ.js → chunk-KPL344LX.js} +2 -2
- package/dist-cli/chunks/{chunk-F33DUJGG.js → chunk-M2OWBYUG.js} +1 -1
- package/dist-cli/chunks/{chunk-ZTM2MKNI.js → chunk-M2XGXP7G.js} +1 -1
- package/dist-cli/chunks/{chunk-6VN5ULGQ.js → chunk-MARPC3GM.js} +2 -2
- package/dist-cli/chunks/{chunk-RELRA5VW.js → chunk-MQES3MTN.js} +2 -2
- package/dist-cli/chunks/{chunk-6Y3PVPTF.js → chunk-NDLRQH7U.js} +5 -5
- package/dist-cli/chunks/{chunk-JWK5WD44.js → chunk-NJMBQLAU.js} +2 -2
- package/dist-cli/chunks/{chunk-RVUGKXJD.js → chunk-NL2HXO7U.js} +1 -1
- package/dist-cli/chunks/{chunk-ZYHCWCMM.js → chunk-NVPZLIMW.js} +1 -1
- package/dist-cli/chunks/{chunk-42KDXJUD.js → chunk-NWVH2X7F.js} +2 -2
- package/dist-cli/chunks/{chunk-FJSHIWAM.js → chunk-OUAYBJ4G.js} +2 -2
- package/dist-cli/chunks/{chunk-I2HQB5NN.js → chunk-OXRDTNVL.js} +2 -2
- package/dist-cli/chunks/{chunk-CL3PREIE.js → chunk-QIVOOERS.js} +2 -2
- package/dist-cli/chunks/{chunk-INBPUR4T.js → chunk-RZ2PXHA7.js} +11 -11
- package/dist-cli/chunks/{chunk-YSUIYK6B.js → chunk-S33NCWJV.js} +2 -2
- package/dist-cli/chunks/{chunk-J7XFINJG.js → chunk-STMCT3G3.js} +2 -2
- package/dist-cli/chunks/{chunk-FE6ZHPKD.js → chunk-SV6NVD7P.js} +1 -1
- package/dist-cli/chunks/{chunk-HNQLZZJA.js → chunk-TA4GBBGC.js} +2 -2
- package/dist-cli/chunks/{chunk-4KC35DMK.js → chunk-TV457FWW.js} +2 -2
- package/dist-cli/chunks/chunk-UB3JHBDW.js +4 -0
- package/dist-cli/chunks/{chunk-LCVUJCRJ.js → chunk-UU2KMAIA.js} +1 -1
- package/dist-cli/chunks/chunk-UZCNKUSS.js +15 -0
- package/dist-cli/chunks/{chunk-GP6QEBZA.js → chunk-V4OZDPTA.js} +1 -1
- package/dist-cli/chunks/{chunk-CGZWLSYD.js → chunk-WBTT5WIO.js} +1 -1
- package/dist-cli/chunks/chunk-YYBC6VB2.js +30 -0
- package/dist-cli/chunks/{chunk-PO3TOAED.js → chunk-ZI6YQKD6.js} +2 -2
- package/dist-cli/chunks/{cleanup-X6ZRPFDV.js → cleanup-ZC5OVBIM.js} +10 -10
- package/dist-cli/chunks/cli-version-NOYHDN6P.js +4 -0
- package/dist-cli/chunks/{compat-VRXJ5J56.js → compat-BS2E7XDD.js} +9 -9
- package/dist-cli/chunks/{config-LHPPE4EP.js → config-VDCDUYMZ.js} +5 -5
- package/dist-cli/chunks/{control-TVTNGSSF.js → control-IKS3CUP4.js} +2 -2
- package/dist-cli/chunks/daemon-MM3C4O2B.js +4 -0
- package/dist-cli/chunks/{debug-EUHBBPGM.js → debug-BKMZ5SRR.js} +17 -17
- package/dist-cli/chunks/desktop-FZQHSNF7.js +31 -0
- package/dist-cli/chunks/detox-52AM3DKY.js +52 -0
- package/dist-cli/chunks/{device-PONITUZJ.js → device-7FL5Y542.js} +11 -11
- package/dist-cli/chunks/{diagnose-2PN4K4L2.js → diagnose-YT4BKJ7I.js} +12 -12
- package/dist-cli/chunks/{disk-cleanup-U2PQLOEW.js → disk-cleanup-O6ICYLAC.js} +2 -2
- package/dist-cli/chunks/drivers-YY3YRD2L.js +4 -0
- package/dist-cli/chunks/{film-XGZCFTQL.js → film-7YBOFSOZ.js} +9 -9
- package/dist-cli/chunks/flow-I4PVS52A.js +4 -0
- package/dist-cli/chunks/help-35ESSWJH.js +4 -0
- package/dist-cli/chunks/{hidden-runtime-alias-I4MYF5CO.js → hidden-runtime-alias-M3UFKZB6.js} +2 -2
- package/dist-cli/chunks/{home-paths-YRAPZ5LE.js → home-paths-VW7G7LVZ.js} +2 -2
- package/dist-cli/chunks/inspect-PCJ6C2BN.js +4 -0
- package/dist-cli/chunks/install-desktop-NGQWMGQO.js +4 -0
- package/dist-cli/chunks/{login-ZMAIAQ6F.js → login-5VAHTGHC.js} +6 -6
- package/dist-cli/chunks/{logout-UQZ5JBJU.js → logout-CXZFNMYF.js} +2 -2
- package/dist-cli/chunks/{maestro-BQYKDUC4.js → maestro-THMBR6L3.js} +25 -25
- package/dist-cli/chunks/{maestro-generate-VQYMMQJ5.js → maestro-generate-R73J53KE.js} +3 -3
- package/dist-cli/chunks/mode-5RJYFW76.js +26 -0
- package/dist-cli/chunks/{optional-demo-registry-DUWHCLGD.js → optional-demo-registry-U7SCVX5U.js} +2 -2
- package/dist-cli/chunks/{perf-7RAU7WRZ.js → perf-AW6LG6FW.js} +28 -28
- package/dist-cli/chunks/permissions-6JWNMXYT.js +13 -0
- package/dist-cli/chunks/record-LLPM3BJT.js +72 -0
- package/dist-cli/chunks/{report-issue-P376KFFU.js → report-issue-YO2NAMJS.js} +4 -4
- package/dist-cli/chunks/reset-5LDPRL3W.js +4 -0
- package/dist-cli/chunks/runtime-IAICY2UL.js +4 -0
- package/dist-cli/chunks/{screenshot-command-NE7BKTQ2.js → screenshot-command-X7ECU2SK.js} +34 -34
- package/dist-cli/chunks/{screenshot-layers-UE4R64PZ.js → screenshot-layers-E7GLIOHG.js} +2 -2
- package/dist-cli/chunks/{screenshots-capture-ULXPLXMC.js → screenshots-capture-TKR2YV6U.js} +11 -11
- package/dist-cli/chunks/{serve-P7BT4XHR.js → serve-HFNYO3YS.js} +16 -16
- package/dist-cli/chunks/setup-2HQHROP3.js +32 -0
- package/dist-cli/chunks/{skills-NTRYKJSF.js → skills-PFCCKOPW.js} +16 -16
- package/dist-cli/chunks/{state-4D5YAM47.js → state-NOCC6IGB.js} +5 -5
- package/dist-cli/chunks/storage-4SYN4ZWP.js +37 -0
- package/dist-cli/chunks/store-7QDSVAZ4.js +4 -0
- package/dist-cli/chunks/telemetry-LGTXJEJC.js +4 -0
- package/dist-cli/chunks/{timeline-GZNFGD3Q.js → timeline-E2SFUV76.js} +6 -6
- package/dist-cli/chunks/{upgrade-A46D6PEY.js → upgrade-KD76JQCK.js} +2 -2
- package/dist-cli/chunks/upload-FI2TS5S7.js +4 -0
- package/dist-cli/chunks/version-B23A4BFH.js +6 -0
- package/dist-cli/chunks/{web-H2IXO5SC.js → web-6OAWYV5Z.js} +2 -2
- package/dist-cli/chunks/{what-happened-Z7UII5GH.js → what-happened-IYXUFM72.js} +16 -16
- package/dist-lib/agent-daemon-client.cjs +5 -5
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +4 -4
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +7 -7
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +248 -98
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +2 -2
- package/dist-lib/menu.mjs +2 -2
- package/dist-lib/metro-host-modules/react-dom.js +6 -0
- package/dist-lib/metro-host-modules/react-native-web.js +6 -0
- package/dist-lib/metro-host-modules/react-native.js +6 -0
- package/dist-lib/metro-host-modules/react.js +6 -0
- package/dist-lib/metro-host-modules/react__jsx-dev-runtime.js +6 -0
- package/dist-lib/metro-host-modules/react__jsx-runtime.js +6 -0
- package/dist-lib/metro-production-bundle.cjs +72 -0
- package/dist-lib/metro-production-bundle.mjs +44 -0
- package/dist-lib/metro.cjs +152 -8
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +2 -2
- package/dist-lib/react-native-host-modules.cjs +50 -0
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +6 -7
- package/dist-lib/sdk.mjs +6 -7
- package/dist-lib/skills.cjs +71 -77
- package/dist-lib/vite.cjs +104 -85
- package/package.json +15 -2
- package/scripts/preuninstall.cjs +1 -1
- package/skills/contrast/SKILL.md +67 -75
- package/skills/rnx-debug/SKILL.md +84 -84
- package/skills/rnx-perf/SKILL.md +8 -8
- package/skills/rnx-setup/SKILL.md +54 -54
- package/skills/rnx-test/SKILL.md +35 -35
- package/skills/rnx-visual/SKILL.md +18 -18
- package/src/agent-daemon-client.ts +2 -2
- package/src/agent-sessions.ts +2 -2
- package/src/connect.ts +6 -6
- package/src/disk-cleanup.ts +1 -1
- package/src/home-paths.ts +1 -1
- package/src/host/bridge-host.ts +6 -6
- package/src/index.ts +1 -1
- package/src/metro-host-modules/react-dom.js +6 -0
- package/src/metro-host-modules/react-native-web.js +6 -0
- package/src/metro-host-modules/react-native.js +6 -0
- package/src/metro-host-modules/react.js +6 -0
- package/src/metro-host-modules/react__jsx-dev-runtime.js +6 -0
- package/src/metro-host-modules/react__jsx-runtime.js +6 -0
- package/src/metro-plugin.ts +249 -10
- package/src/metro-production-bundle.ts +51 -0
- package/src/public-brand.ts +1 -1
- package/src/react-native-host-modules.ts +25 -0
- package/src/runtime-assets.ts +1 -1
- package/src/sim-client.ts +1 -1
- package/src/vite-plugin-one.ts +171 -145
- package/dist-cli/chunks/app-fonts-L3UXFYVE.js +0 -4
- package/dist-cli/chunks/auth-ISX2EUQL.js +0 -12
- package/dist-cli/chunks/camera-4SWTNJUA.js +0 -33
- package/dist-cli/chunks/chunk-BRHZEZKN.js +0 -124
- package/dist-cli/chunks/chunk-EJPYPJWP.js +0 -5
- package/dist-cli/chunks/chunk-KWCD5MOK.js +0 -15
- package/dist-cli/chunks/chunk-MJ7QGY7Z.js +0 -4
- package/dist-cli/chunks/chunk-RSA4XWHN.js +0 -5
- package/dist-cli/chunks/chunk-S3EIOAWZ.js +0 -74
- package/dist-cli/chunks/chunk-TYANJQLO.js +0 -30
- package/dist-cli/chunks/cli-version-NZUSWKZR.js +0 -4
- package/dist-cli/chunks/daemon-XUEC47EC.js +0 -4
- package/dist-cli/chunks/desktop-LLHMP4A3.js +0 -31
- package/dist-cli/chunks/detox-QLNWLXA4.js +0 -52
- package/dist-cli/chunks/drivers-7IU37M2E.js +0 -4
- package/dist-cli/chunks/flow-NZZLR4BN.js +0 -4
- package/dist-cli/chunks/help-D7URIJRD.js +0 -4
- package/dist-cli/chunks/inspect-TJYWKY56.js +0 -4
- package/dist-cli/chunks/install-desktop-LD3W5RS7.js +0 -4
- package/dist-cli/chunks/mode-ZQ6H7KWM.js +0 -26
- package/dist-cli/chunks/permissions-DRZ3HCFL.js +0 -13
- package/dist-cli/chunks/record-J5JAYW4Y.js +0 -72
- package/dist-cli/chunks/reset-KXYRDEFU.js +0 -4
- package/dist-cli/chunks/runtime-66CEPOG6.js +0 -4
- package/dist-cli/chunks/setup-QO5KZAX3.js +0 -32
- package/dist-cli/chunks/storage-X2K2MDPX.js +0 -37
- package/dist-cli/chunks/store-TUJPIRTT.js +0 -4
- package/dist-cli/chunks/telemetry-CF5DVEKI.js +0 -4
- package/dist-cli/chunks/upload-UIQJIBEZ.js +0 -4
- package/dist-cli/chunks/version-CMBB3FXL.js +0 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.336 | (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 jt,c as qt}from"./chunk-
|
|
4
|
+
import{b as jt,c as qt}from"./chunk-UB3JHBDW.js";import{a as Dt,b as Bt}from"./chunk-NL2HXO7U.js";import{a as de}from"./chunk-OXRDTNVL.js";import{k as Ct}from"./chunk-UZCNKUSS.js";import{a as oe,b as C,c as B,d as Me,e as ae,f as X,g as pe,h as ye,i as Et,j as At,k as Ne,l as _t}from"./chunk-G3FVXFPF.js";import{A as Mt,B as Nt,C as Ft,F as Ot,H as Pt,J as ue,K as Rt,Q as We,a as Ie,b as mt,c as ft,d as gt,e as yt,f as ht,g as bt,h as wt,i as xt,j as $t,k as Ce,l as je,r as qe,s as St,t as vt,u as ge,v as kt,w as Te,x as Le,y as It,z as Tt}from"./chunk-7PMNRG53.js";import{a as st}from"./chunk-BIZE6NBI.js";import{a as Q}from"./chunk-3QCSDI3B.js";import{e as it,j as at,o as lt,q as ct,s as dt,t as ut,u as pt,v as ce}from"./chunk-6ALTVOXE.js";import{c as nt,d as Be,f as rt}from"./chunk-6TN3YWA6.js";function Je(e){return`(async () => {
|
|
5
5
|
const bridge = globalThis.SootSim && globalThis.SootSim.bridges && globalThis.SootSim.bridges.hotRemount
|
|
6
6
|
if (!bridge || typeof bridge.reloadExternalApp !== 'function') return false
|
|
7
7
|
await bridge.reloadExternalApp({ resetStorage: ${e?"true":"false"} })
|
|
@@ -462,8 +462,8 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
462
462
|
if (!t) return { ok: false, error: 'timeline bridge missing' }
|
|
463
463
|
return { ok: true, result: await t.recent(${JSON.stringify(D)}) }
|
|
464
464
|
})()`});(!R||!R.ok)&&(console.error(` could not query timeline: ${R&&"error"in R?R.error:"unknown"}`),process.exit(1));let A=R.result.events??[];for(let J of A)if(ms(J,{filter:h,equals:I})){let U=Date.now()-M;console.log(g?JSON.stringify({found:!0,elapsedMs:U,event:J}):` ${r} event after ${U}ms${h?` (filter: ${h})`:""}${I?` (equals: ${I})`:""}`);return}R.result.watermark&&R.result.watermark>O&&(O=R.result.watermark),await new Promise(J=>setTimeout(J,_))}let c=Date.now()-M;g?console.log(JSON.stringify({found:!1,elapsedMs:c,kind:r,filter:h,equals:I})):console.error(` \u26A0 wait event ${r} timed out after ${c}ms${h?` (filter: ${h})`:""}${I?` (equals: ${I})`:""}`),process.exit(1)}async function go(e){let{bridge:t,args:s}=e,i=s.includes("--strict"),d=Ie(s,3e3),{elapsed:r,settled:p}=await se({bridge:t,maxMs:d,strict:i});p?console.log(` idle in ${r}ms`):(console.error(` \u26A0 wait idle timed out after ${r}ms (may still be animating)`),process.exit(1))}async function yo(e){let{bridge:t,args:s}=e,i=Ie(s,2e4),{ready:d,elapsedMs:r,nodes:p,targets:b,liveFrameActive:h,liveFrameChannels:I,flag:w,loadingText:g,externalReady:M,externalError:x,suppressedEntryError:_,errors:O,bridgeError:c}=await St(t,i,{onProgress(R){console.error(` still waiting after ${R.elapsedMs}ms \u2014 ${qe(R)} (nodes: ${R.nodes}, targets: ${R.targets}, live surfaces: ${R.liveFrameActive?R.liveFrameChannels:0}, errors: ${R.errors})`)}});if(d){let R=i-r,A=Math.max(100,Math.min(1e4,R)),J=await se({bridge:t,maxMs:A,pollMs:32,stablePolls:2});J.settled||(console.error(` \u26A0 wait ready timed out after ${r+J.elapsed}ms \u2014 app mounted but did not settle (nodes: ${p}, targets: ${b})`),process.exit(1)),console.log(` ready in ${r+J.elapsed}ms: ${p} nodes, ${b} targets${h?`, ${I} live surfaces`:""}`);return}let D=qe({externalError:x,loadingText:g,externalReady:M,flag:w,targets:b,suppressedEntryError:_,bridgeError:c});console.error(` \u26A0 wait ready timed out after ${r}ms \u2014 ${D} (nodes: ${p}, targets: ${b}, live surfaces: ${h?I:0}, errors: ${O})`),process.exit(1)}async function ho(e){let{bridge:t,args:s,positional:i,inspectUsage:d}=e,r=i[1];r||(console.error(d("selector","<testid> [--max-ms 5000] [--gone]")),process.exit(1));let p=s.indexOf("--max-ms"),b=p>=0&&s[p+1]?Math.max(100,Number(s[p+1])):5e3,h=s.includes("--gone"),{found:I,node:w,elapsed:g}=await vt(t,r,b,{gone:h});if(h){I?console.log(` #${r} gone after ${g}ms`):(console.error(` \u26A0 wait selector #${r} --gone timed out after ${g??b}ms (still present)`),process.exit(1));return}if(I&&w){let M=w.absolutePosition?`@(${Math.round(w.absolutePosition.x)},${Math.round(w.absolutePosition.y)})`:"",x=w.layout?`${Math.round(w.layout.width)}x${Math.round(w.layout.height)}`:"?x?";console.log(` found #${r} in ${g}ms ${x} ${M}`)}else console.error(` \u26A0 wait selector #${r} timed out after ${g??b}ms`),process.exit(1)}function No(e){return e==null?"\u2014":e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}K`:`${(e/1024/1024).toFixed(1)}M`}function Fo(e){return e==null?" \u2026":e<1e3?`${e}ms`.padStart(5):`${(e/1e3).toFixed(2)}s`.padStart(5)}function bo(){process.stderr.write(` the sim is not responding. recover it with:
|
|
465
|
-
|
|
466
|
-
|
|
465
|
+
rnx close --sim <id> # force-close the wedged sim
|
|
466
|
+
rnx list # confirm it's gone
|
|
467
467
|
`)}async function $e(e,t){let s=await e.send({type:"perform",steps:[t]}),i=s?.steps?.[0],d=i?.error??s?.error;return{ok:s?.ok===!0,value:i?.value,...d?{error:d}:{}}}async function gs(e){try{return await e.send({type:"evaluate",code:"1"},{timeoutMs:3e3}),!0}catch{return!1}}async function ys(e,t){try{let s=await e.send({type:"evaluate",code:`(async () => {
|
|
468
468
|
const t = window.__sootsimTest
|
|
469
469
|
if (!t || typeof t.queryAll !== 'function') return []
|
|
@@ -524,7 +524,7 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
524
524
|
frame: runtimeSnapshot?.keyboard?.frame ?? null,
|
|
525
525
|
focusedRect: runtimeSnapshot?.focused?.rect ?? null,
|
|
526
526
|
}
|
|
527
|
-
})()`}).then(t=>et(t))}function ks(e,t,s){if(!e.visible)return!1;let i=e.focusedInput;return!(t&&i&&!(i.testID===t||i.id===t)||s!==null&&we(e)!==s)}async function Is(e,t=600,s={}){let i=Date.now()+t;for(;Date.now()<=i;){let d=await ot(e);if(ks(d,s.targetId??null,s.secureTextEntry??null))return d;await oe(30)}return ot(e)}async function De(e,t){let s=await ot(e);if(s.visible&&(s.focusedInput||s.hostedEditorFocused))return s;s.visible&&(console.error(` ${t} requires a focused editable control. the iOS keyboard is visible, but no input owns focus.`),process.exit(1)),console.error(` ${t} requires the iOS keyboard to be visible. focus an input first with
|
|
527
|
+
})()`}).then(t=>et(t))}function ks(e,t,s){if(!e.visible)return!1;let i=e.focusedInput;return!(t&&i&&!(i.testID===t||i.id===t)||s!==null&&we(e)!==s)}async function Is(e,t=600,s={}){let i=Date.now()+t;for(;Date.now()<=i;){let d=await ot(e);if(ks(d,s.targetId??null,s.secureTextEntry??null))return d;await oe(30)}return ot(e)}async function De(e,t){let s=await ot(e);if(s.visible&&(s.focusedInput||s.hostedEditorFocused))return s;s.visible&&(console.error(` ${t} requires a focused editable control. the iOS keyboard is visible, but no input owns focus.`),process.exit(1)),console.error(` ${t} requires the iOS keyboard to be visible. focus an input first with rnx do tap-id/tap-text or rnx do type-into.`),process.exit(1)}async function To(e,t,s){return t==="appearance"?e.send({type:"evaluate",code:`(async () => {
|
|
528
528
|
const requested = ${JSON.stringify(s??"toggle")}
|
|
529
529
|
// the engine owns toggle + auto resolution (settingsStore is the single
|
|
530
530
|
// source of truth). never infer the current scheme client-side \u2014 the old
|
|
@@ -547,14 +547,14 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
547
547
|
})()`}):e.send({type:"evaluate",code:`(async () => {
|
|
548
548
|
window.dispatchEvent(new CustomEvent('sootsim:shake'))
|
|
549
549
|
return { ok: true, action: 'shake' }
|
|
550
|
-
})()`})}function Ts(e){let t={Enter:"return",NumpadEnter:"return",Backspace:"delete",Delete:"delete",Space:"space",ShiftLeft:"shift",ShiftRight:"shift"};if(t[e])return t[e];let s=e.match(/^Digit([0-9])$/);if(s)return s[1];let i=e.match(/^Key([A-Z])$/);return i?i[1].toLowerCase():null}function Ms(e){if(typeof e!="string")return null;let t=e.replace(/\s+/g," ").trim();return t?t.slice(0,80):null}function Oo(...e){for(let t of e){if(typeof t!="string")continue;let s=t.trim();if(s)return s}return null}function Ns(e){let t=e.indexOf("--node-id");if(t<0)return null;let s=e[t+1];if(!s)return null;let i=Number(s);return Number.isInteger(i)&&i>0?i:null}async function W(e,t,s){let i=Pe({source:e,step:t,summary:s});i.active&&(i.replaced?console.error(` draft: replaced unkept action "${i.replaced.summary}" \u2014 \`maestro keep\` commits one action at a time`):console.error(" draft: action pending \u2014 `
|
|
550
|
+
})()`})}function Ts(e){let t={Enter:"return",NumpadEnter:"return",Backspace:"delete",Delete:"delete",Space:"space",ShiftLeft:"shift",ShiftRight:"shift"};if(t[e])return t[e];let s=e.match(/^Digit([0-9])$/);if(s)return s[1];let i=e.match(/^Key([A-Z])$/);return i?i[1].toLowerCase():null}function Ms(e){if(typeof e!="string")return null;let t=e.replace(/\s+/g," ").trim();return t?t.slice(0,80):null}function Oo(...e){for(let t of e){if(typeof t!="string")continue;let s=t.trim();if(s)return s}return null}function Ns(e){let t=e.indexOf("--node-id");if(t<0)return null;let s=e[t+1];if(!s)return null;let i=Number(s);return Number.isInteger(i)&&i>0?i:null}async function W(e,t,s){let i=Pe({source:e,step:t,summary:s});i.active&&(i.replaced?console.error(` draft: replaced unkept action "${i.replaced.summary}" \u2014 \`maestro keep\` commits one action at a time`):console.error(" draft: action pending \u2014 `rnx maestro keep` to commit"))}function Mo(e,t,s){if(!s||s.hit===!1)return null;let i=Oo(s.responderTestID,s.testID);if(i)return{step:{tapOn:{id:i}},summary:`tap #${i}`};let d=Ms(s.text);return d?{step:{tapOn:d},summary:`tap "${d}"`}:{step:{tapAtCoords:{x:e,y:t}},summary:`tap @${Math.round(e)},${Math.round(t)}`}}function tt(e,t,s){let i=Oo(t?.testID,t?.id);return i?{step:{tapOn:{id:i}},summary:`tap #${i}`}:s==="id"?{step:{tapOn:{id:e}},summary:`tap #${e}`}:{step:{tapOn:e},summary:`tap "${e}"`}}async function _r(e,t){let s=e[0]==="get"||e[0]==="do"||e[0]==="debug"||e[0]==="wait"?e[0]:null,i=s?e.slice(1):e,d=ct(i,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--verbose","-v","--help","-h","--clear-state","--json","--all","--watch","-w","--strict","--no-wait","--dump","--failed","--slow","--tail","-f","--interactive-targets","--actions","--internal","--compact","--no-xy","--no-clipped","--include-occluded"],stripValueFlags:["--output","--nth","--index","--testid","--test-id","--text","--node-id","--max-ms","--filter","--limit","--level","--threshold","--equals","--since","--testid-like","--only","--subtree"]}),r=d.positional,p=r[0],b=s,h=typeof i[0]=="string"&&st.has(i[0]),I=h?i[0]:null,w=S=>{if(t.internalPerfCommand&&S==="perf")return`rnx perf ${t.internalPerfCommand}`;if(h&&S===i[0])return`rnx ${S}`;let o=b??nt(S)?.group;return o?`rnx ${o} ${S}`:`rnx ${S}`},g=(S,o)=>` usage: ${w(S)}${o?` ${o}`:""}`;if(!p||e.includes("--help")||e.includes("-h")){let S={bridgePort:7668,defaultShellUrl:at};if(b==="do"||b==="get"||b==="debug"||b==="wait"){let n=Be(b,S);n&&(console.log(`${n}
|
|
551
551
|
`),process.exit(0))}if(I==="shell"){let n=rt("shell",S);n&&(console.log(`${n}
|
|
552
552
|
`),process.exit(0))}let o=["do","get","debug","wait"].map(n=>Be(n,S)).filter(n=>n!=null).join(`
|
|
553
553
|
|
|
554
554
|
`);console.log(`${o}
|
|
555
|
-
`),process.exit(0)}let M=d.wsPort,x=d.simId,_=d.simIdSource,O=d.commandTimeoutMs;if(b==="get"&&p==="diagnosis"){let S=i.indexOf("diagnosis"),o=S>=0?[...i.slice(0,S),...i.slice(S+1)]:i,{runDiagnose:n}=await import("./diagnose-
|
|
556
|
-
`);let n=Math.max(...o.map(l=>l.id.length),6),a=Math.max(...o.map(l=>l.kind.length),4);for(let l of o){let u=l.available?"\u2713":"\u2717",m=l.id.padEnd(n),f=l.kind.padEnd(a);console.log(` ${u} ${m} ${f} ${l.description}`),l.available&&l.detail?console.log(` ${l.detail}`):!l.available&&l.reason&&console.log(` unavailable: ${l.reason}`)}return}let c=dt(d),D=x||"default",R=new Set(["errors","warnings","requests","js","reload","globals","perf","storage-clear","list","wait","sleep"]),A=200;function J(S){let o=S.replace(/\s+/g," ").trim();if(!o)return"";if(/^<(!doctype html|html|\?xml)|<body[\s>]/i.test(o)){let a=/<title[^>]*>([^<]+)<\/title>/i.exec(S)?.[1]?.trim(),l=/<body[^>]*>([\s\S]*?)<\//i.exec(S)?.[1]?.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().slice(0,80),u=a||l||"html error page";return`<html ${S.length}B> "${u}" (body elided \u2014 add --json for the full payload)`}return o.length<=A?o:`${o.slice(0,A)}\u2026 (+${o.length-A} more bytes)`}function U(S){let o=S.displayUrl||S.url;return S.status!=null?`${S.method} ${o} -> ${S.status}${S.statusText?` ${S.statusText}`:""}`:S.error?`${S.method} ${o} -> ${S.error}`:`${S.method} ${o}`}async function T(S){let o=fe()?400:200;try{let{settled:n,elapsed:a}=await se({bridge:S,maxMs:o,pollMs:32,stablePolls:2});n||process.stderr.write(` \u26A0 auto-wait timed out after ${a??o}ms \u2014 next command may see mid-animation state. use \`
|
|
557
|
-
`)}catch{}}function P(S,o){if(o.result?.reason==="offscreen"){let{x:n,y:a,screen:l}=o.result;console.error(` tap failed: ${S} resolved to (${Math.round(n)},${Math.round(a)}), outside the ${l?.width}x${l?.height} screen`),console.error(" the node exists but is scrolled out of view \u2014 scroll it on-screen first (
|
|
555
|
+
`),process.exit(0)}let M=d.wsPort,x=d.simId,_=d.simIdSource,O=d.commandTimeoutMs;if(b==="get"&&p==="diagnosis"){let S=i.indexOf("diagnosis"),o=S>=0?[...i.slice(0,S),...i.slice(S+1)]:i,{runDiagnose:n}=await import("./diagnose-YT4BKJ7I.js"),a=await n(["recent",...o],t);process.exitCode=a;return}if(b==="do"&&p==="scan"){let{runCamera:S}=await import("./camera-VX65VO5N.js");process.exitCode=await S(i,{port:t.port});return}if(p==="list"&&i.some(S=>S==="--drivers"||S==="-D")){let{buildDriverListRows:S}=await import("./drivers-YY3YRD2L.js"),o=S();console.log(` available drivers (${o.length}):
|
|
556
|
+
`);let n=Math.max(...o.map(l=>l.id.length),6),a=Math.max(...o.map(l=>l.kind.length),4);for(let l of o){let u=l.available?"\u2713":"\u2717",m=l.id.padEnd(n),f=l.kind.padEnd(a);console.log(` ${u} ${m} ${f} ${l.description}`),l.available&&l.detail?console.log(` ${l.detail}`):!l.available&&l.reason&&console.log(` unavailable: ${l.reason}`)}return}let c=dt(d),D=x||"default",R=new Set(["errors","warnings","requests","js","reload","globals","perf","storage-clear","list","wait","sleep"]),A=200;function J(S){let o=S.replace(/\s+/g," ").trim();if(!o)return"";if(/^<(!doctype html|html|\?xml)|<body[\s>]/i.test(o)){let a=/<title[^>]*>([^<]+)<\/title>/i.exec(S)?.[1]?.trim(),l=/<body[^>]*>([\s\S]*?)<\//i.exec(S)?.[1]?.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim().slice(0,80),u=a||l||"html error page";return`<html ${S.length}B> "${u}" (body elided \u2014 add --json for the full payload)`}return o.length<=A?o:`${o.slice(0,A)}\u2026 (+${o.length-A} more bytes)`}function U(S){let o=S.displayUrl||S.url;return S.status!=null?`${S.method} ${o} -> ${S.status}${S.statusText?` ${S.statusText}`:""}`:S.error?`${S.method} ${o} -> ${S.error}`:`${S.method} ${o}`}async function T(S){let o=fe()?400:200;try{let{settled:n,elapsed:a}=await se({bridge:S,maxMs:o,pollMs:32,stablePolls:2});n||process.stderr.write(` \u26A0 auto-wait timed out after ${a??o}ms \u2014 next command may see mid-animation state. use \`rnx do settle\` for a longer wait.
|
|
557
|
+
`)}catch{}}function P(S,o){if(o.result?.reason==="offscreen"){let{x:n,y:a,screen:l}=o.result;console.error(` tap failed: ${S} resolved to (${Math.round(n)},${Math.round(a)}), outside the ${l?.width}x${l?.height} screen`),console.error(" the node exists but is scrolled out of view \u2014 scroll it on-screen first (rnx do scroll / swipe), then tap.");return}console.error(` tap failed: ${S} stayed visible but did not receive a hittable press after ${o.attempts} attempt${o.attempts===1?"":"s"}`),o.result&&console.error(` last result: ${JSON.stringify(o.result)}`)}async function H(){try{return await c.send({type:"evaluate",code:`(() => ({
|
|
558
558
|
console: ${Te},
|
|
559
559
|
requests: window.__sootsimTest?.getRequestCounts?.() || null,
|
|
560
560
|
}))()`})||{console:null,requests:null}}catch{return{console:null,requests:null}}}async function K(S={}){let o=S.counts!==void 0?S.counts:await X(c,"getRequestCounts");if(!o||typeof o!="object")return;let n=Math.max(0,Number(o.failed)||0);if(n===0||!S.includeTail&&!ze("requests",D,String(n))||(console.log(`
|
|
@@ -581,7 +581,7 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
581
581
|
}
|
|
582
582
|
return summary ? { summary, consoleSplit } : null
|
|
583
583
|
})()`)}catch{return}if(!n||!n.summary||!n.summary.total)return;let a=n.summary.byKind??{},l=[],u=new Set;for(let m of ie){let f=a[m];if(f)if(u.add(m),m==="console"&&n.consoleSplit){let{error:$,warn:y}=n.consoleSplit;$>0&&l.push(`${$} error${$===1?"":"s"}`),y>0&&l.push(`${y} warning${y===1?"":"s"}`)}else l.push(`${f} ${m}${f===1?"":"s"}`)}for(let[m,f]of Object.entries(a))!u.has(m)&&f&&l.push(`${f} ${m}${f===1?"":"s"}`);if(l.length!==0&&(console.error(`
|
|
584
|
-
since last: ${l.join(" \xB7 ")} \u2014
|
|
584
|
+
since last: ${l.join(" \xB7 ")} \u2014 rnx what-happened`),n.summary.lastAt))try{await ce(S,"SootSim.bridges.timeline.cursorAdvance",o,n.summary.lastAt)}catch{}}let q=new Set(["tap","double-tap","tap-text","tap-id","type","type-into","key","key-sequence","keycode","drag","swipe","long-press","touch","gesture","pinch","scroll","shell","storage-clear"]),le=new Set(["a11y","capture","count","double-tap","drag","find","gesture","layout","long-press","node","pinch","sample-color","scroll","screenshot","swipe","tap","tap-id","tap-text","touch","tree","type-into"]),ve=(e.includes("--verbose")||e.includes("-v"))&&!e.includes("--json");b==="do"&&p==="shell"&&(console.error(" `rnx do shell` was removed. use `rnx shell ...` instead."),process.exit(1)),q.has(p)&&await ut(c),le.has(p)&&await pe(c,{verbose:ve});try{let S=q.has(p)?await Ot(c):[];switch(p){case"list":{lt(d.wsPort),await so({bridge:c,simId:x,args:i});break}case"tree":{await co({bridge:c,args:i,positional:r});break}case"a11y":{let o=await xt(c);if(!Array.isArray(o)||o.length===0){console.log(" no accessible nodes found");break}if(e.includes("--json"))console.log(JSON.stringify(o,null,2));else{console.log(` accessibility tree (${o.length} nodes):
|
|
585
585
|
`);for(let n of o){let a=[];if(a.push(`[${n.role}]`),n.label){let l=n.label.length>50?n.label.slice(0,47)+"...":n.label;a.push(`"${l}"`)}if(n.hint&&a.push(`(hint: "${n.hint}")`),n.testID&&a.push(`#${n.testID}`),n.state){let l=[];n.state.disabled&&l.push("disabled"),n.state.selected&&l.push("selected"),n.state.checked===!0&&l.push("checked"),n.state.checked==="mixed"&&l.push("mixed"),n.state.busy&&l.push("busy"),n.state.expanded===!0&&l.push("expanded"),n.state.expanded===!1&&l.push("collapsed"),l.length&&a.push(`{${l.join(", ")}}`)}n.position&&a.push(`@(${n.position.x},${n.position.y})`),n.size&&a.push(`${n.size.w}x${n.size.h}`),console.log(" "+a.join(" "))}}break}case"find":{await eo({bridge:c,args:e,effectiveArgs:i,positional:r,inspectUsage:g});break}case"count":{await Qt(c,{args:i});break}case"keyboard":{await oo(c,{json:e.includes("--json")});break}case"screens":{await io(c,{json:e.includes("--json")});break}case"memory":{await ro(c,{args:i});break}case"wait":{await po({wsPort:M,commandTimeoutMs:O,simId:x,simIdSource:_,positional:r});break}case"sleep":{await lo({positional:r,inspectUsage:g});break}case"settle":{await ao({bridge:c,args:e,positional:r});break}case"ready":{await yo({bridge:c,args:e});break}case"idle":{await go({bridge:c,args:e,positional:r});break}case"selector":{await ho({bridge:c,args:e,positional:r,inspectUsage:g});break}case"event":{await fo({bridge:c,args:e,positional:r,inspectUsage:g});break}case"layout":{let o=r[1];if(!o){await to({bridge:c,args:i});break}let n=await c.send({type:"evaluate",code:`(async () => await window.__sootsimTest.getLayout(${JSON.stringify(o)}))()`});console.log(JSON.stringify(n,null,2));break}case"capture":case"screenshot":{let n=e.find(($,y)=>e[y-1]==="--output")||"/tmp/sootsim-inspect.png",a=await vo(e,c),l={type:"screenshot"};a&&(l.crop=a);let m=(await c.send(l)).replace(/^data:image\/png;base64,/,"");a&&console.log(` area: x=${a.x} y=${a.y} w=${a.w} h=${a.h}`),(await import("fs")).writeFileSync(n,Buffer.from(m,"base64")),console.log(` saved: ${n}`);break}case"sample-color":{let o=await vo(e,c);o||(console.error(g("sample-color","<x> <y> [w] [h] | --id <testID> | --text <text>")),console.error(" samples an averaged color from the canvas. coords are logical rnx units."),process.exit(1));let n=await c.send({type:"evaluate",code:Bt(o)});if(e.includes("--json"))console.log(JSON.stringify(n,null,2));else{let{r:a,g:l,b:u,a:m,hex:f,samples:$}=n,y=o.w===1&&o.h===1?`@(${o.x},${o.y})`:`@(${o.x},${o.y}) ${o.w}x${o.h}`;console.log(` ${f} rgba(${a}, ${l}, ${u}, ${m}) ${y} ${$} samples`)}break}case"node":{let o=r[1];o||(console.error(g("node","<matcher>")),console.error(" resolves testID, id, then text \u2014 dumps full node info as JSON"),process.exit(1));let n=await c.send({type:"evaluate",code:`(async () => {
|
|
586
586
|
const t = window.__sootsimTest
|
|
587
587
|
const q = ${JSON.stringify(o)}
|
|
@@ -638,7 +638,7 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
638
638
|
transform,
|
|
639
639
|
parentChain,
|
|
640
640
|
}
|
|
641
|
-
})()`});console.log(JSON.stringify(n,null,2));break}case"tap":{let o=Number(r[1]),n=Number(r[2]),a=xe(e,r);if(a){let m=await be(c,{agent:fe(),textFallback:a.mode==="text"?a.value:void 0,resolve:async()=>{let y=await Ee(c,a);return y?{cx:y.x,cy:y.y,match:{id:a.mode==="testid"?a.value:y.id??null,testID:a.mode==="testid"?a.value:y.testID??null,text:a.mode==="text"?a.value:y.text??null,type:y.type??null},target:{id:y.id??null,testID:y.testID??null,text:y.text??null,type:y.type??null}}:null}}),f=m.payload;(!f||typeof f.cx!="number")&&(console.error(` not found: ${a.value}`),a.mode==="testid"&&Q("wait-selector-for-missing-testid",a.value),process.exit(1)),me(m.result)||(P(`${a.mode} "${a.value}"`,m),process.exit(1));let $=Mo(f.cx,f.cy,m.result);$&&await W("inspect tap",$.step,$.summary),console.log(JSON.stringify({...m.attempts>1?{attempts:m.attempts}:{},...m.result},null,2));break}(!Number.isFinite(o)||!Number.isFinite(n))&&(console.error(g("tap","<testid> | <x> <y> | --testid <id> | --text <t>")),process.exit(1));let l=await Yt(c,o,n),u=Mo(o,n,l);u&&await W("inspect tap",u.step,u.summary),console.log(JSON.stringify(l,null,2));break}case"drag":case"swipe":{let o=Number(r[1]),n=Number(r[2]),a=Number(r[3]),l=Number(r[4]),u=p==="swipe"?10:12,m=p==="swipe"?8:16,f=r[5]?Number(r[5]):u,$=r[6]?Number(r[6]):m;(!Number.isFinite(o)||!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(l)||!Number.isFinite(f)||!Number.isFinite($))&&(console.error(g(p,"<x1> <y1> <x2> <y2> [steps] [stepMs]")),process.exit(1));let y=await $e(c,{type:"drag",fromX:o,fromY:n,toX:a,toY:l,steps:Math.max(1,Math.round(f)),stepMs:Math.max(0,Math.round($))});if(y?.ok){let k=Math.max(1,Math.round(Math.max(1,f)*Math.max(0,$)));await W(`inspect ${p}`,{swipe:{start:`${o}, ${n}`,end:`${a}, ${l}`,duration:k}},`${p} ${o},${n} -> ${a},${l}`)}console.log(JSON.stringify(y,null,2));break}case"pinch":{let o=Number(r[1]),n=Number(r[2]),a=Number(r[3]),l=Number(r[4]),u=Number(r[5]),m=Number(r[6]),f=Number(r[7]),$=Number(r[8]),y=r[9]?Number(r[9]):12,k=r[10]?Number(r[10]):16;(!Number.isFinite(o)||!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(l)||!Number.isFinite(u)||!Number.isFinite(m)||!Number.isFinite(f)||!Number.isFinite($)||!Number.isFinite(y)||!Number.isFinite(k))&&(console.error(g("pinch","<x1> <y1> <x2> <y2> <x1'> <y1'> <x2'> <y2'> [steps] [stepMs]")),process.exit(1));let L=await $e(c,{type:"pinch",fromX1:o,fromY1:n,fromX2:a,fromY2:l,toX1:u,toY1:m,toX2:f,toY2:$,steps:Math.max(1,Math.round(y)),stepMs:Math.max(0,Math.round(k))});L?.ok&&await W("inspect pinch",{pinch:{from:[o,n,a,l],to:[u,m,f,$],steps:Math.max(1,Math.round(y)),stepMs:Math.max(0,Math.round(k))}},`pinch (${o},${n}) (${a},${l}) -> (${u},${m}) (${f},${$})`),console.log(JSON.stringify(L,null,2));break}case"tap-text":{let o=r[1];o||(console.error(g("tap-text","<text>")),process.exit(1));let n=z=>{let j=e.indexOf(z);return j>=0&&j+1<e.length?e[j+1]:null},a=z=>e.includes(z),l=n("--nth")??n("--index"),u=l!==null?Number(l):null;u!==null&&!Number.isFinite(u)&&(console.error(` --nth/--index requires an integer, got: ${l}`),process.exit(1));let m=n("--within"),f=n("--role"),$=a("--exact"),y=a("--first"),k=n("--min-y"),L=n("--max-y"),V=n("--min-x"),G=n("--max-x");for(let[z,j]of[["--min-y",k],["--max-y",L],["--min-x",V],["--max-x",G]])j!==null&&!Number.isFinite(Number(j))&&(console.error(` ${z} requires a number, got: ${j}`),process.exit(1));let Y=e.indexOf("--near"),E=null;if(Y>=0){let z=Number(e[Y+1]),j=Number(e[Y+2]);(!Number.isFinite(z)||!Number.isFinite(j))&&(console.error(" --near requires two numbers: --near <x> <y>"),process.exit(1)),E={x:z,y:j}}let v={exact:$,role:f,within:m,minX:V!==null?Number(V):null,maxX:G!==null?Number(G):null,minY:k!==null?Number(k):null,maxY:L!==null?Number(L):null,near:E,nth:u,first:y},N=await Xt(c,o,v,{agent:fe()}),F=N.payload;if(F?.error==="bridge-not-ready"&&(console.error("
|
|
641
|
+
})()`});console.log(JSON.stringify(n,null,2));break}case"tap":{let o=Number(r[1]),n=Number(r[2]),a=xe(e,r);if(a){let m=await be(c,{agent:fe(),textFallback:a.mode==="text"?a.value:void 0,resolve:async()=>{let y=await Ee(c,a);return y?{cx:y.x,cy:y.y,match:{id:a.mode==="testid"?a.value:y.id??null,testID:a.mode==="testid"?a.value:y.testID??null,text:a.mode==="text"?a.value:y.text??null,type:y.type??null},target:{id:y.id??null,testID:y.testID??null,text:y.text??null,type:y.type??null}}:null}}),f=m.payload;(!f||typeof f.cx!="number")&&(console.error(` not found: ${a.value}`),a.mode==="testid"&&Q("wait-selector-for-missing-testid",a.value),process.exit(1)),me(m.result)||(P(`${a.mode} "${a.value}"`,m),process.exit(1));let $=Mo(f.cx,f.cy,m.result);$&&await W("inspect tap",$.step,$.summary),console.log(JSON.stringify({...m.attempts>1?{attempts:m.attempts}:{},...m.result},null,2));break}(!Number.isFinite(o)||!Number.isFinite(n))&&(console.error(g("tap","<testid> | <x> <y> | --testid <id> | --text <t>")),process.exit(1));let l=await Yt(c,o,n),u=Mo(o,n,l);u&&await W("inspect tap",u.step,u.summary),console.log(JSON.stringify(l,null,2));break}case"drag":case"swipe":{let o=Number(r[1]),n=Number(r[2]),a=Number(r[3]),l=Number(r[4]),u=p==="swipe"?10:12,m=p==="swipe"?8:16,f=r[5]?Number(r[5]):u,$=r[6]?Number(r[6]):m;(!Number.isFinite(o)||!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(l)||!Number.isFinite(f)||!Number.isFinite($))&&(console.error(g(p,"<x1> <y1> <x2> <y2> [steps] [stepMs]")),process.exit(1));let y=await $e(c,{type:"drag",fromX:o,fromY:n,toX:a,toY:l,steps:Math.max(1,Math.round(f)),stepMs:Math.max(0,Math.round($))});if(y?.ok){let k=Math.max(1,Math.round(Math.max(1,f)*Math.max(0,$)));await W(`inspect ${p}`,{swipe:{start:`${o}, ${n}`,end:`${a}, ${l}`,duration:k}},`${p} ${o},${n} -> ${a},${l}`)}console.log(JSON.stringify(y,null,2));break}case"pinch":{let o=Number(r[1]),n=Number(r[2]),a=Number(r[3]),l=Number(r[4]),u=Number(r[5]),m=Number(r[6]),f=Number(r[7]),$=Number(r[8]),y=r[9]?Number(r[9]):12,k=r[10]?Number(r[10]):16;(!Number.isFinite(o)||!Number.isFinite(n)||!Number.isFinite(a)||!Number.isFinite(l)||!Number.isFinite(u)||!Number.isFinite(m)||!Number.isFinite(f)||!Number.isFinite($)||!Number.isFinite(y)||!Number.isFinite(k))&&(console.error(g("pinch","<x1> <y1> <x2> <y2> <x1'> <y1'> <x2'> <y2'> [steps] [stepMs]")),process.exit(1));let L=await $e(c,{type:"pinch",fromX1:o,fromY1:n,fromX2:a,fromY2:l,toX1:u,toY1:m,toX2:f,toY2:$,steps:Math.max(1,Math.round(y)),stepMs:Math.max(0,Math.round(k))});L?.ok&&await W("inspect pinch",{pinch:{from:[o,n,a,l],to:[u,m,f,$],steps:Math.max(1,Math.round(y)),stepMs:Math.max(0,Math.round(k))}},`pinch (${o},${n}) (${a},${l}) -> (${u},${m}) (${f},${$})`),console.log(JSON.stringify(L,null,2));break}case"tap-text":{let o=r[1];o||(console.error(g("tap-text","<text>")),process.exit(1));let n=z=>{let j=e.indexOf(z);return j>=0&&j+1<e.length?e[j+1]:null},a=z=>e.includes(z),l=n("--nth")??n("--index"),u=l!==null?Number(l):null;u!==null&&!Number.isFinite(u)&&(console.error(` --nth/--index requires an integer, got: ${l}`),process.exit(1));let m=n("--within"),f=n("--role"),$=a("--exact"),y=a("--first"),k=n("--min-y"),L=n("--max-y"),V=n("--min-x"),G=n("--max-x");for(let[z,j]of[["--min-y",k],["--max-y",L],["--min-x",V],["--max-x",G]])j!==null&&!Number.isFinite(Number(j))&&(console.error(` ${z} requires a number, got: ${j}`),process.exit(1));let Y=e.indexOf("--near"),E=null;if(Y>=0){let z=Number(e[Y+1]),j=Number(e[Y+2]);(!Number.isFinite(z)||!Number.isFinite(j))&&(console.error(" --near requires two numbers: --near <x> <y>"),process.exit(1)),E={x:z,y:j}}let v={exact:$,role:f,within:m,minX:V!==null?Number(V):null,maxX:G!==null?Number(G):null,minY:k!==null?Number(k):null,maxY:L!==null?Number(L):null,near:E,nth:u,first:y},N=await Xt(c,o,v,{agent:fe()}),F=N.payload;if(F?.error==="bridge-not-ready"&&(console.error(" rnx test bridge not ready"),process.exit(1)),F?.ambiguous){let z=F.candidates;console.error(` ambiguous: ${F.total} matches for "${o}"`);for(let j of z){let ke=j.abs?`@(${Math.round(j.abs.x)},${Math.round(j.abs.y)})`:"",Po=j.layout?` ${j.layout.width}x${j.layout.height}`:"",Ro=j.testID?` #${j.testID}`:"",Eo=j.text?` "${j.text}"`:"",Ao=j.ancestorTestIDs.length>0?` within ${j.ancestorTestIDs.slice(0,3).map(_o=>`#${_o}`).join(" > ")}`:"";console.error(` [${j.idx}] <${j.type}>${Eo}${Ro} ${ke}${Po}${Ao}`)}F.total>z.length&&console.error(` ... and ${F.total-z.length} more`),console.error(" pick one:"),console.error(" --nth <index> pick the nth match (top-to-bottom, left-to-right; negatives from end)"),console.error(" --within <testID> narrow to descendants of a node"),console.error(" --min-y / --max-y geometric filter (pixels, absolute)"),console.error(" --min-x / --max-x geometric filter (pixels, absolute)"),console.error(" --near <x> <y> pick the closest match to a point"),console.error(" --exact exact text match (default is substring)"),console.error(" --role <role> narrow to accessibilityRole"),console.error(" --first keep the old pick-first-silently behavior"),process.exit(2)}F?.nthOutOfRange&&(console.error(` not found: nth ${F.nth} of ${F.total} match${F.total===1?"":"es"} for "${o}"`),process.exit(1)),(!F||typeof F.cx!="number")&&(console.error(` not found: ${o}`),process.exit(1)),me(N.result)||(P(`text "${o}"`,N),process.exit(1));let ne=tt(o,{id:F.target?.id??null,testID:F.target?.testID??null,type:F.target?.type??null,cx:F.cx,cy:F.cy},"text");await W("inspect tap-text",ne.step,ne.summary),console.log(JSON.stringify({matched:F.match,tapped:{nodeId:F.target?.nodeId??null,id:F.target?.id??null,testID:F.target?.testID??null,type:F.target?.type??null,cx:F.cx,cy:F.cy},...F.strategy&&F.strategy!=="matched-node"?{strategy:F.strategy}:{},...F.total>1||u!==null?{nth:{index:F.idx,total:F.total}}:{},...N.attempts>1?{attempts:N.attempts}:{},result:N.result},null,2));break}case"tap-best":{let o=r[1];o||(console.error(g("tap-best","<query>")),process.exit(1));let n=await Vt(c,o,{agent:fe()}),a=n.payload;a||(console.error(` tap-best: no testID or visible text matched "${o}". try \`rnx find --interactive-targets\` to list candidates.`),process.exit(1)),"error"in a&&(console.error(` ${a.error}`),process.exit(1)),a.strategy==="none"&&(console.error(` tap-best: no testID or visible text matched "${o}". try \`rnx find --interactive-targets\` to list candidates.`),process.exit(1));let l=a.node;me(n.result)||(P(`best "${o}"`,n),process.exit(1));let u=tt(o,{id:l.id,testID:l.testID,type:l.type,cx:a.cx,cy:a.cy},a.strategy==="testid"?"id":"text");await W("inspect tap-best",u.step,u.summary),console.log(JSON.stringify({matched:{strategy:a.strategy,nodeId:l.nodeId,id:l.id,testID:l.testID,type:l.type,text:l.text},tapped:{cx:a.cx,cy:a.cy},...n.attempts>1?{attempts:n.attempts}:{},result:n.result},null,2));break}case"tap-id":{let o=r[1];o||(console.error(g("tap-id","<id>")),process.exit(1));let n=await zt(c,o,{agent:fe()}),a=n.payload;(!a||typeof a.cx!="number")&&(console.error(` not found: ${o}`),await ys(c,o),process.exit(1)),me(n.result)||(P(`id "${o}"`,n),process.exit(1));let l=tt(o,{id:a.target?.id??null,testID:a.target?.testID??null,type:a.target?.type??null,cx:a.cx,cy:a.cy},"id");await W("inspect tap-id",l.step,l.summary),console.log(JSON.stringify({matched:a.match,tapped:{nodeId:a.target?.nodeId??null,id:a.target?.id??null,testID:a.target?.testID??null,type:a.target?.type??null,cx:a.cx,cy:a.cy},...a.strategy&&a.strategy!=="matched-node"?{strategy:a.strategy}:{},...n.attempts>1?{attempts:n.attempts}:{},result:n.result},null,2));break}case"type-into":{let o=r[1],n=r.slice(2).join(" ");(!o||!n)&&(console.error(g("type-into","<id> <text>")),process.exit(1));let a=JSON.stringify(o),l=await c.send({type:"evaluate",code:`(async () => {
|
|
642
642
|
const t = window.__sootsimTest
|
|
643
643
|
if (!t) return null
|
|
644
644
|
const n = await (t.findByTestId(${a}) || t.findById(${a}))
|
|
@@ -789,7 +789,7 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
789
789
|
`).slice(0,2);for(let L of k)console.log(` ${L.trim()}`)}}}}catch{}m&&!m.ready&&(process.exitCode=1);break}case"storage-clear":{if(await Le(c),await c.send({type:"evaluate",code:Je(!0)})!==!0){C(i)?B({cleared:!1,ready:!1,error:"external app reload bridge is unavailable"}):console.error(" storage clear failed: external app reload bridge is unavailable"),process.exitCode=1;break}let l=await Ne(c,{timeoutMs:1e4,errorGraceMs:3e3});if(C(i)){B({cleared:!0,ready:l.ready,reload:l}),l.ready||(process.exitCode=1);break}if(l.ready){let u=l.source==="nodes-fallback"?" (no ready signal, node-count fallback)":"";console.log(` cleared tenant storage; ready in ${l.elapsedMs}ms: ${l.nodes} nodes${u}`)}else if(l.source==="error-bail")console.log(` \u26A0 storage clear reloaded but bailed after ${l.elapsedMs}ms: ${l.errors} console error(s), ready signal never fired`);else{let u=wo(l);console.log(` \u26A0 storage clear reloaded but timed out after ${l.elapsedMs}ms \u2014 ${u} (nodes: ${l.nodes}, targets: ${l.targets}, errors: ${l.errors})`)}try{let u=await ge(c,10);if(Array.isArray(u)&&u.length>0){console.log(`
|
|
790
790
|
\u26A0 ${u.length} error(s) during mount:
|
|
791
791
|
`);for(let m of u){let f=m.args.map($=>typeof $=="object"?JSON.stringify($):$).join(" ");if(console.log(` ${f}`),m.stack){let $=m.stack.split(`
|
|
792
|
-
`).slice(0,2);for(let y of $)console.log(` ${y.trim()}`)}}}}catch{}l.ready||(process.exitCode=1);break}case"js":{let o=r.slice(1).join(" ");if(o||(console.error(g("js","<javascript>")),console.error(""),console.error(" runs the snippet in the engine realm. SootSim is the"),console.error(" canonical state surface \u2014 reach into it directly."),console.error(""),console.error(" examples:"),console.error(` ${w("js")} SootSim.bridges.test.findByText("Sign in")`),console.error(` ${w("js")} SootSim.bridges.debug.snapshot("before")`),console.error(` ${w("js")} SootSim.bridges.keyboard.type("hello")`),console.error(` ${w("js")} SootSim.state.root.children.length`),process.exit(1)),e.includes("--tenant")){let m=r.slice(1).filter($=>$!=="--tenant").join(" "),f=await c.send({type:"evaluate",code:`(async () => SootSim.bridges.test.evalInTenant(${JSON.stringify(m)}))()`});console.log(JSON.stringify(f,null,2));break}let n=o;n.startsWith("(async")||(n=`(async () => ${n})()`);let a=await c.send({type:"evaluate",code:n});console.log(JSON.stringify(a,null,2));let l=o.toLowerCase(),u=[];(l.includes("sootsim:gohome")||l.includes("gohome"))&&u.push("
|
|
792
|
+
`).slice(0,2);for(let y of $)console.log(` ${y.trim()}`)}}}}catch{}l.ready||(process.exitCode=1);break}case"js":{let o=r.slice(1).join(" ");if(o||(console.error(g("js","<javascript>")),console.error(""),console.error(" runs the snippet in the engine realm. SootSim is the"),console.error(" canonical state surface \u2014 reach into it directly."),console.error(""),console.error(" examples:"),console.error(` ${w("js")} SootSim.bridges.test.findByText("Sign in")`),console.error(` ${w("js")} SootSim.bridges.debug.snapshot("before")`),console.error(` ${w("js")} SootSim.bridges.keyboard.type("hello")`),console.error(` ${w("js")} SootSim.state.root.children.length`),process.exit(1)),e.includes("--tenant")){let m=r.slice(1).filter($=>$!=="--tenant").join(" "),f=await c.send({type:"evaluate",code:`(async () => SootSim.bridges.test.evalInTenant(${JSON.stringify(m)}))()`});console.log(JSON.stringify(f,null,2));break}let n=o;n.startsWith("(async")||(n=`(async () => ${n})()`);let a=await c.send({type:"evaluate",code:n});console.log(JSON.stringify(a,null,2));let l=o.toLowerCase(),u=[];(l.includes("sootsim:gohome")||l.includes("gohome"))&&u.push("rnx shell home"),(l.includes("sootsim:appswitcher")||l.includes("appswitcher"))&&u.push("rnx shell switcher"),(l.includes("keyboard.isvisible")||l.includes("keyboard.getmode"))&&u.push("rnx debug state keyboard"),l.includes("interact.tap")&&u.push("rnx do tap <x> <y>"),l.includes("keyboard.type")&&u.push("rnx do type <text>"),(l.includes("keyboard.press")||l.includes("keyboard.dispatchkey"))&&u.push("rnx do key <name>"),l.includes("keyboard.dismiss")&&u.push("rnx do dismiss"),l.includes("dumptree")&&u.push("rnx get tree"),l.includes("dumpaccessibilitytree")&&u.push("rnx get a11y"),l.includes("getnodecount")&&u.push("rnx get count"),l.includes("findbytext")&&u.push("rnx find <text>"),(l.includes("findbytestid")||l.includes("findbyid"))&&u.push("rnx find --testid <id>"),l.includes("document.hidden")&&u.push("rnx debug state keyboard (includes tab health)"),u.length>0&&Q("prefer-cli-over-eval",u);break}case"globals":{let o=await c.send({type:"evaluate",code:`(async () => {
|
|
793
793
|
const globals = {}
|
|
794
794
|
|
|
795
795
|
// test bridge (proxy in worker mode)
|
|
@@ -827,7 +827,7 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
827
827
|
|
|
828
828
|
return globals
|
|
829
829
|
})()`});console.log(` rnx JS API:
|
|
830
|
-
`);for(let[n,a]of Object.entries(o)){console.log(` ${n}:`);for(let l of a)console.log(` .${l}`);console.log("")}console.log(` use: ${w("js")} <expression>`),console.log(` example: ${w("js")} test.findByText("Sign in")`);break}case"describe":{await Zt({bridge:c,args:e,positional:r});break}case"perf":{b==="debug"&&!t.internalPerfCommand&&(console.error(" `
|
|
830
|
+
`);for(let[n,a]of Object.entries(o)){console.log(` ${n}:`);for(let l of a)console.log(` .${l}`);console.log("")}console.log(` use: ${w("js")} <expression>`),console.log(` example: ${w("js")} test.findByText("Sign in")`);break}case"describe":{await Zt({bridge:c,args:e,positional:r});break}case"perf":{b==="debug"&&!t.internalPerfCommand&&(console.error(" `rnx debug perf` was removed. use `rnx perf shell ...`."),process.exit(1));let o=r[1];if(t.internalPerfCommand==="scroll"){if(!o||o==="--help"||o==="-h"){console.log(`
|
|
831
831
|
${w("perf")} <start|stop> [options]
|
|
832
832
|
|
|
833
833
|
records per-frame scroll offsets from the tenant worker, shell worker,
|
|
@@ -914,7 +914,7 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
914
914
|
`).slice(0,3);for(let $ of f)console.log(` ${$.trim()}`)}}break}case"warnings":{let o=r[1]?Number(r[1]):20,n=await kt(c,o);if(C(i)){B(n);break}if(n.length===0){console.log(" no warnings captured");break}console.log(` ${n.length} warning(s):
|
|
915
915
|
`);for(let a of n){let l=ae(a.timestamp),u=a.args.map(m=>typeof m=="object"?JSON.stringify(m):m).join(" ");console.log(` [${l}] ${u}`)}break}case"animations":{let o=await X(c,"listAnimations")??[];if(e.includes("--json")){console.log(JSON.stringify(o,null,2));break}if(o.length===0){console.log(" no active animations");break}console.log(` ${o.length} active animation(s):
|
|
916
916
|
`);for(let n of o){let a=String(n.realm??"tenant").padEnd(6),l=String(n.kind).padEnd(10),u=typeof n.from=="number"&&typeof n.to=="number"?`${n.from.toFixed(2)}\u2192${n.to.toFixed(2)}`:"\u2014",m=Number(n.current??0).toFixed(2),f=typeof n.progress=="number"?`${Math.round(n.progress*100)}%`:"\u2014",$=`${Math.round(n.elapsedMs??0)}ms`,y=[n.loop?"loop":null,n.layoutBound?"layout":null,n.remoteDriven?"remote-driven":n.graphBacked?"graph":null,n.visible===!1?"offscreen":null].filter(Boolean),k=y.length>0?` [${y.join(" ")}]`:"";console.log(` #${n.id} ${a} ${l} ${u.padEnd(14)} cur=${m.padEnd(7)} ${f.padStart(4)} ${$}${k}`)}break}case"animation":{let o=r[1];(!o||o==="--help"||o==="-h")&&(console.error(` usage: ${w("animation")} <id>`),process.exit(1));let n=Number(o);Number.isFinite(n)||(console.error(` invalid id: ${o}`),process.exit(1));let a=await X(c,"getAnimation",n);console.log(JSON.stringify(a,null,2));break}case"stop-animation":{let o=r[1];(!o||o==="--help"||o==="-h")&&(console.error(` usage: ${w("stop-animation")} <id|all>`),process.exit(1));let n=o==="all"?"all":Number(o);n!=="all"&&!Number.isFinite(n)&&(console.error(` invalid id: ${o}`),process.exit(1));let a=await X(c,"stopAnimation",n);console.log(` stopped ${a??0} animation(s)`);break}case"requests":{let o=r[1];if(o==="clear"){await Tt(c),C(i)?B({cleared:!0}):console.log(" request buffer cleared");break}let n=o==="all",a=n?r[2]:o,l=a?Number(a):20,u=await It(c,{failed:!n,limit:l});if(C(i)){B(u);break}if(u.length===0){console.log(n?" no requests captured":" no failed requests captured");break}console.log(` ${u.length} ${n?"request(s)":"failed request(s)"}:
|
|
917
|
-
`);for(let m of u){let f=ae(m.timestamp);console.log(` [${f}] ${U(m)}`),m.responseBody?console.log(` ${m.responseBody}`):m.error&&console.log(` ${m.error}`)}break}case"network":{let o=r[1],n=null,a=null,l=!1,u=!1,m=1e3,f=!1,$=!1;for(let E=0;E<i.length;E++){let v=i[E];if(v==="--filter")n=i[E+1]??null,E++;else if(v==="--limit"){let N=Number(i[E+1]);Number.isFinite(N)&&(a=N),E++}else if(v==="--threshold"){let N=Number(i[E+1]);Number.isFinite(N)&&N>0&&(m=N),E++}else v==="--failed"?l=!0:v==="--slow"?u=!0:v==="--tail"||v==="-f"?f=!0:v==="--json"&&($=!0)}if(o==="clear"){await c.send({type:"evaluate",code:'window.__sootsimObservability?.network.clear(); "cleared"'}),console.log(" network buffer cleared");break}if(o==="get"){let E=r[2];E||(console.error(" usage:
|
|
917
|
+
`);for(let m of u){let f=ae(m.timestamp);console.log(` [${f}] ${U(m)}`),m.responseBody?console.log(` ${m.responseBody}`):m.error&&console.log(` ${m.error}`)}break}case"network":{let o=r[1],n=null,a=null,l=!1,u=!1,m=1e3,f=!1,$=!1;for(let E=0;E<i.length;E++){let v=i[E];if(v==="--filter")n=i[E+1]??null,E++;else if(v==="--limit"){let N=Number(i[E+1]);Number.isFinite(N)&&(a=N),E++}else if(v==="--threshold"){let N=Number(i[E+1]);Number.isFinite(N)&&N>0&&(m=N),E++}else v==="--failed"?l=!0:v==="--slow"?u=!0:v==="--tail"||v==="-f"?f=!0:v==="--json"&&($=!0)}if(o==="clear"){await c.send({type:"evaluate",code:'window.__sootsimObservability?.network.clear(); "cleared"'}),console.log(" network buffer cleared");break}if(o==="get"){let E=r[2];E||(console.error(" usage: rnx network get <id>"),process.exit(1));let v=await c.send({type:"evaluate",code:`(() => {
|
|
918
918
|
const obs = window.__sootsimObservability;
|
|
919
919
|
if (!obs) return null;
|
|
920
920
|
return obs.network.getSnapshot().find(e => e.id === ${JSON.stringify(E)}) || null;
|
|
@@ -929,9 +929,9 @@ import{b as jt,c as qt}from"./chunk-MJ7QGY7Z.js";import{a as Dt,b as Bt}from"./c
|
|
|
929
929
|
`);let V=new Set,G=!0,Y=()=>{G=!1};process.on("SIGINT",Y);try{for(;G;){let E=await k(),v=L(E);for(let N of v)N.durationMs!=null&&(V.has(N.id)||(V.add(N.id),$?console.log(JSON.stringify(N)):xo(N)));await oe(250)}}finally{process.off("SIGINT",Y)}break}case"logs":{let o=r[1],n=null,a=null,l=null,u=!1,m=!1,f=!1;for(let v=0;v<i.length;v++){let N=i[v];if(N==="--filter")n=i[v+1]??null,v++;else if(N==="--limit"){let F=Number(i[v+1]);Number.isFinite(F)&&(a=F),v++}else N==="--level"?(l=i[v+1]??null,v++):N==="--tail"||N==="-f"?u=!0:N==="--json"?m=!0:(N==="--internal"||N==="--all")&&(f=!0)}let $=l?new Set(l.split(",").map(v=>v.trim()).filter(v=>v==="log"||v==="info"||v==="warn"||v==="error"||v==="debug")):null;if(o==="clear"){await Nt(c),console.log(" log buffer cleared");break}let y=!m&&process.stdout.isTTY===!0,k=a??(u?500:o?Number(o):50);Number.isFinite(k)||(console.error(` invalid limit: ${o} \u2014 \`logs\` takes a numeric count (e.g. ${w("logs")} 100).
|
|
930
930
|
to target a specific sim, use \`--sim ${o}\` instead.`),process.exit(1));let L=()=>Mt(c),V=v=>Ft(v,{level:$,filter:n,showInternal:f});if(!u){let v=await L(),N=V(v).slice(-k);if(m){console.log(JSON.stringify(N,null,2));break}if(N.length===0){console.log(v.length===0?" no logs captured":" no matching logs");break}console.log(` ${N.length} log(s):
|
|
931
931
|
`);for(let F of N)So(F,y);break}console.log(` tailing logs (ctrl-c to stop)...
|
|
932
|
-
`);let G=new Set,Y=!0,E=()=>{Y=!1};process.on("SIGINT",E);try{for(;Y;){let v=await L(),N=V(v);for(let F of N)G.has(F.id)||(G.add(F.id),m?console.log(JSON.stringify(F)):So(F,y));await oe(250)}}finally{process.off("SIGINT",E)}break}default:console.error(` unknown subcommand: ${p}`),process.exit(1)}if(q.has(p)&&!e.includes("--no-wait")&&process.env.SOOTSIM_NO_AUTO_WAIT!=="1"&&!await mt(c,p)&&await T(c),S.length>0&&ee(S),!R.has(p))try{await Se(c)}catch{}}catch(S){let o=S instanceof Error?S.message:String(S);console.error(` ${p??"
|
|
932
|
+
`);let G=new Set,Y=!0,E=()=>{Y=!1};process.on("SIGINT",E);try{for(;Y;){let v=await L(),N=V(v);for(let F of N)G.has(F.id)||(G.add(F.id),m?console.log(JSON.stringify(F)):So(F,y));await oe(250)}}finally{process.off("SIGINT",E)}break}default:console.error(` unknown subcommand: ${p}`),process.exit(1)}if(q.has(p)&&!e.includes("--no-wait")&&process.env.SOOTSIM_NO_AUTO_WAIT!=="1"&&!await mt(c,p)&&await T(c),S.length>0&&ee(S),!R.has(p))try{await Se(c)}catch{}}catch(S){let o=S instanceof Error?S.message:String(S);console.error(` ${p??"rnx"} failed: ${o}`);let n=/^no sim connected with id ([^;]+)(?:; connected sims: .+)?$/.exec(o),a=/^command timed out after (\d+)s$/.exec(o),l=o.startsWith("sim disconnected:")||o.startsWith("bridge never reconnected")||o.startsWith("could not connect to ws://");if(n)await qt(c,M,n[1]);else if(/^no sim connected$/.test(o))jt(M);else if(a)if(await gs(c)){let m=p??"describe";process.stderr.write(` the sim is still responsive \u2014 '${m}' just exceeded the ${a[1]}s command budget.
|
|
933
933
|
the screen's node tree is large; narrow the query or raise the budget:
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
934
|
+
rnx ${m} --testid <id> # scope to one subtree
|
|
935
|
+
rnx find --testid <id> # targeted single-node lookup
|
|
936
|
+
rnx ${m} --timeout 60000 # raise per-command budget (ms)
|
|
937
937
|
`)}else bo();else if(l)bo();else{try{await _t(c)}catch{}try{await te({includeTail:!0})}catch{}try{await K({includeTail:!0})}catch{}}process.exit(1)}finally{c.close()}}export{Je as a,Do as b,Ps as c,Cs as d,js as e,qs as f,Ls as g,se as h,Io as i,_r as j};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.336 | (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,7 +1,7 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.336 | (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 at}from"./chunk-
|
|
4
|
+
import{a as at}from"./chunk-SV6NVD7P.js";import{a as dt}from"./chunk-4532OPNZ.js";import{a as qe,b as me,c as ge,d as ze,e as we,f as ye,g as Xe,h as be,i as st}from"./chunk-2J4OBR7W.js";import{a as Ye}from"./chunk-OXRDTNVL.js";import{g as tt,h as rt,p as it,r as nt,v as ot}from"./chunk-UZCNKUSS.js";import{a as et}from"./chunk-BYOFHYKS.js";import{e as lt}from"./chunk-RZ2PXHA7.js";import{g as Qe}from"./chunk-MARPC3GM.js";import{h as Ge,m as Ke}from"./chunk-G3FVXFPF.js";import{J as fe,m as Ue,n as We,o as je,p as Ve,q as Je}from"./chunk-7PMNRG53.js";import{b as Ze}from"./chunk-NVPZLIMW.js";import{c as De,d as ce}from"./chunk-MQES3MTN.js";import{a as Be,b as Le,c as Ce}from"./chunk-BHXQ7MUW.js";import{g as ue,h as Ne,q as pe,r as he,s as He}from"./chunk-6ALTVOXE.js";import*as P from"fs";import{createHash as zt,randomUUID as Xt}from"node:crypto";import{tmpdir as Y}from"os";import*as w from"path";import*as x from"fs";import*as S from"path";var Rt="inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121",ut=1;function Mt(n){let e=Ce(n),t=e.scale,r=e.statusBarHeight>0&&!e.dynamicIsland&&e.homeIndicatorHeight===0&&e.cornerRadius===0,i=e.width,o=e.height,a=Be(e),s=r?e.width+58:a.frameWidth,l=r?e.height+111+111:a.frameHeight,p=9.5,u=ut,g=s+p*2,b=l+ut*2,m=p+(r?29:a.screenLeft),k=r?111:a.screenTop,$=r?52:a.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:n,renderScale:t,outerWidth:Math.round(g*t),outerHeight:Math.round(b*t),logicalOuterWidth:g,logicalOuterHeight:b,logicalFrameWidth:s,logicalFrameHeight:l,logicalFrameLeft:p,logicalFrameTop:u,logicalScreenWidth:i,logicalScreenHeight:o,logicalScreenLeft:m,logicalScreenTop:k,logicalScreenRadius:r?0:a.screenRadius,logicalFrameRadius:$,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:Rt,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 Ot(n){let e=n.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="
|
|
@@ -212,7 +212,7 @@ process.stdin.on('end', async () => {
|
|
|
212
212
|
var yPercent = Math.ceil(y * 100) + '%'
|
|
213
213
|
return xPercent + ',' + yPercent
|
|
214
214
|
}
|
|
215
|
-
`,this.context);for(let[i,o]of Object.entries(process.env))o!==void 0&&this.envBinding.set(i,o)}putEnv(e,t){this.envBinding.set(e,t)}setCopiedText(e){this.maestro.copiedText=e}enterEnvScope(){this.envScopeStack.push(new Map(this.envBinding))}leaveEnvScope(){let e=this.envScopeStack.pop();if(e){this.envBinding.clear();for(let[t,r]of e)this.envBinding.set(t,r)}}evaluate(e,t={}){let r=t.env;if(r&&Object.keys(r).length>0){this.enterEnvScope();try{for(let[i,o]of Object.entries(r))this.envBinding.set(i,o);return this.evalRaw(e)}finally{this.leaveEnvScope()}}return this.evalRaw(e)}evalRaw(e){this.syncEnvToContext();let t=e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${");return C.runInContext(`(function(){ with(__maestroScope){ return eval(\`${t}\`) } })()`,this.context)}syncEnvToContext(){let e=C.runInContext("globalThis",this.context);for(let t of this.syncedEnvKeys)this.envBinding.has(t)||delete e[t];this.syncedEnvKeys=new Set;for(let[t,r]of this.envBinding)try{e[t]=r,this.syncedEnvKeys.add(t)}catch{}}evaluateStringTemplate(e){return e.replace(Nt,(r,i)=>{if(i.trim().length===0)return"";let o=this.evaluate(i);if(o===void 0&&Ut.test(i.trim()))throw new Error(`missing variable for flow placeholder: ${i.trim()}`);return ht(o)}).replace(Ht,(r,i)=>i)}interpolateStep(e){return this.interpolateValue(e,null)}interpolateValue(e,t){return typeof e=="string"?t==="evalScript"?e:this.evaluateStringTemplate(e):Array.isArray(e)?t==="commands"||t==="onFlowStart"||t==="onFlowComplete"?e:e.map(r=>this.interpolateValue(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,i])=>[r,this.interpolateValue(i,r)])):e}};function ht(n){if(n===void 0)return"undefined";if(n===null)return"null";if(typeof n=="object")try{return JSON.stringify(n)}catch{return String(n)}return String(n)}function ft(n){if(n==null)return!1;if(typeof n=="boolean")return n;let e=String(n);if(e.trim().length===0||e.toLowerCase()==="false"||e==="undefined"||e==="null")return!1;let t=Number(e);return!(!Number.isNaN(t)&&t===0)}var ee=1e4,Wt=Math.min(10,Math.max(1,Number(process.env.SOOTSIM_FLOW_TIMEOUT_SCALE)||1)),K=n=>Math.round(n*Wt),re=393,N=852;function f(n){return new Promise(e=>setTimeout(e,n))}function Te(n){return!!(n&&typeof n=="object"&&!Array.isArray(n))}function q(n,e){if(!Te(n))return null;let t=n[e];return typeof t=="string"&&t.length>0?t:null}function jt(n,e){return Te(n)?n[e]===!0:!1}function Vt(n){if(!n)return null;let e=n.recentApps;if(Array.isArray(e))for(let r of e){let i=q(r,"id");if(i)return i}let t=n.surfaceBindings;return q(t,"app:one")||q(t,"app:two")||null}function Jt(n){return n?S.basename(n)===".maestro"?S.dirname(n):n:process.cwd()}function Gt(n,e,t){let r=e.endsWith(".png")?e:`${e}.png`;if(S.isAbsolute(r))return r;if(t.mode==="flow"&&/[\\/]/.test(r)){let i=r.startsWith("./")||r.startsWith("../")?t.flowDir??process.cwd():Jt(t.flowDir);return S.resolve(i,r)}return S.join(n,r)}function Kt(n){if(typeof n=="string")return{path:n,withFrame:!1};let e=n.path?.trim()||n.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:n.withFrame===!0,layers:n.layers}}function te(n,e){let[t,r]=n.split(",").map(s=>s.trim()),i=(s,l)=>s.endsWith("%")?Number.parseFloat(s)/100*l:Number.parseFloat(s),o=e?.x??0,a=e?.y??0;return{x:o+i(t,e?.width??re),y:a+i(r,e?.height??N)}}function mt(n){switch(n){case"back":return{back:!0};case"hideKeyboard":return{hideKeyboard:!0};case"waitForAnimationToEnd":return{waitForAnimationToEnd:!0};case"stopApp":return{stopApp:!0};case"clearState":return{clearState:!0};case"clearKeychain":return{clearKeychain:!0};case"eraseText":return{eraseText:50};case"scroll":case"scrollDown":return{scroll:{direction:"DOWN"}};case"scrollUp":return{scroll:{direction:"UP"}};default:return{[n]:!0}}}function qt(n){let e=n.split(/^---$/m),t=e.length>1?e[e.length-1]:n,r=Ye.parse(t);return Array.isArray(r)?r:[]}var ie=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;js=new Q({platform:"ios",onLog:e=>console.log(`[flow] js: ${e}`)});firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingStartedAtMs=null;lastRecordingDurationMs=null;lastRecordingFrameStats=null;flowTraceSteps=[];lastVisualSettledAtMs=0;simRouteHint=null;lastFailedStep=null;get simId(){return this.opts.simId}setSimRouteHint(e){this.simRouteHint=this.normalizeSimRoute(e)}normalizeSimRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let r=t.searchParams.toString();return`${t.origin}${t.pathname}${r?`?${r}`:""}`}catch{return e}}async refreshSimId(){if(this.opts.simId)try{let e=await this.bridge.listSims(),t=e.find(l=>l.id===this.opts.simId);if(t&&(this.simRouteHint=this.normalizeSimRoute(t.url||t.origin)),e.find(l=>l.id===this.opts.simId&&l.readyState==="open")||!this.simRouteHint)return;let i=this.simRouteHint&&e.find(l=>l.readyState==="open"&&this.normalizeSimRoute(l.url||l.origin)===this.simRouteHint);if(!i)return;let o=e.find(l=>l.isPrimary&&l.readyState==="open"),a=e.find(l=>l.readyState==="open"),s=i??o??a;s&&(this.opts.simId=s.id,console.log(` [flow] sim rotated to ${s.id}`))}catch{}}async evaluate(e,t){return this.bridge.send({type:"evaluate",simId:this.opts.simId,code:e},t?{timeoutMs:t}:void 0)}async callTest(e,...t){return this.bridge.send({type:"call",simId:this.opts.simId,path:`__sootsimTest.${e}`,args:t})}async perform(e){return this.bridge.send({type:"perform",simId:this.opts.simId,steps:e})}async waitForTree(e=ee){let t=Date.now()+K(e),r=Date.now(),i=null,o=0,a=0,s=-1,l=r;for(;Date.now()<t;){try{let u=await this.evaluate(Ue,8e3);if(o=0,u?.externalError)throw new Error(`app failed to load: ${u.externalError}`);if(u){let g=Date.now();u.nodes!==s&&(s=u.nodes,l=g);let b=u.flag===!0&&Ve(u),m=u.flag!==!0&&Je(u);if((b||m)&&u.externalReady!==!1&&!u.externalError&&!u.loadingText&&g-l>=We)return}}catch(u){if(i=u instanceof Error?u:new Error(String(u)),i.message.startsWith("app failed to load:"))throw i;if(o++,o>=4)throw new Error(`target sim is not responding to the bridge (${i.message}). it is likely a stale orphan \u2014 run \`
|
|
215
|
+
`,this.context);for(let[i,o]of Object.entries(process.env))o!==void 0&&this.envBinding.set(i,o)}putEnv(e,t){this.envBinding.set(e,t)}setCopiedText(e){this.maestro.copiedText=e}enterEnvScope(){this.envScopeStack.push(new Map(this.envBinding))}leaveEnvScope(){let e=this.envScopeStack.pop();if(e){this.envBinding.clear();for(let[t,r]of e)this.envBinding.set(t,r)}}evaluate(e,t={}){let r=t.env;if(r&&Object.keys(r).length>0){this.enterEnvScope();try{for(let[i,o]of Object.entries(r))this.envBinding.set(i,o);return this.evalRaw(e)}finally{this.leaveEnvScope()}}return this.evalRaw(e)}evalRaw(e){this.syncEnvToContext();let t=e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${");return C.runInContext(`(function(){ with(__maestroScope){ return eval(\`${t}\`) } })()`,this.context)}syncEnvToContext(){let e=C.runInContext("globalThis",this.context);for(let t of this.syncedEnvKeys)this.envBinding.has(t)||delete e[t];this.syncedEnvKeys=new Set;for(let[t,r]of this.envBinding)try{e[t]=r,this.syncedEnvKeys.add(t)}catch{}}evaluateStringTemplate(e){return e.replace(Nt,(r,i)=>{if(i.trim().length===0)return"";let o=this.evaluate(i);if(o===void 0&&Ut.test(i.trim()))throw new Error(`missing variable for flow placeholder: ${i.trim()}`);return ht(o)}).replace(Ht,(r,i)=>i)}interpolateStep(e){return this.interpolateValue(e,null)}interpolateValue(e,t){return typeof e=="string"?t==="evalScript"?e:this.evaluateStringTemplate(e):Array.isArray(e)?t==="commands"||t==="onFlowStart"||t==="onFlowComplete"?e:e.map(r=>this.interpolateValue(r,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([r,i])=>[r,this.interpolateValue(i,r)])):e}};function ht(n){if(n===void 0)return"undefined";if(n===null)return"null";if(typeof n=="object")try{return JSON.stringify(n)}catch{return String(n)}return String(n)}function ft(n){if(n==null)return!1;if(typeof n=="boolean")return n;let e=String(n);if(e.trim().length===0||e.toLowerCase()==="false"||e==="undefined"||e==="null")return!1;let t=Number(e);return!(!Number.isNaN(t)&&t===0)}var ee=1e4,Wt=Math.min(10,Math.max(1,Number(process.env.SOOTSIM_FLOW_TIMEOUT_SCALE)||1)),K=n=>Math.round(n*Wt),re=393,N=852;function f(n){return new Promise(e=>setTimeout(e,n))}function Te(n){return!!(n&&typeof n=="object"&&!Array.isArray(n))}function q(n,e){if(!Te(n))return null;let t=n[e];return typeof t=="string"&&t.length>0?t:null}function jt(n,e){return Te(n)?n[e]===!0:!1}function Vt(n){if(!n)return null;let e=n.recentApps;if(Array.isArray(e))for(let r of e){let i=q(r,"id");if(i)return i}let t=n.surfaceBindings;return q(t,"app:one")||q(t,"app:two")||null}function Jt(n){return n?S.basename(n)===".maestro"?S.dirname(n):n:process.cwd()}function Gt(n,e,t){let r=e.endsWith(".png")?e:`${e}.png`;if(S.isAbsolute(r))return r;if(t.mode==="flow"&&/[\\/]/.test(r)){let i=r.startsWith("./")||r.startsWith("../")?t.flowDir??process.cwd():Jt(t.flowDir);return S.resolve(i,r)}return S.join(n,r)}function Kt(n){if(typeof n=="string")return{path:n,withFrame:!1};let e=n.path?.trim()||n.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:n.withFrame===!0,layers:n.layers}}function te(n,e){let[t,r]=n.split(",").map(s=>s.trim()),i=(s,l)=>s.endsWith("%")?Number.parseFloat(s)/100*l:Number.parseFloat(s),o=e?.x??0,a=e?.y??0;return{x:o+i(t,e?.width??re),y:a+i(r,e?.height??N)}}function mt(n){switch(n){case"back":return{back:!0};case"hideKeyboard":return{hideKeyboard:!0};case"waitForAnimationToEnd":return{waitForAnimationToEnd:!0};case"stopApp":return{stopApp:!0};case"clearState":return{clearState:!0};case"clearKeychain":return{clearKeychain:!0};case"eraseText":return{eraseText:50};case"scroll":case"scrollDown":return{scroll:{direction:"DOWN"}};case"scrollUp":return{scroll:{direction:"UP"}};default:return{[n]:!0}}}function qt(n){let e=n.split(/^---$/m),t=e.length>1?e[e.length-1]:n,r=Ye.parse(t);return Array.isArray(r)?r:[]}var ie=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;js=new Q({platform:"ios",onLog:e=>console.log(`[flow] js: ${e}`)});firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingStartedAtMs=null;lastRecordingDurationMs=null;lastRecordingFrameStats=null;flowTraceSteps=[];lastVisualSettledAtMs=0;simRouteHint=null;lastFailedStep=null;get simId(){return this.opts.simId}setSimRouteHint(e){this.simRouteHint=this.normalizeSimRoute(e)}normalizeSimRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let r=t.searchParams.toString();return`${t.origin}${t.pathname}${r?`?${r}`:""}`}catch{return e}}async refreshSimId(){if(this.opts.simId)try{let e=await this.bridge.listSims(),t=e.find(l=>l.id===this.opts.simId);if(t&&(this.simRouteHint=this.normalizeSimRoute(t.url||t.origin)),e.find(l=>l.id===this.opts.simId&&l.readyState==="open")||!this.simRouteHint)return;let i=this.simRouteHint&&e.find(l=>l.readyState==="open"&&this.normalizeSimRoute(l.url||l.origin)===this.simRouteHint);if(!i)return;let o=e.find(l=>l.isPrimary&&l.readyState==="open"),a=e.find(l=>l.readyState==="open"),s=i??o??a;s&&(this.opts.simId=s.id,console.log(` [flow] sim rotated to ${s.id}`))}catch{}}async evaluate(e,t){return this.bridge.send({type:"evaluate",simId:this.opts.simId,code:e},t?{timeoutMs:t}:void 0)}async callTest(e,...t){return this.bridge.send({type:"call",simId:this.opts.simId,path:`__sootsimTest.${e}`,args:t})}async perform(e){return this.bridge.send({type:"perform",simId:this.opts.simId,steps:e})}async waitForTree(e=ee){let t=Date.now()+K(e),r=Date.now(),i=null,o=0,a=0,s=-1,l=r;for(;Date.now()<t;){try{let u=await this.evaluate(Ue,8e3);if(o=0,u?.externalError)throw new Error(`app failed to load: ${u.externalError}`);if(u){let g=Date.now();u.nodes!==s&&(s=u.nodes,l=g);let b=u.flag===!0&&Ve(u),m=u.flag!==!0&&Je(u);if((b||m)&&u.externalReady!==!1&&!u.externalError&&!u.loadingText&&g-l>=We)return}}catch(u){if(i=u instanceof Error?u:new Error(String(u)),i.message.startsWith("app failed to load:"))throw i;if(o++,o>=4)throw new Error(`target sim is not responding to the bridge (${i.message}). it is likely a stale orphan \u2014 run \`rnx list\`, then close it with \`rnx close <id>\` or start a fresh one with \`rnx open --new <port>\`.`);await this.refreshSimId()}let p=Date.now()-r;p-a>=5e3&&(a=p,console.log(` [flow] waiting for app to be ready\u2026 (${Math.round(p/1e3)}s)`)),await f(je)}throw i?.message.startsWith("app failed to load:")?i:new Error(`app not ready after ${e}ms`)}async ensureRecordingStarted(){if(!this.opts.recordingOutputDir)throw new Error("recording output directory not configured");this.recordingAccessChecked||(this.opts.requireRecordingEntitlement&&await dt("flow --video",{originOverride:this.opts.billingOriginOverride,allowGitHubAuth:this.opts.allowGitHubRecording}),this.recordingAccessChecked=!0);let e=Date.now(),t=await this.evaluate(`(() => {
|
|
216
216
|
const rec = window.__sootsimRecorder
|
|
217
217
|
if (!rec) return { ok: false, error: 'recorder unavailable on this page' }
|
|
218
218
|
const format = ${JSON.stringify(this.opts.recordingFormat??"webm")}
|
|
@@ -535,7 +535,7 @@ flow extension:
|
|
|
535
535
|
})()`}),console.log(` captured ${_.length} partial replay events`)}catch(d){console.warn(` event recorder stop failed: ${d?.message||String(d)}`)}console.error(`
|
|
536
536
|
x failed: ${h.message}
|
|
537
537
|
`),O&&(console.log(" partial profile:"),gt(O)),F&&console.log(` partial video: ${F}`);try{let d=c.lastFailedStep,y=d?`step-${String(d.index+1).padStart(2,"0")}-${d.kind}`:"unstaged",I=w.join(s,y);await c.captureFailureBundle(I,{error:h,stepIndex:d?.index,stepKind:d?.kind,stepTarget:d?.target}),de=I,console.log(` failure bundle: ${I}`),console.log(" (contents: screenshot.png, describe.json, a11y.txt, tree.txt, console.json, error.json)")}catch(d){try{let y=w.join(s,"error.png");await c.captureScreenshot(y),console.log(` error screenshot: ${y}`)}catch{}console.log(` (failure bundle capture failed: ${d instanceof Error?d.message:String(d)})`)}await Ke(E,{errorsCommand:`sootsim get errors 5${c.simId?` --sim ${c.simId}`:""}`,warningsCommand:`sootsim get warnings 5${c.simId?` --sim ${c.simId}`:""}`,requestsCommand:`sootsim get requests 5${c.simId?` --sim ${c.simId}`:""}`}),V=1}if(await c.liveStatus?.end(V===0?"passed":"failed"),m&&(V===0||F||_))try{let h=await tr(_??[]),d=["--origin",k,"--events",h];$&&d.push("--public-origin",$),F&&d.push("--video",F),j&&d.push("--screenshot",j),F&&L&&Number.isFinite(L)&&(d.push("--video-duration-ms",String(Math.round(L))),d.push("--recorded-duration-ms",String(Math.round(L))));let y=c.getLastRecordingStartedAtMs();y&&Number.isFinite(y)&&d.push("--recording-started-at-ms",String(Math.round(y))),v.wsPort&&d.push("--port",String(v.wsPort)),c.simId&&d.push("--sim",c.simId),H&&d.push("--open"),Ie&&d.push("--owner",Ie),Pe&&d.push("--repo",Pe),d.push("--run-scope",yt),U&&d.push("--billing-kind",U),console.log(`
|
|
538
|
-
preparing preview upload\u2026`);let I=c.getFlowTraceSteps();I.length>0&&d.push("--timeline-events",await rr(I));let J=await ir(I,y);J&&d.push("--snapshot-manifest",J),de&&d.push("--failure-bundle",de);let D=c.getLastRecordingFrameStats();D&&d.push("--trace-frame-stats",await nr(D));let{runUpload:Pt}=await import("./upload-
|
|
538
|
+
preparing preview upload\u2026`);let I=c.getFlowTraceSteps();I.length>0&&d.push("--timeline-events",await rr(I));let J=await ir(I,y);J&&d.push("--snapshot-manifest",J),de&&d.push("--failure-bundle",de);let D=c.getLastRecordingFrameStats();D&&d.push("--trace-frame-stats",await nr(D));let{runUpload:Pt}=await import("./upload-FI2TS5S7.js");Ee=await Pt(d,{})}catch(h){console.error(` preview upload failed: ${h?.message||h}`),V=1}return Fe=c.getFlowTraceSteps(),E.close(),ae?(c.simId&&le.add(c.simId),await er(v.wsPort,v.commandTimeoutMs,[...le])):c.simId&&c.simId!==X&&Ne(c.simId),await ce(),V}async function er(n,e,t){let r=[...new Set(t.filter(Boolean))];if(r.length===0)return;let i=he(n,{commandTimeoutMs:e});try{let o=await i.listSims(),a=r.filter(l=>o.some(p=>p.id===l&&p.readyState==="open"));if(a.length===0)return;let s=await ot(i,n,e,a);await it(o,a),s.closed.length>0&&console.log(` closed flow sim(s): ${s.closed.join(", ")}`),s.remaining.length>0&&console.warn(` warn: flow sim(s) still connected after close: ${s.remaining.join(", ")}`)}catch(o){console.warn(` warn: failed to close flow sim(s): ${o instanceof Error?o.message:String(o)}`)}finally{i.close()}}async function tr(n){let{gzipSync:e}=await import("zlib"),t=n.map(o=>JSON.stringify(o)).join(`
|
|
539
539
|
`)+(n.length?`
|
|
540
540
|
`:""),r=e(Buffer.from(t,"utf8")),i=w.join(Y(),`sootsim-events-${Date.now()}.jsonl.gz`);return P.writeFileSync(i,r),console.log(` events: ${n.length} written to ${i} (${r.length} bytes gz)`),i}async function rr(n){let{gzipSync:e}=await import("zlib"),t=n.map((a,s)=>({schemaVersion:1,t:a.endedAtMs,seq:1e6+s,context:"host",kind:"flow-step",id:`flow-step-${a.stepIndex}`,data:{stepIndex:a.stepIndex,stepNumber:a.stepIndex+1,stepName:a.stepName,...a.targetLabel?{targetLabel:a.targetLabel}:{},status:a.status,durationMs:a.durationMs,startedAtMs:a.startedAtMs,endedAtMs:a.endedAtMs,...a.error?{error:a.error}:{}}})),r=t.map(a=>JSON.stringify(a)).join(`
|
|
541
541
|
`)+`
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.336 | (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 k}from"./chunk-
|
|
4
|
+
import{a as k}from"./chunk-BYOFHYKS.js";import{a as $}from"./chunk-WBTT5WIO.js";import{spawn as v,spawnSync as m}from"child_process";import{chmodSync as S,copyFileSync as T,createWriteStream as E,existsSync as w,mkdirSync as y,rmSync as g,statSync as P,unlinkSync as D}from"fs";import{tmpdir as M}from"os";import{dirname as A,join as f,resolve as b}from"path";var h="https://contrast.dev/api/electron-release";function O(){let r=process.arch;if(process.platform==="darwin"){let t=r==="arm64"?"mac-arm64":"mac-x64",e=`sootsim-latest-${t}.dmg`;return{platform:t,filename:e,url:`${h}/${e}`,install:L}}if(process.platform==="linux"){let t=r==="arm64"?"linux-arm64":"linux-x64",e=`sootsim-latest-${t}.AppImage`;return{platform:t,filename:e,url:`${h}/${e}`,install:C}}if(process.platform==="win32"){let t="sootsim-latest-win-x64.exe";return{platform:"win-x64",filename:t,url:`${h}/${t}`,install:B}}return null}async function I({url:r,dest:t,onProgress:e}){let s=await fetch(r,{redirect:"follow"});if(!s.ok)throw new Error(`${s.status} ${s.statusText} (${r})`);let o=s.headers.get("content-length"),a=o?Number(o):null;if(!s.body)throw new Error(`empty response body (${r})`);y(A(t),{recursive:!0});let i=E(t),d=s.body.getReader(),c=0;try{for(;;){let{done:l,value:p}=await d.read();if(l)break;i.write(Buffer.from(p)),c+=p.byteLength,e?.(c,a)}}finally{await new Promise((l,p)=>{i.end(n=>n?p(n):l())})}}function _(r,t){let e=(r/1048576).toFixed(1);if(!t)return` ${e} MB`;let s=Math.min(100,Math.round(r/t*100)),o=(t/(1024*1024)).toFixed(1),a=24,i=Math.round(s/100*a);return` ${"\u2588".repeat(i)+"\u2591".repeat(a-i)} ${s}% ${e} / ${o} MB`}async function L(r){let t=m("hdiutil",["attach","-nobrowse","-readonly",r],{encoding:"utf8"});if(t.status!==0)throw new Error(`hdiutil attach failed: ${t.stderr||t.stdout}`.trim());let e=t.stdout.trim().split(`
|
|
5
5
|
`),o=e[e.length-1].split(" ").pop()?.trim();if(!o||!w(o))throw new Error(`could not determine dmg mount point (output: ${t.stdout})`);let a=f(o,"sootsim.app");if(!w(a))throw m("hdiutil",["detach","-force",o]),new Error(`sootsim.app not found inside ${o}`);let i="/Applications",d=b(process.env.HOME||"","Applications"),c=i;try{let u=f(i,`.sootsim-write-probe-${process.pid}`);m("touch",[u]),w(u)?g(u,{force:!0}):c=d}catch{c=d}c===d&&y(c,{recursive:!0});let l=f(c,"sootsim.app");w(l)&&g(l,{recursive:!0,force:!0});let p=m("cp",["-R",a,l]),n=m("hdiutil",["detach","-force",o]);if(p.status!==0)throw new Error(`copy to ${l} failed: ${p.stderr?.toString()||""}`.trim());return n.status!==0&&console.warn(` warning: failed to unmount ${o} (${n.stderr?.toString().trim()||"unknown error"})`),m("xattr",["-dr","com.apple.quarantine",l]),l}async function C(r){let t=b(process.env.HOME||"","Applications");y(t,{recursive:!0});let e=f(t,"sootsim.AppImage");return w(e)&&g(e,{force:!0}),T(r,e),D(r),S(e,493),e}async function B(r){return await new Promise((t,e)=>{let s=v("cmd",["/c","start",'""',"/wait",r],{stdio:"inherit"});s.once("error",e),s.once("exit",o=>{o===0?t():e(new Error(`installer exited with code ${o}`))})}),r}async function q(r){(r.includes("--help")||r.includes("-h"))&&(console.log(`
|
|
6
|
-
|
|
6
|
+
rnx desktop install \u2014 download and install the optional desktop GUI
|
|
7
7
|
|
|
8
8
|
the CLI + daemon are the canonical rnx surface; the GUI is optional.
|
|
9
9
|
if you just want to drive a running metro/expo dev server from the
|
|
10
10
|
terminal, you don't need this.
|
|
11
11
|
|
|
12
12
|
usage:
|
|
13
|
-
|
|
13
|
+
rnx desktop install [options]
|
|
14
14
|
|
|
15
15
|
options:
|
|
16
16
|
-y, --yes skip confirmation and install immediately
|
|
17
17
|
--force reinstall even if the companion is already present
|
|
18
18
|
|
|
19
19
|
examples:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
`),process.exit(0));let t=r.includes("--yes")||r.includes("-y")||process.env.SOOTSIM_NO_PROMPT==="1"||process.env.CI==="1"||!process.stdin.isTTY,e=r.includes("--force"),s=k();if(s&&!e){console.log(`
|
|
20
|
+
rnx desktop install
|
|
21
|
+
rnx desktop install --yes
|
|
22
|
+
`),process.exit(0));let t=r.includes("--yes")||r.includes("-y")||process.env.SOOTSIM_NO_PROMPT==="1"||process.env.CI==="1"||!process.stdin.isTTY,e=r.includes("--force"),s=k();if(s&&!e){console.log(` rnx desktop already installed at: ${s.path}`),console.log(" pass --force to reinstall.");return}let o=O();if(o||(console.error(` no desktop build available for ${process.platform}/${process.arch}.`),console.error(" supported: darwin-arm64, darwin-x64, linux-x64, linux-arm64, win32-x64"),process.exit(1)),console.log(` platform: ${o.platform}`),console.log(` download: ${o.url}`),console.log(),!t){if(!await $("download and install now?",!0)){console.log(" cancelled.");return}console.log()}let a=f(M(),`sootsim-install-${Date.now()}`),i=f(a,o.filename),d=0;process.stdout.write(` downloading ${o.filename}...
|
|
23
23
|
`);try{await I({url:o.url,dest:i,onProgress:(n,u)=>{let x=Date.now();x-d<100&&n<(u??1/0)||(d=x,process.stdout.isTTY&&process.stdout.write(`\r\x1B[2K${_(n,u)}`))}})}catch(n){g(a,{recursive:!0,force:!0});let u=n instanceof Error?n.message:String(n);console.error(`
|
|
24
|
-
download failed: ${u}`),console.error(` the ${o.platform} desktop build may not be published yet, or your`),console.error(" network blocked the request. check your connection and try again later;"),console.error(" the CLI + daemon work without the desktop app (run:
|
|
25
|
-
`);let c=P(i).size;console.log(` downloaded ${(c/(1024*1024)).toFixed(1)} MB`),console.log(),console.log(" installing...");let{trackCliEvent:l,flushCliTelemetry:p}=await import("./telemetry-
|
|
24
|
+
download failed: ${u}`),console.error(` the ${o.platform} desktop build may not be published yet, or your`),console.error(" network blocked the request. check your connection and try again later;"),console.error(" the CLI + daemon work without the desktop app (run: rnx --help)."),process.exit(1)}process.stdout.isTTY&&process.stdout.write(`
|
|
25
|
+
`);let c=P(i).size;console.log(` downloaded ${(c/(1024*1024)).toFixed(1)} MB`),console.log(),console.log(" installing...");let{trackCliEvent:l,flushCliTelemetry:p}=await import("./telemetry-LGTXJEJC.js");try{let n=await o.install(i);l({event:"cli_install_desktop_succeeded",properties:{platform:o.platform,size_bytes:c}}),console.log(` installed: ${n}`)}catch(n){l({event:"cli_install_desktop_failed",properties:{platform:o.platform,error:n instanceof Error?n.message:String(n)}}),await p(),console.error(` install failed: ${n instanceof Error?n.message:String(n)}`),console.error(` keeping download at ${i} for manual install.`),process.exit(1)}finally{g(a,{recursive:!0,force:!0})}console.log(),console.log(" next steps:"),console.log(" rnx desktop launch the desktop app"),console.log(" rnx open <target> open a demo or bundle in it")}export{q as a};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*! rnx v0.1.336 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import { createRequire as __sootsimCreateRequire } from 'node:module'
|
|
3
|
+
var require = __sootsimCreateRequire(import.meta.url)
|
|
4
|
+
import{e as f}from"./chunk-6ALTVOXE.js";import{existsSync as m,mkdirSync as g,readFileSync as h,writeFileSync as S,rmSync as F}from"fs";import{tmpdir as y}from"os";import{dirname as b,join as p}from"path";var w=new Map;function o(e,n){w.set(e,n)}var s=1;function a(){return p(y(),`sootsim-cli-hints-${f()}.json`)}function d(){return p(y(),"sootsim-cli-hints-global.json")}function u(e){if(!m(e))return{version:s,shown:{}};try{let n=JSON.parse(h(e,"utf8"));return n?.version!==s||!n?.shown?{version:s,shown:{}}:n}catch{return{version:s,shown:{}}}}function l(e,n){try{g(b(e),{recursive:!0}),S(e,JSON.stringify(n)+`
|
|
5
|
+
`)}catch{}}function v(){let e=(process.env.SOOTSIM_HINTS||"").toLowerCase();return e==="off"||e==="0"||e==="false"?"off":e==="always"||e==="verbose"?"always":"normal"}function x(e,n){let i=v();if(i==="off")return!1;if(i==="always"||n==="always")return!0;let t=Date.now();if(n==="once-per-identity"){let r=u(a());return r.shown[e]?!1:(r.shown[e]=t,l(a(),r),!0)}if(n==="once-ever"){let r=u(d());return r.shown[e]?!1:(r.shown[e]=t,l(d(),r),!0)}if(typeof n=="object"&&"cooldownMs"in n){let r=u(a()),c=r.shown[e]??0;return t-c<n.cooldownMs?!1:(r.shown[e]=t,l(a(),r),!0)}return!0}function A(e,...n){let i=w.get(e);if(!i)return process.env.SOOTSIM_HINTS_DEBUG&&console.error(` [hints] no hint registered for id "${e}"`),!1;if(!x(e,i.frequency))return!1;let t=i.render(...n);if(t==null)return!1;let r=Array.isArray(t)?t:[t];for(let c of r)console.error(` hint: ${c}`);return!0}o("app-still-loading",{frequency:{cooldownMs:6e4},render:e=>`app may still be loading (${e} nodes). run \`rnx wait ready\` first.`});o("wait-selector-for-missing-testid",{frequency:"once-per-identity",render:e=>`rnx wait selector ${e}`});o("prefer-cli-over-eval",{frequency:"once-per-identity",render:e=>e.length?["try the CLI shortcut instead:",...e.map(n=>` ${n}`)]:null});o("describe-use-filters",{frequency:"once-per-identity",render:()=>["describe output is long. narrow it with:"," rnx describe --only '*Bottom Sheet*'"," rnx describe --testid-like 'swap-*'"," rnx describe --subtree <testID>"]});o("describe-filter-context",{frequency:"once-per-identity",render:()=>["filtered describe is search output, not current-route proof.","run `rnx describe` without filters after navigation; clipped nodes are marked `(clipped:...)`."]});o("subtree-root-not-found",{frequency:"always",render:e=>`no node with testID/id "${e}" \u2014 try \`rnx find --testid ${e}\` to discover available ids.`});o("clean-uninstall",{frequency:"once-ever",render:()=>["to remove the background daemon and all ~/.sootsim data, run `rnx daemon uninstall`.","the optional desktop app and its macOS preference plist are separate from the daemon."]});export{A as a};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.336 | (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{e as p}from"./chunk-
|
|
4
|
+
import{e as p}from"./chunk-RZ2PXHA7.js";import{a as c,b as l}from"./chunk-OUAYBJ4G.js";import{a}from"./chunk-7FHAHI5V.js";async function g(e,i){if(i)return i.replace(/\/$/,"");if(e.kind==="session"&&e.origin)return e.origin.replace(/\/$/,"");let r=a();return r?.origin?r.origin.replace(/\/$/,""):(await p()).replace(/\/$/,"")}async function x(e,i={}){let r=c();if(r||(process.stderr.write(`
|
|
5
5
|
rnx ${e} needs auth before it can check recording access.
|
|
6
6
|
|
|
7
7
|
pick one:
|
|
8
|
-
\u2022 run \`
|
|
8
|
+
\u2022 run \`rnx login\`
|
|
9
9
|
\u2022 set RNX_API_KEY=sk_rnx_... (recommended for CI)
|
|
10
10
|
|
|
11
11
|
`),process.exit(1)),r.kind==="github"&&i.allowGitHubAuth)return;let s=await g(r,i.originOverride),n;try{n=await fetch(`${s}/api/sootsim/billing/subscription`,{headers:{authorization:l(r)}})}catch(t){process.stderr.write(`
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.336 | (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{q as j,s as A,v as K,w as v}from"./chunk-
|
|
4
|
+
import{q as j,s as A,v as K,w as v}from"./chunk-6ALTVOXE.js";import{createHash as Y}from"node:crypto";import{mkdirSync as L,readFileSync as W,readdirSync as Q,unlinkSync as X,writeFileSync as D}from"node:fs";import{dirname as q,extname as Z,resolve as B}from"node:path";function H(t){let e=t[0]?.toLowerCase()??"toggle";return e!=="on"&&e!=="off"&&e!=="toggle"&&(console.error(` unknown argument: "${e}" (expected on | off | toggle)`),process.exit(1)),e}async function U(t,e,n){let o=j(t,{port:e.port}),i=H(o.positional),u=A({...o,commandTimeoutMs:5e3});try{let a=!!(await K(u,"SootSim.bridges.settings.get"))?.[n.modeKey],m=i==="on"?!0:i==="off"?!1:!a;if(a===m)return console.log(` ${n.displayName}: already ${m?"on":"off"}`),{current:a,target:m,changed:!1};if(!await u.send({type:"evaluate",acquireLock:!0,code:`(async () => {
|
|
5
5
|
const modeKey = ${JSON.stringify(n.modeKey)}
|
|
6
|
-
const target = ${JSON.stringify(
|
|
6
|
+
const target = ${JSON.stringify(m)}
|
|
7
7
|
window.dispatchEvent(new CustomEvent('sootsim:shell-command', {
|
|
8
8
|
detail: { type: 'fire-action', id: ${JSON.stringify(n.actionId)} },
|
|
9
9
|
}))
|
|
@@ -15,17 +15,17 @@ import{q as j,s as A,v as K,w as v}from"./chunk-RTEJXUXN.js";import{createHash a
|
|
|
15
15
|
await new Promise((resolve) => setTimeout(resolve, 40))
|
|
16
16
|
}
|
|
17
17
|
return false
|
|
18
|
-
})()`}))throw new Error(`${n.displayName} did not change to ${
|
|
19
|
-
|
|
18
|
+
})()`}))throw new Error(`${n.displayName} did not change to ${m?"on":"off"}; the live shell may not support this mode`);return console.log(` ${n.displayName}: ${a?"on":"off"} -> ${m?"on":"off"}`),{current:a,target:m,changed:!0}}finally{u.close()}}var z=12e3,ee=6e5,te=new Set(["load","seek","play","pause","render","measure"]);async function ye(t,e){(t.includes("--help")||t.includes("-h"))&&(console.log(`
|
|
19
|
+
rnx mode three \u2014 toggle the 3d device stage
|
|
20
20
|
|
|
21
21
|
usage:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
rnx mode three [on|off|toggle]
|
|
23
|
+
rnx mode three configure [options]
|
|
24
|
+
rnx mode three load <timeline.json>
|
|
25
|
+
rnx mode three seek <time-ms>
|
|
26
|
+
rnx mode three play|pause
|
|
27
|
+
rnx mode three render <timeline.json> --output <dir> [options]
|
|
28
|
+
rnx mode three measure <timeline.json> [options]
|
|
29
29
|
|
|
30
30
|
arguments:
|
|
31
31
|
on enable 3d mode
|
|
@@ -78,14 +78,14 @@ measure options (projected bounds only \u2014 no pixels rendered):
|
|
|
78
78
|
--output <file.json> write the measurement JSON here instead of stdout
|
|
79
79
|
|
|
80
80
|
examples:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
`),process.exit(0));let n=ie(t);if(n){await le(n,t,e);return}if(ne(t)){await oe(t,e);return}(await U(t,e,{modeKey:"threeMode",displayName:"three-mode",actionId:"toggle-three-mode"})).target&&await re(t,e)}function ne(t){return t[0]==="configure"||t.some(e=>["--device","--background","--gradient","--gradient-angle","--colorway","--script","--progress","--animate","--slow","--environment","--env-shape","--env-spread","--env-size","--env-color","--env-glow","--env-plastic","--setting","--focus","--focus-amount","--focus-range","--reset-pose"].includes(e))}async function oe(t,e){let n=j(t,{port:e.port,stripBooleanFlags:["--animate","--slow","--reset-pose"],stripValueFlags:["--device","--background","--gradient","--gradient-angle","--colorway","--script","--progress","--environment","--env-shape","--env-spread","--env-size","--env-color","--env-glow","--env-plastic","--setting","--focus","--focus-amount","--focus-range"]}),o=
|
|
81
|
+
rnx mode three
|
|
82
|
+
rnx mode three on
|
|
83
|
+
rnx mode three configure --script hero-arc --background gradient-tide
|
|
84
|
+
rnx mode three configure --environment on --env-shape pane --setting room
|
|
85
|
+
rnx mode three render ./cinematic.json --output ./frames --fps 30
|
|
86
|
+
rnx mode three measure ./cinematic.json --width 450 --height 900 --at 0,1200
|
|
87
|
+
rnx mode three off
|
|
88
|
+
`),process.exit(0));let n=ie(t);if(n){await le(n,t,e);return}if(ne(t)){await oe(t,e);return}(await U(t,e,{modeKey:"threeMode",displayName:"three-mode",actionId:"toggle-three-mode"})).target&&await re(t,e)}function ne(t){return t[0]==="configure"||t.some(e=>["--device","--background","--gradient","--gradient-angle","--colorway","--script","--progress","--animate","--slow","--environment","--env-shape","--env-spread","--env-size","--env-color","--env-glow","--env-plastic","--setting","--focus","--focus-amount","--focus-range","--reset-pose"].includes(e))}async function oe(t,e){let n=j(t,{port:e.port,stripBooleanFlags:["--animate","--slow","--reset-pose"],stripValueFlags:["--device","--background","--gradient","--gradient-angle","--colorway","--script","--progress","--environment","--env-shape","--env-spread","--env-size","--env-color","--env-glow","--env-plastic","--setting","--focus","--focus-amount","--focus-range"]}),o=ue(t),i=A({...n,commandTimeoutMs:z+1e3});try{await J(i);let u=await v(i,"SootSim.bridges.threeMode.configure",o);console.log(` three-mode: configured (${me(u)})`)}finally{i.close()}}async function re(t,e){let n=j(t,{port:e.port}),o=A({...n,commandTimeoutMs:z+1e3});try{await J(o)}finally{o.close()}}async function J(t){let e=await t.send({type:"evaluate",code:`(async () => {
|
|
89
89
|
const deadline = Date.now() + ${z}
|
|
90
90
|
while (Date.now() < deadline) {
|
|
91
91
|
const settings = window.SootSim?.bridges?.settings?.get?.()
|
|
@@ -100,8 +100,8 @@ examples:
|
|
|
100
100
|
const bridge = window.SootSim?.bridges?.threeMode
|
|
101
101
|
const state = typeof bridge?.getState === 'function' ? bridge.getState() : null
|
|
102
102
|
return state || { ready: false }
|
|
103
|
-
})()`});if(e?.ready===!0)return e;throw e?.disabled?new Error("3d mode is off; run `
|
|
103
|
+
})()`});if(e?.ready===!0)return e;throw e?.disabled?new Error("3d mode is off; run `rnx mode three on` before configure"):new Error("3d mode runtime did not become ready")}function ie(t){for(let e=0;e<t.length;e+=1){let n=t[e];if(n==="--sim"||n==="--port"||n==="-p"){e+=1;continue}if(!n.startsWith("-"))return te.has(n)?n:null}return null}function _(t,e){let n=t.indexOf(e);return n>=0?t[n+1]:void 0}function y(t,e,n,o=0){let i=_(t,e);if(i===void 0)return n;let u=Number.parseFloat(i);if(!Number.isFinite(u)||u<o)throw new Error(`${e} expects a number greater than or equal to ${o}`);return u}function G(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function se(t,e){let n=Z(t).toLowerCase();return e==="recording"?n===".mp4"||n===".m4v"?"video/mp4":"video/webm":n===".jpg"||n===".jpeg"?"image/jpeg":n===".webp"?"image/webp":"image/png"}function V(t,e){if(Array.isArray(t))return t.map(o=>V(o,e));if(!G(t))return t;let n={};for(let[o,i]of Object.entries(t))n[o]=V(i,e);if((n.type==="recording"||n.type==="screenshot"||n.kind==="screen")&&typeof n.src=="string"&&!/^(?:blob:|data:|https?:)/i.test(n.src)){let o=B(e,n.src),i=W(o);n.src=`data:${se(o,n.type==="recording"?"recording":"screenshot")};base64,${i.toString("base64")}`}return n}function ae(t){let e=B(t),n=JSON.parse(W(e,"utf8"));return{absolutePath:e,timeline:V(n,q(e))}}async function de(t){await v(t,"SootSim.bridges.settings.set","threeMode",!0),await J(t)}async function le(t,e,n){let o=j(e,{port:n.port,commandTimeoutMs:ee,stripBooleanFlags:["--overwrite"],stripValueFlags:["--output","--fps","--width","--height","--from","--to","--count","--at"]}),i=A(o);try{if(await de(i),t==="seek"){let r=o.positional[1],l=r===void 0?Number.NaN:Number.parseFloat(r);if(!Number.isFinite(l))throw new Error("three-mode seek expects time in ms");let f=await v(i,"SootSim.bridges.threeMode.seek",l);console.log(` three-mode: ${Math.round(f.timeMs)}ms / ${Math.round(f.durationMs)}ms (${f.shotId??"no shot"})`);return}if(t==="play"||t==="pause"){let r=await v(i,`SootSim.bridges.threeMode.${t}`),l=G(r.timeline)?r.timeline:{};console.log(` three-mode: ${t} (${Math.round(Number(l.timeMs??0))}ms)`);return}let u=o.positional[1];if(!u)throw new Error(`three-mode ${t} expects a timeline JSON path`);let T=ae(u),a=await v(i,"SootSim.bridges.threeMode.loadTimeline",T.timeline);if(t==="load"){console.log(` three-mode: loaded ${T.absolutePath} (${Math.round(a.durationMs)}ms)`);return}if(t==="measure"){let r=y(e,"--fps",30,.001),l=Math.round(y(e,"--width",1920,1)),f=Math.round(y(e,"--height",1080,1)),h=_(e,"--at"),$;if(h!==void 0){let c=h.split(",").map(w=>{let S=Number.parseFloat(w);if(!Number.isFinite(S)||S<0)throw new Error(`--at expects comma-separated times in ms, got "${w}"`);return Math.min(S,a.durationMs)}),M=[];for(let w of c){let S=await v(i,"SootSim.bridges.threeMode.measure",{fps:r,width:l,height:f,from:w,count:1});M.push({...S.frames[0],index:M.length})}$={fps:r,from:c[0],to:c[c.length-1],width:l,height:f,frames:M}}else{let c=y(e,"--from",0,0),M=_(e,"--count"),w={fps:r,width:l,height:f,from:c};if(M===void 0){let S=y(e,"--to",a.durationMs,0);if(S<=c||S>a.durationMs)throw new Error(`--to must be greater than --from and at most ${a.durationMs}`);w.to=S}else w.count=Math.round(y(e,"--count",1,1));$=await v(i,"SootSim.bridges.threeMode.measure",w)}let b=`${JSON.stringify($,null,2)}
|
|
104
104
|
`,I=_(e,"--output");if(I){let c=B(I);L(q(c),{recursive:!0}),D(c,b),process.stderr.write(` three-mode: measured ${$.frames.length} frames \u2192 ${c}
|
|
105
|
-
`)}else process.stdout.write(b);return}let
|
|
105
|
+
`)}else process.stdout.write(b);return}let m=_(e,"--output");if(!m)throw new Error("three-mode render requires --output <dir>");let g=B(m),R=y(e,"--fps",30,.001),E=Math.round(y(e,"--width",1920,1)),k=Math.round(y(e,"--height",1080,1)),F=y(e,"--from",0,0),x=y(e,"--to",a.durationMs,0);if(x<=F||x>a.durationMs)throw new Error(`--to must be greater than --from and at most ${a.durationMs}`);let N=1e3/R,s=Math.ceil((x-F)/N);L(g,{recursive:!0});let p=Q(g).filter(r=>/^frame-\d{5}\.png$/.test(r)||r==="timeline-render.json");if(p.length>0&&!e.includes("--overwrite"))throw new Error(`${g} already has timeline frames; pass --overwrite to replace them`);for(let r of p)X(B(g,r));let d=[],O=4;for(let r=0;r<s;r+=O){let l=Math.min(O,s-r),f=F+r*N,h=Math.min(x,f+l*N),$=await v(i,"SootSim.bridges.threeMode.renderFrames",{fps:R,from:f,to:h,width:E,height:k,count:l});if($.frames.length!==l)throw new Error(`3d renderer returned ${$.frames.length} frames for a ${l}-frame batch`);for(let b of $.frames){let I=r+b.index,c=`frame-${String(I).padStart(5,"0")}.png`,M=b.dataUrl.indexOf(",");if(M<0||!b.dataUrl.slice(0,M).includes("image/png;base64"))throw new Error(`3d renderer returned a non-PNG frame at ${b.timeMs}ms`);let w=Buffer.from(b.dataUrl.slice(M+1),"base64");D(B(g,c),w),d.push({file:c,timeMs:b.timeMs,sha256:Y("sha256").update(w).digest("hex"),alpha:b.alpha,phoneCollision:b.phoneCollision})}process.stderr.write(`\r three-mode: rendered ${Math.min(r+l,s)}/${s}`)}process.stderr.write(`
|
|
106
106
|
`);let C={version:2,timeline:T.absolutePath,fps:R,from:F,to:x,width:E,height:k,frameCount:s,transparent:d.every(r=>r.alpha.transparentPixels>0),frames:d};D(B(g,"timeline-render.json"),`${JSON.stringify(C,null,2)}
|
|
107
|
-
`),console.log(` three-mode: wrote ${s} deterministic RGBA frames to ${g}`)}finally{i.close()}}function
|
|
107
|
+
`),console.log(` three-mode: wrote ${s} deterministic RGBA frames to ${g}`)}finally{i.close()}}function ue(t){let e=s=>t.find((p,d)=>t[d-1]===s),n={},o=e("--device");if(o){if(o!=="iphone-17-air"&&o!=="iphone-17-pro"&&o!=="pixel-10")throw new Error(`--device expects iphone-17-air, iphone-17-pro, or pixel-10, got "${o}"`);n.device=o}let i=e("--colorway");i&&(n.colorway=i);let u=e("--background");u&&(n.background=u);let T=e("--gradient");if(T){let s=T.split(",").map(C=>C.trim()).filter(Boolean),p=s.map((C,r)=>{let[l,f]=C.split("@"),h=f!==void 0?Number.parseFloat(f):s.length>1?r/(s.length-1):0;return h>1&&(h=h/100),Number.isFinite(h)||(h=s.length>1?r/(s.length-1):0),{color:l.trim(),offset:h}}),d=e("--gradient-angle"),O=d===void 0?void 0:Number.parseFloat(d);if(d!==void 0&&!Number.isFinite(O))throw new Error(`--gradient-angle expects a number, got "${d}"`);n.customGradient={stops:p,...O!==void 0?{angleDeg:O}:{}}}let a=e("--setting");if(a){if(a!=="none"&&a!=="room"&&a!=="white-backdrop")throw new Error(`--setting expects none, room, or white-backdrop, got "${a}"`);n.setting=a}let m={},g=P(e("--focus"),"--focus");g!==void 0&&(m.enabled=g);for(let[s,p]of[["--focus-amount","amount"],["--focus-range","range"]]){let d=e(s);d&&(m[p]=d)}Object.keys(m).length>0&&(n.focus=m),t.includes("--reset-pose")&&(n.resetPose=!0);let R=P(e("--environment"),"--environment"),E={},k={};for(let[s,p]of[["--env-shape","shape"],["--env-spread","spread"],["--env-size","size"],["--env-color","color"]]){let d=e(s);d&&(E[p]=d)}let F=P(e("--env-glow"),"--env-glow");F!==void 0&&(k.glow=F);let x=P(e("--env-plastic"),"--env-plastic");x!==void 0&&(k.plastic=x),(R!==void 0||Object.keys(E).length>0||Object.keys(k).length>0)&&(n.environment=R===!1?!1:{pins:E,effects:k});let N=e("--script");if(N){let s=e("--progress"),p=s===void 0?1:Number.parseFloat(s);if(!Number.isFinite(p))throw new Error(`--progress expects a number from 0 to 1, got "${s}"`);n.script={id:N,progress:p,animate:t.includes("--animate"),slow:t.includes("--slow")}}return n}function P(t,e){if(t===void 0)return;let n=t.toLowerCase();if(["on","true","yes","1"].includes(n))return!0;if(["off","false","no","0"].includes(n))return!1;throw new Error(`${e} expects on or off, got "${t}"`)}function me(t){return[`ready=${!!t.ready}`,`background=${String(t.background??"unknown")}`,`colorway=${String(t.colorway??"unknown")}`,`environment=${t.environmentActive?"on":"off"}`,`setting=${String(t.setting??"none")}`,`focus=${t.focus&&typeof t.focus=="object"&&t.focus.enabled?"on":"off"}`].join(", ")}export{U as a,ye as b,J as c,ue as d};
|