rnxsim 0.1.392 → 0.1.394

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 (61) hide show
  1. package/cli/cloud-client.ts +74 -52
  2. package/cli/cloud-dispatch.ts +2 -1
  3. package/cli/commands/inspect/core.ts +33 -2
  4. package/cli/commands/platform.ts +34 -9
  5. package/detox/attempt-events.cjs +23 -0
  6. package/detox/element-types.ts +11 -2
  7. package/detox/expectations.ts +7 -3
  8. package/detox/gestures.ts +23 -2
  9. package/detox/index.ts +42 -62
  10. package/detox/navigation-lifecycle.ts +290 -0
  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 +12 -1
  22. package/dist-lib/bridge-contract-input.mjs +10 -1
  23. package/dist-lib/bridge-contract.cjs +7 -1
  24. package/dist-lib/bridge-contract.mjs +5 -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 +29 -3
  29. package/dist-lib/cloud-contract.mjs +26 -2
  30. package/dist-lib/config.cjs +1 -1
  31. package/dist-lib/detox/index.cjs +240 -48
  32. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  33. package/dist-lib/home-paths.cjs +1 -1
  34. package/dist-lib/host/bridge-host.cjs +1 -1
  35. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  36. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  37. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  38. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  39. package/dist-lib/host/websocket-proxy.cjs +1 -1
  40. package/dist-lib/index.cjs +23 -3
  41. package/dist-lib/jump-to-source-babel.cjs +1 -1
  42. package/dist-lib/menu.cjs +1 -1
  43. package/dist-lib/menu.mjs +1 -1
  44. package/dist-lib/metro-production-bundle.cjs +132 -3
  45. package/dist-lib/metro-production-bundle.mjs +129 -2
  46. package/dist-lib/metro.cjs +1 -1
  47. package/dist-lib/profiles.cjs +1 -1
  48. package/dist-lib/public-brand.cjs +1 -1
  49. package/dist-lib/react-native-host-modules.cjs +1 -1
  50. package/dist-lib/react-native-host-modules.mjs +1 -1
  51. package/dist-lib/render-mode.cjs +1 -1
  52. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  53. package/dist-lib/sdk.cjs +24 -3
  54. package/dist-lib/sdk.mjs +24 -3
  55. package/dist-lib/skills.cjs +51 -80
  56. package/dist-lib/vite.cjs +1 -1
  57. package/package.json +1 -1
  58. package/src/bridge-contract-input.ts +12 -0
  59. package/src/bridge-contract.ts +7 -0
  60. package/src/cloud-contract.ts +29 -0
  61. package/src/metro-production-bundle.ts +200 -0
@@ -0,0 +1,290 @@
1
+ import { writeAttemptEvent } from './attempt-events.cjs'
2
+ import type { Page, Request, Response } from 'playwright'
3
+
4
+ export type SootsimNavigationIdentity = {
5
+ browserId: number
6
+ contextId: number
7
+ operation: 'launchApp' | 'openURL'
8
+ }
9
+
10
+ type SootsimPageState = {
11
+ bodyText: string
12
+ bridges: {
13
+ sootsim: boolean
14
+ test: boolean
15
+ }
16
+ globals: string[]
17
+ readyState: string
18
+ title: string
19
+ url: string
20
+ }
21
+
22
+ type ActiveNavigation = SootsimNavigationIdentity & {
23
+ navigationUrl: string
24
+ navigationId: number
25
+ }
26
+
27
+ type NavigationMilestone =
28
+ | 'document-request'
29
+ | 'document-request-failed'
30
+ | 'document-request-finished'
31
+ | 'document-response'
32
+ | 'domcontentloaded'
33
+ | 'error'
34
+ | 'load'
35
+ | 'start'
36
+
37
+ type NavigationDiagnostic = {
38
+ browserId: number
39
+ capturedAt: string
40
+ contextId: number
41
+ errorText?: string
42
+ failurePhase?: 'bridge' | 'navigation'
43
+ headersReceived?: boolean
44
+ method?: string
45
+ milestone: NavigationMilestone
46
+ navigationUrl: string
47
+ navigationId: number
48
+ operation: SootsimNavigationIdentity['operation']
49
+ pageState?: SootsimPageState | { evaluateError: string }
50
+ status?: number
51
+ target: string
52
+ type: 'rnx-navigation'
53
+ url: string
54
+ }
55
+
56
+ type PageDiagnostic =
57
+ | NavigationDiagnostic
58
+ | {
59
+ capturedAt: string
60
+ level: string
61
+ message: string
62
+ type: 'page-console'
63
+ }
64
+ | {
65
+ capturedAt: string
66
+ message: string
67
+ type: 'page-error'
68
+ }
69
+ | {
70
+ capturedAt: string
71
+ errorText: string
72
+ method: string
73
+ type: 'subresource-request-failed'
74
+ url: string
75
+ }
76
+
77
+ const DIAGNOSTIC_LIMIT = 40
78
+ const pageDiagnostics = new WeakMap<Page, PageDiagnostic[]>()
79
+ const activeNavigations = new WeakMap<Page, ActiveNavigation>()
80
+ const lastNavigations = new WeakMap<Page, ActiveNavigation>()
81
+ let nextNavigationIdentity = 0
82
+
83
+ function recordPageDiagnostic(page: Page, diagnostic: PageDiagnostic, persist = false) {
84
+ const entries = pageDiagnostics.get(page)
85
+ if (!entries) return
86
+ entries.push(diagnostic)
87
+ if (entries.length > DIAGNOSTIC_LIMIT) entries.shift()
88
+ if (persist) writeAttemptEvent(diagnostic)
89
+ }
90
+
91
+ function isTopLevelDocumentRequest(page: Page, request: Request) {
92
+ return (
93
+ request.isNavigationRequest() &&
94
+ request.resourceType() === 'document' &&
95
+ request.frame() === page.mainFrame()
96
+ )
97
+ }
98
+
99
+ function recordNavigationMilestoneFor(
100
+ page: Page,
101
+ active: ActiveNavigation,
102
+ milestone: NavigationMilestone,
103
+ details: Partial<
104
+ Pick<
105
+ NavigationDiagnostic,
106
+ | 'errorText'
107
+ | 'failurePhase'
108
+ | 'headersReceived'
109
+ | 'method'
110
+ | 'pageState'
111
+ | 'status'
112
+ | 'url'
113
+ >
114
+ > = {},
115
+ ) {
116
+ recordPageDiagnostic(
117
+ page,
118
+ {
119
+ ...active,
120
+ ...details,
121
+ capturedAt: new Date().toISOString(),
122
+ milestone,
123
+ target: process.env.CONFORMANCE_PROOF_TARGET || 'sootsim',
124
+ type: 'rnx-navigation',
125
+ url: details.url ?? active.navigationUrl,
126
+ },
127
+ true,
128
+ )
129
+ }
130
+
131
+ function recordNavigationMilestone(
132
+ page: Page,
133
+ milestone: NavigationMilestone,
134
+ details: Parameters<typeof recordNavigationMilestoneFor>[3] = {},
135
+ ) {
136
+ const active = activeNavigations.get(page)
137
+ if (active) recordNavigationMilestoneFor(page, active, milestone, details)
138
+ }
139
+
140
+ function attachPageDiagnostics(page: Page) {
141
+ if (pageDiagnostics.has(page)) return
142
+ pageDiagnostics.set(page, [])
143
+ page.on('console', (message) => {
144
+ recordPageDiagnostic(page, {
145
+ capturedAt: new Date().toISOString(),
146
+ level: message.type(),
147
+ message: message.text(),
148
+ type: 'page-console',
149
+ })
150
+ })
151
+ page.on('pageerror', (error) => {
152
+ recordPageDiagnostic(page, {
153
+ capturedAt: new Date().toISOString(),
154
+ message: error.message,
155
+ type: 'page-error',
156
+ })
157
+ })
158
+ page.on('request', (request) => {
159
+ if (!isTopLevelDocumentRequest(page, request)) return
160
+ recordNavigationMilestone(page, 'document-request', {
161
+ method: request.method(),
162
+ url: request.url(),
163
+ })
164
+ })
165
+ page.on('response', (response) => {
166
+ const request = response.request()
167
+ if (!isTopLevelDocumentRequest(page, request)) return
168
+ recordNavigationMilestone(page, 'document-response', {
169
+ headersReceived: true,
170
+ status: response.status(),
171
+ url: request.url(),
172
+ })
173
+ })
174
+ page.on('requestfinished', (request) => {
175
+ if (!isTopLevelDocumentRequest(page, request)) return
176
+ recordNavigationMilestone(page, 'document-request-finished', { url: request.url() })
177
+ })
178
+ page.on('requestfailed', (request) => {
179
+ const failure = request.failure()
180
+ const errorText = failure?.errorText ?? ''
181
+ if (isTopLevelDocumentRequest(page, request)) {
182
+ recordNavigationMilestone(page, 'document-request-failed', {
183
+ errorText,
184
+ url: request.url(),
185
+ })
186
+ return
187
+ }
188
+ recordPageDiagnostic(page, {
189
+ capturedAt: new Date().toISOString(),
190
+ errorText,
191
+ method: request.method(),
192
+ type: 'subresource-request-failed',
193
+ url: request.url(),
194
+ })
195
+ })
196
+ page.on('domcontentloaded', () => {
197
+ recordNavigationMilestone(page, 'domcontentloaded')
198
+ })
199
+ page.on('load', () => {
200
+ recordNavigationMilestone(page, 'load')
201
+ })
202
+ }
203
+
204
+ async function readSootsimPageState(
205
+ page: Page,
206
+ ): Promise<SootsimPageState | { evaluateError: string }> {
207
+ try {
208
+ return await page.evaluate(() => ({
209
+ bodyText: document.body?.innerText?.slice(0, 500) ?? '',
210
+ bridges: {
211
+ sootsim: Boolean(window.SootSim),
212
+ test: Boolean(window.__sootsimTest),
213
+ },
214
+ globals: Object.keys(window)
215
+ .filter((key) => key.startsWith('__sootsim') || key === 'SootSim')
216
+ .sort(),
217
+ readyState: document.readyState,
218
+ title: document.title,
219
+ url: window.location.href,
220
+ }))
221
+ } catch (error) {
222
+ return {
223
+ evaluateError: error instanceof Error ? error.message : String(error),
224
+ }
225
+ }
226
+ }
227
+
228
+ export async function describeSootsimBridgeFailure(
229
+ page: Page,
230
+ cause: unknown,
231
+ summary = 'timed out waiting for sootsim test bridge',
232
+ pageState?: SootsimPageState | { evaluateError: string },
233
+ ) {
234
+ const recordBridgeFailure = pageState === undefined
235
+ const state = pageState ?? (await readSootsimPageState(page))
236
+ const navigation = lastNavigations.get(page)
237
+ if (recordBridgeFailure && navigation) {
238
+ recordNavigationMilestoneFor(page, navigation, 'error', {
239
+ errorText: cause instanceof Error ? cause.message : String(cause),
240
+ failurePhase: 'bridge',
241
+ pageState: state,
242
+ })
243
+ }
244
+ return new Error(
245
+ [
246
+ summary,
247
+ `cause: ${cause instanceof Error ? cause.message : String(cause)}`,
248
+ `page: ${JSON.stringify(state)}`,
249
+ `recent page diagnostics:\n${JSON.stringify(getSootsimNavigationDiagnostics(page))}`,
250
+ ].join('\n'),
251
+ )
252
+ }
253
+
254
+ export async function navigateSootsimPage(
255
+ page: Page,
256
+ url: string,
257
+ identity: SootsimNavigationIdentity,
258
+ ): Promise<Response | null> {
259
+ attachPageDiagnostics(page)
260
+ const navigation = {
261
+ ...identity,
262
+ navigationUrl: url,
263
+ navigationId: ++nextNavigationIdentity,
264
+ }
265
+ activeNavigations.set(page, navigation)
266
+ lastNavigations.set(page, navigation)
267
+ recordNavigationMilestone(page, 'start')
268
+ try {
269
+ return await page.goto(url, { waitUntil: 'load', timeout: 30000 })
270
+ } catch (error) {
271
+ const pageState = await readSootsimPageState(page)
272
+ recordNavigationMilestone(page, 'error', {
273
+ errorText: error instanceof Error ? error.message : String(error),
274
+ failurePhase: 'navigation',
275
+ pageState,
276
+ })
277
+ throw await describeSootsimBridgeFailure(
278
+ page,
279
+ error,
280
+ 'sootsim navigation failed',
281
+ pageState,
282
+ )
283
+ } finally {
284
+ activeNavigations.delete(page)
285
+ }
286
+ }
287
+
288
+ export function getSootsimNavigationDiagnostics(page: Page): readonly PageDiagnostic[] {
289
+ return [...(pageDiagnostics.get(page) ?? [])]
290
+ }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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;
@@ -33,6 +33,11 @@ __export(bridge_contract_input_exports, {
33
33
  parseStateOptions: () => parseStateOptions
34
34
  });
35
35
  module.exports = __toCommonJS(bridge_contract_input_exports);
36
+
37
+ // src/bridge-contract.ts
38
+ var SIM_LONG_PRESS_MAX_MS = 5e3;
39
+
40
+ // src/bridge-contract-input.ts
36
41
  var BridgeInputError = class extends Error {
37
42
  constructor(message) {
38
43
  super(message);
@@ -123,6 +128,12 @@ function parsePerformStep(value, index) {
123
128
  }
124
129
  case "longPress": {
125
130
  const durationMs = optionalNumber(step, "durationMs", path);
131
+ if (durationMs !== void 0 && (!Number.isInteger(durationMs) || durationMs < 1 || durationMs > SIM_LONG_PRESS_MAX_MS)) {
132
+ validationFailure(
133
+ `${path}.durationMs`,
134
+ `must be an integer between 1 and ${SIM_LONG_PRESS_MAX_MS}`
135
+ );
136
+ }
126
137
  return {
127
138
  type,
128
139
  x: numberValue(step.x, `${path}.x`),
@@ -1,4 +1,7 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+
3
+ // src/bridge-contract.ts
4
+ var SIM_LONG_PRESS_MAX_MS = 5e3;
2
5
 
3
6
  // src/bridge-contract-input.ts
4
7
  var BridgeInputError = class extends Error {
@@ -91,6 +94,12 @@ function parsePerformStep(value, index) {
91
94
  }
92
95
  case "longPress": {
93
96
  const durationMs = optionalNumber(step, "durationMs", path);
97
+ if (durationMs !== void 0 && (!Number.isInteger(durationMs) || durationMs < 1 || durationMs > SIM_LONG_PRESS_MAX_MS)) {
98
+ validationFailure(
99
+ `${path}.durationMs`,
100
+ `must be an integer between 1 and ${SIM_LONG_PRESS_MAX_MS}`
101
+ );
102
+ }
94
103
  return {
95
104
  type,
96
105
  x: numberValue(step.x, `${path}.x`),
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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;
@@ -25,10 +25,14 @@ __export(bridge_contract_exports, {
25
25
  SEMANTIC_READY_CONTENT_NODE_FLOOR: () => SEMANTIC_READY_CONTENT_NODE_FLOOR,
26
26
  SEMANTIC_READY_NODE_STABLE_MS: () => SEMANTIC_READY_NODE_STABLE_MS,
27
27
  SEMANTIC_READY_POLL_MS: () => SEMANTIC_READY_POLL_MS,
28
+ SIM_LONG_PRESS_DEFAULT_MS: () => SIM_LONG_PRESS_DEFAULT_MS,
29
+ SIM_LONG_PRESS_MAX_MS: () => SIM_LONG_PRESS_MAX_MS,
28
30
  readyProbeHasContent: () => readyProbeHasContent,
29
31
  readyProbeHasTargetContent: () => readyProbeHasTargetContent
30
32
  });
31
33
  module.exports = __toCommonJS(bridge_contract_exports);
34
+ var SIM_LONG_PRESS_DEFAULT_MS = 500;
35
+ var SIM_LONG_PRESS_MAX_MS = 5e3;
32
36
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
33
37
  var SEMANTIC_READY_NODE_STABLE_MS = 750;
34
38
  var SEMANTIC_READY_POLL_MS = 150;
@@ -43,6 +47,8 @@ function readyProbeHasTargetContent(probe) {
43
47
  SEMANTIC_READY_CONTENT_NODE_FLOOR,
44
48
  SEMANTIC_READY_NODE_STABLE_MS,
45
49
  SEMANTIC_READY_POLL_MS,
50
+ SIM_LONG_PRESS_DEFAULT_MS,
51
+ SIM_LONG_PRESS_MAX_MS,
46
52
  readyProbeHasContent,
47
53
  readyProbeHasTargetContent
48
54
  });
@@ -1,6 +1,8 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
+ var SIM_LONG_PRESS_DEFAULT_MS = 500;
5
+ var SIM_LONG_PRESS_MAX_MS = 5e3;
4
6
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
5
7
  var SEMANTIC_READY_NODE_STABLE_MS = 750;
6
8
  var SEMANTIC_READY_POLL_MS = 150;
@@ -14,6 +16,8 @@ export {
14
16
  SEMANTIC_READY_CONTENT_NODE_FLOOR,
15
17
  SEMANTIC_READY_NODE_STABLE_MS,
16
18
  SEMANTIC_READY_POLL_MS,
19
+ SIM_LONG_PRESS_DEFAULT_MS,
20
+ SIM_LONG_PRESS_MAX_MS,
17
21
  readyProbeHasContent,
18
22
  readyProbeHasTargetContent
19
23
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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;
@@ -22,20 +22,46 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  // src/cloud-contract.ts
23
23
  var cloud_contract_exports = {};
24
24
  __export(cloud_contract_exports, {
25
+ RNX_CLOUD_COMMAND_TYPES: () => RNX_CLOUD_COMMAND_TYPES,
25
26
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
26
27
  RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
27
28
  RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT: () => RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT,
28
- RNX_CLOUD_MAX_ARTIFACT_BYTES: () => RNX_CLOUD_MAX_ARTIFACT_BYTES
29
+ RNX_CLOUD_MAX_ARTIFACT_BYTES: () => RNX_CLOUD_MAX_ARTIFACT_BYTES,
30
+ isRnxCloudCommandType: () => isRnxCloudCommandType
29
31
  });
30
32
  module.exports = __toCommonJS(cloud_contract_exports);
31
33
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
32
34
  var RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT = 16;
33
35
  var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
34
36
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
37
+ var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
38
+ "state",
39
+ "query",
40
+ "resolve",
41
+ "perform",
42
+ "waitFor",
43
+ "reset",
44
+ "screenshot",
45
+ "capture",
46
+ "captureRegions",
47
+ "settle",
48
+ "setAppearance",
49
+ "openUrl",
50
+ "tree",
51
+ "tap",
52
+ "longPress",
53
+ "memory"
54
+ ]);
55
+ var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
56
+ function isRnxCloudCommandType(value) {
57
+ return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
58
+ }
35
59
  // Annotate the CommonJS export names for ESM import in node:
36
60
  0 && (module.exports = {
61
+ RNX_CLOUD_COMMAND_TYPES,
37
62
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
38
63
  RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
39
64
  RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT,
40
- RNX_CLOUD_MAX_ARTIFACT_BYTES
65
+ RNX_CLOUD_MAX_ARTIFACT_BYTES,
66
+ isRnxCloudCommandType
41
67
  });
@@ -1,13 +1,37 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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;
5
5
  var RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT = 16;
6
6
  var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
7
7
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
8
+ var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
9
+ "state",
10
+ "query",
11
+ "resolve",
12
+ "perform",
13
+ "waitFor",
14
+ "reset",
15
+ "screenshot",
16
+ "capture",
17
+ "captureRegions",
18
+ "settle",
19
+ "setAppearance",
20
+ "openUrl",
21
+ "tree",
22
+ "tap",
23
+ "longPress",
24
+ "memory"
25
+ ]);
26
+ var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
27
+ function isRnxCloudCommandType(value) {
28
+ return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
29
+ }
8
30
  export {
31
+ RNX_CLOUD_COMMAND_TYPES,
9
32
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
10
33
  RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
11
34
  RNX_CLOUD_DESIGN_PARALLEL_JOB_LIMIT,
12
- RNX_CLOUD_MAX_ARTIFACT_BYTES
35
+ RNX_CLOUD_MAX_ARTIFACT_BYTES,
36
+ isRnxCloudCommandType
13
37
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.392 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.394 | (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;