peachsim 0.1.570 → 0.1.571

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 (79) hide show
  1. package/README.md +2 -2
  2. package/cli/bridge-flow-runner.ts +15 -7
  3. package/cli/cloud-dispatch.ts +1 -0
  4. package/cli/cloud-test-result-files.ts +97 -0
  5. package/cli/commands/maestro.ts +123 -31
  6. package/cli/commands/test.ts +161 -3
  7. package/cli/maestro-report.ts +3 -1
  8. package/cli/outbound-endpoints.ts +2 -0
  9. package/cli/run-registry.ts +2 -1
  10. package/detox/jest-preset.cjs +2 -2
  11. package/dist-lib/agent-daemon-client.cjs +1 -1
  12. package/dist-lib/agent-events.cjs +1 -1
  13. package/dist-lib/agent-identity.cjs +1 -1
  14. package/dist-lib/agent-sessions.cjs +1 -1
  15. package/dist-lib/attached-projects.cjs +1 -1
  16. package/dist-lib/auth/shared-session.cjs +1 -1
  17. package/dist-lib/backend-origin.cjs +1 -1
  18. package/dist-lib/beta.cjs +1 -1
  19. package/dist-lib/beta.mjs +1 -1
  20. package/dist-lib/bridge-constants.cjs +1 -1
  21. package/dist-lib/bridge-contract-input.cjs +1 -1
  22. package/dist-lib/bridge-contract-input.mjs +1 -1
  23. package/dist-lib/bridge-contract.cjs +1 -1
  24. package/dist-lib/bridge-contract.mjs +1 -1
  25. package/dist-lib/capture-contract.cjs +1 -1
  26. package/dist-lib/capture-contract.mjs +1 -1
  27. package/dist-lib/cli-constants.cjs +1 -1
  28. package/dist-lib/cloud-contract.cjs +1 -1
  29. package/dist-lib/cloud-contract.mjs +1 -1
  30. package/dist-lib/cloud-test-args.cjs +116 -0
  31. package/dist-lib/cloud-test-args.mjs +86 -0
  32. package/dist-lib/cloud.cjs +1 -1
  33. package/dist-lib/cloud.mjs +1 -1
  34. package/dist-lib/config.cjs +1 -1
  35. package/dist-lib/detox/index.cjs +1 -1
  36. package/dist-lib/detox/jest-preset.cjs +2 -2
  37. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  38. package/dist-lib/home-paths.cjs +1 -1
  39. package/dist-lib/host/bridge-host.cjs +16 -7
  40. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  41. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  42. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  43. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  44. package/dist-lib/host/websocket-proxy.cjs +1 -1
  45. package/dist-lib/index.cjs +16 -26
  46. package/dist-lib/jump-to-source-babel.cjs +1 -1
  47. package/dist-lib/jump-to-source-native.cjs +1 -1
  48. package/dist-lib/menu.cjs +1 -1
  49. package/dist-lib/menu.mjs +1 -1
  50. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  51. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  52. package/dist-lib/metro-production-bundle.cjs +1 -1
  53. package/dist-lib/metro-production-bundle.mjs +1 -1
  54. package/dist-lib/metro.cjs +1 -1
  55. package/dist-lib/profiles.cjs +1 -1
  56. package/dist-lib/public-brand.cjs +1 -1
  57. package/dist-lib/react-native-host-modules.cjs +1 -1
  58. package/dist-lib/react-native-host-modules.mjs +1 -1
  59. package/dist-lib/render-mode.cjs +1 -1
  60. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  61. package/dist-lib/sdk.cjs +1 -1
  62. package/dist-lib/sdk.mjs +1 -1
  63. package/dist-lib/skills.cjs +119 -106
  64. package/dist-lib/swift-compile.cjs +372 -0
  65. package/dist-lib/swift-compile.mjs +339 -0
  66. package/dist-lib/swift-package.cjs +78 -0
  67. package/dist-lib/swift-package.mjs +52 -0
  68. package/dist-lib/swift-submit.cjs +1 -1
  69. package/dist-lib/swift-submit.mjs +1 -1
  70. package/dist-lib/swift.cjs +1 -1
  71. package/dist-lib/vite.cjs +456 -138
  72. package/package.json +22 -1
  73. package/skills/rnx-test/SKILL.md +3 -3
  74. package/src/cloud-test-args.ts +100 -0
  75. package/src/rolldown-plugin-swift.ts +8 -7
  76. package/src/swift-compile.ts +359 -0
  77. package/src/swift-package.ts +69 -0
  78. package/src/swift-submit.ts +3 -2
  79. package/src/vite-plugin-swift.ts +103 -107
@@ -325,6 +325,8 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
325
325
  { category: 'contrast_user_action', count: 1 },
326
326
  'packages/peach-engine/src/auth/shared-session.ts :: fetch :: `${CONTRAST_ORIGIN}/api/auth/me`':
327
327
  { category: 'contrast_user_action', count: 1 },
328
+ 'packages/peach-engine/src/auth/shared-session.ts :: fetch :: `${CONTRAST_ORIGIN}/api/preview/pair-token`':
329
+ { category: 'contrast_user_action', count: 1 },
328
330
  'packages/peach-engine/src/auth/shared-session.ts :: fetch :: `${CONTRAST_ORIGIN}/api/auth/sign-out`':
329
331
  { category: 'contrast_user_action', count: 1 },
330
332
  "packages/peach-engine/src/billing/client.ts :: fetch :: apiUrl('/api/sootsim/billing/checkout')":
@@ -6,7 +6,8 @@
6
6
  // registration policy: a run registers when it produced a hosted share
7
7
  // (--preview) or when it runs in CI (github-token / actions env) — local
8
8
  // iteration without --preview stays local. registration failures warn and
9
- // never change the run's exit code; the test result is the playback result.
9
+ // return null; test commands treat a missing required receipt as a nonzero
10
+ // result.
10
11
 
11
12
  import { execSync } from 'child_process'
12
13
  import { authHeaderValue, resolveCliAuth, type CliAuth } from './auth'
@@ -7,8 +7,8 @@
7
7
  const path = require('path')
8
8
 
9
9
  // resolve the published driver entry so the mapping works from any cwd.
10
- // `require.resolve('sootsim/detox')` honours the subpath export in the
11
- // sootsim package.json.
10
+ // `require.resolve('peachsim/detox')` honours the subpath export in the
11
+ // peachsim package.json.
12
12
  const DRIVER_ENTRY = require.resolve('peachsim/detox')
13
13
  const PACKAGE_ROOT = path.dirname(require.resolve('peachsim/package.json'))
14
14
 
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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;
@@ -0,0 +1,116 @@
1
+ /*! rnx v0.1.571 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/cloud-test-args.ts
23
+ var cloud_test_args_exports = {};
24
+ __export(cloud_test_args_exports, {
25
+ CLOUD_TEST_ARGS_MAX_BYTES: () => CLOUD_TEST_ARGS_MAX_BYTES,
26
+ CLOUD_TEST_ARGS_MAX_COUNT: () => CLOUD_TEST_ARGS_MAX_COUNT,
27
+ CLOUD_TEST_ARG_MAX_LENGTH: () => CLOUD_TEST_ARG_MAX_LENGTH,
28
+ CLOUD_TEST_VALUE_FLAGS: () => CLOUD_TEST_VALUE_FLAGS,
29
+ isCloudTestValueFlag: () => isCloudTestValueFlag,
30
+ parseCloudTestArgs: () => parseCloudTestArgs
31
+ });
32
+ module.exports = __toCommonJS(cloud_test_args_exports);
33
+ var CLOUD_TEST_ARGS_MAX_COUNT = 32;
34
+ var CLOUD_TEST_ARG_MAX_LENGTH = 1e3;
35
+ var CLOUD_TEST_ARGS_MAX_BYTES = 16 * 1024;
36
+ var CLOUD_TEST_VALUE_FLAGS = [
37
+ "-t",
38
+ "--testNamePattern",
39
+ "--testPathPattern",
40
+ "--include-tags",
41
+ "--exclude-tags",
42
+ "--grep"
43
+ ];
44
+ var CLOUD_TEST_VALUE_FLAG_SET = new Set(CLOUD_TEST_VALUE_FLAGS);
45
+ function isCloudTestValueFlag(name) {
46
+ return CLOUD_TEST_VALUE_FLAG_SET.has(name);
47
+ }
48
+ function parseCloudTestArgs(value) {
49
+ if (value === void 0 || value === null) return { ok: true, args: [] };
50
+ if (!Array.isArray(value)) {
51
+ return { ok: false, message: "testArgs must be an array of strings" };
52
+ }
53
+ if (value.length > CLOUD_TEST_ARGS_MAX_COUNT) {
54
+ return {
55
+ ok: false,
56
+ message: `testArgs may contain at most ${CLOUD_TEST_ARGS_MAX_COUNT} entries`
57
+ };
58
+ }
59
+ const encoder = new TextEncoder();
60
+ let bytes = 0;
61
+ const entries = [];
62
+ for (const entry of value) {
63
+ if (typeof entry !== "string" || entry.length === 0) {
64
+ return { ok: false, message: "testArgs entries must be non-empty strings" };
65
+ }
66
+ if (entry.length > CLOUD_TEST_ARG_MAX_LENGTH || entry.includes("\0")) {
67
+ return { ok: false, message: `testArgs entry is too long or carries a NUL byte: ${entry.slice(0, 60)}` };
68
+ }
69
+ bytes += encoder.encode(entry).length;
70
+ if (bytes > CLOUD_TEST_ARGS_MAX_BYTES) {
71
+ return {
72
+ ok: false,
73
+ message: `testArgs may contain at most ${CLOUD_TEST_ARGS_MAX_BYTES} bytes`
74
+ };
75
+ }
76
+ entries.push(entry);
77
+ }
78
+ const args = [];
79
+ for (let i = 0; i < entries.length; i++) {
80
+ const entry = entries[i];
81
+ if (!entry.startsWith("-")) {
82
+ return {
83
+ ok: false,
84
+ message: `testArgs carries a positional argument (selection flags only): ${entry.slice(0, 60)}`
85
+ };
86
+ }
87
+ const eq = entry.indexOf("=");
88
+ const head = eq > 0 ? entry.slice(0, eq) : entry;
89
+ if (!isCloudTestValueFlag(head)) {
90
+ return { ok: false, message: `testArgs carries an unknown flag: ${head.slice(0, 60)}` };
91
+ }
92
+ if (eq > 0) {
93
+ if (!entry.slice(eq + 1)) {
94
+ return { ok: false, message: `${head} expects a value` };
95
+ }
96
+ args.push(entry);
97
+ continue;
98
+ }
99
+ const val = entries[i + 1];
100
+ if (val === void 0 || val.startsWith("-")) {
101
+ return { ok: false, message: `${head} expects a value` };
102
+ }
103
+ args.push(entry, val);
104
+ i += 1;
105
+ }
106
+ return { ok: true, args };
107
+ }
108
+ // Annotate the CommonJS export names for ESM import in node:
109
+ 0 && (module.exports = {
110
+ CLOUD_TEST_ARGS_MAX_BYTES,
111
+ CLOUD_TEST_ARGS_MAX_COUNT,
112
+ CLOUD_TEST_ARG_MAX_LENGTH,
113
+ CLOUD_TEST_VALUE_FLAGS,
114
+ isCloudTestValueFlag,
115
+ parseCloudTestArgs
116
+ });
@@ -0,0 +1,86 @@
1
+ /*! rnx v0.1.571 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+
3
+ // src/cloud-test-args.ts
4
+ var CLOUD_TEST_ARGS_MAX_COUNT = 32;
5
+ var CLOUD_TEST_ARG_MAX_LENGTH = 1e3;
6
+ var CLOUD_TEST_ARGS_MAX_BYTES = 16 * 1024;
7
+ var CLOUD_TEST_VALUE_FLAGS = [
8
+ "-t",
9
+ "--testNamePattern",
10
+ "--testPathPattern",
11
+ "--include-tags",
12
+ "--exclude-tags",
13
+ "--grep"
14
+ ];
15
+ var CLOUD_TEST_VALUE_FLAG_SET = new Set(CLOUD_TEST_VALUE_FLAGS);
16
+ function isCloudTestValueFlag(name) {
17
+ return CLOUD_TEST_VALUE_FLAG_SET.has(name);
18
+ }
19
+ function parseCloudTestArgs(value) {
20
+ if (value === void 0 || value === null) return { ok: true, args: [] };
21
+ if (!Array.isArray(value)) {
22
+ return { ok: false, message: "testArgs must be an array of strings" };
23
+ }
24
+ if (value.length > CLOUD_TEST_ARGS_MAX_COUNT) {
25
+ return {
26
+ ok: false,
27
+ message: `testArgs may contain at most ${CLOUD_TEST_ARGS_MAX_COUNT} entries`
28
+ };
29
+ }
30
+ const encoder = new TextEncoder();
31
+ let bytes = 0;
32
+ const entries = [];
33
+ for (const entry of value) {
34
+ if (typeof entry !== "string" || entry.length === 0) {
35
+ return { ok: false, message: "testArgs entries must be non-empty strings" };
36
+ }
37
+ if (entry.length > CLOUD_TEST_ARG_MAX_LENGTH || entry.includes("\0")) {
38
+ return { ok: false, message: `testArgs entry is too long or carries a NUL byte: ${entry.slice(0, 60)}` };
39
+ }
40
+ bytes += encoder.encode(entry).length;
41
+ if (bytes > CLOUD_TEST_ARGS_MAX_BYTES) {
42
+ return {
43
+ ok: false,
44
+ message: `testArgs may contain at most ${CLOUD_TEST_ARGS_MAX_BYTES} bytes`
45
+ };
46
+ }
47
+ entries.push(entry);
48
+ }
49
+ const args = [];
50
+ for (let i = 0; i < entries.length; i++) {
51
+ const entry = entries[i];
52
+ if (!entry.startsWith("-")) {
53
+ return {
54
+ ok: false,
55
+ message: `testArgs carries a positional argument (selection flags only): ${entry.slice(0, 60)}`
56
+ };
57
+ }
58
+ const eq = entry.indexOf("=");
59
+ const head = eq > 0 ? entry.slice(0, eq) : entry;
60
+ if (!isCloudTestValueFlag(head)) {
61
+ return { ok: false, message: `testArgs carries an unknown flag: ${head.slice(0, 60)}` };
62
+ }
63
+ if (eq > 0) {
64
+ if (!entry.slice(eq + 1)) {
65
+ return { ok: false, message: `${head} expects a value` };
66
+ }
67
+ args.push(entry);
68
+ continue;
69
+ }
70
+ const val = entries[i + 1];
71
+ if (val === void 0 || val.startsWith("-")) {
72
+ return { ok: false, message: `${head} expects a value` };
73
+ }
74
+ args.push(entry, val);
75
+ i += 1;
76
+ }
77
+ return { ok: true, args };
78
+ }
79
+ export {
80
+ CLOUD_TEST_ARGS_MAX_BYTES,
81
+ CLOUD_TEST_ARGS_MAX_COUNT,
82
+ CLOUD_TEST_ARG_MAX_LENGTH,
83
+ CLOUD_TEST_VALUE_FLAGS,
84
+ isCloudTestValueFlag,
85
+ parseCloudTestArgs
86
+ };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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;
@@ -7,8 +7,8 @@
7
7
  const path = require('path')
8
8
 
9
9
  // resolve the published driver entry so the mapping works from any cwd.
10
- // `require.resolve('sootsim/detox')` honours the subpath export in the
11
- // sootsim package.json.
10
+ // `require.resolve('peachsim/detox')` honours the subpath export in the
11
+ // peachsim package.json.
12
12
  const DRIVER_ENTRY = require.resolve('peachsim/detox')
13
13
  const PACKAGE_ROOT = path.dirname(require.resolve('peachsim/package.json'))
14
14
 
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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;
@@ -842,11 +842,19 @@ function resolveDevicePosture(model, posture) {
842
842
  const supported = devices[model].supportedPostures;
843
843
  return posture && supported?.includes(posture) ? posture : supported?.[0] ?? "closed";
844
844
  }
845
- function getDevice(model, posture) {
845
+ function deviceDefaultOrientation(model, posture) {
846
+ if (model === "iphone-duo" && resolveDevicePosture(model, posture) === "open") {
847
+ return "landscape";
848
+ }
849
+ return "portrait";
850
+ }
851
+ function getDevice(model, posture, orientation) {
846
852
  const device = devices[model];
847
853
  if (!device.supportedPostures) return device;
848
854
  const resolvedPosture = resolveDevicePosture(model, posture);
849
855
  if (resolvedPosture === "closed") return device;
856
+ const resolvedOrientation = orientation ?? deviceDefaultOrientation(model, resolvedPosture);
857
+ const isRotatedPortrait = resolvedOrientation === "portrait";
850
858
  return {
851
859
  ...device,
852
860
  // inner display size from apple's ios 27 ui kit. corners and insets are
@@ -854,8 +862,8 @@ function getDevice(model, posture) {
854
862
  // fits a 53pt circle within 0.4px, the silhouette sits 20.67pt outside the
855
863
  // display on every edge as 16.33pt of black glass plus a 4.33pt rail, and
856
864
  // the body itself curves at 75pt. the barrel is hidden when open.
857
- width: 951,
858
- height: 669,
865
+ width: isRotatedPortrait ? 669 : 951,
866
+ height: isRotatedPortrait ? 951 : 669,
859
867
  statusBarHeight: 44,
860
868
  cornerRadius: cornerRadii(53),
861
869
  continuousCornerRadius: cornerRadii(53),
@@ -869,8 +877,9 @@ function getDevice(model, posture) {
869
877
  // the closed outer display, so it takes the same 84pt inset: a ~50pt
870
878
  // control at a ~23pt inset needs 73pt, and anything narrower would shift
871
879
  // controls horizontally on unfold, defeating the continuous experience
872
- // Apple states as the reason for the design.
873
- safeAreaInsets: { top: 0, bottom: 0, left: 0, right: 84 }
880
+ // Apple states as the reason for the design. native bottom inset is 34;
881
+ // rotated portrait is top 82 / bottom 34 / right 0.
882
+ safeAreaInsets: isRotatedPortrait ? { top: 82, bottom: 34, left: 0, right: 0 } : { top: 0, bottom: 34, left: 0, right: 84 }
874
883
  };
875
884
  }
876
885
  function listDeviceModels() {
@@ -1338,7 +1347,7 @@ var init_devices = __esm({
1338
1347
  },
1339
1348
  dynamicIsland: null,
1340
1349
  // 84pt trailing Vertical Bar on the outer display (Apple iOS 27 UI kit).
1341
- safeAreaInsets: { top: 0, bottom: 0, left: 0, right: 84 },
1350
+ safeAreaInsets: { top: 0, bottom: 34, left: 0, right: 84 },
1342
1351
  iosVersion: "27.1",
1343
1352
  keyboardHeight: 0,
1344
1353
  physicalPPI: 460,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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;
@@ -3973,10 +3973,10 @@ function resolveRuntimeRootForHostname(hostname) {
3973
3973
  const version = runtimeVersionFromHostname(hostname);
3974
3974
  return version ? resolveInstalledRuntimeRoot(version) : null;
3975
3975
  }
3976
- function resolveRuntimeRootForRequestHost(host) {
3977
- if (!host) return resolveActiveRuntimeRoot();
3976
+ function resolveRuntimeRootForRequestHost(host2) {
3977
+ if (!host2) return resolveActiveRuntimeRoot();
3978
3978
  try {
3979
- return resolveRuntimeRootForHostname(new URL(`http://${host}`).hostname);
3979
+ return resolveRuntimeRootForHostname(new URL(`http://${host2}`).hostname);
3980
3980
  } catch {
3981
3981
  return null;
3982
3982
  }
@@ -4016,25 +4016,15 @@ function serveRuntimeFile(req, res, fullPath) {
4016
4016
  import_fs3.default.createReadStream(fullPath).pipe(res);
4017
4017
  }
4018
4018
 
4019
- // src/vite-plugin-swift.ts
4019
+ // src/swift-compile.ts
4020
4020
  var import_node_child_process2 = require("node:child_process");
4021
- var import_node_os2 = __toESM(require("node:os"), 1);
4022
- var import_node_path6 = __toESM(require("node:path"), 1);
4023
4021
  var import_node_util = require("node:util");
4024
-
4025
- // ../sootsim-swift/toolchain.json
4026
- var toolchain_default = {
4027
- release: "swift-6.3-RELEASE",
4028
- wasmSdkChecksum: "9fa4016ee632c7e9e906608ec3b55cf13dfc4dff44e47574c5af58064dc33fd9"
4029
- };
4022
+ var run = (0, import_node_util.promisify)(import_node_child_process2.execFile);
4023
+ var ROOT_LOCKS = Symbol.for("peachsim.swiftCompile.rootLocks");
4024
+ var host = globalThis;
4025
+ var rootLocks = host[ROOT_LOCKS] ??= /* @__PURE__ */ new Map();
4030
4026
 
4031
4027
  // src/vite-plugin-swift.ts
4032
- var run = (0, import_node_util.promisify)(import_node_child_process2.execFile);
4033
- var TOOLCHAIN_BIN = import_node_path6.default.join(
4034
- import_node_os2.default.homedir(),
4035
- `Library/Developer/Toolchains/${toolchain_default.release}.xctoolchain/usr/bin`
4036
- );
4037
- var WASM_SDK = `${toolchain_default.release}_wasm`;
4038
4028
  var BUNDLE_MAX_FILE_BYTES = 2 * 1024 * 1024;
4039
4029
  var BUNDLE_MAX_TOTAL_BYTES = 8 * 1024 * 1024;
4040
4030
 
@@ -4373,13 +4363,13 @@ function resolveMetroPort(server) {
4373
4363
  var metro_plugin_default = withRNX;
4374
4364
 
4375
4365
  // src/jump-to-source-babel.ts
4376
- function normalizeSourcePath(path9) {
4377
- const queryStart = path9.indexOf("?");
4378
- const clean = queryStart >= 0 ? path9.slice(0, queryStart) : path9;
4366
+ function normalizeSourcePath(path8) {
4367
+ const queryStart = path8.indexOf("?");
4368
+ const clean = queryStart >= 0 ? path8.slice(0, queryStart) : path8;
4379
4369
  return clean.replace(/\\/g, "/");
4380
4370
  }
4381
- function matchesPath(path9, matcher) {
4382
- return typeof matcher === "string" ? path9.includes(matcher) : matcher.test(path9);
4371
+ function matchesPath(path8, matcher) {
4372
+ return typeof matcher === "string" ? path8.includes(matcher) : matcher.test(path8);
4383
4373
  }
4384
4374
  function shouldStampFile(filename, options) {
4385
4375
  const normalized = normalizeSourcePath(filename);
@@ -4412,11 +4402,11 @@ function sootsimJumpToSourceBabelPlugin(api, options = {}) {
4412
4402
  return {
4413
4403
  name: "sootsim-jump-to-source",
4414
4404
  visitor: {
4415
- JSXOpeningElement(path9, state) {
4405
+ JSXOpeningElement(path8, state) {
4416
4406
  if (options.enabled === false) return;
4417
4407
  const filename = state.file?.opts?.filename;
4418
4408
  if (!filename || !shouldStampFile(filename, options)) return;
4419
- const node = path9.node;
4409
+ const node = path8.node;
4420
4410
  const tagName = getJSXName(node.name);
4421
4411
  if (!tagName || tagName === "Fragment" || tagName.endsWith(".Fragment")) return;
4422
4412
  if (hasAttribute(node, attrName)) return;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (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.570 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.571 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";