peachsim 0.1.637 → 0.1.639

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/README.md +8 -5
  2. package/cli/bridge-flow-runner.ts +442 -14
  3. package/cli/command-registry.ts +1 -0
  4. package/cli/commands/control.ts +42 -5
  5. package/cli/commands/inspect/core.ts +93 -24
  6. package/cli/commands/maestro.ts +2 -2
  7. package/cli/commands/serve.ts +13 -1
  8. package/cli/commands/swift.ts +326 -0
  9. package/cli/drivers/playwright-provisioning.ts +8 -16
  10. package/cli/drivers/playwright-sim-host.ts +3 -0
  11. package/cli/drivers/playwright.ts +1 -0
  12. package/cli/internal-child.ts +51 -8
  13. package/cli/main.ts +11 -0
  14. package/cli/outbound-endpoints.ts +5 -1
  15. package/dist-lib/agent-daemon-client.cjs +1 -1
  16. package/dist-lib/agent-events.cjs +1 -1
  17. package/dist-lib/agent-identity.cjs +1 -1
  18. package/dist-lib/agent-sessions.cjs +1 -1
  19. package/dist-lib/attached-projects.cjs +1 -1
  20. package/dist-lib/auth/shared-session.cjs +1 -1
  21. package/dist-lib/backend-origin.cjs +1 -1
  22. package/dist-lib/beta.cjs +1 -1
  23. package/dist-lib/beta.mjs +1 -1
  24. package/dist-lib/bridge-constants.cjs +1 -1
  25. package/dist-lib/bridge-contract-input.cjs +3 -2
  26. package/dist-lib/bridge-contract-input.mjs +3 -2
  27. package/dist-lib/bridge-contract.cjs +1 -1
  28. package/dist-lib/bridge-contract.mjs +1 -1
  29. package/dist-lib/capture-contract.cjs +1 -1
  30. package/dist-lib/capture-contract.mjs +1 -1
  31. package/dist-lib/cli-constants.cjs +1 -1
  32. package/dist-lib/cloud-contract.cjs +1 -1
  33. package/dist-lib/cloud-contract.mjs +1 -1
  34. package/dist-lib/cloud-test-args.cjs +1 -1
  35. package/dist-lib/cloud-test-args.mjs +1 -1
  36. package/dist-lib/cloud.cjs +1 -1
  37. package/dist-lib/cloud.mjs +1 -1
  38. package/dist-lib/config.cjs +1 -1
  39. package/dist-lib/detox/index.cjs +1 -1
  40. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  41. package/dist-lib/home-paths.cjs +1 -1
  42. package/dist-lib/host/bridge-host.cjs +4 -2
  43. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  44. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  45. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  46. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  47. package/dist-lib/host/websocket-proxy.cjs +1 -1
  48. package/dist-lib/index.cjs +88 -23
  49. package/dist-lib/jump-to-source-babel.cjs +1 -1
  50. package/dist-lib/jump-to-source-native.cjs +1 -1
  51. package/dist-lib/kotlin-host.cjs +1 -1
  52. package/dist-lib/menu.cjs +1 -1
  53. package/dist-lib/menu.mjs +1 -1
  54. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  55. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  56. package/dist-lib/metro-production-bundle.cjs +1 -1
  57. package/dist-lib/metro-production-bundle.mjs +1 -1
  58. package/dist-lib/metro.cjs +1 -1
  59. package/dist-lib/native-app-identity.cjs +1 -1
  60. package/dist-lib/native-app-identity.mjs +1 -1
  61. package/dist-lib/profiles.cjs +1 -1
  62. package/dist-lib/public-brand.cjs +1 -1
  63. package/dist-lib/react-native-host-modules.cjs +1 -1
  64. package/dist-lib/react-native-host-modules.mjs +1 -1
  65. package/dist-lib/render-mode.cjs +1 -1
  66. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  67. package/dist-lib/sdk.cjs +78 -20
  68. package/dist-lib/sdk.mjs +77 -20
  69. package/dist-lib/skills.cjs +441 -94
  70. package/dist-lib/swift-compile.cjs +89 -7
  71. package/dist-lib/swift-compile.mjs +89 -7
  72. package/dist-lib/swift-package.cjs +1 -1
  73. package/dist-lib/swift-package.mjs +1 -1
  74. package/dist-lib/swift-submit.cjs +89 -8
  75. package/dist-lib/swift-submit.mjs +78 -8
  76. package/dist-lib/swift.cjs +16 -33220
  77. package/dist-lib/vite-swift.cjs +510 -253
  78. package/dist-lib/vite.cjs +13 -4
  79. package/package.json +1 -1
  80. package/skills/contrast/SKILL.md +1 -0
  81. package/src/assetCatalogContract.ts +16 -0
  82. package/src/bridge-contract-input.ts +3 -2
  83. package/src/bridge-contract.ts +8 -0
  84. package/src/host/bridge-host.ts +5 -5
  85. package/src/metro-runtime-source.ts +15 -0
  86. package/src/native-seam-manifest.ts +4 -6
  87. package/src/swift-compile.ts +105 -9
  88. package/src/swift-guest.ts +51 -0
  89. package/src/swift-host.ts +900 -0
  90. package/src/swift-submit.ts +97 -6
  91. package/src/swift.ts +36 -8
  92. package/src/swiftContract.ts +52 -0
  93. package/src/vite-plugin-one.ts +4 -3
  94. package/src/vite-plugin-swift.ts +43 -755
@@ -12,8 +12,9 @@
12
12
  // the same path. bin.ts dispatches here straight from argv, before any CLI
13
13
  // startup work, which keeps a per-request worker (sync-http) cheap.
14
14
 
15
- import { existsSync, writeFileSync } from 'node:fs'
15
+ import { accessSync, constants, existsSync, readdirSync, writeFileSync } from 'node:fs'
16
16
  import { createRequire } from 'node:module'
17
+ import { basename, dirname, join, relative, resolve } from 'node:path'
17
18
  import * as vm from 'node:vm'
18
19
 
19
20
  export const RNX_INTERNAL_COMMAND = '__internal'
@@ -88,8 +89,8 @@ export async function runInternalChild(args: string[]): Promise<void> {
88
89
  // own work does.
89
90
  }
90
91
 
91
- /** report where the resolved playwright package expects its chromium and
92
- * whether that file is there. a separate process so the caller's environment
92
+ /** select an explicit executable or the newest installed chromium in the
93
+ * resolved package's cache. a separate process so the caller's environment
93
94
  * snapshot — PLAYWRIGHT_BROWSERS_PATH above all — is the only browser cache
94
95
  * this ever sees. */
95
96
  function playwrightProbe(): ChildReply {
@@ -100,19 +101,61 @@ function playwrightProbe(): ChildReply {
100
101
  if (!isRecord(chromium) || typeof chromium.executablePath !== 'function') {
101
102
  throw new Error('resolved package does not expose browser "chromium"')
102
103
  }
103
- const executablePath: unknown = chromium.executablePath()
104
- if (typeof executablePath !== 'string') {
104
+ const expectedPath: unknown = chromium.executablePath()
105
+ if (typeof expectedPath !== 'string') {
105
106
  throw new Error('browser "chromium" reported no executable path')
106
107
  }
108
+ let executablePath = expectedPath
109
+ const override = process.env.PEACH_CHROMIUM_EXECUTABLE
110
+ if (override) {
111
+ executablePath = resolve(override)
112
+ accessSync(executablePath, constants.X_OK)
113
+ } else {
114
+ // use full chromium for both headed and headless launches. selecting it
115
+ // explicitly also avoids a second, revision-pinned headless-shell lookup.
116
+ let browserDir = dirname(expectedPath)
117
+ while (!/^chromium-\d+$/.test(basename(browserDir))) {
118
+ const parent = dirname(browserDir)
119
+ if (parent === browserDir) throw new Error('unexpected chromium cache layout')
120
+ browserDir = parent
121
+ }
122
+ const cacheDir = dirname(browserDir)
123
+ const binaryPath = relative(browserDir, expectedPath)
124
+ const revisions = existsSync(cacheDir)
125
+ ? readdirSync(cacheDir)
126
+ .filter((name) => /^chromium-\d+$/.test(name))
127
+ .sort((a, b) => Number(b.slice(9)) - Number(a.slice(9)))
128
+ : []
129
+ for (const revision of revisions) {
130
+ // chromium switched its linux archive directory to chrome-linux64.
131
+ const paths =
132
+ process.platform === 'linux'
133
+ ? ['chrome-linux64/chrome', 'chrome-linux/chrome']
134
+ : [binaryPath]
135
+ const installed = paths
136
+ .map((path) => join(cacheDir, revision, path))
137
+ .find((path) => {
138
+ try {
139
+ accessSync(path, constants.X_OK)
140
+ return true
141
+ } catch {
142
+ return false
143
+ }
144
+ })
145
+ if (installed) {
146
+ executablePath = installed
147
+ break
148
+ }
149
+ }
150
+ }
107
151
  return {
108
152
  stdout: JSON.stringify({ executablePath, exists: existsSync(executablePath) }),
109
153
  code: 0,
110
154
  }
111
155
  }
112
156
 
113
- /** run playwright's own CLI entry, the only thing allowed to install the
114
- * browser revision its API named. argv is shaped the way that CLI's argument
115
- * parser expects to receive it from node. it owns this process from here:
157
+ /** run the resolved playwright core's absolute CLI entry. argv is shaped the
158
+ * way its parser expects to receive it from node. it owns this process from here:
116
159
  * it sets the exit code and may exit outright. */
117
160
  function playwrightInstall(args: string[]): void {
118
161
  const [cliPath, ...cliArgs] = args
package/cli/main.ts CHANGED
@@ -551,6 +551,17 @@ try {
551
551
  }
552
552
  }
553
553
 
554
+ case 'swift': {
555
+ if (globalSimTarget) {
556
+ console.error(' peach swift owns a new preview and cannot target --sim')
557
+ await exitWithFlush(1)
558
+ }
559
+ const { runSwift } = await import('./commands/swift')
560
+ await exitWithFlush(
561
+ await runSwift(parsed.commandArgs, { port, device, driver, headless }),
562
+ )
563
+ }
564
+
554
565
  case 'preview': {
555
566
  const { runPreview } = await import('./commands/preview')
556
567
  await exitWithFlush(await runPreview(parsed.commandArgs))
@@ -124,7 +124,7 @@ export const OUTBOUND_ENDPOINTS: Record<string, OutboundEndpointDeclaration> = {
124
124
  'the origin already serving the app, or the absolute Contrast origin a node caller passes',
125
125
  preConsent: false,
126
126
  payload:
127
- 'the project .swift sources, packed bundle resources and images, plus the signed preview token or ccdn_ api key that authorizes the compile',
127
+ 'the selected project .swift sources, packed bundle resources and images, authorized with a preview token, stored session or API key; peach swift requires --upload-source for that root and its watched edits',
128
128
  },
129
129
  peach_cloud_sim: {
130
130
  category: 'explicit-user-action',
@@ -221,6 +221,10 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
221
221
  // compiling a project's .swift sources needs a swift toolchain, so the
222
222
  // bundler posts them to the app's own /api/swift-compile. it only fires with
223
223
  // a compile credential and only for a project that has .swift sources.
224
+ 'packages/peachsim/src/swift-host.ts :: fetch :: address.url': {
225
+ category: 'swift_compile',
226
+ count: 1,
227
+ },
224
228
  'packages/peachsim/src/swift-submit.ts :: fetch :: url': {
225
229
  category: 'swift_compile',
226
230
  count: 1,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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;
@@ -337,6 +337,7 @@ function parseSemanticQuery(value) {
337
337
  const query = recordValue(value, "query");
338
338
  const kind = stringValue(query.kind, "query.kind");
339
339
  if (kind === "count") return { kind };
340
+ if (kind === "accessibility") return { kind };
340
341
  if (kind === "tree") {
341
342
  const depth = optionalNumber(query, "depth", "query");
342
343
  return { kind, ...depth === void 0 ? {} : { depth } };
@@ -344,7 +345,7 @@ function parseSemanticQuery(value) {
344
345
  if (kind === "find") {
345
346
  return { kind, selector: parseSemanticSelector(query.selector, "query.selector") };
346
347
  }
347
- return validationFailure("query.kind", "must be tree, find, or count");
348
+ return validationFailure("query.kind", "must be tree, find, count, or accessibility");
348
349
  }
349
350
  function semanticResolveSelector(value, path) {
350
351
  const selector = recordValue(value, path);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -301,6 +301,7 @@ function parseSemanticQuery(value) {
301
301
  const query = recordValue(value, "query");
302
302
  const kind = stringValue(query.kind, "query.kind");
303
303
  if (kind === "count") return { kind };
304
+ if (kind === "accessibility") return { kind };
304
305
  if (kind === "tree") {
305
306
  const depth = optionalNumber(query, "depth", "query");
306
307
  return { kind, ...depth === void 0 ? {} : { depth } };
@@ -308,7 +309,7 @@ function parseSemanticQuery(value) {
308
309
  if (kind === "find") {
309
310
  return { kind, selector: parseSemanticSelector(query.selector, "query.selector") };
310
311
  }
311
- return validationFailure("query.kind", "must be tree, find, or count");
312
+ return validationFailure("query.kind", "must be tree, find, count, or accessibility");
312
313
  }
313
314
  function semanticResolveSelector(value, path) {
314
315
  const selector = recordValue(value, path);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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;
@@ -9497,6 +9497,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
9497
9497
  // terminal 4001 code, so the client closes the abandoned window instead
9498
9498
  // of reconnecting the zombie straight back in.
9499
9499
  static SIM_IDLE_REAP_TTL_MS = 30 * 6e4;
9500
+ bindHost;
9500
9501
  preferredPort;
9501
9502
  portFallbackCount;
9502
9503
  shouldWriteLockfile;
@@ -9530,6 +9531,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
9530
9531
  inflightScan = null;
9531
9532
  static SCAN_FRESH_MS = 2e3;
9532
9533
  constructor(opts = {}) {
9534
+ this.bindHost = opts.host ?? "127.0.0.1";
9533
9535
  this.preferredPort = opts.port ?? DEFAULT_SOOTSIM_BRIDGE_PORT;
9534
9536
  this.port = this.preferredPort;
9535
9537
  this.shouldWriteLockfile = opts.writeLockfile === true;
@@ -9606,7 +9608,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
9606
9608
  reject(err);
9607
9609
  };
9608
9610
  server.once("error", onError);
9609
- server.listen(port, "127.0.0.1", () => {
9611
+ server.listen(port, this.bindHost, () => {
9610
9612
  if (settled) return;
9611
9613
  const address = server.address();
9612
9614
  if (!address || typeof address === "string") {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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;
@@ -1780,33 +1780,89 @@ function layoutGetNativeEval(opts = {}) {
1780
1780
  })()`;
1781
1781
  }
1782
1782
  var LAYOUT_GET_NATIVE_EVAL = layoutGetNativeEval();
1783
+ function isPeachAccessibilityTree(value) {
1784
+ if (!Array.isArray(value)) return false;
1785
+ return value.every((node) => {
1786
+ if (node === null || typeof node !== "object") return false;
1787
+ if (Reflect.get(node, "platform") !== "ios" && Reflect.get(node, "platform") !== "android")
1788
+ return false;
1789
+ if (typeof Reflect.get(node, "elementId") !== "string") return false;
1790
+ if (!Number.isInteger(Reflect.get(node, "nodeId"))) return false;
1791
+ for (const key of ["type", "role"]) {
1792
+ if (typeof Reflect.get(node, key) !== "string") return false;
1793
+ }
1794
+ for (const key of ["testID", "label", "hint", "value", "placeholder"]) {
1795
+ const field = Reflect.get(node, key);
1796
+ if (field !== null && typeof field !== "string") return false;
1797
+ }
1798
+ for (const key of [
1799
+ "isAccessibilityElement",
1800
+ "enabled",
1801
+ "selected",
1802
+ "checked",
1803
+ "clickable",
1804
+ "isTextInput"
1805
+ ]) {
1806
+ if (typeof Reflect.get(node, key) !== "boolean") return false;
1807
+ }
1808
+ const hasFocus = Reflect.get(node, "hasFocus");
1809
+ if (hasFocus !== void 0 && typeof hasFocus !== "boolean") return false;
1810
+ const state = Reflect.get(node, "state");
1811
+ if (state !== null) {
1812
+ if (typeof state !== "object") return false;
1813
+ const checked = Reflect.get(state, "checked");
1814
+ if (typeof checked !== "boolean" && checked !== "mixed") return false;
1815
+ for (const key of ["disabled", "selected", "busy", "expanded"]) {
1816
+ if (typeof Reflect.get(state, key) !== "boolean") return false;
1817
+ }
1818
+ }
1819
+ const value2 = Reflect.get(node, "accessibilityValue");
1820
+ if (value2 !== null) {
1821
+ if (typeof value2 !== "object") return false;
1822
+ for (const key of ["min", "max", "now"]) {
1823
+ const field = Reflect.get(value2, key);
1824
+ if (field !== void 0 && (typeof field !== "number" || !Number.isFinite(field)))
1825
+ return false;
1826
+ }
1827
+ const text = Reflect.get(value2, "text");
1828
+ if (text !== void 0 && typeof text !== "string") return false;
1829
+ }
1830
+ if (!isSemanticGeometry(Reflect.get(node, "frame"))) return false;
1831
+ return isPeachAccessibilityTree(Reflect.get(node, "children"));
1832
+ });
1833
+ }
1783
1834
  async function inspectAccessibilityTree(bridge) {
1784
1835
  const result = await bridge.send({
1785
1836
  type: "query",
1786
- query: { kind: "find", selector: { visible: true } }
1837
+ query: { kind: "accessibility" }
1787
1838
  });
1788
- if (!isSemanticQueryResult(result)) return [];
1789
- return result.nodes.flatMap((node) => {
1790
- if (node.accessibilityHidden) return [];
1791
- if (!node.role && !node.label && !node.text && !node.pressable) return [];
1792
- return [
1793
- {
1794
- role: node.role ?? (node.pressable ? "button" : node.type === "text" ? "statictext" : "none"),
1795
- label: node.label ?? node.text ?? null,
1796
- hint: null,
1797
- state: null,
1798
- testID: node.testID ?? null,
1839
+ const tree = result !== null && typeof result === "object" ? Reflect.get(result, "accessibility") : void 0;
1840
+ if (!isPeachAccessibilityTree(tree))
1841
+ throw new Error("engine returned an invalid accessibility snapshot");
1842
+ const nodes = [];
1843
+ const visit = (node) => {
1844
+ if (node.isAccessibilityElement) {
1845
+ nodes.push({
1846
+ role: node.role,
1847
+ label: node.label,
1848
+ hint: node.hint,
1849
+ state: node.state ? { ...node.state } : null,
1850
+ testID: node.testID,
1799
1851
  position: {
1800
- x: Math.round(node.geometry.x),
1801
- y: Math.round(node.geometry.y)
1852
+ x: Math.round(node.frame.x),
1853
+ y: Math.round(node.frame.y)
1802
1854
  },
1803
1855
  size: {
1804
- w: Math.round(node.geometry.width),
1805
- h: Math.round(node.geometry.height)
1856
+ w: Math.round(node.frame.width),
1857
+ h: Math.round(node.frame.height)
1806
1858
  }
1807
- }
1808
- ];
1809
- });
1859
+ });
1860
+ if (node.platform === "ios") return;
1861
+ }
1862
+ for (const child of node.children) visit(child);
1863
+ };
1864
+ for (const root of tree) visit(root);
1865
+ return nodes;
1810
1866
  }
1811
1867
  function resolveFindMode(q) {
1812
1868
  if (q.testId) {
@@ -4191,8 +4247,16 @@ function streamFile(res, stream) {
4191
4247
  stream.pipe(res);
4192
4248
  }
4193
4249
 
4194
- // src/vite-plugin-one.ts
4250
+ // src/swift-submit.ts
4251
+ var SWIFT_PACKAGE_PATH = "/__peach/swift-package/";
4195
4252
  var SWIFT_HMR_PATH = "/__peach/swift-hmr";
4253
+ var MAX_SWIFT_COMPILE_SOURCE_BYTES = 2 * 1024 * 1024;
4254
+ var MAX_SWIFT_COMPILE_RESOURCE_BYTES = 2 * 1024 * 1024;
4255
+ var MAX_SWIFT_COMPILE_RESOURCE_TOTAL_BYTES = 8 * 1024 * 1024;
4256
+ var MAX_SWIFT_COMPILE_IMAGE_BYTES = 4 * 1024 * 1024;
4257
+ var MAX_SWIFT_COMPILE_IMAGE_TOTAL_BYTES = 16 * 1024 * 1024;
4258
+
4259
+ // src/vite-plugin-one.ts
4196
4260
  var SWIFT_ROUTE_PREFIX = "/__peach/swift";
4197
4261
  var swiftHost;
4198
4262
  var loadSwiftHost = () => swiftHost ??= import("peachsim/vite-swift");
@@ -4294,7 +4358,8 @@ function rnxPlugin(options = {}) {
4294
4358
  if (!served) next();
4295
4359
  }).catch(next);
4296
4360
  });
4297
- server.watcher.on("change", (file) => {
4361
+ server.watcher.on("all", (event, file) => {
4362
+ if (event !== "add" && event !== "unlink" && event !== "change") return;
4298
4363
  if (activeSwiftPackages.size === 0) return;
4299
4364
  const moduleRoot = moduleRootFor();
4300
4365
  let packages;
@@ -4342,7 +4407,7 @@ function rnxPlugin(options = {}) {
4342
4407
  if (!pathname.startsWith(SWIFT_ROUTE_PREFIX)) return next();
4343
4408
  loadSwiftHost().then((host) => {
4344
4409
  if (host.serveSwiftPackageAsset(pathname, res)) return;
4345
- const prefix3 = "/__peach/swift-package/";
4410
+ const prefix3 = SWIFT_PACKAGE_PATH;
4346
4411
  if (!pathname.startsWith(prefix3)) return next();
4347
4412
  if (!swiftSockets) {
4348
4413
  res.statusCode = 501;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (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.637 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.639 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {