peachsim 0.1.627 → 0.1.629

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 (94) hide show
  1. package/LICENSE +1 -1
  2. package/cli/bin.ts +6 -2
  3. package/cli/bridge-flow-runner.ts +79 -72
  4. package/cli/commands/cleanup.ts +6 -6
  5. package/cli/commands/control.ts +4 -5
  6. package/cli/commands/detox.ts +25 -11
  7. package/cli/commands/flow.ts +3 -2
  8. package/cli/commands/inspect/core.ts +5 -0
  9. package/cli/commands/inspect.ts +43 -49
  10. package/cli/commands/mode.ts +11 -7
  11. package/cli/commands/report-issue.ts +1 -1
  12. package/cli/commands/setup.ts +16 -11
  13. package/cli/commands/show-touches-mode.ts +33 -0
  14. package/cli/commands/skills.ts +16 -0
  15. package/cli/commands/test.ts +8 -1
  16. package/cli/commands/welcome.ts +3 -3
  17. package/cli/drivers/playwright-sim-host.ts +6 -5
  18. package/cli/help-core.ts +9 -4
  19. package/cli/internal-child.ts +14 -2
  20. package/cli/levenshtein.ts +27 -0
  21. package/cli/main.ts +28 -18
  22. package/cli/ws-bridge.ts +3 -2
  23. package/detox/index.ts +234 -7
  24. package/dist-lib/agent-daemon-client.cjs +1 -1
  25. package/dist-lib/agent-events.cjs +1 -1
  26. package/dist-lib/agent-identity.cjs +1 -1
  27. package/dist-lib/agent-sessions.cjs +1 -1
  28. package/dist-lib/attached-projects.cjs +1 -1
  29. package/dist-lib/auth/shared-session.cjs +1 -1
  30. package/dist-lib/backend-origin.cjs +1 -1
  31. package/dist-lib/beta.cjs +1 -1
  32. package/dist-lib/beta.mjs +1 -1
  33. package/dist-lib/bridge-constants.cjs +1 -1
  34. package/dist-lib/bridge-contract-input.cjs +1 -1
  35. package/dist-lib/bridge-contract-input.mjs +1 -1
  36. package/dist-lib/bridge-contract.cjs +1 -1
  37. package/dist-lib/bridge-contract.mjs +1 -1
  38. package/dist-lib/capture-contract.cjs +1 -1
  39. package/dist-lib/capture-contract.mjs +1 -1
  40. package/dist-lib/cli-constants.cjs +1 -1
  41. package/dist-lib/cloud-contract.cjs +1 -1
  42. package/dist-lib/cloud-contract.mjs +1 -1
  43. package/dist-lib/cloud-test-args.cjs +1 -1
  44. package/dist-lib/cloud-test-args.mjs +1 -1
  45. package/dist-lib/cloud.cjs +1 -1
  46. package/dist-lib/cloud.mjs +1 -1
  47. package/dist-lib/config.cjs +1 -1
  48. package/dist-lib/detox/index.cjs +170 -13
  49. package/dist-lib/dev-bundle-resolution.cjs +2 -2
  50. package/dist-lib/home-paths.cjs +1 -1
  51. package/dist-lib/host/bridge-host.cjs +57 -97
  52. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  53. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  54. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  55. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  56. package/dist-lib/host/websocket-proxy.cjs +1 -1
  57. package/dist-lib/index.cjs +44 -5
  58. package/dist-lib/jump-to-source-babel.cjs +1 -1
  59. package/dist-lib/jump-to-source-native.cjs +1 -1
  60. package/dist-lib/menu.cjs +7 -1
  61. package/dist-lib/menu.mjs +7 -1
  62. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  63. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  64. package/dist-lib/metro-production-bundle.cjs +1 -1
  65. package/dist-lib/metro-production-bundle.mjs +1 -1
  66. package/dist-lib/metro.cjs +43 -4
  67. package/dist-lib/profiles.cjs +1 -1
  68. package/dist-lib/public-brand.cjs +1 -1
  69. package/dist-lib/react-native-host-modules.cjs +1 -1
  70. package/dist-lib/react-native-host-modules.mjs +1 -1
  71. package/dist-lib/render-mode.cjs +1 -1
  72. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  73. package/dist-lib/sdk.cjs +1 -1
  74. package/dist-lib/sdk.mjs +1 -1
  75. package/dist-lib/skills.cjs +159 -210
  76. package/dist-lib/swift-compile.cjs +1 -1
  77. package/dist-lib/swift-compile.mjs +1 -1
  78. package/dist-lib/swift-package.cjs +1 -1
  79. package/dist-lib/swift-package.mjs +1 -1
  80. package/dist-lib/swift-submit.cjs +1 -1
  81. package/dist-lib/swift-submit.mjs +1 -1
  82. package/dist-lib/swift.cjs +7276 -7131
  83. package/dist-lib/vite-kotlin.cjs +1 -1
  84. package/dist-lib/vite-swift.cjs +1 -1
  85. package/dist-lib/vite.cjs +43 -4
  86. package/package.json +1 -1
  87. package/skills/contrast/SKILL.md +1 -1
  88. package/src/dev-bundle-resolution.ts +1 -1
  89. package/src/host/bridge-host.ts +2 -34
  90. package/src/menu.ts +7 -0
  91. package/src/native-seam-manifest.ts +4 -16
  92. package/src/runtime-assets.ts +59 -2
  93. package/src/screenshots/frame-compose.ts +4 -1
  94. package/src/vite-plugin.ts +723 -25
package/detox/index.ts CHANGED
@@ -369,6 +369,52 @@ function reapOwnedBrowser(): void {
369
369
  } catch {}
370
370
  }
371
371
 
372
+ // an open picture-in-picture window keeps the browser context alive and
373
+ // context.close() never settles (expo-pip has no exit api, and the OS
374
+ // window outlives its video element). exit PiP in every page first; the
375
+ // page's leavepictureinpicture handler stops the capture tracks and
376
+ // removes the video. bounded and best-effort so a wedged page cannot eat
377
+ // the close budget.
378
+ const CONTEXT_MEDIA_QUIESCE_TIMEOUT_MS = 2_500
379
+
380
+ async function quiesceContextMedia(context: BrowserContext): Promise<void> {
381
+ const pages = context.pages()
382
+ if (pages.length === 0) return
383
+ const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
384
+ await Promise.race([
385
+ Promise.all(
386
+ pages.map((page) =>
387
+ page
388
+ .evaluate(() => {
389
+ const doc = globalThis.document
390
+ if (!doc) return
391
+ if (
392
+ doc.pictureInPictureElement &&
393
+ typeof doc.exitPictureInPicture === 'function'
394
+ ) {
395
+ void doc.exitPictureInPicture().catch(() => {})
396
+ }
397
+ doc.querySelectorAll('video').forEach((v) => {
398
+ try {
399
+ if (
400
+ v.srcObject &&
401
+ typeof (v.srcObject as MediaStream).getTracks === 'function'
402
+ ) {
403
+ ;(v.srcObject as MediaStream).getTracks().forEach((t) => t.stop())
404
+ v.srcObject = null
405
+ }
406
+ v.pause()
407
+ v.remove()
408
+ } catch {}
409
+ })
410
+ })
411
+ .catch(() => {}),
412
+ ),
413
+ ),
414
+ sleep(CONTEXT_MEDIA_QUIESCE_TIMEOUT_MS),
415
+ ]).catch(() => {})
416
+ }
417
+
372
418
  async function closeContext() {
373
419
  if (_browserCompromised) {
374
420
  throw new Error(`sootsim browser is compromised: ${_browserCompromised}`)
@@ -377,6 +423,7 @@ async function closeContext() {
377
423
  const context = _context
378
424
  const closingContextId = contextIdentity
379
425
  try {
426
+ await quiesceContextMedia(context)
380
427
  await withLifecycleTimeout('context.close()', closingContextId, () => context.close())
381
428
  _context = null
382
429
  _page = null
@@ -715,7 +762,9 @@ async function focusElementForTextEntry(el: SootSimElement): Promise<void> {
715
762
  // would edit around a caret the tap then moves, so wait for its focus.
716
763
  await pollUntil(
717
764
  () =>
718
- page.evaluate(async () => (await window.__sootsimTest!.getFocusedNode?.())?.nodeId ?? null),
765
+ page.evaluate(
766
+ async () => (await window.__sootsimTest!.getFocusedNode?.())?.nodeId ?? null,
767
+ ),
719
768
  (focusedNodeId) => focusedNodeId === node.nodeId,
720
769
  {
721
770
  timeoutMs: 5000,
@@ -1535,6 +1584,14 @@ function createSootSimElement(matcher: Matcher): SootSimElement {
1535
1584
  visible: node.layout.width > 0 && node.layout.height > 0,
1536
1585
  enabled: !node.accessibilityState?.disabled,
1537
1586
  ...node,
1587
+ frame: node.absolutePosition
1588
+ ? {
1589
+ x: node.absolutePosition.x,
1590
+ y: node.absolutePosition.y,
1591
+ width: node.absolutePosition.width ?? node.frame?.width ?? 0,
1592
+ height: node.absolutePosition.height ?? node.frame?.height ?? 0,
1593
+ }
1594
+ : node.frame,
1538
1595
  }
1539
1596
  },
1540
1597
 
@@ -1552,6 +1609,131 @@ export function element(matcher: Matcher): SootSimElement {
1552
1609
  }
1553
1610
 
1554
1611
  // device object -- app lifecycle
1612
+ export interface DetoxUserNotificationParams {
1613
+ trigger: {
1614
+ type: string
1615
+ [key: string]: unknown
1616
+ }
1617
+ title?: unknown
1618
+ subtitle?: unknown
1619
+ body?: unknown
1620
+ badge?: unknown
1621
+ category?: unknown
1622
+ 'content-available'?: unknown
1623
+ payload?: Record<string, unknown>
1624
+ 'user-text'?: unknown
1625
+ 'action-identifier'?: unknown
1626
+ [key: string]: unknown
1627
+ }
1628
+
1629
+ // detox's documented sendUserNotification data, converted the way detox ios
1630
+ // builds it (DetoxUserNotificationDispatcher.payload): the user info is the
1631
+ // custom `payload`, with the top-level title, subtitle, and body written into
1632
+ // its aps alert and badge, category, and content-available written into its
1633
+ // aps. a top-level key that is absent removes the payload's own value, as
1634
+ // assigning nil to a swift dictionary does; every other aps key survives.
1635
+ function detoxNotificationToApnsPayload(params: DetoxUserNotificationParams): {
1636
+ payload: Record<string, unknown>
1637
+ actionId?: string
1638
+ userText?: string
1639
+ } {
1640
+ const trigger = objectOrEmpty(objectOrEmpty(params).trigger)
1641
+ const supported = ['push', 'calendar', 'location', 'timeInterval']
1642
+ if (typeof trigger.type !== 'string' || !supported.includes(trigger.type)) {
1643
+ throw new Error(
1644
+ `Missing trigger or invalid trigger type. A 'trigger' key must exist, with one of the following types: '${supported.join("', '")}'`,
1645
+ )
1646
+ }
1647
+ if (trigger.type !== 'push') {
1648
+ throw new Error(
1649
+ `sootsim device.sendUserNotification: trigger type '${trigger.type}' is not simulated, only 'push'`,
1650
+ )
1651
+ }
1652
+ const assign = (record: Record<string, unknown>, key: string, value: unknown) => {
1653
+ if (value === undefined) delete record[key]
1654
+ else record[key] = value
1655
+ }
1656
+ const payload = { ...objectOrEmpty(params.payload) }
1657
+ const aps = { ...objectOrEmpty(payload.aps) }
1658
+ const alert = { ...objectOrEmpty(aps.alert) }
1659
+ assign(alert, 'title', params.title)
1660
+ assign(alert, 'subtitle', params.subtitle)
1661
+ assign(alert, 'body', params.body)
1662
+ aps.alert = alert
1663
+ assign(aps, 'badge', params.badge)
1664
+ assign(aps, 'category', params.category)
1665
+ assign(aps, 'content-available', params['content-available'])
1666
+ payload.aps = aps
1667
+ return {
1668
+ payload,
1669
+ actionId:
1670
+ typeof params['action-identifier'] === 'string'
1671
+ ? params['action-identifier']
1672
+ : undefined,
1673
+ userText: typeof params['user-text'] === 'string' ? params['user-text'] : undefined,
1674
+ }
1675
+ }
1676
+
1677
+ function objectOrEmpty(value: unknown): Record<string, unknown> {
1678
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
1679
+ ? { ...value }
1680
+ : {}
1681
+ }
1682
+
1683
+ interface PreparedRemotePush {
1684
+ payload: Record<string, unknown>
1685
+ actionId?: string
1686
+ userText?: string
1687
+ }
1688
+
1689
+ async function postPreparedRemotePush(
1690
+ prepared: PreparedRemotePush,
1691
+ launch: boolean,
1692
+ ): Promise<void> {
1693
+ const { payload, actionId, userText } = prepared
1694
+ const page = getPage()
1695
+ await page.evaluate(
1696
+ ({ request }) => {
1697
+ const bridges = (
1698
+ window as unknown as {
1699
+ SootSim?: {
1700
+ bridges?: {
1701
+ shellHost?: { postNativeUIRequest?: (request: unknown) => unknown }
1702
+ }
1703
+ }
1704
+ }
1705
+ ).SootSim?.bridges
1706
+ // the shell host queues requests until the shell worker connects, so a
1707
+ // post here never silently drops. (mainShell.postNativeUIRequest would
1708
+ // swallow a not-yet-connected shell and report success.)
1709
+ const target = bridges?.shellHost
1710
+ const post = target?.postNativeUIRequest
1711
+ if (typeof post !== 'function') {
1712
+ throw new Error(
1713
+ 'sootsim device.sendUserNotification: simulator shell unavailable — call device.launchApp() first',
1714
+ )
1715
+ }
1716
+ post.call(target, request)
1717
+ },
1718
+ {
1719
+ request: {
1720
+ kind: 'notification.remote-push',
1721
+ payload,
1722
+ launch,
1723
+ ...(actionId !== undefined ? { actionId } : {}),
1724
+ ...(userText !== undefined ? { userText } : {}),
1725
+ },
1726
+ },
1727
+ )
1728
+ }
1729
+
1730
+ async function postRemotePushToSimulator(
1731
+ params: DetoxUserNotificationParams,
1732
+ launch: boolean,
1733
+ ): Promise<void> {
1734
+ await postPreparedRemotePush(detoxNotificationToApnsPayload(params), launch)
1735
+ }
1736
+
1555
1737
  export const device = {
1556
1738
  _currentUrl: '',
1557
1739
  _platform: DETOX_PLATFORM as 'ios' | 'android',
@@ -1561,6 +1743,9 @@ export const device = {
1561
1743
  newInstance?: boolean
1562
1744
  url?: string
1563
1745
  launchArgs?: Record<string, any>
1746
+ // launch from a notification, like detox launchApp({ userNotification }):
1747
+ // dispatched during launch, so the app receives its tap response.
1748
+ userNotification?: DetoxUserNotificationParams
1564
1749
  // when set, the new BrowserContext records video at this dir. used by
1565
1750
  // captureProofMenuStages for the multi-stage animation diff path. must
1566
1751
  // be set at launchApp time because playwright recordVideo can't be
@@ -1601,6 +1786,9 @@ export const device = {
1601
1786
  )
1602
1787
  _suspendedAppId = null
1603
1788
  await waitForSootsimTree(page, 10000)
1789
+ if (opts?.userNotification) {
1790
+ await postRemotePushToSimulator(opts.userNotification, true)
1791
+ }
1604
1792
  return
1605
1793
  }
1606
1794
 
@@ -1649,16 +1837,17 @@ export const device = {
1649
1837
  const request = readBrowserCompositeCaptureRequest(value)
1650
1838
  const session = await source.page.context().newCDPSession(source.page)
1651
1839
  try {
1840
+ const { clip, originX, originY } = resolveBrowserCompositeCdpClip(
1841
+ request,
1842
+ await session.send('Page.getLayoutMetrics'),
1843
+ )
1652
1844
  const result = await session.send('Page.captureScreenshot', {
1653
1845
  format: 'png',
1654
1846
  fromSurface: true,
1655
1847
  captureBeyondViewport: true,
1656
- clip: resolveBrowserCompositeCdpClip(
1657
- request,
1658
- await session.send('Page.getLayoutMetrics'),
1659
- ),
1848
+ clip,
1660
1849
  })
1661
- return 'data:image/png;base64,' + result.data
1850
+ return { dataUrl: 'data:image/png;base64,' + result.data, originX, originY }
1662
1851
  } finally {
1663
1852
  await session.detach()
1664
1853
  }
@@ -1683,6 +1872,25 @@ export const device = {
1683
1872
  operation: 'launchApp',
1684
1873
  })
1685
1874
 
1875
+ if (opts?.userNotification) {
1876
+ // detox dispatches the launch notification before the app's js runs.
1877
+ // the shell and tenant channels queue it until they connect, so it is
1878
+ // posted once, as soon as the shell accepts requests.
1879
+ const prepared = detoxNotificationToApnsPayload(opts.userNotification)
1880
+ await pollUntil(
1881
+ () =>
1882
+ postPreparedRemotePush(prepared, true).then(
1883
+ () => true,
1884
+ () => false,
1885
+ ),
1886
+ Boolean,
1887
+ {
1888
+ timeoutMs: 60000,
1889
+ label: 'SootSim shell to accept launch notification',
1890
+ },
1891
+ )
1892
+ }
1893
+
1686
1894
  await waitForSootsimTree(_page!, 30000)
1687
1895
  await waitForSootsimSurfaceMetrics(_page!, 30000)
1688
1896
  await waitForSootsimShellReady(_page!, 30000)
@@ -1728,6 +1936,13 @@ export const device = {
1728
1936
  await waitForSootsimWorkletsIdle(page, 3000)
1729
1937
  },
1730
1938
 
1939
+ // detox device.sendUserNotification on ios: the notification goes straight
1940
+ // to the app's notification center delegate. an active app gets willPresent;
1941
+ // otherwise the app gets the tap response.
1942
+ async sendUserNotification(params: DetoxUserNotificationParams) {
1943
+ await postRemotePushToSimulator(params, false)
1944
+ },
1945
+
1731
1946
  async takeScreenshot(name: string): Promise<string> {
1732
1947
  return writeSootsimScreenshot(name)
1733
1948
  },
@@ -2832,8 +3047,20 @@ export const device = {
2832
3047
  // no-op for sootsim
2833
3048
  },
2834
3049
 
3050
+ // set the simulated device location at the platform level, the same step
3051
+ // native detox's setLocation takes: on iOS it drives the simulator location
3052
+ // (AppleSimUtils/simctl location set) and CLLocationManager delivers the fix
3053
+ // asynchronously. here the platform is the harness browser, so grant page
3054
+ // geolocation and override the context fix; the guest location seam observes
3055
+ // it through navigator.geolocation exactly like the app observes Core
3056
+ // Location. app permission state is untouched, matching native.
2835
3057
  async setLocation(lat: number, lon: number) {
2836
- // no-op
3058
+ const page = getPage()
3059
+ const context = _context ?? page.context()
3060
+ await context.grantPermissions(['geolocation'], {
3061
+ origin: new URL(page.url()).origin,
3062
+ })
3063
+ await context.setGeolocation({ latitude: lat, longitude: lon })
2837
3064
  },
2838
3065
 
2839
3066
  async setStatusBar(config: StatusBarConfig) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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.627 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.629 | (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;