rnxsim 0.1.530 → 0.1.532

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 (60) hide show
  1. package/cli/bridge-flow-runner.ts +28 -2
  2. package/cli/commands/agent-wrapper.ts +4 -1
  3. package/cli/commands/flow.ts +56 -2
  4. package/cli/commands/maestro.ts +11 -1
  5. package/cli/flow-live-status.ts +65 -8
  6. package/dist-lib/agent-daemon-client.cjs +1 -1
  7. package/dist-lib/agent-events.cjs +1 -1
  8. package/dist-lib/agent-identity.cjs +1 -1
  9. package/dist-lib/agent-sessions.cjs +1 -1
  10. package/dist-lib/attached-projects.cjs +1 -1
  11. package/dist-lib/auth/shared-session.cjs +1 -1
  12. package/dist-lib/backend-origin.cjs +1 -1
  13. package/dist-lib/beta.cjs +1 -1
  14. package/dist-lib/beta.mjs +1 -1
  15. package/dist-lib/bridge-constants.cjs +1 -1
  16. package/dist-lib/bridge-contract-input.cjs +1 -1
  17. package/dist-lib/bridge-contract-input.mjs +1 -1
  18. package/dist-lib/bridge-contract.cjs +1 -1
  19. package/dist-lib/bridge-contract.mjs +1 -1
  20. package/dist-lib/capture-contract.cjs +1 -1
  21. package/dist-lib/capture-contract.mjs +1 -1
  22. package/dist-lib/cli-constants.cjs +1 -1
  23. package/dist-lib/cloud-contract.cjs +1 -1
  24. package/dist-lib/cloud-contract.mjs +1 -1
  25. package/dist-lib/cloud.cjs +1 -1
  26. package/dist-lib/cloud.mjs +1 -1
  27. package/dist-lib/config.cjs +1 -1
  28. package/dist-lib/detox/index.cjs +1 -1
  29. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  30. package/dist-lib/home-paths.cjs +1 -1
  31. package/dist-lib/host/bridge-host.cjs +1 -1
  32. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  34. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  35. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  36. package/dist-lib/host/websocket-proxy.cjs +1 -1
  37. package/dist-lib/index.cjs +1 -1
  38. package/dist-lib/jump-to-source-babel.cjs +1 -1
  39. package/dist-lib/jump-to-source-native.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 +1 -1
  45. package/dist-lib/metro-production-bundle.mjs +1 -1
  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 +27 -4
  56. package/dist-lib/swift-submit.cjs +1 -1
  57. package/dist-lib/swift-submit.mjs +1 -1
  58. package/dist-lib/swift.cjs +1 -1
  59. package/dist-lib/vite.cjs +1 -1
  60. package/package.json +1 -1
@@ -2258,6 +2258,7 @@ export class SootSimBridgeFlowRunner {
2258
2258
  }
2259
2259
 
2260
2260
  async runStep(rawStepInput: MaestroStep | string, stepIndex: number) {
2261
+ await this.liveStatus?.waitWhilePaused()
2261
2262
  // maestro allows several commands in BARE-STRING form (`- back`,
2262
2263
  // `- hideKeyboard`, `- waitForAnimationToEnd`, `- scrollUp`, …). yaml parses
2263
2264
  // those to a plain string, so normalize to the `{ verb: true }` object form
@@ -2384,7 +2385,14 @@ export class SootSimBridgeFlowRunner {
2384
2385
  step.waitFor
2385
2386
  )
2386
2387
  if (this.stepDelay > 0 && !isAssertion) {
2387
- await sleep(this.stepDelay)
2388
+ const chunkMs = 50
2389
+ let elapsed = 0
2390
+ while (elapsed < this.stepDelay) {
2391
+ await this.liveStatus?.waitWhilePaused()
2392
+ const toSleep = Math.min(chunkMs, this.stepDelay - elapsed)
2393
+ await sleep(toSleep)
2394
+ elapsed += toSleep
2395
+ }
2388
2396
  }
2389
2397
  this.recordFlowTraceStep({
2390
2398
  stepIndex,
@@ -2621,7 +2629,12 @@ export class SootSimBridgeFlowRunner {
2621
2629
  // runFlowPlayback; absent for programmatic callers.
2622
2630
  liveStatus: FlowLiveStatusReporter | null = null
2623
2631
 
2624
- async runFlow(steps: MaestroStep[]) {
2632
+ resetFlowState() {
2633
+ this.flowTraceSteps = []
2634
+ this.lastFailedStep = null
2635
+ }
2636
+
2637
+ extractFlowBody(steps: MaestroStep[]) {
2625
2638
  // maestro `onFlowStart` / `onFlowComplete` lifecycle hooks: if any step
2626
2639
  // in the array is a sole-key entry whose key is one of these names and
2627
2640
  // whose value is a list of sub-steps, pull them out and run them as
@@ -2649,7 +2662,11 @@ export class SootSimBridgeFlowRunner {
2649
2662
  }
2650
2663
  body.push(step)
2651
2664
  }
2665
+ return { onStart, onComplete, body }
2666
+ }
2652
2667
 
2668
+ async planFlow(steps: MaestroStep[], options: { dryRun?: boolean } = {}) {
2669
+ const { body } = this.extractFlowBody(steps)
2653
2670
  if (this.liveStatus) {
2654
2671
  await this.liveStatus.plan(
2655
2672
  body.map((rawStep, index) => {
@@ -2660,8 +2677,17 @@ export class SootSimBridgeFlowRunner {
2660
2677
  const name = Object.keys(step).find((k) => k !== 'when') ?? Object.keys(step)[0]
2661
2678
  return { index, name, target: this.flowStepTargetLabel(step, name) }
2662
2679
  }),
2680
+ options,
2663
2681
  )
2664
2682
  }
2683
+ }
2684
+
2685
+ async runFlow(steps: MaestroStep[], options: { skipPlan?: boolean } = {}) {
2686
+ const { onStart, onComplete, body } = this.extractFlowBody(steps)
2687
+
2688
+ if (!options.skipPlan && this.liveStatus) {
2689
+ await this.planFlow(steps)
2690
+ }
2665
2691
 
2666
2692
  if (onStart.length > 0) {
2667
2693
  console.log(`[flow] onFlowStart (${onStart.length} steps)`)
@@ -47,7 +47,10 @@ const CODEX_TURN_SANDBOX_POLICY = { type: 'dangerFullAccess' } as const
47
47
  const CODEX_MODEL = 'gpt-5.6-luna'
48
48
  const CODEX_SERVICE_TIER = 'fast' as const
49
49
  // prompt-bar turns are small targeted edits, so both providers think briefly.
50
- const AGENT_REASONING_EFFORT = 'low' as const
50
+ // long-horizon callers (the one-take film) raise it through the env; the
51
+ // take's stack launch sets SOOTSIM_AGENT_EFFORT, never the repo.
52
+ const AGENT_REASONING_EFFORT =
53
+ process.env.SOOTSIM_AGENT_EFFORT?.trim() || ('low' as const)
51
54
  const CODEX_READY_TIMEOUT_MS = 5_000
52
55
  const CODEX_THREAD_SETUP_TIMEOUT_MS = 10_000
53
56
 
@@ -58,6 +58,8 @@ const FLOW_BOOLEAN_FLAGS = [
58
58
  '--proof',
59
59
  '--no-shell',
60
60
  '--shell-only',
61
+ '--dry-run',
62
+ '--no-run',
61
63
  ]
62
64
 
63
65
  const FLOW_VALUE_FLAGS = [
@@ -210,12 +212,14 @@ rnx maestro — author and run Maestro YAML flows
210
212
 
211
213
  usage:
212
214
  rnx maestro test <flow.yaml> [options]
215
+ rnx maestro load <flow.yaml> [options]
213
216
  rnx maestro start
214
217
  rnx maestro keep
215
218
  rnx maestro end [--output <path>] [--validate] [--video]
216
219
  rnx maestro validate <path>
217
220
 
218
221
  options:
222
+ --dry-run, --no-run load flow into the runner idle without executing steps
219
223
  --record record a webm artifact while the flow runs
220
224
  --profile capture perf stats while the flow runs
221
225
  --out <dir> output directory (default: /tmp/rnx-recordings)
@@ -665,6 +669,7 @@ flow extension:
665
669
  let previewScreenshotPath: string | null = null
666
670
  let failureBundleDir: string | null = null
667
671
  let exitCode = 0
672
+ const dryRun = args.includes('--dry-run') || args.includes('--no-run')
668
673
  const startsWithLaunchApp = !!steps[0]?.launchApp
669
674
  try {
670
675
  if (!startsWithLaunchApp) {
@@ -694,7 +699,21 @@ flow extension:
694
699
  if (preview && !startsWithLaunchApp && !process.env.RNX_PREVIEW_RESET_DONE) {
695
700
  await driver.launchApp({ clearState: true })
696
701
  }
697
- if (record) {
702
+ if (dryRun) {
703
+ await driver.planFlow(steps, { dryRun: true })
704
+ console.log(
705
+ `[flow] flow loaded (${steps.length} steps) — waiting for play in test runner…`,
706
+ )
707
+ await driver.liveStatus?.waitForStart()
708
+ console.log('[flow] starting flow playback…')
709
+ if (record) {
710
+ if (startsWithLaunchApp) {
711
+ driver.prepareRecording()
712
+ } else {
713
+ await driver.startRecording()
714
+ }
715
+ }
716
+ } else if (record) {
698
717
  if (startsWithLaunchApp) {
699
718
  driver.prepareRecording()
700
719
  } else {
@@ -723,7 +742,7 @@ flow extension:
723
742
  )
724
743
  }
725
744
  }
726
- await driver.runFlow(steps)
745
+ await driver.runFlow(steps, { skipPlan: dryRun })
727
746
  if (profile) {
728
747
  profileResult = await driver.stopProfile()
729
748
  }
@@ -923,6 +942,41 @@ flow extension:
923
942
  }
924
943
  }
925
944
 
945
+ if (dryRun) {
946
+ console.log('[flow] run completed — waiting for reset or new action in test runner…')
947
+ while (true) {
948
+ const action = await driver.liveStatus?.waitForResetOrRerun()
949
+ if (action === 'reset') {
950
+ console.log('[flow] reset requested from devtools — resetting runner state')
951
+ driver.resetFlowState()
952
+ await driver.planFlow(steps, { dryRun: true })
953
+ console.log('[flow] flow reloaded — waiting for play in test runner…')
954
+ await driver.liveStatus?.waitForStart()
955
+ console.log('[flow] re-running flow playback…')
956
+ try {
957
+ await driver.runFlow(steps, { skipPlan: true })
958
+ await driver.liveStatus?.end('passed')
959
+ console.log('\n + completed replay successfully\n')
960
+ } catch (replayErr: any) {
961
+ console.error(`\n x failed replay: ${replayErr?.message || replayErr}\n`)
962
+ await driver.liveStatus?.end('failed')
963
+ }
964
+ } else if (action === 'start') {
965
+ console.log('[flow] play requested from devtools — re-running flow playback…')
966
+ try {
967
+ await driver.runFlow(steps, { skipPlan: true })
968
+ await driver.liveStatus?.end('passed')
969
+ console.log('\n + completed replay successfully\n')
970
+ } catch (replayErr: any) {
971
+ console.error(`\n x failed replay: ${replayErr?.message || replayErr}\n`)
972
+ await driver.liveStatus?.end('failed')
973
+ }
974
+ } else {
975
+ break
976
+ }
977
+ }
978
+ }
979
+
926
980
  lastFlowTraceSteps = driver.getFlowTraceSteps()
927
981
 
928
982
  bridge.close()
@@ -38,6 +38,7 @@ rnx maestro — author and run Maestro YAML flows against rnx
38
38
  usage:
39
39
  rnx maestro # discover .maestro/ or maestro/ in cwd, run all
40
40
  rnx maestro test <flow-or-dir> # mirrors "maestro test"
41
+ rnx maestro load <flow> # load flow into runner without running (--dry-run)
41
42
  rnx maestro test .maestro/ # every *.yaml / *.yml in a directory
42
43
  rnx maestro generate "<goal>" # generate, run, and upload a Maestro flow
43
44
  rnx maestro start|keep|end # author a flow from live CLI actions
@@ -46,6 +47,7 @@ usage:
46
47
  rnx maestro --list-compat # print supported/unsupported verbs
47
48
 
48
49
  options:
50
+ --dry-run, --no-run load flow into runner idle without auto-running
49
51
  --env KEY=VALUE set env vars for \${KEY} interpolation (repeatable)
50
52
  --continuous accepted for maestro cli compat; rnx runs the flow once
51
53
  --format <fmt> accepted for maestro cli compat (not used)
@@ -316,7 +318,15 @@ export async function runMaestro(
316
318
  remaining = hoistLeadingSimFlag(remaining)
317
319
 
318
320
  const cwd = process.cwd()
319
- const sub = remaining[0]
321
+ let sub = remaining[0]
322
+
323
+ if (sub === 'load') {
324
+ remaining[0] = 'test'
325
+ sub = 'test'
326
+ if (!remaining.includes('--dry-run') && !remaining.includes('--no-run')) {
327
+ remaining.push('--dry-run')
328
+ }
329
+ }
320
330
 
321
331
  if (sub === 'init') {
322
332
  return runInit(cwd)
@@ -44,17 +44,21 @@ export class FlowLiveStatusReporter {
44
44
  private getSimId?: () => string | undefined,
45
45
  ) {}
46
46
 
47
- private async send(payload: Record<string, unknown>, simId: string | undefined) {
47
+ private async send(
48
+ payload: Record<string, unknown>,
49
+ simId: string | undefined,
50
+ ): Promise<unknown> {
48
51
  const reply: unknown = await this.bridge.send({
49
52
  type: 'flowStatus',
50
53
  simId,
51
54
  status: { runId: this.runId, flowName: this.flowName, ...payload },
52
55
  })
53
56
  this.paused = replyPaused(reply)
57
+ return reply
54
58
  }
55
59
 
56
- private async push(payload: Record<string, unknown>): Promise<void> {
57
- if (this.disabled) return
60
+ private async push(payload: Record<string, unknown>): Promise<unknown> {
61
+ if (this.disabled) return undefined
58
62
  try {
59
63
  const simId = this.getSimId?.()
60
64
  if (
@@ -77,19 +81,68 @@ export class FlowLiveStatusReporter {
77
81
  }
78
82
  }
79
83
  this.lastSimId = simId
80
- await this.send(payload, simId)
84
+ return await this.send(payload, simId)
81
85
  } catch (error) {
82
86
  this.disabled = true
83
87
  console.log(
84
88
  `[flow] live status unavailable (${error instanceof Error ? error.message.slice(0, 120) : error}) — continuing without the devtools rail`,
85
89
  )
90
+ return undefined
86
91
  }
87
92
  }
88
93
 
89
- async plan(steps: PlanStep[]): Promise<void> {
94
+ async plan(steps: PlanStep[], options: { dryRun?: boolean } = {}): Promise<void> {
90
95
  this.plannedSteps = steps.map((step) => ({ ...step }))
91
96
  this.completedSteps.clear()
92
- await this.push({ phase: 'plan', state: 'running', steps, source: this.flowSource })
97
+ await this.push({
98
+ phase: 'plan',
99
+ state: options.dryRun ? 'idle' : 'running',
100
+ dryRun: options.dryRun,
101
+ steps,
102
+ source: this.flowSource,
103
+ })
104
+ }
105
+
106
+ async waitForStart(): Promise<void> {
107
+ if (this.disabled) return
108
+ while (!this.disabled) {
109
+ await new Promise((resolve) => setTimeout(resolve, 200))
110
+ const reply = await this.push({ phase: 'heartbeat', state: 'idle' })
111
+ if (
112
+ reply &&
113
+ typeof reply === 'object' &&
114
+ 'control' in reply &&
115
+ typeof (reply as { control?: unknown }).control === 'object'
116
+ ) {
117
+ const ctrl = (reply as { control: { start?: boolean } }).control
118
+ if (ctrl?.start === true) {
119
+ return
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ async waitForResetOrRerun(): Promise<'reset' | 'start' | 'exit'> {
126
+ if (this.disabled) return 'exit'
127
+ while (!this.disabled) {
128
+ await new Promise((resolve) => setTimeout(resolve, 200))
129
+ const reply = await this.push({ phase: 'heartbeat' })
130
+ if (
131
+ reply &&
132
+ typeof reply === 'object' &&
133
+ 'control' in reply &&
134
+ typeof (reply as { control?: unknown }).control === 'object'
135
+ ) {
136
+ const ctrl = (reply as { control: { reset?: boolean; start?: boolean } }).control
137
+ if (ctrl?.reset === true) {
138
+ return 'reset'
139
+ }
140
+ if (ctrl?.start === true) {
141
+ return 'start'
142
+ }
143
+ }
144
+ }
145
+ return 'exit'
93
146
  }
94
147
 
95
148
  async step(
@@ -114,10 +167,14 @@ export class FlowLiveStatusReporter {
114
167
  // steps only, so a pause never interrupts a step mid-gesture.
115
168
  async waitWhilePaused(): Promise<void> {
116
169
  if (this.disabled) return
117
- while (this.paused) {
170
+ const reply = await this.push({ phase: 'heartbeat' })
171
+ if (replyPaused(reply)) {
172
+ this.paused = true
173
+ }
174
+ while (this.paused && !this.disabled) {
118
175
  console.log('[flow] paused from devtools — waiting…')
119
176
  while (this.paused && !this.disabled) {
120
- await new Promise((resolve) => setTimeout(resolve, PAUSE_POLL_MS))
177
+ await new Promise((resolve) => setTimeout(resolve, 200))
121
178
  await this.push({ phase: 'heartbeat', state: 'paused' })
122
179
  }
123
180
  if (!this.disabled) console.log('[flow] resumed')
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var REFUSED_PERFORM_STEP_TYPES = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-fingerprint-registry.ts
4
4
  var RNX_METRO_FINGERPRINT_SCHEMA_VERSION = 2;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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;
@@ -38266,6 +38266,7 @@ var init_bridge_flow_runner = __esm({
38266
38266
  return !!(value && typeof value === "object" && "optional" in value && value.optional);
38267
38267
  }
38268
38268
  async runStep(rawStepInput, stepIndex) {
38269
+ await this.liveStatus?.waitWhilePaused();
38269
38270
  const rawStep = typeof rawStepInput === "string" ? normalizeBareStringStep(rawStepInput) : rawStepInput;
38270
38271
  const stepName = Object.keys(rawStep).find((k) => k !== "when") || Object.keys(rawStep)[0];
38271
38272
  console.log(`[flow] step ${stepIndex + 1}: ${stepName}`);
@@ -38356,7 +38357,14 @@ var init_bridge_flow_runner = __esm({
38356
38357
  }
38357
38358
  const isAssertion = !!(step.assertVisible || step.assertNotVisible || step.extendedWaitUntil || step.waitFor);
38358
38359
  if (this.stepDelay > 0 && !isAssertion) {
38359
- await sleep3(this.stepDelay);
38360
+ const chunkMs = 50;
38361
+ let elapsed = 0;
38362
+ while (elapsed < this.stepDelay) {
38363
+ await this.liveStatus?.waitWhilePaused();
38364
+ const toSleep = Math.min(chunkMs, this.stepDelay - elapsed);
38365
+ await sleep3(toSleep);
38366
+ elapsed += toSleep;
38367
+ }
38360
38368
  }
38361
38369
  this.recordFlowTraceStep({
38362
38370
  stepIndex,
@@ -38562,7 +38570,11 @@ var init_bridge_flow_runner = __esm({
38562
38570
  // live progress reporter (shell devtools "test" tab). attached by
38563
38571
  // runFlowPlayback; absent for programmatic callers.
38564
38572
  liveStatus = null;
38565
- async runFlow(steps) {
38573
+ resetFlowState() {
38574
+ this.flowTraceSteps = [];
38575
+ this.lastFailedStep = null;
38576
+ }
38577
+ extractFlowBody(steps) {
38566
38578
  const onStart = [];
38567
38579
  const onComplete = [];
38568
38580
  const body = [];
@@ -38578,15 +38590,26 @@ var init_bridge_flow_runner = __esm({
38578
38590
  }
38579
38591
  body.push(step);
38580
38592
  }
38593
+ return { onStart, onComplete, body };
38594
+ }
38595
+ async planFlow(steps, options = {}) {
38596
+ const { body } = this.extractFlowBody(steps);
38581
38597
  if (this.liveStatus) {
38582
38598
  await this.liveStatus.plan(
38583
38599
  body.map((rawStep, index) => {
38584
38600
  const step = typeof rawStep === "string" ? normalizeBareStringStep(rawStep) : rawStep;
38585
38601
  const name2 = Object.keys(step).find((k) => k !== "when") ?? Object.keys(step)[0];
38586
38602
  return { index, name: name2, target: this.flowStepTargetLabel(step, name2) };
38587
- })
38603
+ }),
38604
+ options
38588
38605
  );
38589
38606
  }
38607
+ }
38608
+ async runFlow(steps, options = {}) {
38609
+ const { onStart, onComplete, body } = this.extractFlowBody(steps);
38610
+ if (!options.skipPlan && this.liveStatus) {
38611
+ await this.planFlow(steps);
38612
+ }
38590
38613
  if (onStart.length > 0) {
38591
38614
  console.log(`[flow] onFlowStart (${onStart.length} steps)`);
38592
38615
  for (let i = 0; i < onStart.length; i++) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-submit.ts
4
4
  var SWIFT_COMPILE_PATH = "/api/swift-compile";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.530 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.532 | (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.530",
3
+ "version": "0.1.532",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for rnx.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",