rnxsim 0.1.427 → 0.1.428

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/cli/commands/control.ts +17 -1
  2. package/cli/commands/flow.ts +5 -9
  3. package/cli/commands/inspect/core.ts +1 -0
  4. package/cli/outbound-endpoints.ts +5 -2
  5. package/cli/self-invocation.ts +24 -0
  6. package/detox/index.ts +10 -36
  7. package/dist-lib/agent-daemon-client.cjs +48 -24
  8. package/dist-lib/agent-events.cjs +1 -1
  9. package/dist-lib/agent-identity.cjs +1 -1
  10. package/dist-lib/agent-sessions.cjs +100 -76
  11. package/dist-lib/attached-projects.cjs +1 -1
  12. package/dist-lib/auth/shared-session.cjs +1 -1
  13. package/dist-lib/backend-origin.cjs +1 -1
  14. package/dist-lib/beta.cjs +1 -1
  15. package/dist-lib/beta.mjs +1 -1
  16. package/dist-lib/bridge-constants.cjs +1 -1
  17. package/dist-lib/bridge-contract-input.cjs +1 -1
  18. package/dist-lib/bridge-contract-input.mjs +1 -1
  19. package/dist-lib/bridge-contract.cjs +1 -1
  20. package/dist-lib/bridge-contract.mjs +1 -1
  21. package/dist-lib/capture-contract.cjs +1 -1
  22. package/dist-lib/capture-contract.mjs +1 -1
  23. package/dist-lib/cli-constants.cjs +1 -1
  24. package/dist-lib/cloud-contract.cjs +1 -1
  25. package/dist-lib/cloud-contract.mjs +1 -1
  26. package/dist-lib/cloud.cjs +1 -1
  27. package/dist-lib/cloud.mjs +1 -1
  28. package/dist-lib/config.cjs +1 -1
  29. package/dist-lib/detox/index.cjs +2 -25
  30. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  31. package/dist-lib/home-paths.cjs +1 -1
  32. package/dist-lib/host/bridge-host.cjs +324 -218
  33. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  34. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  35. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  36. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  37. package/dist-lib/host/websocket-proxy.cjs +162 -78
  38. package/dist-lib/index.cjs +1 -1
  39. package/dist-lib/jump-to-source-babel.cjs +1 -1
  40. package/dist-lib/menu.cjs +1 -1
  41. package/dist-lib/menu.mjs +1 -1
  42. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  43. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  44. package/dist-lib/metro-production-bundle.cjs +43 -24
  45. package/dist-lib/metro-production-bundle.mjs +43 -24
  46. package/dist-lib/metro.cjs +1 -1
  47. package/dist-lib/profiles.cjs +1 -1
  48. package/dist-lib/public-brand.cjs +1 -1
  49. package/dist-lib/react-native-host-modules.cjs +1 -1
  50. package/dist-lib/react-native-host-modules.mjs +1 -1
  51. package/dist-lib/render-mode.cjs +1 -1
  52. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  53. package/dist-lib/sdk.cjs +1 -1
  54. package/dist-lib/sdk.mjs +1 -1
  55. package/dist-lib/skills.cjs +452 -336
  56. package/dist-lib/vite.cjs +1 -1
  57. package/package.json +1 -1
  58. package/src/host/websocket-proxy.ts +197 -92
  59. package/src/metro-production-bundle.ts +55 -30
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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;
@@ -48,10 +48,15 @@ __export(agent_sessions_exports, {
48
48
  module.exports = __toCommonJS(agent_sessions_exports);
49
49
  var import_node_child_process = require("node:child_process");
50
50
  var import_node_crypto2 = require("node:crypto");
51
- var import_node_fs2 = __toESM(require("node:fs"), 1);
52
- var import_node_path3 = __toESM(require("node:path"), 1);
51
+ var import_node_fs3 = __toESM(require("node:fs"), 1);
52
+ var import_node_path4 = __toESM(require("node:path"), 1);
53
53
  var import_node_readline = __toESM(require("node:readline"), 1);
54
54
 
55
+ // cli/self-invocation.ts
56
+ var import_node_fs = require("node:fs");
57
+ var import_node_path = require("node:path");
58
+ var import_node_url = require("node:url");
59
+
55
60
  // src/public-brand.ts
56
61
  var name = "rnx";
57
62
  var rnxPublicBrand = Object.freeze({
@@ -66,9 +71,28 @@ var rnxPublicBrand = Object.freeze({
66
71
  var IS_STANDALONE = typeof __SOOTSIM_STANDALONE__ !== "undefined" && __SOOTSIM_STANDALONE__;
67
72
 
68
73
  // cli/self-invocation.ts
74
+ function sourceEntryPath() {
75
+ try {
76
+ const candidate = (0, import_node_path.join)((0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(__sootsim_import_meta_url)), "bin.ts");
77
+ return (0, import_node_fs.existsSync)(candidate) ? candidate : null;
78
+ } catch {
79
+ return null;
80
+ }
81
+ }
82
+ function isCliEntry(path4) {
83
+ const name2 = (0, import_node_path.basename)(path4);
84
+ return name2 === "bin.ts" || name2 === "bin.js";
85
+ }
69
86
  function rnxSelfInvocation() {
70
87
  if (IS_STANDALONE) return { executable: process.execPath, prefixArgs: [] };
71
88
  const entry = process.argv[1];
89
+ if (entry && isCliEntry(entry)) {
90
+ return { executable: process.execPath, prefixArgs: [entry] };
91
+ }
92
+ const sourceEntry = sourceEntryPath();
93
+ if (sourceEntry) {
94
+ return { executable: process.execPath, prefixArgs: [sourceEntry] };
95
+ }
72
96
  if (!entry) {
73
97
  throw new Error(`could not locate the ${rnxPublicBrand.commandName} entry script`);
74
98
  }
@@ -116,23 +140,23 @@ function encodeAgentPromptEnvelope(input) {
116
140
 
117
141
  // src/attached-projects.ts
118
142
  var import_node_crypto = require("node:crypto");
119
- var import_node_fs = __toESM(require("node:fs"), 1);
120
- var import_node_path2 = __toESM(require("node:path"), 1);
143
+ var import_node_fs2 = __toESM(require("node:fs"), 1);
144
+ var import_node_path3 = __toESM(require("node:path"), 1);
121
145
 
122
146
  // src/home-paths.ts
123
147
  var import_node_os = require("node:os");
124
- var import_node_path = __toESM(require("node:path"), 1);
148
+ var import_node_path2 = __toESM(require("node:path"), 1);
125
149
  var RNX_HOME_ENV = "RNX_HOME";
126
150
  function rnxHomeDir() {
127
151
  const override = process.env[RNX_HOME_ENV];
128
- if (override && override.length > 0) return import_node_path.default.resolve(override);
129
- return import_node_path.default.join((0, import_node_os.homedir)(), ".rnx");
152
+ if (override && override.length > 0) return import_node_path2.default.resolve(override);
153
+ return import_node_path2.default.join((0, import_node_os.homedir)(), ".rnx");
130
154
  }
131
155
  function electronDir() {
132
- return import_node_path.default.join(rnxHomeDir(), "electron");
156
+ return import_node_path2.default.join(rnxHomeDir(), "electron");
133
157
  }
134
158
  function electronUserDataDir() {
135
- return import_node_path.default.join(electronDir(), "userData");
159
+ return import_node_path2.default.join(electronDir(), "userData");
136
160
  }
137
161
  var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
138
162
 
@@ -148,7 +172,7 @@ function getUserDataDir() {
148
172
  return userDataDir();
149
173
  }
150
174
  function storeFile() {
151
- return import_node_path2.default.join(userDataDir(), "attached-projects.json");
175
+ return import_node_path3.default.join(userDataDir(), "attached-projects.json");
152
176
  }
153
177
  function cloneEmpty() {
154
178
  return {
@@ -162,7 +186,7 @@ function loadStore() {
162
186
  const file = storeFile();
163
187
  let raw;
164
188
  try {
165
- raw = import_node_fs.default.readFileSync(file, "utf8");
189
+ raw = import_node_fs2.default.readFileSync(file, "utf8");
166
190
  } catch (err) {
167
191
  if (err.code === "ENOENT") return cloneEmpty();
168
192
  throw err;
@@ -179,7 +203,7 @@ function loadStore() {
179
203
  } catch (err) {
180
204
  const quarantine = `${file}.corrupt-${Date.now()}`;
181
205
  try {
182
- import_node_fs.default.renameSync(file, quarantine);
206
+ import_node_fs2.default.renameSync(file, quarantine);
183
207
  console.warn(
184
208
  `[sootsim] attached-projects.json was unparseable; quarantined to ${quarantine}. original error: ${err.message}`
185
209
  );
@@ -190,16 +214,16 @@ function loadStore() {
190
214
  }
191
215
  function writeStore(store) {
192
216
  const file = storeFile();
193
- import_node_fs.default.mkdirSync(import_node_path2.default.dirname(file), { recursive: true });
217
+ import_node_fs2.default.mkdirSync(import_node_path3.default.dirname(file), { recursive: true });
194
218
  const tmp = `${file}.tmp-${process.pid}-${Date.now()}`;
195
- const fd = import_node_fs.default.openSync(tmp, "w", 384);
219
+ const fd = import_node_fs2.default.openSync(tmp, "w", 384);
196
220
  try {
197
- import_node_fs.default.writeFileSync(fd, JSON.stringify(store, null, 2));
198
- import_node_fs.default.fsyncSync(fd);
221
+ import_node_fs2.default.writeFileSync(fd, JSON.stringify(store, null, 2));
222
+ import_node_fs2.default.fsyncSync(fd);
199
223
  } finally {
200
- import_node_fs.default.closeSync(fd);
224
+ import_node_fs2.default.closeSync(fd);
201
225
  }
202
- import_node_fs.default.renameSync(tmp, file);
226
+ import_node_fs2.default.renameSync(tmp, file);
203
227
  }
204
228
  function mutateStore(fn) {
205
229
  const store = loadStore();
@@ -300,16 +324,16 @@ function updateSessionStatus(id, patch) {
300
324
 
301
325
  // src/agent-sessions.ts
302
326
  function sessionDir(sessionId) {
303
- return import_node_path3.default.join(getUserDataDir(), "sessions", sessionId);
327
+ return import_node_path4.default.join(getUserDataDir(), "sessions", sessionId);
304
328
  }
305
329
  function promptFifoPath(sessionId) {
306
- return import_node_path3.default.join(sessionDir(sessionId), "prompt.in");
330
+ return import_node_path4.default.join(sessionDir(sessionId), "prompt.in");
307
331
  }
308
332
  function eventsFifoPath(sessionId) {
309
- return import_node_path3.default.join(sessionDir(sessionId), "events.out");
333
+ return import_node_path4.default.join(sessionDir(sessionId), "events.out");
310
334
  }
311
335
  function transcriptPath(sessionId) {
312
- return import_node_path3.default.join(getUserDataDir(), "transcripts", `${sessionId}.log`);
336
+ return import_node_path4.default.join(getUserDataDir(), "transcripts", `${sessionId}.log`);
313
337
  }
314
338
  function pidIsAlive(pid, sessionId) {
315
339
  if (!pid) return false;
@@ -319,7 +343,7 @@ function pidIsAlive(pid, sessionId) {
319
343
  return false;
320
344
  }
321
345
  if (sessionId) {
322
- if (!import_node_fs2.default.existsSync(sessionDir(sessionId))) return false;
346
+ if (!import_node_fs3.default.existsSync(sessionDir(sessionId))) return false;
323
347
  }
324
348
  return true;
325
349
  }
@@ -332,11 +356,11 @@ function resolveSootsimInvocation() {
332
356
  const resourcesPath = process.resourcesPath;
333
357
  if (resourcesPath) {
334
358
  const candidates = [
335
- import_node_path3.default.join(resourcesPath, "bin", "sootsim"),
336
- import_node_path3.default.join(resourcesPath, "bin", `sootsim-${process.platform}-${process.arch}`)
359
+ import_node_path4.default.join(resourcesPath, "bin", "sootsim"),
360
+ import_node_path4.default.join(resourcesPath, "bin", `sootsim-${process.platform}-${process.arch}`)
337
361
  ];
338
362
  for (const c of candidates) {
339
- if (import_node_fs2.default.existsSync(c)) return { executable: c, prefixArgs: [] };
363
+ if (import_node_fs3.default.existsSync(c)) return { executable: c, prefixArgs: [] };
340
364
  }
341
365
  }
342
366
  }
@@ -355,15 +379,15 @@ function tryWorkspaceSootsim() {
355
379
  const sootsimDir = resolveSootsimPackageDir();
356
380
  if (!sootsimDir) return null;
357
381
  const binaryName = `rnx-${process.platform === "win32" ? "windows" : process.platform}-${process.arch}${process.platform === "win32" ? ".exe" : ""}`;
358
- const distBinary = import_node_path3.default.join(sootsimDir, "dist-bin", binaryName);
359
- if (import_node_fs2.default.existsSync(distBinary)) return { executable: distBinary, prefixArgs: [] };
360
- const distBin = import_node_path3.default.join(sootsimDir, "dist-cli", "bin.js");
361
- if (import_node_fs2.default.existsSync(distBin)) {
382
+ const distBinary = import_node_path4.default.join(sootsimDir, "dist-bin", binaryName);
383
+ if (import_node_fs3.default.existsSync(distBinary)) return { executable: distBinary, prefixArgs: [] };
384
+ const distBin = import_node_path4.default.join(sootsimDir, "dist-cli", "bin.js");
385
+ if (import_node_fs3.default.existsSync(distBin)) {
362
386
  try {
363
- const src = import_node_path3.default.join(sootsimDir, "cli", "commands", "agent-wrapper.ts");
364
- if (import_node_fs2.default.existsSync(src)) {
365
- const srcMtime = import_node_fs2.default.statSync(src).mtimeMs;
366
- const buildMtime = import_node_fs2.default.statSync(distBin).mtimeMs;
387
+ const src = import_node_path4.default.join(sootsimDir, "cli", "commands", "agent-wrapper.ts");
388
+ if (import_node_fs3.default.existsSync(src)) {
389
+ const srcMtime = import_node_fs3.default.statSync(src).mtimeMs;
390
+ const buildMtime = import_node_fs3.default.statSync(distBin).mtimeMs;
367
391
  if (buildMtime < srcMtime) {
368
392
  console.warn(
369
393
  `[rnx] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with \`bun run --cwd packages/sootsim build:cli\`.`
@@ -382,22 +406,22 @@ function tryWorkspaceSootsim() {
382
406
  function resolveSootsimPackageDir() {
383
407
  try {
384
408
  const resolved = require.resolve(`${rnxPublicBrand.packageName}/package.json`);
385
- return import_node_path3.default.dirname(resolved);
409
+ return import_node_path4.default.dirname(resolved);
386
410
  } catch {
387
411
  }
388
412
  const here = fileFromImportMeta();
389
413
  if (!here) return null;
390
- let cur = import_node_path3.default.dirname(here);
414
+ let cur = import_node_path4.default.dirname(here);
391
415
  for (let i = 0; i < 8; i++) {
392
- const pkg = import_node_path3.default.join(cur, "package.json");
416
+ const pkg = import_node_path4.default.join(cur, "package.json");
393
417
  try {
394
- if (import_node_fs2.default.existsSync(pkg)) {
395
- const parsed = JSON.parse(import_node_fs2.default.readFileSync(pkg, "utf8"));
418
+ if (import_node_fs3.default.existsSync(pkg)) {
419
+ const parsed = JSON.parse(import_node_fs3.default.readFileSync(pkg, "utf8"));
396
420
  if (parsed.name === rnxPublicBrand.packageName) return cur;
397
421
  }
398
422
  } catch {
399
423
  }
400
- const parent = import_node_path3.default.dirname(cur);
424
+ const parent = import_node_path4.default.dirname(cur);
401
425
  if (parent === cur) break;
402
426
  cur = parent;
403
427
  }
@@ -413,28 +437,28 @@ function fileFromImportMeta() {
413
437
  }
414
438
  }
415
439
  async function withStartLock(projectId, provider, fn) {
416
- const lockDir = import_node_path3.default.join(getUserDataDir(), "locks");
417
- import_node_fs2.default.mkdirSync(lockDir, { recursive: true });
440
+ const lockDir = import_node_path4.default.join(getUserDataDir(), "locks");
441
+ import_node_fs3.default.mkdirSync(lockDir, { recursive: true });
418
442
  try {
419
- import_node_fs2.default.chmodSync(lockDir, 448);
443
+ import_node_fs3.default.chmodSync(lockDir, 448);
420
444
  } catch {
421
445
  }
422
- const lockPath = import_node_path3.default.join(lockDir, `start-${projectId}-${provider}.lock`);
446
+ const lockPath = import_node_path4.default.join(lockDir, `start-${projectId}-${provider}.lock`);
423
447
  const deadline = Date.now() + 4e3;
424
448
  let fd = null;
425
449
  while (fd === null) {
426
450
  try {
427
- fd = import_node_fs2.default.openSync(
451
+ fd = import_node_fs3.default.openSync(
428
452
  lockPath,
429
- import_node_fs2.constants.O_WRONLY | import_node_fs2.constants.O_CREAT | import_node_fs2.constants.O_EXCL,
453
+ import_node_fs3.constants.O_WRONLY | import_node_fs3.constants.O_CREAT | import_node_fs3.constants.O_EXCL,
430
454
  384
431
455
  );
432
456
  } catch (err) {
433
457
  if (err.code !== "EEXIST") throw err;
434
458
  try {
435
- const stale = Number(import_node_fs2.default.readFileSync(lockPath, "utf8").trim());
459
+ const stale = Number(import_node_fs3.default.readFileSync(lockPath, "utf8").trim());
436
460
  if (stale && !isProcessAlive(stale)) {
437
- import_node_fs2.default.unlinkSync(lockPath);
461
+ import_node_fs3.default.unlinkSync(lockPath);
438
462
  continue;
439
463
  }
440
464
  } catch {
@@ -448,15 +472,15 @@ async function withStartLock(projectId, provider, fn) {
448
472
  }
449
473
  }
450
474
  try {
451
- import_node_fs2.default.writeFileSync(fd, String(process.pid));
475
+ import_node_fs3.default.writeFileSync(fd, String(process.pid));
452
476
  return await fn();
453
477
  } finally {
454
478
  try {
455
- import_node_fs2.default.closeSync(fd);
479
+ import_node_fs3.default.closeSync(fd);
456
480
  } catch {
457
481
  }
458
482
  try {
459
- import_node_fs2.default.unlinkSync(lockPath);
483
+ import_node_fs3.default.unlinkSync(lockPath);
460
484
  } catch {
461
485
  }
462
486
  }
@@ -470,25 +494,25 @@ function isProcessAlive(pid) {
470
494
  }
471
495
  }
472
496
  function mkfifoSync(p) {
473
- const parent = import_node_path3.default.dirname(p);
474
- import_node_fs2.default.mkdirSync(parent, { recursive: true });
497
+ const parent = import_node_path4.default.dirname(p);
498
+ import_node_fs3.default.mkdirSync(parent, { recursive: true });
475
499
  try {
476
- import_node_fs2.default.chmodSync(parent, 448);
500
+ import_node_fs3.default.chmodSync(parent, 448);
477
501
  } catch {
478
502
  }
479
- if (import_node_fs2.default.existsSync(p)) {
503
+ if (import_node_fs3.default.existsSync(p)) {
480
504
  try {
481
- const stat = import_node_fs2.default.statSync(p);
505
+ const stat = import_node_fs3.default.statSync(p);
482
506
  if (stat.isFIFO()) {
483
507
  try {
484
- import_node_fs2.default.chmodSync(p, 384);
508
+ import_node_fs3.default.chmodSync(p, 384);
485
509
  } catch {
486
510
  }
487
511
  return;
488
512
  }
489
- import_node_fs2.default.unlinkSync(p);
513
+ import_node_fs3.default.unlinkSync(p);
490
514
  } catch {
491
- import_node_fs2.default.unlinkSync(p);
515
+ import_node_fs3.default.unlinkSync(p);
492
516
  }
493
517
  }
494
518
  const result = (0, import_node_child_process.spawnSync)("mkfifo", ["-m", "600", p]);
@@ -535,10 +559,10 @@ async function startSession(opts) {
535
559
  const transcript = transcriptPath(session.id);
536
560
  mkfifoSync(promptIn);
537
561
  mkfifoSync(eventsOut);
538
- const transcriptDir = import_node_path3.default.dirname(transcript);
539
- import_node_fs2.default.mkdirSync(transcriptDir, { recursive: true });
562
+ const transcriptDir = import_node_path4.default.dirname(transcript);
563
+ import_node_fs3.default.mkdirSync(transcriptDir, { recursive: true });
540
564
  try {
541
- import_node_fs2.default.chmodSync(transcriptDir, 448);
565
+ import_node_fs3.default.chmodSync(transcriptDir, 448);
542
566
  } catch {
543
567
  }
544
568
  const { executable, prefixArgs } = resolveSootsimInvocation();
@@ -589,7 +613,7 @@ async function startSession(opts) {
589
613
  }
590
614
  }
591
615
  try {
592
- import_node_fs2.default.rmSync(sessionDir(session.id), { recursive: true, force: true });
616
+ import_node_fs3.default.rmSync(sessionDir(session.id), { recursive: true, force: true });
593
617
  } catch {
594
618
  }
595
619
  updateSessionStatus(session.id, { status: "ended" });
@@ -617,18 +641,18 @@ async function sendPrompt(sessionId, prompt) {
617
641
  );
618
642
  }
619
643
  const fifo = promptFifoPath(sessionId);
620
- if (!import_node_fs2.default.existsSync(fifo)) {
644
+ if (!import_node_fs3.default.existsSync(fifo)) {
621
645
  throw new AgentSessionError("NO_FIFO", `prompt FIFO missing: ${fifo}`);
622
646
  }
623
- const fd = import_node_fs2.default.openSync(fifo, import_node_fs2.constants.O_WRONLY);
647
+ const fd = import_node_fs3.default.openSync(fifo, import_node_fs3.constants.O_WRONLY);
624
648
  try {
625
649
  const wireText = encodeAgentPromptEnvelope(prompt);
626
650
  if (!wireText) {
627
651
  throw new AgentSessionError("EMPTY_PROMPT", "prompt text is empty");
628
652
  }
629
- import_node_fs2.default.writeSync(fd, wireText + "\n");
653
+ import_node_fs3.default.writeSync(fd, wireText + "\n");
630
654
  } finally {
631
- import_node_fs2.default.closeSync(fd);
655
+ import_node_fs3.default.closeSync(fd);
632
656
  }
633
657
  updateSessionStatus(sessionId, {
634
658
  lastPrompt: prompt.displayText ?? prompt.text,
@@ -650,7 +674,7 @@ async function endSession(sessionId) {
650
674
  const base = getUserDataDir();
651
675
  if (dir.startsWith(base)) {
652
676
  try {
653
- import_node_fs2.default.rmSync(dir, { recursive: true, force: true });
677
+ import_node_fs3.default.rmSync(dir, { recursive: true, force: true });
654
678
  } catch {
655
679
  }
656
680
  }
@@ -658,11 +682,11 @@ async function endSession(sessionId) {
658
682
  }
659
683
  function subscribeEvents(sessionId, onEvent) {
660
684
  const fifo = eventsFifoPath(sessionId);
661
- if (!import_node_fs2.default.existsSync(fifo)) {
685
+ if (!import_node_fs3.default.existsSync(fifo)) {
662
686
  throw new AgentSessionError("NO_FIFO", `events FIFO missing: ${fifo}`);
663
687
  }
664
- const fd = import_node_fs2.default.openSync(fifo, import_node_fs2.constants.O_RDWR);
665
- const stream = import_node_fs2.default.createReadStream("", { fd, autoClose: true });
688
+ const fd = import_node_fs3.default.openSync(fifo, import_node_fs3.constants.O_RDWR);
689
+ const stream = import_node_fs3.default.createReadStream("", { fd, autoClose: true });
666
690
  const rl = import_node_readline.default.createInterface({ input: stream, crlfDelay: Infinity });
667
691
  rl.on("line", (line) => {
668
692
  const event = parseAgentEventLine(line);
@@ -673,7 +697,7 @@ function subscribeEvents(sessionId, onEvent) {
673
697
  if (closed) return;
674
698
  closed = true;
675
699
  try {
676
- import_node_fs2.default.writeSync(fd, "\n");
700
+ import_node_fs3.default.writeSync(fd, "\n");
677
701
  } catch {
678
702
  }
679
703
  try {
@@ -687,7 +711,7 @@ function subscribeEvents(sessionId, onEvent) {
687
711
  };
688
712
  }
689
713
  async function waitForFirstEvent(fifo, predicate, timeoutMs) {
690
- const fd = import_node_fs2.default.openSync(fifo, import_node_fs2.constants.O_RDWR | import_node_fs2.constants.O_NONBLOCK);
714
+ const fd = import_node_fs3.default.openSync(fifo, import_node_fs3.constants.O_RDWR | import_node_fs3.constants.O_NONBLOCK);
691
715
  const buf = Buffer.alloc(8192);
692
716
  let leftover = "";
693
717
  const deadline = Date.now() + timeoutMs;
@@ -695,7 +719,7 @@ async function waitForFirstEvent(fifo, predicate, timeoutMs) {
695
719
  while (Date.now() < deadline) {
696
720
  let n = 0;
697
721
  try {
698
- n = import_node_fs2.default.readSync(fd, buf, 0, buf.length, null);
722
+ n = import_node_fs3.default.readSync(fd, buf, 0, buf.length, null);
699
723
  } catch (err) {
700
724
  if (err.code !== "EAGAIN") throw err;
701
725
  n = 0;
@@ -715,7 +739,7 @@ async function waitForFirstEvent(fifo, predicate, timeoutMs) {
715
739
  }
716
740
  return null;
717
741
  } finally {
718
- import_node_fs2.default.closeSync(fd);
742
+ import_node_fs3.default.closeSync(fd);
719
743
  }
720
744
  }
721
745
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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;
package/dist-lib/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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;
package/dist-lib/beta.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/capture-contract.ts
4
4
  var RNX_SCREEN_CAPTURE_VERSION = 1;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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;
@@ -2232,15 +2232,6 @@ async function dispatchStatusBarOverride(config) {
2232
2232
  );
2233
2233
  await page.waitForTimeout(50);
2234
2234
  }
2235
- async function dispatchSootsimEventInPage(type, detail) {
2236
- const page = getPage();
2237
- await page.evaluate(
2238
- ({ detail: detail2, type: type2 }) => {
2239
- window.dispatchEvent(new CustomEvent(type2, { detail: detail2 }));
2240
- },
2241
- { detail, type }
2242
- );
2243
- }
2244
2235
  function createSootSimElement(matcher) {
2245
2236
  const el = {
2246
2237
  _matcher: matcher,
@@ -2806,18 +2797,6 @@ var device = {
2806
2797
  return outPath;
2807
2798
  },
2808
2799
  _lastRecordingPath: "",
2809
- // set the engine's ContextMenu animation-progress override. visual-proof
2810
- // harnesses use this to drive each capture stage to a known animProgress
2811
- // (matched against the iOS oracle's curve) instead of fighting capture
2812
- // latency vs. sub-second spring timing. pass null to clear.
2813
- //
2814
- // dispatches a host CustomEvent that the engine forwards to the tenant
2815
- // worker (see shell-event-registry.ts + input-bridge.ts handleShellEvent).
2816
- // the worker writes globalThis.__sootsimMenuAnimOverride which the engine
2817
- // ContextMenu reads each rAF tick.
2818
- async setMenuAnimOverride(progress) {
2819
- await dispatchSootsimEventInPage("sootsim:menuAnimOverride", { value: progress });
2820
- },
2821
2800
  // park every render clock before the interaction, detect the first changed
2822
2801
  // stepped frame inside the named component, then advance exact 60fps frames
2823
2802
  // to each requested offset. native extraction also chooses the first frame
@@ -2941,9 +2920,7 @@ var device = {
2941
2920
  if (input.hold && interact) {
2942
2921
  const hit = await interact.touchDown(input.hold.x, input.hold.y);
2943
2922
  if (!hit) {
2944
- throw new Error(
2945
- `rnx motion hold missed at ${input.hold.x},${input.hold.y}`
2946
- );
2923
+ throw new Error(`rnx motion hold missed at ${input.hold.x},${input.hold.y}`);
2947
2924
  }
2948
2925
  } else {
2949
2926
  while (!state.triggerCompleted) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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.427 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.428 | (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;