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
@@ -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;
@@ -22,6 +22,8 @@ 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_ALL_COMMAND_SCOPES: () => RNX_CLOUD_ALL_COMMAND_SCOPES,
26
+ RNX_CLOUD_COMMAND_SCOPES: () => RNX_CLOUD_COMMAND_SCOPES,
25
27
  RNX_CLOUD_COMMAND_TYPES: () => RNX_CLOUD_COMMAND_TYPES,
26
28
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
27
29
  RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
@@ -30,12 +32,15 @@ __export(cloud_contract_exports, {
30
32
  RNX_CLOUD_MAX_ARTIFACT_BYTES: () => RNX_CLOUD_MAX_ARTIFACT_BYTES,
31
33
  RNX_CLOUD_TEST_FILES_MAX_BYTES: () => RNX_CLOUD_TEST_FILES_MAX_BYTES,
32
34
  RNX_CLOUD_TEST_FILES_MAX_COUNT: () => RNX_CLOUD_TEST_FILES_MAX_COUNT,
35
+ RNX_CLOUD_TOKEN_SCOPES: () => RNX_CLOUD_TOKEN_SCOPES,
33
36
  isRnxCloudCommandType: () => isRnxCloudCommandType,
34
37
  isRnxCloudSimStatus: () => isRnxCloudSimStatus,
35
38
  isValidRnxCloudLabel: () => isValidRnxCloudLabel,
36
39
  matchesRnxCloudLabels: () => matchesRnxCloudLabels,
37
40
  parseRnxCloudLabels: () => parseRnxCloudLabels,
38
- readRnxCloudLabels: () => readRnxCloudLabels
41
+ readRnxCloudLabels: () => readRnxCloudLabels,
42
+ rnxCloudCommandScope: () => rnxCloudCommandScope,
43
+ rnxCloudScopesAllowCommand: () => rnxCloudScopesAllowCommand
39
44
  });
40
45
  module.exports = __toCommonJS(cloud_contract_exports);
41
46
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -43,29 +48,60 @@ var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
43
48
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
44
49
  var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
45
50
  var RNX_CLOUD_TEST_FILES_MAX_BYTES = 5e5;
46
- var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
47
- "state",
48
- "query",
49
- "resolve",
50
- "perform",
51
- "waitFor",
52
- "reset",
53
- "screenshot",
54
- "capture",
55
- "captureRegions",
56
- "settle",
57
- "setAppearance",
58
- "openUrl",
59
- "tree",
60
- "tap",
61
- "longPress",
62
- "memory",
63
- "diagnostics"
64
- ]);
51
+ var RNX_CLOUD_COMMAND_SCOPES = {
52
+ state: "read",
53
+ tree: "read",
54
+ query: "read",
55
+ resolve: "read",
56
+ screenshot: "read",
57
+ capture: "read",
58
+ captureRegions: "read",
59
+ memory: "read",
60
+ diagnostics: "read",
61
+ storageSnapshot: "read",
62
+ perform: "drive",
63
+ waitFor: "drive",
64
+ tap: "drive",
65
+ longPress: "drive",
66
+ settle: "drive",
67
+ openUrl: "drive",
68
+ setAppearance: "drive",
69
+ keyboard: "drive",
70
+ focus: "drive",
71
+ flowStatus: "drive",
72
+ reset: "reset",
73
+ camera: "media",
74
+ // string evaluation and arbitrary bridge calls are maestro's boundary: the
75
+ // customer sdk never carries this scope, and the service grants it only to
76
+ // the account api key caller. close rides along, since ending the page ends
77
+ // the sim and belongs to the sim's owner rather than any driver.
78
+ evaluate: "debug",
79
+ call: "debug",
80
+ close: "debug"
81
+ };
82
+ function scopeTableKeys() {
83
+ return Object.keys(RNX_CLOUD_COMMAND_SCOPES).filter(
84
+ (key) => Object.prototype.hasOwnProperty.call(RNX_CLOUD_COMMAND_SCOPES, key)
85
+ );
86
+ }
87
+ var RNX_CLOUD_COMMAND_TYPES = Object.freeze(scopeTableKeys());
65
88
  var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
66
89
  function isRnxCloudCommandType(value) {
67
90
  return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
68
91
  }
92
+ function rnxCloudCommandScope(type) {
93
+ return RNX_CLOUD_COMMAND_SCOPES[type];
94
+ }
95
+ var RNX_CLOUD_TOKEN_SCOPES = Object.freeze([
96
+ "read",
97
+ "drive",
98
+ "reset",
99
+ "media"
100
+ ]);
101
+ var RNX_CLOUD_ALL_COMMAND_SCOPES = Object.freeze(["read", "drive", "reset", "media", "debug"]);
102
+ function rnxCloudScopesAllowCommand(scopes, type) {
103
+ return scopes.includes(RNX_CLOUD_COMMAND_SCOPES[type]);
104
+ }
69
105
  var RNX_CLOUD_LABELS_MAX_COUNT = 16;
70
106
  var RNX_CLOUD_LABEL_MAX_LENGTH = 63;
71
107
  var RNX_CLOUD_LABEL_CONTROL = /[\u0000-\u001f\u007f]/;
@@ -108,6 +144,8 @@ function isRnxCloudSimStatus(value) {
108
144
  }
109
145
  // Annotate the CommonJS export names for ESM import in node:
110
146
  0 && (module.exports = {
147
+ RNX_CLOUD_ALL_COMMAND_SCOPES,
148
+ RNX_CLOUD_COMMAND_SCOPES,
111
149
  RNX_CLOUD_COMMAND_TYPES,
112
150
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
113
151
  RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
@@ -116,10 +154,13 @@ function isRnxCloudSimStatus(value) {
116
154
  RNX_CLOUD_MAX_ARTIFACT_BYTES,
117
155
  RNX_CLOUD_TEST_FILES_MAX_BYTES,
118
156
  RNX_CLOUD_TEST_FILES_MAX_COUNT,
157
+ RNX_CLOUD_TOKEN_SCOPES,
119
158
  isRnxCloudCommandType,
120
159
  isRnxCloudSimStatus,
121
160
  isValidRnxCloudLabel,
122
161
  matchesRnxCloudLabels,
123
162
  parseRnxCloudLabels,
124
- readRnxCloudLabels
163
+ readRnxCloudLabels,
164
+ rnxCloudCommandScope,
165
+ rnxCloudScopesAllowCommand
125
166
  });
@@ -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/cloud-contract.ts
4
4
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
@@ -6,29 +6,60 @@ var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
6
6
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
7
7
  var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
8
8
  var RNX_CLOUD_TEST_FILES_MAX_BYTES = 5e5;
9
- var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
10
- "state",
11
- "query",
12
- "resolve",
13
- "perform",
14
- "waitFor",
15
- "reset",
16
- "screenshot",
17
- "capture",
18
- "captureRegions",
19
- "settle",
20
- "setAppearance",
21
- "openUrl",
22
- "tree",
23
- "tap",
24
- "longPress",
25
- "memory",
26
- "diagnostics"
27
- ]);
9
+ var RNX_CLOUD_COMMAND_SCOPES = {
10
+ state: "read",
11
+ tree: "read",
12
+ query: "read",
13
+ resolve: "read",
14
+ screenshot: "read",
15
+ capture: "read",
16
+ captureRegions: "read",
17
+ memory: "read",
18
+ diagnostics: "read",
19
+ storageSnapshot: "read",
20
+ perform: "drive",
21
+ waitFor: "drive",
22
+ tap: "drive",
23
+ longPress: "drive",
24
+ settle: "drive",
25
+ openUrl: "drive",
26
+ setAppearance: "drive",
27
+ keyboard: "drive",
28
+ focus: "drive",
29
+ flowStatus: "drive",
30
+ reset: "reset",
31
+ camera: "media",
32
+ // string evaluation and arbitrary bridge calls are maestro's boundary: the
33
+ // customer sdk never carries this scope, and the service grants it only to
34
+ // the account api key caller. close rides along, since ending the page ends
35
+ // the sim and belongs to the sim's owner rather than any driver.
36
+ evaluate: "debug",
37
+ call: "debug",
38
+ close: "debug"
39
+ };
40
+ function scopeTableKeys() {
41
+ return Object.keys(RNX_CLOUD_COMMAND_SCOPES).filter(
42
+ (key) => Object.prototype.hasOwnProperty.call(RNX_CLOUD_COMMAND_SCOPES, key)
43
+ );
44
+ }
45
+ var RNX_CLOUD_COMMAND_TYPES = Object.freeze(scopeTableKeys());
28
46
  var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
29
47
  function isRnxCloudCommandType(value) {
30
48
  return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
31
49
  }
50
+ function rnxCloudCommandScope(type) {
51
+ return RNX_CLOUD_COMMAND_SCOPES[type];
52
+ }
53
+ var RNX_CLOUD_TOKEN_SCOPES = Object.freeze([
54
+ "read",
55
+ "drive",
56
+ "reset",
57
+ "media"
58
+ ]);
59
+ var RNX_CLOUD_ALL_COMMAND_SCOPES = Object.freeze(["read", "drive", "reset", "media", "debug"]);
60
+ function rnxCloudScopesAllowCommand(scopes, type) {
61
+ return scopes.includes(RNX_CLOUD_COMMAND_SCOPES[type]);
62
+ }
32
63
  var RNX_CLOUD_LABELS_MAX_COUNT = 16;
33
64
  var RNX_CLOUD_LABEL_MAX_LENGTH = 63;
34
65
  var RNX_CLOUD_LABEL_CONTROL = /[\u0000-\u001f\u007f]/;
@@ -70,6 +101,8 @@ function isRnxCloudSimStatus(value) {
70
101
  return value === "creating" || value === "open" || value === "hibernated" || value === "deleting" || value === "deleted";
71
102
  }
72
103
  export {
104
+ RNX_CLOUD_ALL_COMMAND_SCOPES,
105
+ RNX_CLOUD_COMMAND_SCOPES,
73
106
  RNX_CLOUD_COMMAND_TYPES,
74
107
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
75
108
  RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
@@ -78,10 +111,13 @@ export {
78
111
  RNX_CLOUD_MAX_ARTIFACT_BYTES,
79
112
  RNX_CLOUD_TEST_FILES_MAX_BYTES,
80
113
  RNX_CLOUD_TEST_FILES_MAX_COUNT,
114
+ RNX_CLOUD_TOKEN_SCOPES,
81
115
  isRnxCloudCommandType,
82
116
  isRnxCloudSimStatus,
83
117
  isValidRnxCloudLabel,
84
118
  matchesRnxCloudLabels,
85
119
  parseRnxCloudLabels,
86
- readRnxCloudLabels
120
+ readRnxCloudLabels,
121
+ rnxCloudCommandScope,
122
+ rnxCloudScopesAllowCommand
87
123
  };
@@ -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;
@@ -99,29 +99,60 @@ function isRnxScreenCapture(value) {
99
99
  // src/cloud-contract.ts
100
100
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
101
101
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
102
- var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
103
- "state",
104
- "query",
105
- "resolve",
106
- "perform",
107
- "waitFor",
108
- "reset",
109
- "screenshot",
110
- "capture",
111
- "captureRegions",
112
- "settle",
113
- "setAppearance",
114
- "openUrl",
115
- "tree",
116
- "tap",
117
- "longPress",
118
- "memory",
119
- "diagnostics"
120
- ]);
102
+ var RNX_CLOUD_COMMAND_SCOPES = {
103
+ state: "read",
104
+ tree: "read",
105
+ query: "read",
106
+ resolve: "read",
107
+ screenshot: "read",
108
+ capture: "read",
109
+ captureRegions: "read",
110
+ memory: "read",
111
+ diagnostics: "read",
112
+ storageSnapshot: "read",
113
+ perform: "drive",
114
+ waitFor: "drive",
115
+ tap: "drive",
116
+ longPress: "drive",
117
+ settle: "drive",
118
+ openUrl: "drive",
119
+ setAppearance: "drive",
120
+ keyboard: "drive",
121
+ focus: "drive",
122
+ flowStatus: "drive",
123
+ reset: "reset",
124
+ camera: "media",
125
+ // string evaluation and arbitrary bridge calls are maestro's boundary: the
126
+ // customer sdk never carries this scope, and the service grants it only to
127
+ // the account api key caller. close rides along, since ending the page ends
128
+ // the sim and belongs to the sim's owner rather than any driver.
129
+ evaluate: "debug",
130
+ call: "debug",
131
+ close: "debug"
132
+ };
133
+ function scopeTableKeys() {
134
+ return Object.keys(RNX_CLOUD_COMMAND_SCOPES).filter(
135
+ (key) => Object.prototype.hasOwnProperty.call(RNX_CLOUD_COMMAND_SCOPES, key)
136
+ );
137
+ }
138
+ var RNX_CLOUD_COMMAND_TYPES = Object.freeze(scopeTableKeys());
121
139
  var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
122
140
  function isRnxCloudCommandType(value) {
123
141
  return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
124
142
  }
143
+ function rnxCloudCommandScope(type) {
144
+ return RNX_CLOUD_COMMAND_SCOPES[type];
145
+ }
146
+ var RNX_CLOUD_TOKEN_SCOPES = Object.freeze([
147
+ "read",
148
+ "drive",
149
+ "reset",
150
+ "media"
151
+ ]);
152
+ var RNX_CLOUD_ALL_COMMAND_SCOPES = Object.freeze(["read", "drive", "reset", "media", "debug"]);
153
+ function rnxCloudScopesAllowCommand(scopes, type) {
154
+ return scopes.includes(RNX_CLOUD_COMMAND_SCOPES[type]);
155
+ }
125
156
 
126
157
  // src/public-brand.ts
127
158
  var name = "rnx";
@@ -313,6 +344,11 @@ function cloudCommand(command) {
313
344
  if (!isRnxCloudCommandType(command.type)) {
314
345
  throw new Error(`RNX Cloud does not support bridge command type ${command.type}`);
315
346
  }
347
+ if (!rnxCloudScopesAllowCommand(RNX_CLOUD_TOKEN_SCOPES, command.type)) {
348
+ throw new Error(
349
+ `RNX Cloud command ${command.type} requires the ${rnxCloudCommandScope(command.type)} scope`
350
+ );
351
+ }
316
352
  return { ...clean, type: command.type };
317
353
  }
318
354
  var RemoteSimulator = class {
@@ -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
  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);
@@ -72,29 +72,60 @@ function isRnxScreenCapture(value) {
72
72
  // src/cloud-contract.ts
73
73
  var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
74
74
  var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
75
- var RNX_CLOUD_COMMAND_TYPES = Object.freeze([
76
- "state",
77
- "query",
78
- "resolve",
79
- "perform",
80
- "waitFor",
81
- "reset",
82
- "screenshot",
83
- "capture",
84
- "captureRegions",
85
- "settle",
86
- "setAppearance",
87
- "openUrl",
88
- "tree",
89
- "tap",
90
- "longPress",
91
- "memory",
92
- "diagnostics"
93
- ]);
75
+ var RNX_CLOUD_COMMAND_SCOPES = {
76
+ state: "read",
77
+ tree: "read",
78
+ query: "read",
79
+ resolve: "read",
80
+ screenshot: "read",
81
+ capture: "read",
82
+ captureRegions: "read",
83
+ memory: "read",
84
+ diagnostics: "read",
85
+ storageSnapshot: "read",
86
+ perform: "drive",
87
+ waitFor: "drive",
88
+ tap: "drive",
89
+ longPress: "drive",
90
+ settle: "drive",
91
+ openUrl: "drive",
92
+ setAppearance: "drive",
93
+ keyboard: "drive",
94
+ focus: "drive",
95
+ flowStatus: "drive",
96
+ reset: "reset",
97
+ camera: "media",
98
+ // string evaluation and arbitrary bridge calls are maestro's boundary: the
99
+ // customer sdk never carries this scope, and the service grants it only to
100
+ // the account api key caller. close rides along, since ending the page ends
101
+ // the sim and belongs to the sim's owner rather than any driver.
102
+ evaluate: "debug",
103
+ call: "debug",
104
+ close: "debug"
105
+ };
106
+ function scopeTableKeys() {
107
+ return Object.keys(RNX_CLOUD_COMMAND_SCOPES).filter(
108
+ (key) => Object.prototype.hasOwnProperty.call(RNX_CLOUD_COMMAND_SCOPES, key)
109
+ );
110
+ }
111
+ var RNX_CLOUD_COMMAND_TYPES = Object.freeze(scopeTableKeys());
94
112
  var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
95
113
  function isRnxCloudCommandType(value) {
96
114
  return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
97
115
  }
116
+ function rnxCloudCommandScope(type) {
117
+ return RNX_CLOUD_COMMAND_SCOPES[type];
118
+ }
119
+ var RNX_CLOUD_TOKEN_SCOPES = Object.freeze([
120
+ "read",
121
+ "drive",
122
+ "reset",
123
+ "media"
124
+ ]);
125
+ var RNX_CLOUD_ALL_COMMAND_SCOPES = Object.freeze(["read", "drive", "reset", "media", "debug"]);
126
+ function rnxCloudScopesAllowCommand(scopes, type) {
127
+ return scopes.includes(RNX_CLOUD_COMMAND_SCOPES[type]);
128
+ }
98
129
 
99
130
  // src/public-brand.ts
100
131
  var name = "rnx";
@@ -286,6 +317,11 @@ function cloudCommand(command) {
286
317
  if (!isRnxCloudCommandType(command.type)) {
287
318
  throw new Error(`RNX Cloud does not support bridge command type ${command.type}`);
288
319
  }
320
+ if (!rnxCloudScopesAllowCommand(RNX_CLOUD_TOKEN_SCOPES, command.type)) {
321
+ throw new Error(
322
+ `RNX Cloud command ${command.type} requires the ${rnxCloudCommandScope(command.type)} scope`
323
+ );
324
+ }
289
325
  return { ...clean, type: command.type };
290
326
  }
291
327
  var RemoteSimulator = class {
@@ -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 __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;
@@ -3488,32 +3488,57 @@ var init_metro_fingerprint = __esm({
3488
3488
  });
3489
3489
 
3490
3490
  // src/cloud-contract.ts
3491
- var RNX_CLOUD_MAX_ARTIFACT_BYTES, RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES, RNX_CLOUD_COMMAND_TYPES, RNX_CLOUD_COMMAND_TYPE_SET;
3491
+ function scopeTableKeys() {
3492
+ return Object.keys(RNX_CLOUD_COMMAND_SCOPES).filter(
3493
+ (key) => Object.prototype.hasOwnProperty.call(RNX_CLOUD_COMMAND_SCOPES, key)
3494
+ );
3495
+ }
3496
+ var RNX_CLOUD_MAX_ARTIFACT_BYTES, RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES, RNX_CLOUD_COMMAND_SCOPES, RNX_CLOUD_COMMAND_TYPES, RNX_CLOUD_COMMAND_TYPE_SET, RNX_CLOUD_TOKEN_SCOPES, RNX_CLOUD_ALL_COMMAND_SCOPES;
3492
3497
  var init_cloud_contract = __esm({
3493
3498
  "src/cloud-contract.ts"() {
3494
3499
  "use strict";
3495
3500
  RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
3496
3501
  RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
3497
- RNX_CLOUD_COMMAND_TYPES = Object.freeze([
3498
- "state",
3499
- "query",
3500
- "resolve",
3501
- "perform",
3502
- "waitFor",
3502
+ RNX_CLOUD_COMMAND_SCOPES = {
3503
+ state: "read",
3504
+ tree: "read",
3505
+ query: "read",
3506
+ resolve: "read",
3507
+ screenshot: "read",
3508
+ capture: "read",
3509
+ captureRegions: "read",
3510
+ memory: "read",
3511
+ diagnostics: "read",
3512
+ storageSnapshot: "read",
3513
+ perform: "drive",
3514
+ waitFor: "drive",
3515
+ tap: "drive",
3516
+ longPress: "drive",
3517
+ settle: "drive",
3518
+ openUrl: "drive",
3519
+ setAppearance: "drive",
3520
+ keyboard: "drive",
3521
+ focus: "drive",
3522
+ flowStatus: "drive",
3523
+ reset: "reset",
3524
+ camera: "media",
3525
+ // string evaluation and arbitrary bridge calls are maestro's boundary: the
3526
+ // customer sdk never carries this scope, and the service grants it only to
3527
+ // the account api key caller. close rides along, since ending the page ends
3528
+ // the sim and belongs to the sim's owner rather than any driver.
3529
+ evaluate: "debug",
3530
+ call: "debug",
3531
+ close: "debug"
3532
+ };
3533
+ RNX_CLOUD_COMMAND_TYPES = Object.freeze(scopeTableKeys());
3534
+ RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
3535
+ RNX_CLOUD_TOKEN_SCOPES = Object.freeze([
3536
+ "read",
3537
+ "drive",
3503
3538
  "reset",
3504
- "screenshot",
3505
- "capture",
3506
- "captureRegions",
3507
- "settle",
3508
- "setAppearance",
3509
- "openUrl",
3510
- "tree",
3511
- "tap",
3512
- "longPress",
3513
- "memory",
3514
- "diagnostics"
3539
+ "media"
3515
3540
  ]);
3516
- RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
3541
+ RNX_CLOUD_ALL_COMMAND_SCOPES = Object.freeze(["read", "drive", "reset", "media", "debug"]);
3517
3542
  }
3518
3543
  });
3519
3544
 
@@ -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
 
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.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;