rnxsim 0.1.365 → 0.1.366
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/cli/bridge-flow-runner.ts +2 -2
- package/cli/commands/control.ts +3 -44
- package/cli/commands/detox.ts +18 -1
- package/cli/commands/flow.ts +2 -1
- package/detox/index.ts +3 -1
- package/dist-cli/bin.js +5 -5
- package/dist-cli/chunks/{agent-BVMNQFKF.js → agent-SO6IOPRK.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-B6YFXGC3.js → agent-wrapper-PMYCB2KO.js} +2 -2
- package/dist-cli/chunks/{app-fonts-MEI6R6XR.js → app-fonts-LULQGFY7.js} +2 -2
- package/dist-cli/chunks/{assert-JGHI53HV.js → assert-WGNCD4ZU.js} +2 -2
- package/dist-cli/chunks/{auth-STEOXUS7.js → auth-G7CCHH3M.js} +2 -2
- package/dist-cli/chunks/{beta-HT3FLS5T.js → beta-N4LXL5TO.js} +2 -2
- package/dist-cli/chunks/{camera-ZCLFSLON.js → camera-4JHCYBQS.js} +2 -2
- package/dist-cli/chunks/{chunk-5AS7S6HY.js → chunk-2S7BKUP2.js} +2 -2
- package/dist-cli/chunks/{chunk-RI3NS77J.js → chunk-2UXU53MG.js} +1 -1
- package/dist-cli/chunks/{chunk-XPOTXF5Q.js → chunk-34IQM22N.js} +2 -2
- package/dist-cli/chunks/{chunk-52ES4API.js → chunk-3X6IBUBX.js} +2 -2
- package/dist-cli/chunks/{chunk-TULWPOAY.js → chunk-5DAIA77C.js} +2 -2
- package/dist-cli/chunks/{chunk-FIXRGPUT.js → chunk-5NMCF5VF.js} +1 -1
- package/dist-cli/chunks/{chunk-QIQL7Y5V.js → chunk-5OK3LCEJ.js} +2 -2
- package/dist-cli/chunks/{chunk-NEH4T67X.js → chunk-6PL2CCGP.js} +2 -2
- package/dist-cli/chunks/{chunk-MRNW4GVL.js → chunk-77ZHQJZR.js} +2 -2
- package/dist-cli/chunks/chunk-7B37IZBN.js +15 -0
- package/dist-cli/chunks/{chunk-CYIE65QN.js → chunk-A5FXX5PJ.js} +1 -1
- package/dist-cli/chunks/{chunk-JRPU5TFI.js → chunk-AFV32WZT.js} +3 -3
- package/dist-cli/chunks/{chunk-M5KJCLUW.js → chunk-CN6XYYEA.js} +12 -12
- package/dist-cli/chunks/{chunk-J66US2OZ.js → chunk-CTG7HBCA.js} +1 -1
- package/dist-cli/chunks/{chunk-ZGD7GZRI.js → chunk-DMPF2D24.js} +2 -2
- package/dist-cli/chunks/{chunk-622E4JET.js → chunk-DW37EVX5.js} +1 -1
- package/dist-cli/chunks/{chunk-XKRUNS7A.js → chunk-DWFIH7CB.js} +2 -2
- package/dist-cli/chunks/{chunk-WGNDJARS.js → chunk-EFR5DVNP.js} +1 -1
- package/dist-cli/chunks/{chunk-6BAF6GFS.js → chunk-EGAGZHO6.js} +1 -1
- package/dist-cli/chunks/{chunk-MACI34ST.js → chunk-EQK5MJCU.js} +2 -2
- package/dist-cli/chunks/{chunk-JAFF4RAU.js → chunk-GAJQSITE.js} +1 -1
- package/dist-cli/chunks/{chunk-ZGH5U4AJ.js → chunk-GUI3PDH2.js} +2 -2
- package/dist-cli/chunks/{chunk-DBJZUCFP.js → chunk-GXAB52K7.js} +2 -2
- package/dist-cli/chunks/{chunk-O6P4N2JD.js → chunk-H23KWIKA.js} +2 -2
- package/dist-cli/chunks/{chunk-2CXHDTQ5.js → chunk-HT6GFZOZ.js} +1 -1
- package/dist-cli/chunks/{chunk-BGRGP3QR.js → chunk-I6KIM6PN.js} +1 -1
- package/dist-cli/chunks/{chunk-XRO5WQXP.js → chunk-IZKHOM37.js} +1 -1
- package/dist-cli/chunks/{chunk-EVBQDQVY.js → chunk-JHXETDVC.js} +1 -1
- package/dist-cli/chunks/{chunk-2JFZ5Z7Q.js → chunk-KLF3K6ZZ.js} +1 -1
- package/dist-cli/chunks/{chunk-EFXNSJ55.js → chunk-LN3RNW6X.js} +2 -2
- package/dist-cli/chunks/{chunk-TKCGP3DD.js → chunk-M3BNCF7E.js} +2 -2
- package/dist-cli/chunks/{chunk-YE3M3YD4.js → chunk-M5QCGLXR.js} +3 -3
- package/dist-cli/chunks/{chunk-4WFN4DFR.js → chunk-M6SKQGAN.js} +2 -2
- package/dist-cli/chunks/{chunk-R4FQZXJC.js → chunk-MGDSJZ37.js} +2 -2
- package/dist-cli/chunks/{chunk-2SFMW5K6.js → chunk-N3UC7HIX.js} +1 -1
- package/dist-cli/chunks/{chunk-OSZ5HZSI.js → chunk-NAYLPOC5.js} +2 -2
- package/dist-cli/chunks/{chunk-XR4KID25.js → chunk-NM2L2QV4.js} +2 -2
- package/dist-cli/chunks/{chunk-67ATAITF.js → chunk-NQFJOCSF.js} +2 -2
- package/dist-cli/chunks/{chunk-HIDS3PYC.js → chunk-ONORMKWX.js} +2 -2
- package/dist-cli/chunks/{chunk-XXNPISER.js → chunk-ORWP2E7R.js} +2 -2
- package/dist-cli/chunks/{chunk-GK7PGYFH.js → chunk-OW5XHAA4.js} +1 -1
- package/dist-cli/chunks/{chunk-GZEUDDAW.js → chunk-RYIMSKDO.js} +2 -2
- package/dist-cli/chunks/{chunk-X5ZOZVHC.js → chunk-SA6XVI55.js} +1 -1
- package/dist-cli/chunks/{chunk-ZTWUNK45.js → chunk-TIAEYO6I.js} +2 -2
- package/dist-cli/chunks/{chunk-5VHWQGGF.js → chunk-TTASWLKM.js} +1 -1
- package/dist-cli/chunks/{chunk-O2ORLK6W.js → chunk-UCHW7ZHR.js} +2 -2
- package/dist-cli/chunks/{chunk-EFL2ASZO.js → chunk-VIND4SP3.js} +1 -1
- package/dist-cli/chunks/{chunk-UR345KM3.js → chunk-XJU2QIRY.js} +2 -2
- package/dist-cli/chunks/{chunk-W3UIDI3W.js → chunk-XXNLYR64.js} +3 -3
- package/dist-cli/chunks/{chunk-25BTVHK2.js → chunk-YCCCPFWT.js} +2 -2
- package/dist-cli/chunks/chunk-YGMEDJKJ.js +4 -0
- package/dist-cli/chunks/{chunk-FHWZPUGC.js → chunk-YXXKSL6R.js} +1 -1
- package/dist-cli/chunks/{chunk-ZCP4CRP6.js → chunk-ZFM24DOX.js} +2 -2
- package/dist-cli/chunks/{chunk-EAFKG5R3.js → chunk-ZJIS3CTW.js} +2 -2
- package/dist-cli/chunks/{chunk-DQFOHIRF.js → chunk-ZLVRYXZ7.js} +1 -1
- package/dist-cli/chunks/{chunk-MR3YPNUI.js → chunk-ZMJ75EDG.js} +2 -2
- package/dist-cli/chunks/{cleanup-G4TEYVKY.js → cleanup-KRIATKFH.js} +2 -2
- package/dist-cli/chunks/cli-version-SYGNHGFR.js +4 -0
- package/dist-cli/chunks/{compat-EZ5NP32J.js → compat-6PTQ3QEA.js} +2 -2
- package/dist-cli/chunks/{config-27M2DGCS.js → config-ETGDUANO.js} +2 -2
- package/dist-cli/chunks/control-RBTNOLQM.js +4 -0
- package/dist-cli/chunks/daemon-N3SC5DK6.js +4 -0
- package/dist-cli/chunks/{debug-EXU3D7PC.js → debug-WIIB6ZKC.js} +3 -3
- package/dist-cli/chunks/{desktop-SHHPZAWQ.js → desktop-TD7Q5LNB.js} +3 -3
- package/dist-cli/chunks/detox-7GNR33VM.js +52 -0
- package/dist-cli/chunks/{device-4NI26HG6.js → device-QOR3PGUF.js} +2 -2
- package/dist-cli/chunks/{diagnose-P4SFXH6J.js → diagnose-RRCBLP6E.js} +2 -2
- package/dist-cli/chunks/{disk-cleanup-BUAKWYMY.js → disk-cleanup-MJUGJPXT.js} +2 -2
- package/dist-cli/chunks/drivers-W6E3BZH4.js +4 -0
- package/dist-cli/chunks/{film-Y2BAQINB.js → film-D7Y64LID.js} +3 -3
- package/dist-cli/chunks/flow-7QAE2V5Y.js +4 -0
- package/dist-cli/chunks/help-NLD6KWVG.js +4 -0
- package/dist-cli/chunks/{hidden-runtime-alias-U2MAY2XV.js → hidden-runtime-alias-JGURVR2Z.js} +2 -2
- package/dist-cli/chunks/{home-paths-PAJMZCOS.js → home-paths-4ICFIGXO.js} +2 -2
- package/dist-cli/chunks/inspect-C347BG52.js +4 -0
- package/dist-cli/chunks/install-desktop-YR6TWZYK.js +4 -0
- package/dist-cli/chunks/{login-D53XKBEO.js → login-RU33QR2G.js} +2 -2
- package/dist-cli/chunks/{logout-HZQKLNUJ.js → logout-2IUG3Y5J.js} +2 -2
- package/dist-cli/chunks/{maestro-XSS2KX6L.js → maestro-2MXTGG7I.js} +3 -3
- package/dist-cli/chunks/{maestro-generate-DNDQX3JQ.js → maestro-generate-2PYIFGLR.js} +3 -3
- package/dist-cli/chunks/{mode-LEVGOKI3.js → mode-3DAPG3HF.js} +2 -2
- package/dist-cli/chunks/{optional-demo-registry-2XZIJNDG.js → optional-demo-registry-BWSDJF2Z.js} +2 -2
- package/dist-cli/chunks/{perf-OKMAXDLB.js → perf-2TKPWB4N.js} +2 -2
- package/dist-cli/chunks/{permissions-VG5TBUTN.js → permissions-5CSMHYNA.js} +2 -2
- package/dist-cli/chunks/privacy-PWWC2BXO.js +4 -0
- package/dist-cli/chunks/{record-BQYGZOMV.js → record-I2HJCFP3.js} +3 -3
- package/dist-cli/chunks/{report-issue-HCPZESWE.js → report-issue-A4FZWBOC.js} +2 -2
- package/dist-cli/chunks/reset-Y3PBPFYA.js +4 -0
- package/dist-cli/chunks/runtime-IC6NVVGA.js +4 -0
- package/dist-cli/chunks/{screenshot-command-DWEYPJE7.js → screenshot-command-UFW5BFHP.js} +3 -3
- package/dist-cli/chunks/{screenshot-layers-5GMBXLO7.js → screenshot-layers-5BIAL4YN.js} +2 -2
- package/dist-cli/chunks/{screenshots-capture-5KCI7IZD.js → screenshots-capture-EHYS3BV2.js} +2 -2
- package/dist-cli/chunks/{serve-QNKTA2HR.js → serve-O4FDM3AC.js} +2 -2
- package/dist-cli/chunks/setup-Y4QGSJBM.js +4 -0
- package/dist-cli/chunks/{skills-DOEALD3X.js → skills-ZK55SY32.js} +2 -2
- package/dist-cli/chunks/{state-3HH2IHIF.js → state-KFLAZNEY.js} +2 -2
- package/dist-cli/chunks/{storage-E7WUWN3E.js → storage-WP33ISEM.js} +2 -2
- package/dist-cli/chunks/store-VEE22CAY.js +4 -0
- package/dist-cli/chunks/telemetry-PZV4BISJ.js +4 -0
- package/dist-cli/chunks/{timeline-IKNUGQ2A.js → timeline-DKGW5S4I.js} +2 -2
- package/dist-cli/chunks/{upgrade-VS3OKXE2.js → upgrade-LL7G4B7G.js} +2 -2
- package/dist-cli/chunks/upload-Y4C3YZDK.js +4 -0
- package/dist-cli/chunks/{version-F4XHNTBZ.js → version-YLWR5G4F.js} +2 -2
- package/dist-cli/chunks/{web-F72724QL.js → web-QELZ4CP6.js} +2 -2
- package/dist-cli/chunks/welcome-ZPKA5PZJ.js +5 -0
- package/dist-cli/chunks/{what-happened-APK7YKOV.js → what-happened-MIOMZWM5.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- 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 +4 -2
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- 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/replacement-module-handler.cjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +31 -1
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/mcp.cjs +673 -0
- package/dist-lib/mcp.mjs +641 -0
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +31 -1
- package/dist-lib/sdk.mjs +31 -1
- package/dist-lib/skills.cjs +67 -53
- package/dist-lib/vite.cjs +1 -1
- package/package.json +7 -1
- package/src/app-url.ts +40 -0
- package/src/mcp.ts +791 -0
- package/src/sim-client.ts +12 -6
- package/dist-cli/chunks/chunk-IWPS3EKJ.js +0 -15
- package/dist-cli/chunks/chunk-MCHKBFUL.js +0 -4
- package/dist-cli/chunks/cli-version-ZM3PVKQ5.js +0 -4
- package/dist-cli/chunks/control-4QR43FXV.js +0 -4
- package/dist-cli/chunks/daemon-2U4CJ6AT.js +0 -4
- package/dist-cli/chunks/detox-RQ6FFSBS.js +0 -52
- package/dist-cli/chunks/drivers-OVCUPQTM.js +0 -4
- package/dist-cli/chunks/flow-ELTLKKZ3.js +0 -4
- package/dist-cli/chunks/help-CDEZAG2L.js +0 -4
- package/dist-cli/chunks/inspect-VVQRPJLS.js +0 -4
- package/dist-cli/chunks/install-desktop-YXSRKR35.js +0 -4
- package/dist-cli/chunks/privacy-MNRHREME.js +0 -4
- package/dist-cli/chunks/reset-R4E4W4YI.js +0 -4
- package/dist-cli/chunks/runtime-XRQZ7W34.js +0 -4
- package/dist-cli/chunks/setup-RNMM5GO5.js +0 -4
- package/dist-cli/chunks/store-HUPZUCFG.js +0 -4
- package/dist-cli/chunks/telemetry-IJ53XR2Y.js +0 -4
- package/dist-cli/chunks/upload-A57NAAHF.js +0 -4
- package/dist-cli/chunks/welcome-B72RRMBW.js +0 -5
package/dist-lib/render-mode.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/sdk.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -2315,6 +2315,32 @@ async function resolveTargetCoords(bridge, target) {
|
|
|
2315
2315
|
return result ?? null;
|
|
2316
2316
|
}
|
|
2317
2317
|
|
|
2318
|
+
// src/app-url.ts
|
|
2319
|
+
var APP_URL_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
2320
|
+
function normalizeAppUrlTarget(target) {
|
|
2321
|
+
const trimmed = target.trim();
|
|
2322
|
+
if (!trimmed) {
|
|
2323
|
+
throw new Error("expected <url-or-route>");
|
|
2324
|
+
}
|
|
2325
|
+
if (APP_URL_SCHEME_RE.test(trimmed) || trimmed.startsWith("/")) {
|
|
2326
|
+
return trimmed;
|
|
2327
|
+
}
|
|
2328
|
+
return `/${trimmed}`;
|
|
2329
|
+
}
|
|
2330
|
+
async function openAppUrl(bridge, target) {
|
|
2331
|
+
const normalized = normalizeAppUrlTarget(target);
|
|
2332
|
+
const result = await bridge.send({
|
|
2333
|
+
type: "call",
|
|
2334
|
+
path: "SootSim.bridges.test.openDeepLink",
|
|
2335
|
+
args: [normalized]
|
|
2336
|
+
});
|
|
2337
|
+
if (result !== null && typeof result === "object" && Reflect.get(result, "ok") === false) {
|
|
2338
|
+
const error = Reflect.get(result, "error");
|
|
2339
|
+
throw new Error(typeof error === "string" ? error : "deep-link dispatch failed");
|
|
2340
|
+
}
|
|
2341
|
+
return normalized;
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2318
2344
|
// src/sim-client.ts
|
|
2319
2345
|
var SimClientError = class extends Error {
|
|
2320
2346
|
constructor(message) {
|
|
@@ -2475,6 +2501,10 @@ var SimClient = class {
|
|
|
2475
2501
|
`timed out waiting for sim ${this.simId} to load ${nextUrl}`
|
|
2476
2502
|
);
|
|
2477
2503
|
}
|
|
2504
|
+
/** dispatch a route or app URL through React Native Linking in this guest. */
|
|
2505
|
+
openUrl(target) {
|
|
2506
|
+
return openAppUrl(this, target);
|
|
2507
|
+
}
|
|
2478
2508
|
/**
|
|
2479
2509
|
* block until the guest app has mounted and painted real content.
|
|
2480
2510
|
* throws SimReadyTimeoutError (with the last probe status) on timeout.
|
package/dist-lib/sdk.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -2217,6 +2217,32 @@ async function resolveTargetCoords(bridge, target) {
|
|
|
2217
2217
|
return result ?? null;
|
|
2218
2218
|
}
|
|
2219
2219
|
|
|
2220
|
+
// src/app-url.ts
|
|
2221
|
+
var APP_URL_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
2222
|
+
function normalizeAppUrlTarget(target) {
|
|
2223
|
+
const trimmed = target.trim();
|
|
2224
|
+
if (!trimmed) {
|
|
2225
|
+
throw new Error("expected <url-or-route>");
|
|
2226
|
+
}
|
|
2227
|
+
if (APP_URL_SCHEME_RE.test(trimmed) || trimmed.startsWith("/")) {
|
|
2228
|
+
return trimmed;
|
|
2229
|
+
}
|
|
2230
|
+
return `/${trimmed}`;
|
|
2231
|
+
}
|
|
2232
|
+
async function openAppUrl(bridge, target) {
|
|
2233
|
+
const normalized = normalizeAppUrlTarget(target);
|
|
2234
|
+
const result = await bridge.send({
|
|
2235
|
+
type: "call",
|
|
2236
|
+
path: "SootSim.bridges.test.openDeepLink",
|
|
2237
|
+
args: [normalized]
|
|
2238
|
+
});
|
|
2239
|
+
if (result !== null && typeof result === "object" && Reflect.get(result, "ok") === false) {
|
|
2240
|
+
const error = Reflect.get(result, "error");
|
|
2241
|
+
throw new Error(typeof error === "string" ? error : "deep-link dispatch failed");
|
|
2242
|
+
}
|
|
2243
|
+
return normalized;
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2220
2246
|
// src/sim-client.ts
|
|
2221
2247
|
var SimClientError = class extends Error {
|
|
2222
2248
|
constructor(message) {
|
|
@@ -2377,6 +2403,10 @@ var SimClient = class {
|
|
|
2377
2403
|
`timed out waiting for sim ${this.simId} to load ${nextUrl}`
|
|
2378
2404
|
);
|
|
2379
2405
|
}
|
|
2406
|
+
/** dispatch a route or app URL through React Native Linking in this guest. */
|
|
2407
|
+
openUrl(target) {
|
|
2408
|
+
return openAppUrl(this, target);
|
|
2409
|
+
}
|
|
2380
2410
|
/**
|
|
2381
2411
|
* block until the guest app has mounted and painted real content.
|
|
2382
2412
|
* throws SimReadyTimeoutError (with the last probe status) on timeout.
|
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1180,6 +1180,16 @@ var init_react_native_root_export_coverage = __esm({
|
|
|
1180
1180
|
}
|
|
1181
1181
|
});
|
|
1182
1182
|
|
|
1183
|
+
// ../compat/src/generated/react-native-webview-coverage.ts
|
|
1184
|
+
var REACT_NATIVE_WEBVIEW_WILL_IT_WORK_COVERAGE, REACT_NATIVE_WEBVIEW_STRICT_COVERAGE;
|
|
1185
|
+
var init_react_native_webview_coverage = __esm({
|
|
1186
|
+
"../compat/src/generated/react-native-webview-coverage.ts"() {
|
|
1187
|
+
"use strict";
|
|
1188
|
+
REACT_NATIVE_WEBVIEW_WILL_IT_WORK_COVERAGE = 0.74;
|
|
1189
|
+
REACT_NATIVE_WEBVIEW_STRICT_COVERAGE = 0.223;
|
|
1190
|
+
}
|
|
1191
|
+
});
|
|
1192
|
+
|
|
1183
1193
|
// ../compat/src/unsupported-packages.ts
|
|
1184
1194
|
function getUnsupportedNativePackage(name2) {
|
|
1185
1195
|
const entry = UNSUPPORTED_NATIVE_PACKAGES[name2];
|
|
@@ -1220,6 +1230,7 @@ var init_registry = __esm({
|
|
|
1220
1230
|
"use strict";
|
|
1221
1231
|
init_capability_inventory_coverage();
|
|
1222
1232
|
init_react_native_root_export_coverage();
|
|
1233
|
+
init_react_native_webview_coverage();
|
|
1223
1234
|
init_unsupported_packages();
|
|
1224
1235
|
COMPAT_CATEGORIES = [
|
|
1225
1236
|
"All",
|
|
@@ -1371,10 +1382,11 @@ var init_registry = __esm({
|
|
|
1371
1382
|
versions: [
|
|
1372
1383
|
{
|
|
1373
1384
|
range: ">=11.0.0",
|
|
1374
|
-
coverage:
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1385
|
+
coverage: REACT_NATIVE_WEBVIEW_WILL_IT_WORK_COVERAGE,
|
|
1386
|
+
strictCoverage: REACT_NATIVE_WEBVIEW_STRICT_COVERAGE,
|
|
1387
|
+
note: "native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface. coverage is generated from app-source use in six pinned applications; equal-surface strict coverage includes the shared, iOS, and Android public prop and ref surface. paired native and SootSim runtime conformance covers local HTML, base URL, URI loading, load and navigation callbacks, both injection phases, two-way messaging, imperative URI reload and injection, content scrolling, parent translation, and onOpenWindow target delivery.",
|
|
1388
|
+
working: "source.uri/source.html/source.baseUrl, Chromium cross-origin URI loading under the shell COEP, same-origin URI cookies, source.html persistent localStorage, document-start ReactNativeWebView bootstrap and injectedJavaScriptBeforeContentLoaded/injectedJavaScript on source.html, strict ReactNativeWebView.postMessage bridge envelope in both directions, onMessage synthetic event with navigation fields, onOpenWindow target delivery for source.html, successful onLoad/Start/End and onNavigationStateChange, ref.reload on URI pages, ref.injectJavaScript/postMessage, internal content scrolling, renderLoading, javaScriptEnabled sandbox, layout, inherited clipping and visibility, parked/live presentation",
|
|
1389
|
+
missing: "Safari/WebKit cross-origin URI pages without COEP-compatible response headers remain permanently loading because WebKit ignores iframe credentialless; Chromium credentialless cross-origin URI frames send no credentials, including cookies set by their own origin, and use ephemeral storage; iframe pixels in canvas screenshots; script injection, ReactNativeWebView bootstrap, and onOpenWindow for remote pages, which get no bridge at all because a browser cannot script a cross-origin frame; cross-origin ref.goBack/goForward/stopLoading and truthful canGoBack/canGoForward values; failed HTTP/refused navigation callbacks (onError/onHttpError and renderError); onShouldStartLoadWithRequest, allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, originWhitelist enforcement"
|
|
1378
1390
|
}
|
|
1379
1391
|
]
|
|
1380
1392
|
},
|
|
@@ -21171,6 +21183,45 @@ var init_ws_bridge = __esm({
|
|
|
21171
21183
|
}
|
|
21172
21184
|
});
|
|
21173
21185
|
|
|
21186
|
+
// src/app-url.ts
|
|
21187
|
+
function normalizeAppUrlTarget(target) {
|
|
21188
|
+
const trimmed = target.trim();
|
|
21189
|
+
if (!trimmed) {
|
|
21190
|
+
throw new Error("expected <url-or-route>");
|
|
21191
|
+
}
|
|
21192
|
+
if (APP_URL_SCHEME_RE.test(trimmed) || trimmed.startsWith("/")) {
|
|
21193
|
+
return trimmed;
|
|
21194
|
+
}
|
|
21195
|
+
return `/${trimmed}`;
|
|
21196
|
+
}
|
|
21197
|
+
function isAppDeepLinkTarget(target) {
|
|
21198
|
+
const trimmed = target.trim();
|
|
21199
|
+
if (!trimmed) return false;
|
|
21200
|
+
if (trimmed.startsWith("/")) return true;
|
|
21201
|
+
if (!APP_URL_SCHEME_RE.test(trimmed)) return false;
|
|
21202
|
+
return !/^https?:\/\//i.test(trimmed);
|
|
21203
|
+
}
|
|
21204
|
+
async function openAppUrl(bridge, target) {
|
|
21205
|
+
const normalized = normalizeAppUrlTarget(target);
|
|
21206
|
+
const result = await bridge.send({
|
|
21207
|
+
type: "call",
|
|
21208
|
+
path: "SootSim.bridges.test.openDeepLink",
|
|
21209
|
+
args: [normalized]
|
|
21210
|
+
});
|
|
21211
|
+
if (result !== null && typeof result === "object" && Reflect.get(result, "ok") === false) {
|
|
21212
|
+
const error = Reflect.get(result, "error");
|
|
21213
|
+
throw new Error(typeof error === "string" ? error : "deep-link dispatch failed");
|
|
21214
|
+
}
|
|
21215
|
+
return normalized;
|
|
21216
|
+
}
|
|
21217
|
+
var APP_URL_SCHEME_RE;
|
|
21218
|
+
var init_app_url = __esm({
|
|
21219
|
+
"src/app-url.ts"() {
|
|
21220
|
+
"use strict";
|
|
21221
|
+
APP_URL_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
21222
|
+
}
|
|
21223
|
+
});
|
|
21224
|
+
|
|
21174
21225
|
// src/dev-bundle-resolution.ts
|
|
21175
21226
|
function buildUnresolvedTargetError(targetLabel) {
|
|
21176
21227
|
return new Error(
|
|
@@ -24002,7 +24053,6 @@ __export(control_exports, {
|
|
|
24002
24053
|
buildShellUrl: () => buildShellUrl,
|
|
24003
24054
|
closeSimsBulk: () => closeSimsBulk,
|
|
24004
24055
|
ensureBridgeForOpen: () => ensureBridgeForOpen,
|
|
24005
|
-
normalizeDeepLinkTarget: () => normalizeDeepLinkTarget,
|
|
24006
24056
|
planBulkCloseTargets: () => planBulkCloseTargets,
|
|
24007
24057
|
playwrightHostPidForSim: () => playwrightHostPidForSim,
|
|
24008
24058
|
printConnectedSims: () => printConnectedSims,
|
|
@@ -24063,26 +24113,6 @@ function resolveDriverHeadless(args, driverId) {
|
|
|
24063
24113
|
function normalizeKnownTarget(target) {
|
|
24064
24114
|
return target.trim();
|
|
24065
24115
|
}
|
|
24066
|
-
function normalizeDeepLinkTarget(target) {
|
|
24067
|
-
const trimmed = target.trim();
|
|
24068
|
-
if (!trimmed) {
|
|
24069
|
-
throw new Error("expected <url-or-route>");
|
|
24070
|
-
}
|
|
24071
|
-
if (DEEP_LINK_SCHEME_RE.test(trimmed) || trimmed.startsWith("/")) {
|
|
24072
|
-
return trimmed;
|
|
24073
|
-
}
|
|
24074
|
-
return `/${trimmed}`;
|
|
24075
|
-
}
|
|
24076
|
-
function isObjectRecord(value) {
|
|
24077
|
-
return value !== null && typeof value === "object";
|
|
24078
|
-
}
|
|
24079
|
-
function shouldOpenAsDeepLink(target) {
|
|
24080
|
-
const trimmed = target.trim();
|
|
24081
|
-
if (!trimmed) return false;
|
|
24082
|
-
if (trimmed.startsWith("/")) return true;
|
|
24083
|
-
if (!DEEP_LINK_SCHEME_RE.test(trimmed)) return false;
|
|
24084
|
-
return !/^https?:\/\//i.test(trimmed);
|
|
24085
|
-
}
|
|
24086
24116
|
async function ensureBridgeForOpen(preferredPort, explicitPort = false) {
|
|
24087
24117
|
const lock = readDaemonLockfile();
|
|
24088
24118
|
assertExplicitBridgeLock(preferredPort, explicitPort, lock);
|
|
@@ -24932,26 +24962,10 @@ async function runLinkCommand(args, opts = {}) {
|
|
|
24932
24962
|
console.error(" examples: rnx open /settings | rnx open myapp://settings");
|
|
24933
24963
|
process.exit(1);
|
|
24934
24964
|
}
|
|
24935
|
-
let target;
|
|
24936
|
-
try {
|
|
24937
|
-
target = normalizeDeepLinkTarget(parsed.positional[0] ?? "");
|
|
24938
|
-
} catch (err) {
|
|
24939
|
-
console.error(` rnx open: ${err instanceof Error ? err.message : String(err)}`);
|
|
24940
|
-
process.exit(1);
|
|
24941
|
-
}
|
|
24942
24965
|
const bridge = createBridgeFromParsed(parsed);
|
|
24943
24966
|
const simHint = parsed.simId ? ` --sim ${parsed.simId}` : "";
|
|
24944
24967
|
try {
|
|
24945
|
-
const
|
|
24946
|
-
type: "call",
|
|
24947
|
-
path: "SootSim.bridges.test.openDeepLink",
|
|
24948
|
-
args: [target]
|
|
24949
|
-
});
|
|
24950
|
-
if (isObjectRecord(result) && result.ok === false) {
|
|
24951
|
-
throw new Error(
|
|
24952
|
-
typeof result.error === "string" ? result.error : "deep-link dispatch failed"
|
|
24953
|
-
);
|
|
24954
|
-
}
|
|
24968
|
+
const target = await openAppUrl(bridge, parsed.positional[0] ?? "");
|
|
24955
24969
|
console.log(` opened deep link: ${target}`);
|
|
24956
24970
|
} catch (err) {
|
|
24957
24971
|
console.error(` link failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -25014,7 +25028,7 @@ async function runOpenCommand(args, opts = {}) {
|
|
|
25014
25028
|
process.exit(1);
|
|
25015
25029
|
}
|
|
25016
25030
|
const target = parsed.positional[0] || "";
|
|
25017
|
-
if (
|
|
25031
|
+
if (isAppDeepLinkTarget(target)) {
|
|
25018
25032
|
if (openInNewSim) {
|
|
25019
25033
|
console.error(
|
|
25020
25034
|
" rnx open: deep links target the current app; remove --new, --profile, or --ephemeral"
|
|
@@ -25551,7 +25565,7 @@ async function runCloseCommand(args, opts = {}) {
|
|
|
25551
25565
|
bridge.close();
|
|
25552
25566
|
}
|
|
25553
25567
|
}
|
|
25554
|
-
var import_node_child_process6, import_node_fs13, import_node_os3, import_node_path16, import_settings, import_ws5, DEFAULT_DRIVER_CONNECT_TIMEOUT_MS, DRIVER_CONNECT_INTERVAL_MS, DRIVER_CONNECT_HOST_GRACE_MS, OPEN_BRIDGE_SPAWN_TIMEOUT_MS, SHELL_APPS
|
|
25568
|
+
var import_node_child_process6, import_node_fs13, import_node_os3, import_node_path16, import_settings, import_ws5, DEFAULT_DRIVER_CONNECT_TIMEOUT_MS, DRIVER_CONNECT_INTERVAL_MS, DRIVER_CONNECT_HOST_GRACE_MS, OPEN_BRIDGE_SPAWN_TIMEOUT_MS, SHELL_APPS;
|
|
25555
25569
|
var init_control = __esm({
|
|
25556
25570
|
"cli/commands/control.ts"() {
|
|
25557
25571
|
"use strict";
|
|
@@ -25562,6 +25576,7 @@ var init_control = __esm({
|
|
|
25562
25576
|
import_settings = require("sootsim-engine/settings");
|
|
25563
25577
|
import_ws5 = require("ws");
|
|
25564
25578
|
init_dev_server_scanner();
|
|
25579
|
+
init_app_url();
|
|
25565
25580
|
init_backend_origin();
|
|
25566
25581
|
init_bridge_constants();
|
|
25567
25582
|
init_config();
|
|
@@ -25598,7 +25613,6 @@ var init_control = __esm({
|
|
|
25598
25613
|
photos: "/app/photos",
|
|
25599
25614
|
camera: "/app/camera"
|
|
25600
25615
|
};
|
|
25601
|
-
DEEP_LINK_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
25602
25616
|
}
|
|
25603
25617
|
});
|
|
25604
25618
|
|
|
@@ -26702,16 +26716,16 @@ __export(bridge_flow_runner_exports, {
|
|
|
26702
26716
|
function sleep3(ms) {
|
|
26703
26717
|
return new Promise((resolve7) => setTimeout(resolve7, ms));
|
|
26704
26718
|
}
|
|
26705
|
-
function
|
|
26719
|
+
function isObjectRecord(value) {
|
|
26706
26720
|
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
26707
26721
|
}
|
|
26708
26722
|
function readStringKey(value, key) {
|
|
26709
|
-
if (!
|
|
26723
|
+
if (!isObjectRecord(value)) return null;
|
|
26710
26724
|
const raw = value[key];
|
|
26711
26725
|
return typeof raw === "string" && raw.length > 0 ? raw : null;
|
|
26712
26726
|
}
|
|
26713
26727
|
function readBooleanKey(value, key) {
|
|
26714
|
-
if (!
|
|
26728
|
+
if (!isObjectRecord(value)) return false;
|
|
26715
26729
|
return value[key] === true;
|
|
26716
26730
|
}
|
|
26717
26731
|
function readRecentShellAppId(state) {
|
|
@@ -28016,8 +28030,8 @@ var init_bridge_flow_runner = __esm({
|
|
|
28016
28030
|
await this.refreshSimId();
|
|
28017
28031
|
let hasLaunchArguments = false;
|
|
28018
28032
|
let launchArguments;
|
|
28019
|
-
if (
|
|
28020
|
-
if (!
|
|
28033
|
+
if (isObjectRecord(opts) && Object.prototype.hasOwnProperty.call(opts, "arguments")) {
|
|
28034
|
+
if (!isObjectRecord(opts.arguments)) {
|
|
28021
28035
|
throw new Error("launchApp.arguments must be a JSON object");
|
|
28022
28036
|
}
|
|
28023
28037
|
hasLaunchArguments = true;
|
|
@@ -28069,7 +28083,7 @@ var init_bridge_flow_runner = __esm({
|
|
|
28069
28083
|
await this.waitForTree(12e4);
|
|
28070
28084
|
if (this.opts.onAfterLaunch) {
|
|
28071
28085
|
try {
|
|
28072
|
-
await this.opts.onAfterLaunch();
|
|
28086
|
+
await this.opts.onAfterLaunch(this.opts.simId);
|
|
28073
28087
|
} catch (err) {
|
|
28074
28088
|
console.warn(
|
|
28075
28089
|
` warn: onAfterLaunch hook threw: ${err instanceof Error ? err.message : err}`
|
|
@@ -28102,7 +28116,7 @@ var init_bridge_flow_runner = __esm({
|
|
|
28102
28116
|
}
|
|
28103
28117
|
resolveShellLaunchAppId(opts, state) {
|
|
28104
28118
|
if (typeof opts === "string" && opts.length > 0) return opts;
|
|
28105
|
-
if (
|
|
28119
|
+
if (isObjectRecord(opts)) {
|
|
28106
28120
|
const explicit = readStringKey(opts, "appId") || readStringKey(opts, "id");
|
|
28107
28121
|
if (explicit) return explicit;
|
|
28108
28122
|
}
|
package/dist-lib/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.366 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rnxsim",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.366",
|
|
4
4
|
"description": "rnx CLI, Vite and Metro plugins, and agent skills for driving React Native apps in the browser.",
|
|
5
5
|
"author": "Tamagui LLC",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -71,6 +71,12 @@
|
|
|
71
71
|
"import": "./dist-lib/sdk.mjs",
|
|
72
72
|
"default": "./dist-lib/sdk.cjs"
|
|
73
73
|
},
|
|
74
|
+
"./mcp": {
|
|
75
|
+
"types": "./src/mcp.ts",
|
|
76
|
+
"source": "./src/mcp.ts",
|
|
77
|
+
"import": "./dist-lib/mcp.mjs",
|
|
78
|
+
"default": "./dist-lib/mcp.cjs"
|
|
79
|
+
},
|
|
74
80
|
"./beta": {
|
|
75
81
|
"source": "./src/beta.ts",
|
|
76
82
|
"import": "./dist-lib/beta.mjs",
|
package/src/app-url.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { InspectBridge } from '../cli/commands/inspect/core'
|
|
2
|
+
|
|
3
|
+
const APP_URL_SCHEME_RE = /^[A-Za-z][A-Za-z0-9+.-]*:/
|
|
4
|
+
|
|
5
|
+
export function normalizeAppUrlTarget(target: string): string {
|
|
6
|
+
const trimmed = target.trim()
|
|
7
|
+
if (!trimmed) {
|
|
8
|
+
throw new Error('expected <url-or-route>')
|
|
9
|
+
}
|
|
10
|
+
if (APP_URL_SCHEME_RE.test(trimmed) || trimmed.startsWith('/')) {
|
|
11
|
+
return trimmed
|
|
12
|
+
}
|
|
13
|
+
return `/${trimmed}`
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function isAppDeepLinkTarget(target: string): boolean {
|
|
17
|
+
const trimmed = target.trim()
|
|
18
|
+
if (!trimmed) return false
|
|
19
|
+
if (trimmed.startsWith('/')) return true
|
|
20
|
+
if (!APP_URL_SCHEME_RE.test(trimmed)) return false
|
|
21
|
+
return !/^https?:\/\//i.test(trimmed)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function openAppUrl(bridge: InspectBridge, target: string): Promise<string> {
|
|
25
|
+
const normalized = normalizeAppUrlTarget(target)
|
|
26
|
+
const result: unknown = await bridge.send({
|
|
27
|
+
type: 'call',
|
|
28
|
+
path: 'SootSim.bridges.test.openDeepLink',
|
|
29
|
+
args: [normalized],
|
|
30
|
+
})
|
|
31
|
+
if (
|
|
32
|
+
result !== null &&
|
|
33
|
+
typeof result === 'object' &&
|
|
34
|
+
Reflect.get(result, 'ok') === false
|
|
35
|
+
) {
|
|
36
|
+
const error = Reflect.get(result, 'error')
|
|
37
|
+
throw new Error(typeof error === 'string' ? error : 'deep-link dispatch failed')
|
|
38
|
+
}
|
|
39
|
+
return normalized
|
|
40
|
+
}
|