peachsim 0.1.836 → 0.1.838

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 (78) hide show
  1. package/cli/commands/control.ts +6 -0
  2. package/detox/index.ts +54 -30
  3. package/dist-lib/agent-daemon-client.cjs +1 -1
  4. package/dist-lib/agent-events.cjs +1 -1
  5. package/dist-lib/agent-identity.cjs +1 -1
  6. package/dist-lib/agent-sessions.cjs +1 -1
  7. package/dist-lib/attached-projects.cjs +1 -1
  8. package/dist-lib/auth/shared-session.cjs +1 -1
  9. package/dist-lib/backend-origin.cjs +1 -1
  10. package/dist-lib/beta.cjs +1 -1
  11. package/dist-lib/beta.mjs +1 -1
  12. package/dist-lib/bridge-constants.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.mjs +1 -1
  15. package/dist-lib/bridge-contract.cjs +1 -1
  16. package/dist-lib/bridge-contract.mjs +1 -1
  17. package/dist-lib/bundle-channel.cjs +1 -1
  18. package/dist-lib/capture-contract.cjs +1 -1
  19. package/dist-lib/capture-contract.mjs +1 -1
  20. package/dist-lib/cli-constants.cjs +1 -1
  21. package/dist-lib/cloud-contract.cjs +1 -1
  22. package/dist-lib/cloud-contract.mjs +1 -1
  23. package/dist-lib/cloud-test-args.cjs +1 -1
  24. package/dist-lib/cloud-test-args.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 +48 -29
  29. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  30. package/dist-lib/expo-swift-bundle.cjs +1 -1
  31. package/dist-lib/expo-swift-metadata.cjs +1 -1
  32. package/dist-lib/expo-swift-metadata.mjs +1 -1
  33. package/dist-lib/home-paths.cjs +1 -1
  34. package/dist-lib/host/bridge-host.cjs +5 -1
  35. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  36. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  37. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  38. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  39. package/dist-lib/host/websocket-proxy.cjs +1 -1
  40. package/dist-lib/index.cjs +1 -1
  41. package/dist-lib/jump-to-source-babel.cjs +1 -1
  42. package/dist-lib/jump-to-source-native.cjs +1 -1
  43. package/dist-lib/kotlin-host.cjs +1 -1
  44. package/dist-lib/menu.cjs +1 -1
  45. package/dist-lib/menu.mjs +1 -1
  46. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  47. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  48. package/dist-lib/metro-production-bundle.cjs +1 -1
  49. package/dist-lib/metro-production-bundle.mjs +1 -1
  50. package/dist-lib/metro.cjs +1 -1
  51. package/dist-lib/native-app-identity.cjs +1 -1
  52. package/dist-lib/native-app-identity.mjs +1 -1
  53. package/dist-lib/native-firebase-metadata.cjs +1 -1
  54. package/dist-lib/native-firebase-metadata.mjs +1 -1
  55. package/dist-lib/plist.cjs +1 -1
  56. package/dist-lib/plist.mjs +1 -1
  57. package/dist-lib/profiles.cjs +1 -1
  58. package/dist-lib/public-brand.cjs +1 -1
  59. package/dist-lib/react-native-host-modules.cjs +1 -1
  60. package/dist-lib/react-native-host-modules.mjs +1 -1
  61. package/dist-lib/render-mode.cjs +1 -1
  62. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  63. package/dist-lib/sdk.cjs +1 -1
  64. package/dist-lib/sdk.mjs +1 -1
  65. package/dist-lib/skills.cjs +9 -1
  66. package/dist-lib/swift-compile.cjs +1 -1
  67. package/dist-lib/swift-compile.mjs +1 -1
  68. package/dist-lib/swift-package.cjs +1 -1
  69. package/dist-lib/swift-package.mjs +1 -1
  70. package/dist-lib/swift-submit.cjs +1 -1
  71. package/dist-lib/swift-submit.mjs +1 -1
  72. package/dist-lib/swift-toolchain.cjs +1 -1
  73. package/dist-lib/swift.cjs +1 -1
  74. package/dist-lib/vite-swift.cjs +1 -1
  75. package/dist-lib/vite.cjs +1 -1
  76. package/dist-lib/worklet-executable.cjs +1 -1
  77. package/dist-lib/worklet-executable.mjs +1 -1
  78. package/package.json +1 -1
@@ -863,6 +863,8 @@ async function splashImageReachable(imageUrl: string): Promise<boolean> {
863
863
  }
864
864
 
865
865
  export interface BuildShellUrlOptions {
866
+ // manifest and asset origin provided by an authenticated recorder proxy.
867
+ bundleOriginOverride?: string
866
868
  // marks native host windows so the bridge can reuse a CLI-opened desktop sim.
867
869
  hostDriver?: 'desktop'
868
870
  // when set, forces the metro `hot` query on the resolved bundle URL. true
@@ -946,6 +948,8 @@ export async function buildShellUrl(
946
948
  project,
947
949
  )
948
950
  const expoStamped = new URL(stamped)
951
+ if (opts.bundleOriginOverride)
952
+ expoStamped.searchParams.set('bundleOriginOverride', opts.bundleOriginOverride)
949
953
  if (opts.hostDriver) expoStamped.searchParams.set('peachHostDriver', opts.hostDriver)
950
954
  if (expoRoot) {
951
955
  const world = resolveBridgeWorld()
@@ -1532,6 +1536,7 @@ export async function runOpenCommand(
1532
1536
  ],
1533
1537
  stripValueFlags: [
1534
1538
  '--base-url',
1539
+ '--bundle-origin',
1535
1540
  '--replace',
1536
1541
  '--driver',
1537
1542
  '--profile',
@@ -1851,6 +1856,7 @@ export async function runOpenCommand(
1851
1856
  }
1852
1857
 
1853
1858
  const buildShellUrlOpts: BuildShellUrlOptions = {
1859
+ bundleOriginOverride: args.find((_, i) => args[i - 1] === '--bundle-origin'),
1854
1860
  hot: hotMode,
1855
1861
  hostDriver: driverId === 'desktop' ? 'desktop' : undefined,
1856
1862
  device: deviceArg,
package/detox/index.ts CHANGED
@@ -59,10 +59,10 @@ export type { SootSimElement } from './element-types'
59
59
 
60
60
  declare global {
61
61
  interface Window {
62
- // installed by takeScreenshotStagesFast; each input action calls it just
63
- // before handing its input to the engine so an input-anchored capture
64
- // starts its stage clock at that dispatch
65
- __sootsimAnchorTimedInput?: () => void
62
+ // installed by takeScreenshotStagesFast; each input action calls it with
63
+ // its capture token after successfully handing its input to the engine so
64
+ // only that capture's stages anchor at that dispatch.
65
+ __sootsimAnchorTimedInput?: (token: string) => void
66
66
  }
67
67
  }
68
68
 
@@ -749,22 +749,30 @@ async function getDefaultTapPoint(
749
749
  }
750
750
  }
751
751
 
752
- async function dispatchTapAtSootsimPoint(page: Page, x: number, y: number) {
752
+ async function dispatchTapAtSootsimPoint(
753
+ page: Page,
754
+ x: number,
755
+ y: number,
756
+ token?: string,
757
+ ) {
753
758
  await page.evaluate(
754
- async ({ x, y }) => {
759
+ async ({ x, y, token }) => {
755
760
  const interactTap = window.SootSim?.bridges?.interact?.tap
756
- window.__sootsimAnchorTimedInput?.()
757
761
  if (typeof interactTap === 'function') {
758
762
  const result = await interactTap(x, y)
759
- if (result && (typeof result !== 'object' || result.hit !== false)) return
763
+ if (result && (typeof result !== 'object' || result.hit !== false)) {
764
+ if (token) window.__sootsimAnchorTimedInput?.(token)
765
+ return
766
+ }
760
767
  }
761
768
  const tap = window.__sootsimTest?.tap
762
769
  if (typeof tap !== 'function') {
763
770
  throw new Error('sootsim tap bridge is not installed')
764
771
  }
765
772
  await tap(x, y)
773
+ if (token) window.__sootsimAnchorTimedInput?.(token)
766
774
  },
767
- { x, y },
775
+ { x, y, token },
768
776
  )
769
777
  }
770
778
 
@@ -1109,7 +1117,8 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1109
1117
  typeof point?.y === 'number'
1110
1118
  ? node.absolutePosition.y + point.y
1111
1119
  : (defaultPoint?.y ?? node.absolutePosition.y + node.layout.height / 2)
1112
- await dispatchTapAtSootsimPoint(page, targetSootSimX, targetSootSimY)
1120
+ const captureToken = (page as any).__sootsimCaptureToken
1121
+ await dispatchTapAtSootsimPoint(page, targetSootSimX, targetSootSimY, captureToken)
1113
1122
  if (_synchronizationEnabled) {
1114
1123
  await waitForSootsimIdle(page)
1115
1124
  }
@@ -1168,16 +1177,17 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1168
1177
  y: node.absolutePosition.y + pointOrDuration.y,
1169
1178
  }
1170
1179
  : getNodeCenter(node)
1180
+ const captureToken = (page as any).__sootsimCaptureToken
1171
1181
  await page.evaluate(
1172
- async ({ duration, x, y }) => {
1182
+ async ({ duration, x, y, token }) => {
1173
1183
  const longPress = window.SootSim?.bridges?.interact?.longPress
1174
1184
  if (typeof longPress !== 'function') {
1175
1185
  throw new Error('sootsim longPress bridge is not installed')
1176
1186
  }
1177
- window.__sootsimAnchorTimedInput?.()
1178
1187
  await longPress(x, y, duration)
1188
+ if (token) window.__sootsimAnchorTimedInput?.(token)
1179
1189
  },
1180
- { duration, x: target.x, y: target.y },
1190
+ { duration, x: target.x, y: target.y, token: captureToken },
1181
1191
  )
1182
1192
  await page.waitForTimeout(50)
1183
1193
  },
@@ -1437,8 +1447,9 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1437
1447
  const steps = speed === 'slow' ? 40 : 20
1438
1448
  const stepDelay = 1000 / 60
1439
1449
 
1450
+ const captureToken = (page as any).__sootsimCaptureToken
1440
1451
  await page.evaluate(
1441
- async ({ fromX, fromY, toX, toY, steps, stepMs }) => {
1452
+ async ({ fromX, fromY, toX, toY, steps, stepMs, token }) => {
1442
1453
  // the interact bridge, not __sootsimTest.drag. the test bridge's drag
1443
1454
  // runs the whole down/move/up loop through the tenant's own
1444
1455
  // dispatchPointer and never fans to the shell, where gesture-handler's
@@ -1451,8 +1462,8 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1451
1462
  if (typeof drag !== 'function') {
1452
1463
  throw new Error('sootsim interact bridge is not installed')
1453
1464
  }
1454
- window.__sootsimAnchorTimedInput?.()
1455
1465
  await drag(fromX, fromY, toX, toY, steps, stepMs)
1466
+ if (token) window.__sootsimAnchorTimedInput?.(token)
1456
1467
  },
1457
1468
  {
1458
1469
  fromX: startSootSimX,
@@ -1461,6 +1472,7 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1461
1472
  toY: endSootSimY,
1462
1473
  steps,
1463
1474
  stepMs: stepDelay,
1475
+ token: captureToken,
1464
1476
  },
1465
1477
  )
1466
1478
  await page.waitForTimeout(100)
@@ -1538,10 +1550,12 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1538
1550
  `setColumnToValue(${column}, ${JSON.stringify(value)}) could not resolve its picker row`,
1539
1551
  )
1540
1552
  }
1553
+ const captureToken = (page as any).__sootsimCaptureToken
1541
1554
  await dispatchTapAtSootsimPoint(
1542
1555
  page,
1543
1556
  tapTarget.target.absolutePosition.x + tapTarget.target.layout.width / 2,
1544
1557
  tapTarget.target.absolutePosition.y + tapTarget.target.layout.height / 2,
1558
+ captureToken,
1545
1559
  )
1546
1560
  },
1547
1561
 
@@ -2937,15 +2951,15 @@ export const device = {
2937
2951
  ready: false,
2938
2952
  }
2939
2953
  registry[input.token] = state
2940
- window.__sootsimAnchorTimedInput = () => {
2954
+ window.__sootsimAnchorTimedInput = (token: string) => {
2955
+ const capture = registry[token]
2956
+ if (!capture) return
2957
+ if (!capture.anchorOnInput || !capture.ready) return
2958
+ if (capture.anchorPerformanceMs !== null) return
2941
2959
  const anchorPerformanceMs = performance.now()
2942
2960
  const anchorWallMs = Date.now()
2943
- for (const capture of Object.values(registry)) {
2944
- if (!capture.anchorOnInput || !capture.ready) continue
2945
- if (capture.anchorPerformanceMs !== null) continue
2946
- capture.anchorPerformanceMs = anchorPerformanceMs
2947
- capture.anchorWallMs = anchorWallMs
2948
- }
2961
+ capture.anchorPerformanceMs = anchorPerformanceMs
2962
+ capture.anchorWallMs = anchorWallMs
2949
2963
  }
2950
2964
  // initial warm-up: ensure the worker has produced at least one
2951
2965
  // frame after the menu's portal mount before we start sampling.
@@ -3110,7 +3124,12 @@ export const device = {
3110
3124
  let captureAnchorMs: number
3111
3125
  if (anchorOnInput) {
3112
3126
  triggerStartMs = Date.now()
3113
- await Promise.resolve(options.trigger())
3127
+ ;(page as any).__sootsimCaptureToken = token
3128
+ try {
3129
+ await Promise.resolve(options.trigger())
3130
+ } finally {
3131
+ delete (page as any).__sootsimCaptureToken
3132
+ }
3114
3133
  triggerCompletedMs = Date.now()
3115
3134
  // the capture deletes its entry once every stage is sampled, which
3116
3135
  // can precede a long trigger's return; only a live entry can be unanchored
@@ -3309,21 +3328,25 @@ export const device = {
3309
3328
  if (point == null || typeof point === 'boolean') return
3310
3329
  const page = getPage()
3311
3330
  const { x, y } = point
3331
+ const captureToken = (page as any).__sootsimCaptureToken
3312
3332
  await page.evaluate(
3313
- async ({ x: tx, y: ty }) => {
3333
+ async ({ x: tx, y: ty, token }) => {
3314
3334
  const interactTap = window.SootSim?.bridges?.interact?.tap
3315
- window.__sootsimAnchorTimedInput?.()
3316
3335
  if (typeof interactTap === 'function') {
3317
3336
  const result = await interactTap(tx, ty)
3318
- if (result && (typeof result !== 'object' || result.hit !== false)) return
3337
+ if (result && (typeof result !== 'object' || result.hit !== false)) {
3338
+ if (token) window.__sootsimAnchorTimedInput?.(token)
3339
+ return
3340
+ }
3319
3341
  }
3320
3342
  const tap = window.__sootsimTest?.tap
3321
3343
  if (typeof tap !== 'function') {
3322
3344
  throw new Error('sootsim tap bridge is not installed')
3323
3345
  }
3324
3346
  await tap(tx, ty)
3347
+ if (token) window.__sootsimAnchorTimedInput?.(token)
3325
3348
  },
3326
- { x, y },
3349
+ { x, y, token: captureToken },
3327
3350
  )
3328
3351
  await page.waitForTimeout(50)
3329
3352
  if (_synchronizationEnabled) {
@@ -3336,19 +3359,20 @@ export const device = {
3336
3359
  async longPress(point: { x: number; y: number }, durationMs = 1000) {
3337
3360
  const page = getPage()
3338
3361
  const { x, y } = point
3362
+ const captureToken = (page as any).__sootsimCaptureToken
3339
3363
  await page.evaluate(
3340
- async ({ x: px, y: py, ms }) => {
3364
+ async ({ x: px, y: py, ms, token }) => {
3341
3365
  const longPress = window.SootSim?.bridges?.interact?.longPress
3342
3366
  if (typeof longPress !== 'function') {
3343
3367
  throw new Error('sootsim longPress bridge is not installed')
3344
3368
  }
3345
- window.__sootsimAnchorTimedInput?.()
3346
3369
  const hit = await longPress(px, py, ms)
3347
3370
  if (!hit) {
3348
3371
  throw new Error(`sootsim longPress missed at ${px},${py}`)
3349
3372
  }
3373
+ if (token) window.__sootsimAnchorTimedInput?.(token)
3350
3374
  },
3351
- { x, y, ms: durationMs },
3375
+ { x, y, ms: durationMs, token: captureToken },
3352
3376
  )
3353
3377
  await page.waitForTimeout(50)
3354
3378
  if (_synchronizationEnabled) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/cloud-test-args.ts
4
4
  var CLOUD_TEST_ARGS_MAX_COUNT = 32;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -8485,22 +8485,25 @@ async function getDefaultTapPoint(page, nodeInfo) {
8485
8485
  y: top + (bottom - top) / 2
8486
8486
  };
8487
8487
  }
8488
- async function dispatchTapAtSootsimPoint(page, x, y) {
8488
+ async function dispatchTapAtSootsimPoint(page, x, y, token) {
8489
8489
  await page.evaluate(
8490
- async ({ x: x2, y: y2 }) => {
8490
+ async ({ x: x2, y: y2, token: token2 }) => {
8491
8491
  const interactTap = window.SootSim?.bridges?.interact?.tap;
8492
- window.__sootsimAnchorTimedInput?.();
8493
8492
  if (typeof interactTap === "function") {
8494
8493
  const result = await interactTap(x2, y2);
8495
- if (result && (typeof result !== "object" || result.hit !== false)) return;
8494
+ if (result && (typeof result !== "object" || result.hit !== false)) {
8495
+ if (token2) window.__sootsimAnchorTimedInput?.(token2);
8496
+ return;
8497
+ }
8496
8498
  }
8497
8499
  const tap = window.__sootsimTest?.tap;
8498
8500
  if (typeof tap !== "function") {
8499
8501
  throw new Error("sootsim tap bridge is not installed");
8500
8502
  }
8501
8503
  await tap(x2, y2);
8504
+ if (token2) window.__sootsimAnchorTimedInput?.(token2);
8502
8505
  },
8503
- { x, y }
8506
+ { x, y, token }
8504
8507
  );
8505
8508
  }
8506
8509
  async function isFocusedTextInputNode(page, nodeInfo) {
@@ -8763,7 +8766,8 @@ function createSootSimElement(matcher) {
8763
8766
  const defaultPoint = point ? null : await getDefaultTapPoint(page, node);
8764
8767
  const targetSootSimX = typeof point?.x === "number" ? node.absolutePosition.x + point.x : defaultPoint?.x ?? node.absolutePosition.x + node.layout.width / 2;
8765
8768
  const targetSootSimY = typeof point?.y === "number" ? node.absolutePosition.y + point.y : defaultPoint?.y ?? node.absolutePosition.y + node.layout.height / 2;
8766
- await dispatchTapAtSootsimPoint(page, targetSootSimX, targetSootSimY);
8769
+ const captureToken = page.__sootsimCaptureToken;
8770
+ await dispatchTapAtSootsimPoint(page, targetSootSimX, targetSootSimY, captureToken);
8767
8771
  if (_synchronizationEnabled) {
8768
8772
  await waitForSootsimIdle(page);
8769
8773
  }
@@ -8808,16 +8812,17 @@ function createSootSimElement(matcher) {
8808
8812
  x: node.absolutePosition.x + pointOrDuration.x,
8809
8813
  y: node.absolutePosition.y + pointOrDuration.y
8810
8814
  } : getNodeCenter(node);
8815
+ const captureToken = page.__sootsimCaptureToken;
8811
8816
  await page.evaluate(
8812
- async ({ duration: duration2, x, y }) => {
8817
+ async ({ duration: duration2, x, y, token }) => {
8813
8818
  const longPress = window.SootSim?.bridges?.interact?.longPress;
8814
8819
  if (typeof longPress !== "function") {
8815
8820
  throw new Error("sootsim longPress bridge is not installed");
8816
8821
  }
8817
- window.__sootsimAnchorTimedInput?.();
8818
8822
  await longPress(x, y, duration2);
8823
+ if (token) window.__sootsimAnchorTimedInput?.(token);
8819
8824
  },
8820
- { duration, x: target.x, y: target.y }
8825
+ { duration, x: target.x, y: target.y, token: captureToken }
8821
8826
  );
8822
8827
  await page.waitForTimeout(50);
8823
8828
  },
@@ -8990,14 +8995,15 @@ function createSootSimElement(matcher) {
8990
8995
  }
8991
8996
  const steps = speed === "slow" ? 40 : 20;
8992
8997
  const stepDelay = 1e3 / 60;
8998
+ const captureToken = page.__sootsimCaptureToken;
8993
8999
  await page.evaluate(
8994
- async ({ fromX, fromY, toX, toY, steps: steps2, stepMs }) => {
9000
+ async ({ fromX, fromY, toX, toY, steps: steps2, stepMs, token }) => {
8995
9001
  const drag = window.__sootsimInteract?.drag;
8996
9002
  if (typeof drag !== "function") {
8997
9003
  throw new Error("sootsim interact bridge is not installed");
8998
9004
  }
8999
- window.__sootsimAnchorTimedInput?.();
9000
9005
  await drag(fromX, fromY, toX, toY, steps2, stepMs);
9006
+ if (token) window.__sootsimAnchorTimedInput?.(token);
9001
9007
  },
9002
9008
  {
9003
9009
  fromX: startSootSimX,
@@ -9005,7 +9011,8 @@ function createSootSimElement(matcher) {
9005
9011
  toX: endSootSimX,
9006
9012
  toY: endSootSimY,
9007
9013
  steps,
9008
- stepMs: stepDelay
9014
+ stepMs: stepDelay,
9015
+ token: captureToken
9009
9016
  }
9010
9017
  );
9011
9018
  await page.waitForTimeout(100);
@@ -9065,10 +9072,12 @@ function createSootSimElement(matcher) {
9065
9072
  `setColumnToValue(${column}, ${JSON.stringify(value)}) could not resolve its picker row`
9066
9073
  );
9067
9074
  }
9075
+ const captureToken = page.__sootsimCaptureToken;
9068
9076
  await dispatchTapAtSootsimPoint(
9069
9077
  page,
9070
9078
  tapTarget.target.absolutePosition.x + tapTarget.target.layout.width / 2,
9071
- tapTarget.target.absolutePosition.y + tapTarget.target.layout.height / 2
9079
+ tapTarget.target.absolutePosition.y + tapTarget.target.layout.height / 2,
9080
+ captureToken
9072
9081
  );
9073
9082
  },
9074
9083
  async pinch(scale, speed = "fast", angle = 0) {
@@ -10002,15 +10011,15 @@ var device = {
10002
10011
  ready: false
10003
10012
  };
10004
10013
  registry[input.token] = state;
10005
- window.__sootsimAnchorTimedInput = () => {
10014
+ window.__sootsimAnchorTimedInput = (token2) => {
10015
+ const capture = registry[token2];
10016
+ if (!capture) return;
10017
+ if (!capture.anchorOnInput || !capture.ready) return;
10018
+ if (capture.anchorPerformanceMs !== null) return;
10006
10019
  const anchorPerformanceMs = performance.now();
10007
10020
  const anchorWallMs = Date.now();
10008
- for (const capture of Object.values(registry)) {
10009
- if (!capture.anchorOnInput || !capture.ready) continue;
10010
- if (capture.anchorPerformanceMs !== null) continue;
10011
- capture.anchorPerformanceMs = anchorPerformanceMs;
10012
- capture.anchorWallMs = anchorWallMs;
10013
- }
10021
+ capture.anchorPerformanceMs = anchorPerformanceMs;
10022
+ capture.anchorWallMs = anchorWallMs;
10014
10023
  };
10015
10024
  if (!input.skipWarmup) {
10016
10025
  await screenshot({ format: "png" });
@@ -10124,7 +10133,12 @@ var device = {
10124
10133
  let captureAnchorMs;
10125
10134
  if (anchorOnInput) {
10126
10135
  triggerStartMs = Date.now();
10127
- await Promise.resolve(options.trigger());
10136
+ page.__sootsimCaptureToken = token;
10137
+ try {
10138
+ await Promise.resolve(options.trigger());
10139
+ } finally {
10140
+ delete page.__sootsimCaptureToken;
10141
+ }
10128
10142
  triggerCompletedMs = Date.now();
10129
10143
  const unanchored = await page.evaluate(
10130
10144
  (captureToken) => window.__sootsimTimedCaptures?.[captureToken]?.anchorWallMs === null,
@@ -10275,21 +10289,25 @@ var device = {
10275
10289
  if (point == null || typeof point === "boolean") return;
10276
10290
  const page = getPage();
10277
10291
  const { x, y } = point;
10292
+ const captureToken = page.__sootsimCaptureToken;
10278
10293
  await page.evaluate(
10279
- async ({ x: tx, y: ty }) => {
10294
+ async ({ x: tx, y: ty, token }) => {
10280
10295
  const interactTap = window.SootSim?.bridges?.interact?.tap;
10281
- window.__sootsimAnchorTimedInput?.();
10282
10296
  if (typeof interactTap === "function") {
10283
10297
  const result = await interactTap(tx, ty);
10284
- if (result && (typeof result !== "object" || result.hit !== false)) return;
10298
+ if (result && (typeof result !== "object" || result.hit !== false)) {
10299
+ if (token) window.__sootsimAnchorTimedInput?.(token);
10300
+ return;
10301
+ }
10285
10302
  }
10286
10303
  const tap = window.__sootsimTest?.tap;
10287
10304
  if (typeof tap !== "function") {
10288
10305
  throw new Error("sootsim tap bridge is not installed");
10289
10306
  }
10290
10307
  await tap(tx, ty);
10308
+ if (token) window.__sootsimAnchorTimedInput?.(token);
10291
10309
  },
10292
- { x, y }
10310
+ { x, y, token: captureToken }
10293
10311
  );
10294
10312
  await page.waitForTimeout(50);
10295
10313
  if (_synchronizationEnabled) {
@@ -10301,19 +10319,20 @@ var device = {
10301
10319
  async longPress(point, durationMs = 1e3) {
10302
10320
  const page = getPage();
10303
10321
  const { x, y } = point;
10322
+ const captureToken = page.__sootsimCaptureToken;
10304
10323
  await page.evaluate(
10305
- async ({ x: px, y: py, ms }) => {
10324
+ async ({ x: px, y: py, ms, token }) => {
10306
10325
  const longPress = window.SootSim?.bridges?.interact?.longPress;
10307
10326
  if (typeof longPress !== "function") {
10308
10327
  throw new Error("sootsim longPress bridge is not installed");
10309
10328
  }
10310
- window.__sootsimAnchorTimedInput?.();
10311
10329
  const hit = await longPress(px, py, ms);
10312
10330
  if (!hit) {
10313
10331
  throw new Error(`sootsim longPress missed at ${px},${py}`);
10314
10332
  }
10333
+ if (token) window.__sootsimAnchorTimedInput?.(token);
10315
10334
  },
10316
- { x, y, ms: durationMs }
10335
+ { x, y, ms: durationMs, token: captureToken }
10317
10336
  );
10318
10337
  await page.waitForTimeout(50);
10319
10338
  if (_synchronizationEnabled) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/expoSwiftContract.ts
4
4
  function record(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2470,6 +2470,10 @@ function getDevice(model, posture, orientation, landscapeSide) {
2470
2470
  // below to the app across the whole window and none above it
2471
2471
  // (plans/contrast/duo-platform.md)
2472
2472
  systemTopEdgeHeight: 20,
2473
+ // reservedRegions' system-control occlusion on the ios 27.1 duo
2474
+ // simulator's open display; taps at x 900, y 10..60 never reach the app
2475
+ // and y 130 does (plans/contrast/duo-platform.md)
2476
+ systemControlRegion: isRotatedPortrait ? { x: 585, y: 0, width: 84, height: 120 } : { x: 867, y: 0, width: 84, height: 120 },
2473
2477
  orientation: resolvedOrientation,
2474
2478
  // open inner display in landscape carries the same trailing column as
2475
2479
  // the closed outer display, so it takes the same 84pt inset: a ~50pt
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_NATIVE_USER_AGENT_HEADER = "x-sootsim-native-user-agent";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-app-identity.ts
4
4
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-firebase-metadata.ts
4
4
  var PREFIX = "globalThis.__peachNativeFirebaseConfig=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -41571,6 +41571,10 @@ function getDevice(model, posture, orientation, landscapeSide) {
41571
41571
  // below to the app across the whole window and none above it
41572
41572
  // (plans/contrast/duo-platform.md)
41573
41573
  systemTopEdgeHeight: 20,
41574
+ // reservedRegions' system-control occlusion on the ios 27.1 duo
41575
+ // simulator's open display; taps at x 900, y 10..60 never reach the app
41576
+ // and y 130 does (plans/contrast/duo-platform.md)
41577
+ systemControlRegion: isRotatedPortrait ? { x: 585, y: 0, width: 84, height: 120 } : { x: 867, y: 0, width: 84, height: 120 },
41574
41578
  orientation: resolvedOrientation,
41575
41579
  // open inner display in landscape carries the same trailing column as
41576
41580
  // the closed outer display, so it takes the same 84pt inset: a ~50pt
@@ -53974,6 +53978,8 @@ async function buildShellUrl(target, baseUrl = resolveDefaultShellBaseUrl(), opt
53974
53978
  project
53975
53979
  );
53976
53980
  const expoStamped = new URL(stamped);
53981
+ if (opts.bundleOriginOverride)
53982
+ expoStamped.searchParams.set("bundleOriginOverride", opts.bundleOriginOverride);
53977
53983
  if (opts.hostDriver) expoStamped.searchParams.set("peachHostDriver", opts.hostDriver);
53978
53984
  if (expoRoot) {
53979
53985
  const world = resolveBridgeWorld();
@@ -54416,6 +54422,7 @@ async function runOpenCommand(args, opts = {}) {
54416
54422
  ],
54417
54423
  stripValueFlags: [
54418
54424
  "--base-url",
54425
+ "--bundle-origin",
54419
54426
  "--replace",
54420
54427
  "--driver",
54421
54428
  "--profile",
@@ -54636,6 +54643,7 @@ async function runOpenCommand(args, opts = {}) {
54636
54643
  }
54637
54644
  }
54638
54645
  const buildShellUrlOpts = {
54646
+ bundleOriginOverride: args.find((_, i) => args[i - 1] === "--bundle-origin"),
54639
54647
  hot: hotMode,
54640
54648
  hostDriver: driverId === "desktop" ? "desktop" : void 0,
54641
54649
  device: deviceArg,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-compile.ts
4
4
  import { execFile as execFile2, execFileSync } from "node:child_process";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-package.ts
4
4
  function isSwiftManifestFile(file) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } 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.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.836 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.838 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/worklet-executable.ts
4
4
  import { parse } from "acorn";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peachsim",
3
- "version": "0.1.836",
3
+ "version": "0.1.838",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for peach.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",