rnxsim 0.1.514 → 0.1.516

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 (60) hide show
  1. package/cli/cloud-client.ts +18 -8
  2. package/cli/commands/inspect/get-layout.ts +2 -1
  3. package/cli/outbound-endpoints.ts +1 -1
  4. package/dist-lib/agent-daemon-client.cjs +1 -1
  5. package/dist-lib/agent-events.cjs +1 -1
  6. package/dist-lib/agent-identity.cjs +1 -1
  7. package/dist-lib/agent-sessions.cjs +1 -1
  8. package/dist-lib/attached-projects.cjs +1 -1
  9. package/dist-lib/auth/shared-session.cjs +1 -1
  10. package/dist-lib/backend-origin.cjs +1 -1
  11. package/dist-lib/beta.cjs +1 -1
  12. package/dist-lib/beta.mjs +1 -1
  13. package/dist-lib/bridge-constants.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.cjs +64 -1
  15. package/dist-lib/bridge-contract-input.mjs +63 -1
  16. package/dist-lib/bridge-contract.cjs +73 -3
  17. package/dist-lib/bridge-contract.mjs +69 -2
  18. package/dist-lib/capture-contract.cjs +1 -1
  19. package/dist-lib/capture-contract.mjs +1 -1
  20. package/dist-lib/cli-constants.cjs +1 -1
  21. package/dist-lib/cloud-contract.cjs +63 -22
  22. package/dist-lib/cloud-contract.mjs +57 -21
  23. package/dist-lib/cloud.cjs +56 -20
  24. package/dist-lib/cloud.mjs +56 -20
  25. package/dist-lib/config.cjs +1 -1
  26. package/dist-lib/detox/index.cjs +1 -1
  27. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  28. package/dist-lib/home-paths.cjs +1 -1
  29. package/dist-lib/host/bridge-host.cjs +45 -20
  30. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  31. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  32. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  33. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  34. package/dist-lib/host/websocket-proxy.cjs +1 -1
  35. package/dist-lib/index.cjs +62 -24
  36. package/dist-lib/jump-to-source-babel.cjs +1 -1
  37. package/dist-lib/jump-to-source-native.cjs +1 -1
  38. package/dist-lib/menu.cjs +1 -1
  39. package/dist-lib/menu.mjs +1 -1
  40. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  41. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  42. package/dist-lib/metro-production-bundle.cjs +1 -1
  43. package/dist-lib/metro-production-bundle.mjs +1 -1
  44. package/dist-lib/metro.cjs +1 -1
  45. package/dist-lib/profiles.cjs +1 -1
  46. package/dist-lib/public-brand.cjs +1 -1
  47. package/dist-lib/react-native-host-modules.cjs +1 -1
  48. package/dist-lib/react-native-host-modules.mjs +1 -1
  49. package/dist-lib/render-mode.cjs +1 -1
  50. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  51. package/dist-lib/sdk.cjs +1 -1
  52. package/dist-lib/sdk.mjs +1 -1
  53. package/dist-lib/skills.cjs +62 -24
  54. package/dist-lib/swift.cjs +1 -1
  55. package/dist-lib/vite.cjs +1 -1
  56. package/package.json +2 -1
  57. package/src/bridge-contract-input.ts +74 -0
  58. package/src/bridge-contract.ts +103 -0
  59. package/src/cloud-contract.ts +71 -19
  60. package/src/cloud.ts +10 -0
@@ -28,6 +28,9 @@ import { isLoopbackHost } from '../src/backend-origin.ts'
28
28
  import {
29
29
  isRnxCloudCommandType,
30
30
  RNX_CLOUD_MAX_ARTIFACT_BYTES,
31
+ RNX_CLOUD_TOKEN_SCOPES,
32
+ rnxCloudCommandScope,
33
+ rnxCloudScopesAllowCommand,
31
34
  type RnxCloudBoxCreateReceipt,
32
35
  type RnxCloudCreateReceipt,
33
36
  } from '../src/cloud-contract.ts'
@@ -981,10 +984,17 @@ function cloudCommand(command: {
981
984
  for (const [key, value] of Object.entries(command)) {
982
985
  if (key !== 'id' && key !== 'simId') clean[key] = value
983
986
  }
984
- if (isRnxCloudCommandType(command.type)) return clean
985
- throw new Error(
986
- `a remote simulator does not support bridge command type ${command.type}`,
987
- )
987
+ if (!isRnxCloudCommandType(command.type)) {
988
+ throw new Error(
989
+ `a remote simulator does not support bridge command type ${command.type}`,
990
+ )
991
+ }
992
+ if (!rnxCloudScopesAllowCommand(RNX_CLOUD_TOKEN_SCOPES, command.type)) {
993
+ throw new Error(
994
+ `a remote simulator command ${command.type} requires the ${rnxCloudCommandScope(command.type)} scope`,
995
+ )
996
+ }
997
+ return clean
988
998
  }
989
999
 
990
1000
  class CloudBridge implements WsBridge {
@@ -1077,10 +1087,10 @@ class CloudBridge implements WsBridge {
1077
1087
  *
1078
1088
  * the box holds no simulator of its own: the one it shows lives in its Box
1079
1089
  * page, which runs the same shell the local CLI drives over the daemon bridge.
1080
- * so this transport moves the whole bridge vocabulary rather than the nano
1081
- * subset (every verb that works against a local sim works against a box), and
1082
- * the box service is only the relay in the middle. that is also why there is
1083
- * no claim: the box token addresses the box, and the page answers for it.
1090
+ * so this transport moves the whole bridge vocabulary, admitted by caller
1091
+ * scope exactly like the nano plane, and the box service is only the relay in
1092
+ * the middle. that is also why there is no claim: the box token addresses the
1093
+ * box, and the page answers for it.
1084
1094
  */
1085
1095
  class CloudBoxBridge implements WsBridge {
1086
1096
  readonly plane = 'cloud' as const
@@ -30,7 +30,8 @@ export async function runGetLayoutSubcommand(opts: {
30
30
  if (
31
31
  styling &&
32
32
  error instanceof Error &&
33
- error.message === 'unsupported RNX Cloud command type: evaluate'
33
+ (error.message === 'unsupported RNX Cloud command type: evaluate' ||
34
+ error.message.includes('requires the debug scope'))
34
35
  ) {
35
36
  throw new Error(
36
37
  'get layout --styling is unavailable on a remote simulator; rerun without --styling or use a local sim',
@@ -374,7 +374,7 @@ export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> =
374
374
  'packages/sootsim-engine/src/headless/browser-tenant-worker.ts :: fetch :: new URL(name, assetBase).href':
375
375
  { category: 'same_origin_runtime', count: 1 },
376
376
  // hashes its own delivered script to identify the engine to display clients.
377
- 'packages/sootsim-engine/src/headless/browser-tenant-worker.ts :: fetch :: self.location.href':
377
+ 'packages/sootsim-engine/src/headless/browser-tenant-worker.ts :: fetch :: workerSourceUrl':
378
378
  { category: 'same_origin_runtime', count: 1 },
379
379
  // the tenant build's built-in app chunk prefetch list and the chunk bodies
380
380
  // it names, resolved against the worker chunk's own url.
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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;
@@ -24,6 +24,7 @@ var bridge_contract_input_exports = {};
24
24
  __export(bridge_contract_input_exports, {
25
25
  BridgeInputError: () => BridgeInputError,
26
26
  SEMANTIC_WAIT_MAX_TIMEOUT_MS: () => SEMANTIC_WAIT_MAX_TIMEOUT_MS,
27
+ findUnbalancedTouchDown: () => findUnbalancedTouchDown,
27
28
  parsePerformStep: () => parsePerformStep,
28
29
  parseResetOptions: () => parseResetOptions,
29
30
  parseScreenshotOptions: () => parseScreenshotOptions,
@@ -191,6 +192,45 @@ function parsePerformStep(value, index) {
191
192
  return { type, key: stringValue(step.key, `${path}.key`) };
192
193
  case "dismissKeyboard":
193
194
  return { type };
195
+ case "setElementValue": {
196
+ const submit = optionalBoolean(step, "submit", path);
197
+ return {
198
+ type,
199
+ id: stringValue(step.id, `${path}.id`),
200
+ text: stringValue(step.text, `${path}.text`),
201
+ ...submit === void 0 ? {} : { submit }
202
+ };
203
+ }
204
+ case "toggleKeyboard":
205
+ return { type };
206
+ case "openUrl": {
207
+ const url = stringValue(step.url, `${path}.url`);
208
+ if (url.length === 0) validationFailure(`${path}.url`, "must be non-empty");
209
+ return { type, url };
210
+ }
211
+ case "keyDown":
212
+ case "keyUp":
213
+ return { type, key: stringValue(step.key, `${path}.key`) };
214
+ case "setOrientation": {
215
+ const orientation = stringValue(step.orientation, `${path}.orientation`);
216
+ if (orientation !== "portrait" && orientation !== "landscape") {
217
+ validationFailure(`${path}.orientation`, "must be portrait or landscape");
218
+ }
219
+ return { type, orientation };
220
+ }
221
+ case "deviceInfo":
222
+ return { type };
223
+ case "buttonDown":
224
+ case "buttonUp": {
225
+ const button = step.button === void 0 ? void 0 : stringValue(step.button, `${path}.button`);
226
+ return { type, ...button === void 0 ? {} : { button } };
227
+ }
228
+ case "incrementElement":
229
+ case "decrementElement":
230
+ return { type, id: stringValue(step.id, `${path}.id`) };
231
+ case "discoverStoreKitConfig":
232
+ case "clearStoreKitConfig":
233
+ return { type };
194
234
  case "wait":
195
235
  return { type, ms: numberValue(step.ms, `${path}.ms`) };
196
236
  case "waitFor": {
@@ -214,6 +254,28 @@ function parsePerformStep(value, index) {
214
254
  return validationFailure(`${path}.type`, "is not a supported perform step");
215
255
  }
216
256
  }
257
+ function findUnbalancedTouchDown(steps) {
258
+ const open = /* @__PURE__ */ new Map();
259
+ const pointerIdOf = (step) => {
260
+ if (step.type !== "touchDown" && step.type !== "touchMove" && step.type !== "touchUp" && step.type !== "touchCancel") {
261
+ return null;
262
+ }
263
+ const pointerId = step.pointerId ?? 999;
264
+ return Number.isSafeInteger(pointerId) ? pointerId : null;
265
+ };
266
+ for (const [index, step] of steps.entries()) {
267
+ if (step.type === "touchDown") {
268
+ const pointerId = pointerIdOf(step) ?? 999;
269
+ if (!open.has(pointerId)) open.set(pointerId, index);
270
+ } else if (step.type === "touchUp" || step.type === "touchCancel") {
271
+ const pointerId = pointerIdOf(step);
272
+ if (pointerId !== null) open.delete(pointerId);
273
+ }
274
+ }
275
+ const next = open.entries().next();
276
+ if (next.done) return null;
277
+ return { index: next.value[1], pointerId: next.value[0] };
278
+ }
217
279
  function parseStateOptions(value) {
218
280
  const input = recordValue(value, "state");
219
281
  const route = optionalBoolean(input, "route", "state");
@@ -372,6 +434,7 @@ function parseTapTarget(value) {
372
434
  0 && (module.exports = {
373
435
  BridgeInputError,
374
436
  SEMANTIC_WAIT_MAX_TIMEOUT_MS,
437
+ findUnbalancedTouchDown,
375
438
  parsePerformStep,
376
439
  parseResetOptions,
377
440
  parseScreenshotOptions,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_MAX_MS = 5e3;
@@ -156,6 +156,45 @@ function parsePerformStep(value, index) {
156
156
  return { type, key: stringValue(step.key, `${path}.key`) };
157
157
  case "dismissKeyboard":
158
158
  return { type };
159
+ case "setElementValue": {
160
+ const submit = optionalBoolean(step, "submit", path);
161
+ return {
162
+ type,
163
+ id: stringValue(step.id, `${path}.id`),
164
+ text: stringValue(step.text, `${path}.text`),
165
+ ...submit === void 0 ? {} : { submit }
166
+ };
167
+ }
168
+ case "toggleKeyboard":
169
+ return { type };
170
+ case "openUrl": {
171
+ const url = stringValue(step.url, `${path}.url`);
172
+ if (url.length === 0) validationFailure(`${path}.url`, "must be non-empty");
173
+ return { type, url };
174
+ }
175
+ case "keyDown":
176
+ case "keyUp":
177
+ return { type, key: stringValue(step.key, `${path}.key`) };
178
+ case "setOrientation": {
179
+ const orientation = stringValue(step.orientation, `${path}.orientation`);
180
+ if (orientation !== "portrait" && orientation !== "landscape") {
181
+ validationFailure(`${path}.orientation`, "must be portrait or landscape");
182
+ }
183
+ return { type, orientation };
184
+ }
185
+ case "deviceInfo":
186
+ return { type };
187
+ case "buttonDown":
188
+ case "buttonUp": {
189
+ const button = step.button === void 0 ? void 0 : stringValue(step.button, `${path}.button`);
190
+ return { type, ...button === void 0 ? {} : { button } };
191
+ }
192
+ case "incrementElement":
193
+ case "decrementElement":
194
+ return { type, id: stringValue(step.id, `${path}.id`) };
195
+ case "discoverStoreKitConfig":
196
+ case "clearStoreKitConfig":
197
+ return { type };
159
198
  case "wait":
160
199
  return { type, ms: numberValue(step.ms, `${path}.ms`) };
161
200
  case "waitFor": {
@@ -179,6 +218,28 @@ function parsePerformStep(value, index) {
179
218
  return validationFailure(`${path}.type`, "is not a supported perform step");
180
219
  }
181
220
  }
221
+ function findUnbalancedTouchDown(steps) {
222
+ const open = /* @__PURE__ */ new Map();
223
+ const pointerIdOf = (step) => {
224
+ if (step.type !== "touchDown" && step.type !== "touchMove" && step.type !== "touchUp" && step.type !== "touchCancel") {
225
+ return null;
226
+ }
227
+ const pointerId = step.pointerId ?? 999;
228
+ return Number.isSafeInteger(pointerId) ? pointerId : null;
229
+ };
230
+ for (const [index, step] of steps.entries()) {
231
+ if (step.type === "touchDown") {
232
+ const pointerId = pointerIdOf(step) ?? 999;
233
+ if (!open.has(pointerId)) open.set(pointerId, index);
234
+ } else if (step.type === "touchUp" || step.type === "touchCancel") {
235
+ const pointerId = pointerIdOf(step);
236
+ if (pointerId !== null) open.delete(pointerId);
237
+ }
238
+ }
239
+ const next = open.entries().next();
240
+ if (next.done) return null;
241
+ return { index: next.value[1], pointerId: next.value[0] };
242
+ }
182
243
  function parseStateOptions(value) {
183
244
  const input = recordValue(value, "state");
184
245
  const route = optionalBoolean(input, "route", "state");
@@ -336,6 +397,7 @@ function parseTapTarget(value) {
336
397
  export {
337
398
  BridgeInputError,
338
399
  SEMANTIC_WAIT_MAX_TIMEOUT_MS,
400
+ findUnbalancedTouchDown,
339
401
  parsePerformStep,
340
402
  parseResetOptions,
341
403
  parseScreenshotOptions,
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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;
@@ -24,15 +24,82 @@ var bridge_contract_exports = {};
24
24
  __export(bridge_contract_exports, {
25
25
  HEADLESS_TENANT_FETCH_HUNG_MARKER: () => HEADLESS_TENANT_FETCH_HUNG_MARKER,
26
26
  PUBLIC_NO_NETWORK_MARKER: () => PUBLIC_NO_NETWORK_MARKER,
27
+ REFUSED_PERFORM_STEP_TYPES: () => REFUSED_PERFORM_STEP_TYPES,
27
28
  SEMANTIC_READY_CONTENT_NODE_FLOOR: () => SEMANTIC_READY_CONTENT_NODE_FLOOR,
28
29
  SEMANTIC_READY_NODE_STABLE_MS: () => SEMANTIC_READY_NODE_STABLE_MS,
29
30
  SEMANTIC_READY_POLL_MS: () => SEMANTIC_READY_POLL_MS,
30
31
  SIM_LONG_PRESS_DEFAULT_MS: () => SIM_LONG_PRESS_DEFAULT_MS,
31
32
  SIM_LONG_PRESS_MAX_MS: () => SIM_LONG_PRESS_MAX_MS,
33
+ performStepRefusal: () => performStepRefusal,
32
34
  readyProbeHasContent: () => readyProbeHasContent,
33
- readyProbeHasTargetContent: () => readyProbeHasTargetContent
35
+ readyProbeHasTargetContent: () => readyProbeHasTargetContent,
36
+ refusedPerformStepReason: () => refusedPerformStepReason
34
37
  });
35
38
  module.exports = __toCommonJS(bridge_contract_exports);
39
+ var REFUSED_PERFORM_STEP_TYPES = [
40
+ "keyDown",
41
+ "keyUp",
42
+ "setOrientation",
43
+ "buttonDown",
44
+ "buttonUp",
45
+ "incrementElement",
46
+ "decrementElement",
47
+ "discoverStoreKitConfig",
48
+ "clearStoreKitConfig"
49
+ ];
50
+ function refusedPerformStepReason(type) {
51
+ switch (type) {
52
+ case "keyDown":
53
+ case "keyUp":
54
+ return `${type} is not supported: keys dispatch atomically; use the key step`;
55
+ case "setOrientation":
56
+ return "setOrientation is not supported: the simulator viewport is fixed at boot";
57
+ case "buttonDown":
58
+ case "buttonUp":
59
+ return `${type} is not supported: the simulator has no hardware buttons`;
60
+ case "incrementElement":
61
+ case "decrementElement":
62
+ return `${type} is not supported: steppers have no engine primitive; drive them with tapId`;
63
+ case "discoverStoreKitConfig":
64
+ case "clearStoreKitConfig":
65
+ return `${type} is not supported: storekit has no simulator model`;
66
+ }
67
+ }
68
+ function performStepRefusal(type) {
69
+ switch (type) {
70
+ case "keyDown":
71
+ case "keyUp":
72
+ case "setOrientation":
73
+ case "buttonDown":
74
+ case "buttonUp":
75
+ case "incrementElement":
76
+ case "decrementElement":
77
+ case "discoverStoreKitConfig":
78
+ case "clearStoreKitConfig":
79
+ return refusedPerformStepReason(type);
80
+ case "touchDown":
81
+ case "touchMove":
82
+ case "touchUp":
83
+ case "touchCancel":
84
+ case "tap":
85
+ case "tapId":
86
+ case "doubleTap":
87
+ case "longPress":
88
+ case "drag":
89
+ case "pinch":
90
+ case "scroll":
91
+ case "type":
92
+ case "key":
93
+ case "dismissKeyboard":
94
+ case "setElementValue":
95
+ case "toggleKeyboard":
96
+ case "openUrl":
97
+ case "deviceInfo":
98
+ case "wait":
99
+ case "waitFor":
100
+ return null;
101
+ }
102
+ }
36
103
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
37
104
  var SIM_LONG_PRESS_MAX_MS = 5e3;
38
105
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
@@ -50,11 +117,14 @@ function readyProbeHasTargetContent(probe) {
50
117
  0 && (module.exports = {
51
118
  HEADLESS_TENANT_FETCH_HUNG_MARKER,
52
119
  PUBLIC_NO_NETWORK_MARKER,
120
+ REFUSED_PERFORM_STEP_TYPES,
53
121
  SEMANTIC_READY_CONTENT_NODE_FLOOR,
54
122
  SEMANTIC_READY_NODE_STABLE_MS,
55
123
  SEMANTIC_READY_POLL_MS,
56
124
  SIM_LONG_PRESS_DEFAULT_MS,
57
125
  SIM_LONG_PRESS_MAX_MS,
126
+ performStepRefusal,
58
127
  readyProbeHasContent,
59
- readyProbeHasTargetContent
128
+ readyProbeHasTargetContent,
129
+ refusedPerformStepReason
60
130
  });
@@ -1,6 +1,70 @@
1
- /*! rnx v0.1.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
+ var REFUSED_PERFORM_STEP_TYPES = [
5
+ "keyDown",
6
+ "keyUp",
7
+ "setOrientation",
8
+ "buttonDown",
9
+ "buttonUp",
10
+ "incrementElement",
11
+ "decrementElement",
12
+ "discoverStoreKitConfig",
13
+ "clearStoreKitConfig"
14
+ ];
15
+ function refusedPerformStepReason(type) {
16
+ switch (type) {
17
+ case "keyDown":
18
+ case "keyUp":
19
+ return `${type} is not supported: keys dispatch atomically; use the key step`;
20
+ case "setOrientation":
21
+ return "setOrientation is not supported: the simulator viewport is fixed at boot";
22
+ case "buttonDown":
23
+ case "buttonUp":
24
+ return `${type} is not supported: the simulator has no hardware buttons`;
25
+ case "incrementElement":
26
+ case "decrementElement":
27
+ return `${type} is not supported: steppers have no engine primitive; drive them with tapId`;
28
+ case "discoverStoreKitConfig":
29
+ case "clearStoreKitConfig":
30
+ return `${type} is not supported: storekit has no simulator model`;
31
+ }
32
+ }
33
+ function performStepRefusal(type) {
34
+ switch (type) {
35
+ case "keyDown":
36
+ case "keyUp":
37
+ case "setOrientation":
38
+ case "buttonDown":
39
+ case "buttonUp":
40
+ case "incrementElement":
41
+ case "decrementElement":
42
+ case "discoverStoreKitConfig":
43
+ case "clearStoreKitConfig":
44
+ return refusedPerformStepReason(type);
45
+ case "touchDown":
46
+ case "touchMove":
47
+ case "touchUp":
48
+ case "touchCancel":
49
+ case "tap":
50
+ case "tapId":
51
+ case "doubleTap":
52
+ case "longPress":
53
+ case "drag":
54
+ case "pinch":
55
+ case "scroll":
56
+ case "type":
57
+ case "key":
58
+ case "dismissKeyboard":
59
+ case "setElementValue":
60
+ case "toggleKeyboard":
61
+ case "openUrl":
62
+ case "deviceInfo":
63
+ case "wait":
64
+ case "waitFor":
65
+ return null;
66
+ }
67
+ }
4
68
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
5
69
  var SIM_LONG_PRESS_MAX_MS = 5e3;
6
70
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
@@ -17,11 +81,14 @@ function readyProbeHasTargetContent(probe) {
17
81
  export {
18
82
  HEADLESS_TENANT_FETCH_HUNG_MARKER,
19
83
  PUBLIC_NO_NETWORK_MARKER,
84
+ REFUSED_PERFORM_STEP_TYPES,
20
85
  SEMANTIC_READY_CONTENT_NODE_FLOOR,
21
86
  SEMANTIC_READY_NODE_STABLE_MS,
22
87
  SEMANTIC_READY_POLL_MS,
23
88
  SIM_LONG_PRESS_DEFAULT_MS,
24
89
  SIM_LONG_PRESS_MAX_MS,
90
+ performStepRefusal,
25
91
  readyProbeHasContent,
26
- readyProbeHasTargetContent
92
+ readyProbeHasTargetContent,
93
+ refusedPerformStepReason
27
94
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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.514 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.516 | (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;