peachsim 0.1.630 → 0.1.631

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 (89) hide show
  1. package/cli/app-fonts.ts +23 -4
  2. package/cli/bridge-flow-runner.ts +35 -28
  3. package/cli/command-registry.ts +1 -0
  4. package/cli/commands/compat.ts +11 -60
  5. package/cli/commands/control.ts +12 -5
  6. package/cli/commands/detect.ts +289 -26
  7. package/cli/commands/inspect/core.ts +1 -1
  8. package/cli/commands/inspect.ts +4 -0
  9. package/cli/commands/maestro.ts +3 -1
  10. package/cli/commands/project-report.ts +386 -0
  11. package/cli/commands/projectReportContract.ts +42 -0
  12. package/cli/commands/report-issue.ts +38 -54
  13. package/cli/commands/setup.ts +6 -4
  14. package/cli/commands/telemetry.ts +8 -3
  15. package/cli/commands/test.ts +347 -134
  16. package/cli/main.ts +11 -1
  17. package/cli/outbound-endpoints.ts +2 -1
  18. package/cli/privacy.ts +1 -2
  19. package/cli/runtime-diagnostics.ts +51 -0
  20. package/cli/telemetry.ts +78 -7
  21. package/detox/index.ts +3 -8
  22. package/dist-lib/agent-daemon-client.cjs +1 -1
  23. package/dist-lib/agent-events.cjs +1 -1
  24. package/dist-lib/agent-identity.cjs +1 -1
  25. package/dist-lib/agent-sessions.cjs +1 -1
  26. package/dist-lib/attached-projects.cjs +1 -1
  27. package/dist-lib/auth/shared-session.cjs +1 -1
  28. package/dist-lib/backend-origin.cjs +1 -1
  29. package/dist-lib/beta.cjs +1 -1
  30. package/dist-lib/beta.mjs +1 -1
  31. package/dist-lib/bridge-constants.cjs +1 -1
  32. package/dist-lib/bridge-contract-input.cjs +1 -1
  33. package/dist-lib/bridge-contract-input.mjs +1 -1
  34. package/dist-lib/bridge-contract.cjs +1 -1
  35. package/dist-lib/bridge-contract.mjs +1 -1
  36. package/dist-lib/capture-contract.cjs +1 -1
  37. package/dist-lib/capture-contract.mjs +1 -1
  38. package/dist-lib/cli-constants.cjs +1 -1
  39. package/dist-lib/cloud-contract.cjs +1 -1
  40. package/dist-lib/cloud-contract.mjs +1 -1
  41. package/dist-lib/cloud-test-args.cjs +1 -1
  42. package/dist-lib/cloud-test-args.mjs +1 -1
  43. package/dist-lib/cloud.cjs +1 -1
  44. package/dist-lib/cloud.mjs +1 -1
  45. package/dist-lib/config.cjs +1 -1
  46. package/dist-lib/detox/index.cjs +2 -7
  47. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  48. package/dist-lib/home-paths.cjs +8 -5
  49. package/dist-lib/host/bridge-host.cjs +110 -67
  50. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  51. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  52. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  53. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  54. package/dist-lib/host/websocket-proxy.cjs +1 -1
  55. package/dist-lib/index.cjs +5 -1
  56. package/dist-lib/jump-to-source-babel.cjs +1 -1
  57. package/dist-lib/jump-to-source-native.cjs +1 -1
  58. package/dist-lib/kotlin-host.cjs +1 -1
  59. package/dist-lib/menu.cjs +11 -1
  60. package/dist-lib/menu.mjs +11 -1
  61. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  62. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  63. package/dist-lib/metro-production-bundle.cjs +1 -1
  64. package/dist-lib/metro-production-bundle.mjs +1 -1
  65. package/dist-lib/metro.cjs +1 -1
  66. package/dist-lib/native-app-identity.cjs +1 -1
  67. package/dist-lib/native-app-identity.mjs +1 -1
  68. package/dist-lib/profiles.cjs +1 -1
  69. package/dist-lib/public-brand.cjs +1 -1
  70. package/dist-lib/react-native-host-modules.cjs +1 -1
  71. package/dist-lib/react-native-host-modules.mjs +1 -1
  72. package/dist-lib/render-mode.cjs +1 -1
  73. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  74. package/dist-lib/sdk.cjs +3 -1
  75. package/dist-lib/sdk.mjs +2 -1
  76. package/dist-lib/skills.cjs +589 -268
  77. package/dist-lib/swift-compile.cjs +1 -1
  78. package/dist-lib/swift-compile.mjs +1 -1
  79. package/dist-lib/swift-package.cjs +1 -1
  80. package/dist-lib/swift-package.mjs +1 -1
  81. package/dist-lib/swift-submit.cjs +1 -1
  82. package/dist-lib/swift-submit.mjs +1 -1
  83. package/dist-lib/swift.cjs +439 -167
  84. package/dist-lib/vite-swift.cjs +1 -1
  85. package/dist-lib/vite.cjs +1 -1
  86. package/package.json +2 -1
  87. package/skills/contrast/SKILL.md +1 -0
  88. package/src/home-paths.ts +11 -9
  89. package/src/menu.ts +11 -0
@@ -0,0 +1,51 @@
1
+ import { consoleEntriesEval, type InspectBridge } from './commands/inspect/core'
2
+ import { diagnosticsAllowedForCurrentProcess } from './privacy'
3
+ import { setDiagnosticRuntimeVersion, trackCliDiagnostic } from './telemetry'
4
+
5
+ // reuse the same local console/error stores the CLI already inspects. only
6
+ // message strings cross into the diagnostic queue, never stacks or objects.
7
+ export async function collectRuntimeDiagnostics(bridge: InspectBridge): Promise<void> {
8
+ if (!diagnosticsAllowedForCurrentProcess()) return
9
+ try {
10
+ const result: unknown = await bridge.send(
11
+ {
12
+ type: 'evaluate',
13
+ code: `(() => {
14
+ const messages = []
15
+ const add = (kind, message) => {
16
+ if (typeof message === 'string' && message) messages.push({ kind, message: message.slice(0, 2048) })
17
+ }
18
+ const obs = window.__sootsimObservability
19
+ for (const e of (obs?.reportedErrors?.getSnapshot?.() || []).slice(-20)) add('runtime_error', e.message)
20
+ for (const [kind, entries] of [
21
+ ['runtime_error', ${consoleEntriesEval('error', 20)}],
22
+ ['runtime_warning', ${consoleEntriesEval('warn', 20)}],
23
+ ]) {
24
+ for (const e of entries) {
25
+ const parts = e.args.map(a => typeof a === 'string' ? a : typeof a?.message === 'string' ? a.message : '').filter(Boolean)
26
+ add(kind, parts.join(' '))
27
+ }
28
+ }
29
+ return { runtimeVersion: window.__sootsimRuntimeVersion, messages: messages.slice(0, 50) }
30
+ })()`,
31
+ },
32
+ { timeoutMs: 1000 },
33
+ )
34
+ if (!result || typeof result !== 'object') return
35
+ if ('runtimeVersion' in result && typeof result.runtimeVersion === 'string') {
36
+ setDiagnosticRuntimeVersion(result.runtimeVersion)
37
+ }
38
+ if (!('messages' in result) || !Array.isArray(result.messages)) return
39
+ for (const entry of result.messages.slice(0, 50)) {
40
+ if (!entry || typeof entry !== 'object') continue
41
+ if (
42
+ (entry.kind === 'runtime_error' || entry.kind === 'runtime_warning') &&
43
+ typeof entry.message === 'string'
44
+ ) {
45
+ trackCliDiagnostic({ kind: entry.kind, message: entry.message })
46
+ }
47
+ }
48
+ } catch {
49
+ // diagnostics never delay a failed bridge beyond this bounded probe.
50
+ }
51
+ }
package/cli/telemetry.ts CHANGED
@@ -1,3 +1,7 @@
1
+ import { homedir } from 'node:os'
2
+ import { getCliVersion } from '../src/cli-version'
3
+ import { readActiveRuntime, readOrCreateAnonymousId } from '../src/home-paths'
4
+ import { parseArgs } from './parse-args'
1
5
  import { diagnosticsAllowedForCurrentProcess } from './privacy'
2
6
 
3
7
  type PackageIncompatibility = {
@@ -10,9 +14,15 @@ type PackageIncompatibility = {
10
14
  type ErrorShape = {
11
15
  kind: 'error_shape'
12
16
  errorClass: string
17
+ message: string
13
18
  }
14
19
 
15
- export type CliDiagnostic = PackageIncompatibility | ErrorShape
20
+ type RuntimeMessage = {
21
+ kind: 'runtime_error' | 'runtime_warning'
22
+ message: string
23
+ }
24
+
25
+ export type CliDiagnostic = PackageIncompatibility | ErrorShape | RuntimeMessage
16
26
 
17
27
  type Config = { apiKey: string; host: string }
18
28
 
@@ -32,6 +42,46 @@ function bounded(value: string, max: number): string {
32
42
  return value.trim().slice(0, max)
33
43
  }
34
44
 
45
+ export function sanitizeDiagnosticMessage(value: string): string {
46
+ const firstLine = value.slice(0, 2048).split(/[\r\n\u2028\u2029]/, 1)[0] ?? ''
47
+ // retain package names from dependency paths, never source filenames,
48
+ // URL paths/queries, local paths, stack frames, or serialized app objects.
49
+ return firstLine
50
+ .split(homedir())
51
+ .join('<home>')
52
+ .replace(
53
+ /<package:(?:@[\w.-]+\/)?[\w.-]+>|(?:https?:\/\/|file:\/\/|[A-Za-z]:[\\/]|<home>[\\/]|\/|\.{1,2}[\\/]|\b[\w.-]+[\\/])[^\s"'<>]+/g,
54
+ (location) => {
55
+ if (location.startsWith('<package:')) return location
56
+ const dependency = /(?:^|[\\/])node_modules[\\/]((?:@[^\\/]+[\\/])?[^\\/]+)/.exec(
57
+ location,
58
+ )
59
+ return dependency ? `<package:${dependency[1]?.replace(/\\/g, '/')}>` : '<path>'
60
+ },
61
+ )
62
+ .replace(/\b[\w.-]+\.(?:tsx?|jsx?|swift|m|mm|kt|java)(?::\d+(?::\d+)?)?/g, '<source>')
63
+ .replace(/\{.*$|\[(?:\s*["'{\d]|$).*$/g, '<data>')
64
+ .replace(
65
+ /\b(?:const|let|var)\s+\w+\s*=.*$|\b(?:function|class)\s+\w+.*$|\b(?:import|export)\s+.*$|\breturn\s*[({<].*$/g,
66
+ '<source>',
67
+ )
68
+ .replace(/^\s*at\s+.*$|\bat\s+[\w.$<>]+\s*\([^)]*\)/g, '<stack>')
69
+ .trim()
70
+ .slice(0, 300)
71
+ }
72
+
73
+ let observedRuntimeVersion: string | null = null
74
+
75
+ function diagnosticVersion(version: string | null): string | null {
76
+ return version && version.length <= 80 && /^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(version)
77
+ ? version
78
+ : null
79
+ }
80
+
81
+ export function setDiagnosticRuntimeVersion(version: string): void {
82
+ observedRuntimeVersion = diagnosticVersion(version)
83
+ }
84
+
35
85
  export function buildCliDiagnosticEvent(diagnostic: CliDiagnostic) {
36
86
  const properties =
37
87
  diagnostic.kind === 'package_incompatibility'
@@ -42,12 +92,24 @@ export function buildCliDiagnosticEvent(diagnostic: CliDiagnostic) {
42
92
  ? { unsupported_api: bounded(diagnostic.unsupportedApi, 160) }
43
93
  : {}),
44
94
  }
45
- : { error_class: bounded(diagnostic.errorClass, 160) }
95
+ : diagnostic.kind === 'error_shape'
96
+ ? {
97
+ error_class: bounded(diagnostic.errorClass, 160),
98
+ message: sanitizeDiagnosticMessage(diagnostic.message),
99
+ }
100
+ : { message: sanitizeDiagnosticMessage(diagnostic.message) }
46
101
 
47
102
  return {
48
103
  event: diagnostic.kind,
49
- distinct_id: 'peach-cli-diagnostic',
50
- properties,
104
+ distinct_id: readOrCreateAnonymousId(),
105
+ properties: {
106
+ cli_version: diagnosticVersion(getCliVersion()),
107
+ runtime_version: observedRuntimeVersion ?? diagnosticVersion(readActiveRuntime()),
108
+ os: process.platform,
109
+ arch: process.arch,
110
+ command: parseArgs(process.argv).command ?? 'open',
111
+ ...properties,
112
+ },
51
113
  }
52
114
  }
53
115
 
@@ -55,12 +117,20 @@ const queue: CliDiagnostic[] = []
55
117
 
56
118
  export function trackCliDiagnostic(diagnostic: CliDiagnostic): void {
57
119
  if (!diagnosticsAllowedForCurrentProcess()) return
58
- queue.push(diagnostic)
120
+ if (queue.length >= 50) return
121
+ const entry =
122
+ diagnostic.kind === 'package_incompatibility'
123
+ ? diagnostic
124
+ : { ...diagnostic, message: sanitizeDiagnosticMessage(diagnostic.message) }
125
+ if (queue.some((queued) => JSON.stringify(queued) === JSON.stringify(entry))) return
126
+ queue.push(entry)
59
127
  }
60
128
 
61
129
  export function trackCliError(error: unknown): void {
62
130
  const errorClass = error instanceof Error ? error.constructor.name : typeof error
63
- trackCliDiagnostic({ kind: 'error_shape', errorClass })
131
+ const message =
132
+ error instanceof Error ? error.message : typeof error === 'string' ? error : ''
133
+ trackCliDiagnostic({ kind: 'error_shape', errorClass, message })
64
134
  }
65
135
 
66
136
  export async function flushCliTelemetry(): Promise<void> {
@@ -70,8 +140,9 @@ export async function flushCliTelemetry(): Promise<void> {
70
140
  queue.length = 0
71
141
  return
72
142
  }
73
- const batch = queue.splice(0, queue.length).map(buildCliDiagnosticEvent)
143
+ const diagnostics = queue.splice(0, queue.length)
74
144
  try {
145
+ const batch = diagnostics.map((diagnostic) => buildCliDiagnosticEvent(diagnostic))
75
146
  await fetch(`${config.host}/batch/`, {
76
147
  method: 'POST',
77
148
  headers: { 'content-type': 'application/json' },
package/detox/index.ts CHANGED
@@ -605,7 +605,7 @@ export async function waitForSootsimIdle(
605
605
  // find a node in the sootsim tree matching a matcher descriptor
606
606
  async function findNodeByMatcher(matcher: Matcher): Promise<any> {
607
607
  const page = getPage()
608
- if (matcher.index !== undefined) {
608
+ if (matcher.index !== undefined || matcher.type === 'text') {
609
609
  return page.evaluate(async (indexedMatcher: Matcher) => {
610
610
  const filter =
611
611
  indexedMatcher.type === 'id'
@@ -618,8 +618,8 @@ async function findNodeByMatcher(matcher: Matcher): Promise<any> {
618
618
  ? { hasRole: indexedMatcher.value }
619
619
  : { type: indexedMatcher.value }
620
620
  const results = await window.__sootsimTest!.queryAll(filter)
621
- // detox indexes by.text over the text elements that read exactly that
622
- // text. hasText also matches every ancestor, so index 0 would be the root.
621
+ // detox by.text matches exact text elements, with or without an index.
622
+ // hasText also matches ancestors and substrings, which are not targets.
623
623
  const indexed =
624
624
  indexedMatcher.type === 'text'
625
625
  ? results.filter(
@@ -634,11 +634,6 @@ async function findNodeByMatcher(matcher: Matcher): Promise<any> {
634
634
  (id: string) => window.__sootsimTest!.findByTestId(id),
635
635
  matcher.value,
636
636
  )
637
- } else if (matcher.type === 'text') {
638
- return page.evaluate(
639
- (text: string) => window.__sootsimTest!.findByText(text),
640
- matcher.value,
641
- )
642
637
  } else if (matcher.type === 'label') {
643
638
  return page.evaluate(
644
639
  (label: string) => window.__sootsimTest!.findByLabel(label),
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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;
@@ -2474,7 +2474,7 @@ async function waitForSootsimIdle(page, maxMs = 3e3, strict = false) {
2474
2474
  }
2475
2475
  async function findNodeByMatcher(matcher) {
2476
2476
  const page = getPage();
2477
- if (matcher.index !== void 0) {
2477
+ if (matcher.index !== void 0 || matcher.type === "text") {
2478
2478
  return page.evaluate(async (indexedMatcher) => {
2479
2479
  const filter = indexedMatcher.type === "id" ? { hasId: indexedMatcher.value } : indexedMatcher.type === "text" ? { hasText: indexedMatcher.value } : indexedMatcher.type === "label" ? { hasLabel: indexedMatcher.value } : indexedMatcher.type === "role" ? { hasRole: indexedMatcher.value } : { type: indexedMatcher.value };
2480
2480
  const results = await window.__sootsimTest.queryAll(filter);
@@ -2489,11 +2489,6 @@ async function findNodeByMatcher(matcher) {
2489
2489
  (id) => window.__sootsimTest.findByTestId(id),
2490
2490
  matcher.value
2491
2491
  );
2492
- } else if (matcher.type === "text") {
2493
- return page.evaluate(
2494
- (text) => window.__sootsimTest.findByText(text),
2495
- matcher.value
2496
- );
2497
2492
  } else if (matcher.type === "label") {
2498
2493
  return page.evaluate(
2499
2494
  (label) => window.__sootsimTest.findByLabel(label),
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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.630 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.631 | (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;
@@ -226,7 +226,7 @@ function readPrivacyPreferences() {
226
226
  return {
227
227
  productAnalytics: typeof productAnalytics === "boolean" ? productAnalytics : false,
228
228
  crashReports: typeof crashReports === "boolean" ? crashReports : false,
229
- configured: typeof productAnalytics === "boolean" && typeof crashReports === "boolean"
229
+ configured: typeof productAnalytics === "boolean"
230
230
  };
231
231
  }
232
232
  function writePrivacyPreferences(preferences) {
@@ -238,10 +238,13 @@ function writePrivacyPreferences(preferences) {
238
238
  });
239
239
  }
240
240
  function readOrCreateAnonymousId() {
241
- const existing = readSharedConfig().anonymousId;
242
- if (typeof existing === "string" && existing.trim()) return existing;
241
+ const existing = readSharedConfig().settings?.anonymousId;
242
+ if (typeof existing === "string" && /^anon-cli-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(
243
+ existing
244
+ ))
245
+ return existing;
243
246
  const created = `anon-cli-${(0, import_node_crypto.randomUUID)()}`;
244
- writeSharedConfig({ anonymousId: created });
247
+ writeSharedConfig({ settings: { anonymousId: created } });
245
248
  return created;
246
249
  }
247
250
  function readDefaultBox() {