rnxsim 0.1.410 → 0.1.412

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 (55) hide show
  1. package/cli/cloud-client.ts +54 -32
  2. package/cli/cloud-dispatch.ts +2 -2
  3. package/cli/cloud-session.ts +23 -5
  4. package/cli/commands/platform.ts +7 -7
  5. package/cli/outbound-endpoints.ts +2 -2
  6. package/dist-lib/agent-daemon-client.cjs +1 -1
  7. package/dist-lib/agent-events.cjs +1 -1
  8. package/dist-lib/agent-identity.cjs +1 -1
  9. package/dist-lib/agent-sessions.cjs +1 -1
  10. package/dist-lib/attached-projects.cjs +1 -1
  11. package/dist-lib/auth/shared-session.cjs +1 -1
  12. package/dist-lib/backend-origin.cjs +1 -1
  13. package/dist-lib/beta.cjs +1 -1
  14. package/dist-lib/beta.mjs +1 -1
  15. package/dist-lib/bridge-constants.cjs +1 -1
  16. package/dist-lib/bridge-contract-input.cjs +1 -1
  17. package/dist-lib/bridge-contract-input.mjs +1 -1
  18. package/dist-lib/bridge-contract.cjs +1 -1
  19. package/dist-lib/bridge-contract.mjs +1 -1
  20. package/dist-lib/capture-contract.cjs +1 -1
  21. package/dist-lib/capture-contract.mjs +1 -1
  22. package/dist-lib/cli-constants.cjs +1 -1
  23. package/dist-lib/cloud-contract.cjs +1 -1
  24. package/dist-lib/cloud-contract.mjs +1 -1
  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 +1 -1
  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 +1 -1
  36. package/dist-lib/jump-to-source-babel.cjs +1 -1
  37. package/dist-lib/menu.cjs +1 -1
  38. package/dist-lib/menu.mjs +1 -1
  39. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  40. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  41. package/dist-lib/metro-production-bundle.cjs +1 -1
  42. package/dist-lib/metro-production-bundle.mjs +1 -1
  43. package/dist-lib/metro.cjs +1 -1
  44. package/dist-lib/profiles.cjs +1 -1
  45. package/dist-lib/public-brand.cjs +1 -1
  46. package/dist-lib/react-native-host-modules.cjs +1 -1
  47. package/dist-lib/react-native-host-modules.mjs +1 -1
  48. package/dist-lib/render-mode.cjs +1 -1
  49. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  50. package/dist-lib/sdk.cjs +1 -1
  51. package/dist-lib/sdk.mjs +1 -1
  52. package/dist-lib/skills.cjs +10 -6
  53. package/dist-lib/vite.cjs +1 -1
  54. package/package.json +1 -1
  55. package/src/cloud-contract.ts +11 -0
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  isRnxCloudCommandType,
14
14
  RNX_CLOUD_MAX_ARTIFACT_BYTES,
15
- type RnxCloudCreateReceipt,
15
+ type RnxCloudBoxCreateReceipt,
16
16
  } from '../src/cloud-contract'
17
17
  import { rnxPublicBrand } from '../src/public-brand'
18
18
  import {
@@ -31,7 +31,7 @@ import type {
31
31
  export const DEFAULT_RNX_CLOUD_ORIGIN = rnxPublicBrand.origin
32
32
  export const MAX_RNX_CLOUD_BUNDLE_BYTES = RNX_CLOUD_MAX_ARTIFACT_BYTES
33
33
 
34
- interface CreateCloudSimulatorOptions {
34
+ interface CreateCloudBoxOptions {
35
35
  bundlePath: string
36
36
  device: string
37
37
  authorization: string
@@ -165,46 +165,64 @@ function readCreateResponse(
165
165
  expectedBytes: number,
166
166
  expectedSha256: string,
167
167
  ): {
168
- receipt: RnxCloudCreateReceipt
169
- token: string
168
+ receipt: RnxCloudBoxCreateReceipt
169
+ boxToken: string
170
+ simulatorToken: string
170
171
  } {
171
172
  if (!isRecord(value)) throw new Error('RNX Cloud create returned invalid JSON')
172
- const simId = value.simId
173
- const artifact = value.artifact
174
- const claim = value.claim
175
- const token = value.token
173
+ const artifactId = `sha256:${expectedSha256}` as const
174
+ const isExpectedArtifact = (artifact: unknown): artifact is { bytes: number } =>
175
+ isRecord(artifact) &&
176
+ artifact.id === artifactId &&
177
+ typeof artifact.bytes === 'number' &&
178
+ Number.isInteger(artifact.bytes) &&
179
+ artifact.bytes === expectedBytes
180
+ const boxId = value.boxId
181
+ const boxToken = value.token
182
+ const simulator = value.simulator
183
+ const simId = isRecord(simulator) ? simulator.simId : null
184
+ const claim = isRecord(simulator) ? simulator.claim : null
185
+ const simulatorToken = isRecord(simulator) ? simulator.token : null
176
186
  if (
187
+ typeof boxId !== 'string' ||
188
+ !boxId ||
189
+ value.size !== 'nano' ||
190
+ typeof boxToken !== 'string' ||
191
+ !boxToken ||
192
+ !isExpectedArtifact(value.artifact) ||
193
+ !isRecord(simulator) ||
177
194
  typeof simId !== 'string' ||
178
195
  !simId ||
179
- !isRecord(artifact) ||
180
- typeof artifact.id !== 'string' ||
181
- artifact.id !== `sha256:${expectedSha256}` ||
182
- typeof artifact.bytes !== 'number' ||
183
- !Number.isInteger(artifact.bytes) ||
184
- artifact.bytes !== expectedBytes ||
196
+ !isExpectedArtifact(simulator.artifact) ||
185
197
  !isRecord(claim) ||
186
198
  typeof claim.id !== 'string' ||
187
199
  !claim.id ||
188
200
  typeof claim.expiresAt !== 'number' ||
189
- typeof token !== 'string' ||
190
- !token
201
+ typeof simulatorToken !== 'string' ||
202
+ !simulatorToken
191
203
  ) {
192
- throw new Error('RNX Cloud create returned an invalid simulator receipt')
204
+ throw new Error('RNX Cloud create returned an invalid box receipt')
193
205
  }
194
206
  return {
195
207
  receipt: {
196
- simId,
197
- artifact: { id: `sha256:${expectedSha256}`, bytes: artifact.bytes },
198
- claim: { id: claim.id, expiresAt: claim.expiresAt },
208
+ boxId,
209
+ size: 'nano',
210
+ artifact: { id: artifactId, bytes: expectedBytes },
211
+ simulator: {
212
+ simId,
213
+ artifact: { id: artifactId, bytes: expectedBytes },
214
+ claim: { id: claim.id, expiresAt: claim.expiresAt },
215
+ },
199
216
  },
200
- token,
217
+ boxToken,
218
+ simulatorToken,
201
219
  }
202
220
  }
203
221
 
204
- export async function createCloudSimulator(
205
- options: CreateCloudSimulatorOptions,
206
- ): Promise<{
207
- receipt: RnxCloudCreateReceipt
222
+ // `rnx ios --cloud <bundle>` creates a nano box around the artifact with its
223
+ // first simulator in one request, and the shell then targets that box
224
+ export async function createCloudBox(options: CreateCloudBoxOptions): Promise<{
225
+ receipt: RnxCloudBoxCreateReceipt
208
226
  session: CloudSession
209
227
  artifact: RnxCloudArtifactReceipt
210
228
  }> {
@@ -215,11 +233,12 @@ export async function createCloudSimulator(
215
233
  )
216
234
  let response: Response
217
235
  try {
218
- response = await fetch(`${apiOrigin}/v1/sims`, {
236
+ response = await fetch(`${apiOrigin}/v1/boxes`, {
219
237
  method: 'POST',
220
238
  headers: {
221
239
  authorization: options.authorization,
222
240
  'content-type': 'application/javascript',
241
+ 'x-rnx-box-size': 'nano',
223
242
  'x-rnx-artifact-sha256': artifact.sha256,
224
243
  'x-rnx-platform': 'ios',
225
244
  'x-rnx-device': options.device,
@@ -243,10 +262,12 @@ export async function createCloudSimulator(
243
262
  }
244
263
  const created = readCreateResponse(parsed, artifact.bytes.length, artifact.sha256)
245
264
  const session = createCloudSession({
246
- simId: created.receipt.simId,
265
+ boxId: created.receipt.boxId,
266
+ boxToken: created.boxToken,
267
+ simId: created.receipt.simulator.simId,
247
268
  apiOrigin,
248
- claimId: created.receipt.claim.id,
249
- token: created.token,
269
+ claimId: created.receipt.simulator.claim.id,
270
+ token: created.simulatorToken,
250
271
  })
251
272
  return { receipt: created.receipt, session, artifact: artifact.receipt }
252
273
  }
@@ -414,12 +435,13 @@ export async function confirmCloudSimulator(session: CloudSession): Promise<void
414
435
  }
415
436
  }
416
437
 
417
- export async function closeCloudSimulator(session: CloudSession): Promise<void> {
438
+ // deletes the box, which closes every simulator it holds
439
+ export async function closeCloudBox(session: CloudSession): Promise<void> {
418
440
  const response = await fetch(
419
- `${session.apiOrigin}/v1/sims/${encodeURIComponent(session.simId)}`,
441
+ `${session.apiOrigin}/v1/boxes/${encodeURIComponent(session.boxId)}`,
420
442
  {
421
443
  method: 'DELETE',
422
- headers: { authorization: `Bearer ${session.token}` },
444
+ headers: { authorization: `Bearer ${session.boxToken}` },
423
445
  },
424
446
  )
425
447
  const text = await response.text()
@@ -148,9 +148,9 @@ export async function dispatchCloudBoundary({
148
148
  }
149
149
  try {
150
150
  const descriptor = cloudSession.requireCloudSessionShellUpdate()
151
- await cloudClient.closeCloudSimulator(session)
151
+ await cloudClient.closeCloudBox(session)
152
152
  cloudSession.publishCloudSessionToShell(null, descriptor)
153
- console.log(` closed: ${session.simId}`)
153
+ console.log(` closed: box ${session.boxId} and simulator ${session.simId}`)
154
154
  return { handled: true, code: 0 }
155
155
  } catch (error) {
156
156
  console.error(
@@ -1,7 +1,7 @@
1
1
  import { fstatSync, writeSync } from 'node:fs'
2
2
  import { isLoopbackHost } from '../src/backend-origin'
3
3
 
4
- const CLOUD_SESSION_VERSION = 1 as const
4
+ const CLOUD_SESSION_VERSION = 2 as const
5
5
  const SHELL_UPDATE_FD_ENV = 'RNX_SHELL_UPDATE_FD'
6
6
  const MAX_ENCODED_SESSION_BYTES = 32 * 1024
7
7
 
@@ -10,8 +10,12 @@ export const RNX_SHELL_UPDATE_PREFIX = '__RNX_SHELL_UPDATE_V1__'
10
10
  export const RNX_SHELL_UPDATE_SET_PREFIX = `${RNX_SHELL_UPDATE_PREFIX}set:`
11
11
  export const RNX_SHELL_UPDATE_UNSET = `${RNX_SHELL_UPDATE_PREFIX}unset`
12
12
 
13
+ // the shell's target: one nano box, addressed by the box token, and the
14
+ // simulator inside it that ordinary commands reach with the simulator token
13
15
  export interface CloudSession {
14
- version: 1
16
+ version: 2
17
+ boxId: string
18
+ boxToken: string
15
19
  simId: string
16
20
  apiOrigin: string
17
21
  claimId: string
@@ -46,6 +50,8 @@ export function normalizeCloudOrigin(source: string): string {
46
50
  }
47
51
 
48
52
  export function createCloudSession(input: {
53
+ boxId: string
54
+ boxToken: string
49
55
  simId: string
50
56
  apiOrigin: string
51
57
  claimId: string
@@ -53,13 +59,21 @@ export function createCloudSession(input: {
53
59
  }): CloudSession {
54
60
  const session = {
55
61
  version: CLOUD_SESSION_VERSION,
62
+ boxId: input.boxId.trim(),
63
+ boxToken: input.boxToken,
56
64
  simId: input.simId.trim(),
57
65
  apiOrigin: normalizeCloudOrigin(input.apiOrigin.trim()),
58
66
  claimId: input.claimId.trim(),
59
67
  token: input.token,
60
68
  } satisfies CloudSession
61
- if (!session.simId || !session.claimId || !session.token) {
62
- throw new Error('cloud session requires simulator, origin, claim, and token')
69
+ if (
70
+ !session.boxId ||
71
+ !session.boxToken ||
72
+ !session.simId ||
73
+ !session.claimId ||
74
+ !session.token
75
+ ) {
76
+ throw new Error('cloud session requires box, simulator, origin, claim, and tokens')
63
77
  }
64
78
  return session
65
79
  }
@@ -92,11 +106,15 @@ export function parseCloudSession(encoded: string): CloudSession {
92
106
  if (!isRecord(parsed) || parsed.version !== CLOUD_SESSION_VERSION) {
93
107
  throw new Error(`${RNX_CLOUD_SESSION_ENV} is invalid`)
94
108
  }
109
+ const boxId = parsed.boxId
110
+ const boxToken = parsed.boxToken
95
111
  const simId = parsed.simId
96
112
  const apiOrigin = parsed.apiOrigin
97
113
  const claimId = parsed.claimId
98
114
  const token = parsed.token
99
115
  if (
116
+ typeof boxId !== 'string' ||
117
+ typeof boxToken !== 'string' ||
100
118
  typeof simId !== 'string' ||
101
119
  typeof apiOrigin !== 'string' ||
102
120
  typeof claimId !== 'string' ||
@@ -105,7 +123,7 @@ export function parseCloudSession(encoded: string): CloudSession {
105
123
  throw new Error(`${RNX_CLOUD_SESSION_ENV} is invalid`)
106
124
  }
107
125
  try {
108
- return createCloudSession({ simId, apiOrigin, claimId, token })
126
+ return createCloudSession({ boxId, boxToken, simId, apiOrigin, claimId, token })
109
127
  } catch {
110
128
  throw new Error(`${RNX_CLOUD_SESSION_ENV} is invalid`)
111
129
  }
@@ -130,15 +130,14 @@ export async function runPlatformCommand(
130
130
  } = await import('../cloud-session')
131
131
  if (readCloudSession()) {
132
132
  throw new Error(
133
- 'this shell already has an RNX Cloud simulator; run `rnx close` or create the next simulator in another shell',
133
+ 'this shell already targets an RNX Cloud box; run `rnx close` or create the next box in another shell',
134
134
  )
135
135
  }
136
136
  const descriptor = requireCloudSessionShellUpdate()
137
137
  const { authHeaderOrExit } = await import('../auth')
138
- const { closeCloudSimulator, createCloudSimulator } =
139
- await import('../cloud-client')
138
+ const { closeCloudBox, createCloudBox } = await import('../cloud-client')
140
139
  const { header } = authHeaderOrExit('ios --cloud')
141
- const created = await createCloudSimulator({
140
+ const created = await createCloudBox({
142
141
  bundlePath: input.bundlePath,
143
142
  assetsPath: input.assetsPath ?? undefined,
144
143
  device: selectedDevice,
@@ -147,12 +146,13 @@ export async function runPlatformCommand(
147
146
  try {
148
147
  publishCloudSessionToShell(created.session, descriptor)
149
148
  } catch (error) {
150
- await closeCloudSimulator(created.session)
149
+ await closeCloudBox(created.session)
151
150
  throw error
152
151
  }
153
152
  const receipt = created.receipt
154
153
  const produced = created.artifact
155
- console.log(` cloud sim: ${receipt.simId}`)
154
+ console.log(` cloud box: ${receipt.boxId} (nano)`)
155
+ console.log(` simulator: ${receipt.simulator.simId}`)
156
156
  console.log(` artifact: ${receipt.artifact.id} (${receipt.artifact.bytes} bytes)`)
157
157
  console.log(
158
158
  ` source bundle: sha256:${produced.source.sha256} (${produced.source.bytes} bytes)`,
@@ -163,7 +163,7 @@ export async function runPlatformCommand(
163
163
  console.log(
164
164
  ` embedded assets: ${produced.assets.descriptors} descriptors, ${produced.assets.variants} scales, ${produced.assets.bytes} bytes (${produced.assets.encodedBytes} encoded)`,
165
165
  )
166
- console.log(` claim expires: ${receipt.claim.expiresAt}`)
166
+ console.log(` claim expires: ${receipt.simulator.claim.expiresAt}`)
167
167
  console.log(
168
168
  ' commands: describe, find, get tree|node|count|memory, wait ready|selector, do, reset, logs, state, screenshot',
169
169
  )
@@ -121,13 +121,13 @@ export interface OutboundCallDeclaration {
121
121
  // a new fetch, websocket, node HTTP request, or TCP connection has no entry and
122
122
  // fails the package test until its destination and consent behavior are declared.
123
123
  export const DECLARED_OUTBOUND_CALLS: Record<string, OutboundCallDeclaration> = {
124
- 'packages/sootsim/cli/cloud-client.ts :: fetch :: `${apiOrigin}/v1/sims`': {
124
+ 'packages/sootsim/cli/cloud-client.ts :: fetch :: `${apiOrigin}/v1/boxes`': {
125
125
  category: 'rnx_cloud_sim',
126
126
  count: 1,
127
127
  },
128
128
  'packages/sootsim/cli/cloud-client.ts :: fetch :: `${session.apiOrigin}/v1/sims/${encodeURIComponent(session.simId)}/claim`':
129
129
  { category: 'rnx_cloud_sim', count: 1 },
130
- 'packages/sootsim/cli/cloud-client.ts :: fetch :: `${session.apiOrigin}/v1/sims/${encodeURIComponent(session.simId)}`':
130
+ 'packages/sootsim/cli/cloud-client.ts :: fetch :: `${session.apiOrigin}/v1/boxes/${encodeURIComponent(session.boxId)}`':
131
131
  { category: 'rnx_cloud_sim', count: 1 },
132
132
  'packages/sootsim/cli/cloud-client.ts :: fetch :: `${this.session.apiOrigin}/v1/sims/${encodeURIComponent(this.session.simId)}/commands`':
133
133
  { category: 'rnx_cloud_sim', count: 1 },
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SIM_LONG_PRESS_DEFAULT_MS = 500;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-fingerprint-registry.ts
4
4
  var RNX_METRO_FINGERPRINT_SCHEMA_VERSION = 2;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_MODULE_PATHS_PREFIX = "globalThis.__sootsimModulePaths=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (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;
@@ -21509,13 +21509,15 @@ function normalizeCloudOrigin(source) {
21509
21509
  function createCloudSession(input) {
21510
21510
  const session = {
21511
21511
  version: CLOUD_SESSION_VERSION,
21512
+ boxId: input.boxId.trim(),
21513
+ boxToken: input.boxToken,
21512
21514
  simId: input.simId.trim(),
21513
21515
  apiOrigin: normalizeCloudOrigin(input.apiOrigin.trim()),
21514
21516
  claimId: input.claimId.trim(),
21515
21517
  token: input.token
21516
21518
  };
21517
- if (!session.simId || !session.claimId || !session.token) {
21518
- throw new Error("cloud session requires simulator, origin, claim, and token");
21519
+ if (!session.boxId || !session.boxToken || !session.simId || !session.claimId || !session.token) {
21520
+ throw new Error("cloud session requires box, simulator, origin, claim, and tokens");
21519
21521
  }
21520
21522
  return session;
21521
21523
  }
@@ -21537,15 +21539,17 @@ function parseCloudSession(encoded) {
21537
21539
  if (!isRecord3(parsed) || parsed.version !== CLOUD_SESSION_VERSION) {
21538
21540
  throw new Error(`${RNX_CLOUD_SESSION_ENV} is invalid`);
21539
21541
  }
21542
+ const boxId = parsed.boxId;
21543
+ const boxToken = parsed.boxToken;
21540
21544
  const simId = parsed.simId;
21541
21545
  const apiOrigin = parsed.apiOrigin;
21542
21546
  const claimId = parsed.claimId;
21543
21547
  const token = parsed.token;
21544
- if (typeof simId !== "string" || typeof apiOrigin !== "string" || typeof claimId !== "string" || typeof token !== "string") {
21548
+ if (typeof boxId !== "string" || typeof boxToken !== "string" || typeof simId !== "string" || typeof apiOrigin !== "string" || typeof claimId !== "string" || typeof token !== "string") {
21545
21549
  throw new Error(`${RNX_CLOUD_SESSION_ENV} is invalid`);
21546
21550
  }
21547
21551
  try {
21548
- return createCloudSession({ simId, apiOrigin, claimId, token });
21552
+ return createCloudSession({ boxId, boxToken, simId, apiOrigin, claimId, token });
21549
21553
  } catch {
21550
21554
  throw new Error(`${RNX_CLOUD_SESSION_ENV} is invalid`);
21551
21555
  }
@@ -21559,7 +21563,7 @@ var init_cloud_session = __esm({
21559
21563
  "cli/cloud-session.ts"() {
21560
21564
  "use strict";
21561
21565
  init_backend_origin();
21562
- CLOUD_SESSION_VERSION = 1;
21566
+ CLOUD_SESSION_VERSION = 2;
21563
21567
  MAX_ENCODED_SESSION_BYTES = 32 * 1024;
21564
21568
  RNX_CLOUD_SESSION_ENV = "RNX_CLOUD_SESSION";
21565
21569
  RNX_SHELL_UPDATE_PREFIX = "__RNX_SHELL_UPDATE_V1__";
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.410 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.412 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rnxsim",
3
- "version": "0.1.410",
3
+ "version": "0.1.412",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for rnx.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -45,3 +45,14 @@ export interface RnxCloudCreateReceipt {
45
45
  }
46
46
  claim: RnxCloudClaim
47
47
  }
48
+
49
+ // a nano box is created around one artifact with its first simulator
50
+ export interface RnxCloudBoxCreateReceipt {
51
+ boxId: string
52
+ size: 'nano'
53
+ artifact: {
54
+ id: `sha256:${string}`
55
+ bytes: number
56
+ }
57
+ simulator: RnxCloudCreateReceipt
58
+ }