rnxsim 0.1.384 → 0.1.386

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 (49) hide show
  1. package/cli/commands/cpu-profile.ts +206 -40
  2. package/dist-lib/agent-daemon-client.cjs +1 -1
  3. package/dist-lib/agent-events.cjs +1 -1
  4. package/dist-lib/agent-identity.cjs +1 -1
  5. package/dist-lib/agent-sessions.cjs +1 -1
  6. package/dist-lib/attached-projects.cjs +1 -1
  7. package/dist-lib/auth/shared-session.cjs +1 -1
  8. package/dist-lib/backend-origin.cjs +1 -1
  9. package/dist-lib/beta.cjs +1 -1
  10. package/dist-lib/beta.mjs +1 -1
  11. package/dist-lib/bridge-constants.cjs +1 -1
  12. package/dist-lib/bridge-contract-input.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.mjs +1 -1
  14. package/dist-lib/bridge-contract.cjs +1 -1
  15. package/dist-lib/bridge-contract.mjs +1 -1
  16. package/dist-lib/capture-contract.cjs +1 -1
  17. package/dist-lib/capture-contract.mjs +1 -1
  18. package/dist-lib/cli-constants.cjs +1 -1
  19. package/dist-lib/cloud-contract.cjs +1 -1
  20. package/dist-lib/cloud-contract.mjs +1 -1
  21. package/dist-lib/config.cjs +1 -1
  22. package/dist-lib/detox/index.cjs +1 -1
  23. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  24. package/dist-lib/home-paths.cjs +1 -1
  25. package/dist-lib/host/bridge-host.cjs +1 -1
  26. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  27. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  28. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  29. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  30. package/dist-lib/host/websocket-proxy.cjs +1 -1
  31. package/dist-lib/index.cjs +1 -1
  32. package/dist-lib/jump-to-source-babel.cjs +1 -1
  33. package/dist-lib/menu.cjs +1 -1
  34. package/dist-lib/menu.mjs +1 -1
  35. package/dist-lib/metro-production-bundle.cjs +1 -1
  36. package/dist-lib/metro-production-bundle.mjs +1 -1
  37. package/dist-lib/metro.cjs +1 -1
  38. package/dist-lib/profiles.cjs +1 -1
  39. package/dist-lib/public-brand.cjs +1 -1
  40. package/dist-lib/react-native-host-modules.cjs +1 -1
  41. package/dist-lib/react-native-host-modules.mjs +1 -1
  42. package/dist-lib/render-mode.cjs +1 -1
  43. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  44. package/dist-lib/sdk.cjs +1 -1
  45. package/dist-lib/sdk.mjs +1 -1
  46. package/dist-lib/skills.cjs +1 -1
  47. package/dist-lib/vite.cjs +1 -1
  48. package/package.json +1 -1
  49. package/skills/rnx-perf/SKILL.md +8 -3
@@ -151,6 +151,37 @@ export interface CpuProfileCoverage {
151
151
  stoppedOffsetMs: number | null
152
152
  }
153
153
 
154
+ export interface CpuProfileBrowserExecutableIdentity {
155
+ path: string
156
+ sha256: string
157
+ }
158
+
159
+ export interface CpuProfileBrowserIdentity {
160
+ name: string
161
+ version: string
162
+ executable: CpuProfileBrowserExecutableIdentity
163
+ }
164
+
165
+ export interface CpuProfileCaptureEvidence {
166
+ label: string
167
+ actionEpochMs: number
168
+ }
169
+
170
+ export interface CpuProfileWorkloadIdentity {
171
+ scenario: string
172
+ sourceSha256: string
173
+ }
174
+
175
+ export interface CpuProfileWorkloadEvidence {
176
+ browserIdentity: CpuProfileBrowserIdentity
177
+ captures: CpuProfileCaptureEvidence[]
178
+ completionMarker: string
179
+ expectedCaptureLabels: string[]
180
+ runtimeIdentity: Record<string, unknown>
181
+ stage: string
182
+ workloadIdentity: CpuProfileWorkloadIdentity
183
+ }
184
+
154
185
  export function cpuProfileCoverage(
155
186
  profileStartedAtMs: number | undefined,
156
187
  profileStoppedAtMs: number | undefined,
@@ -185,6 +216,33 @@ export function cpuProfileCoverage(
185
216
  }
186
217
  }
187
218
 
219
+ export function cpuProfileRoleLabels(
220
+ targets: readonly { captured: boolean; role: string }[],
221
+ ): string[] {
222
+ const labels = new Array<string>(targets.length)
223
+ const roleCounts = new Map<string, number>()
224
+ const assign = (index: number) => {
225
+ const role = targets[index].role
226
+ const count = (roleCounts.get(role) ?? 0) + 1
227
+ roleCounts.set(role, count)
228
+ labels[index] = count === 1 ? role : `${role}-${count}`
229
+ }
230
+ for (let index = 0; index < targets.length; index++) {
231
+ if (targets[index].captured) assign(index)
232
+ }
233
+ for (let index = 0; index < targets.length; index++) {
234
+ if (!targets[index].captured) assign(index)
235
+ }
236
+ return labels
237
+ }
238
+
239
+ export function cpuProfileTargetOverlapsWindow(
240
+ detachedAtMs: number | undefined,
241
+ windowStartedAtMs: number,
242
+ ): boolean {
243
+ return detachedAtMs === undefined || detachedAtMs > windowStartedAtMs
244
+ }
245
+
188
246
  export function cpuProfileActionsWithinWindow(
189
247
  actionEpochMs: readonly number[],
190
248
  windowStartedAtEpochMs: number,
@@ -201,6 +259,115 @@ export function cpuProfileActionsWithinWindow(
201
259
  )
202
260
  }
203
261
 
262
+ function cpuProfileRecord(value: unknown): Record<string, unknown> | null {
263
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return null
264
+ return Object.fromEntries(Object.entries(value))
265
+ }
266
+
267
+ function cpuProfileNonemptyString(value: unknown): value is string {
268
+ return typeof value === 'string' && value.length > 0
269
+ }
270
+
271
+ function cpuProfileSha256(value: unknown): value is string {
272
+ return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value)
273
+ }
274
+
275
+ function cpuProfileViewportIdentityValid(value: unknown): boolean {
276
+ const viewport = cpuProfileRecord(value)
277
+ return (
278
+ typeof viewport?.width === 'number' &&
279
+ Number.isFinite(viewport.width) &&
280
+ viewport.width > 0 &&
281
+ typeof viewport.height === 'number' &&
282
+ Number.isFinite(viewport.height) &&
283
+ viewport.height > 0 &&
284
+ typeof viewport.devicePixelRatio === 'number' &&
285
+ Number.isFinite(viewport.devicePixelRatio) &&
286
+ viewport.devicePixelRatio > 0
287
+ )
288
+ }
289
+
290
+ export function readCpuProfileWorkloadEvidence(
291
+ value: unknown,
292
+ ): CpuProfileWorkloadEvidence | null {
293
+ const partial = cpuProfileRecord(value)
294
+ const browserIdentity = cpuProfileRecord(partial?.browserIdentity)
295
+ const browserExecutable = cpuProfileRecord(browserIdentity?.executable)
296
+ const runtimeIdentity = cpuProfileRecord(partial?.runtimeIdentity)
297
+ const engineManifest = cpuProfileRecord(runtimeIdentity?.engineManifest)
298
+ const hostPresentation = cpuProfileRecord(runtimeIdentity?.hostPresentation)
299
+ const workloadIdentity = cpuProfileRecord(partial?.workloadIdentity)
300
+ const stage = partial?.stage
301
+ const completionMarker = partial?.completionMarker
302
+ const expectedCaptureLabels = partial?.expectedCaptureLabels
303
+ const captures = partial?.captures
304
+ if (
305
+ !cpuProfileNonemptyString(stage) ||
306
+ !cpuProfileNonemptyString(completionMarker) ||
307
+ stage !== completionMarker ||
308
+ !Array.isArray(expectedCaptureLabels) ||
309
+ expectedCaptureLabels.length === 0 ||
310
+ expectedCaptureLabels.some(
311
+ (label, index, labels) =>
312
+ !cpuProfileNonemptyString(label) || labels.indexOf(label) !== index,
313
+ ) ||
314
+ !Array.isArray(captures) ||
315
+ !cpuProfileNonemptyString(browserIdentity?.name) ||
316
+ !cpuProfileNonemptyString(browserIdentity.version) ||
317
+ !cpuProfileNonemptyString(browserExecutable?.path) ||
318
+ !cpuProfileSha256(browserExecutable.sha256) ||
319
+ runtimeIdentity === null ||
320
+ !cpuProfileNonemptyString(engineManifest?.buildIdentity) ||
321
+ !cpuProfileNonemptyString(engineManifest.generation) ||
322
+ hostPresentation === null ||
323
+ !cpuProfileViewportIdentityValid(hostPresentation.rootViewport) ||
324
+ !cpuProfileViewportIdentityValid(hostPresentation.targetViewport) ||
325
+ !cpuProfileNonemptyString(workloadIdentity?.scenario) ||
326
+ workloadIdentity.scenario !== partial?.scenario ||
327
+ !cpuProfileSha256(workloadIdentity.sourceSha256)
328
+ ) {
329
+ return null
330
+ }
331
+ const captureEvidence: CpuProfileCaptureEvidence[] = []
332
+ for (const captureValue of captures) {
333
+ const capture = cpuProfileRecord(captureValue)
334
+ const note = cpuProfileRecord(capture?.note)
335
+ if (
336
+ !cpuProfileNonemptyString(capture?.label) ||
337
+ typeof note?.actionEpochMs !== 'number' ||
338
+ !Number.isFinite(note.actionEpochMs)
339
+ ) {
340
+ return null
341
+ }
342
+ captureEvidence.push({ label: capture.label, actionEpochMs: note.actionEpochMs })
343
+ }
344
+ if (
345
+ JSON.stringify(captureEvidence.map((capture) => capture.label)) !==
346
+ JSON.stringify(expectedCaptureLabels)
347
+ ) {
348
+ return null
349
+ }
350
+ return {
351
+ browserIdentity: {
352
+ name: browserIdentity.name,
353
+ version: browserIdentity.version,
354
+ executable: {
355
+ path: browserExecutable.path,
356
+ sha256: browserExecutable.sha256,
357
+ },
358
+ },
359
+ captures: captureEvidence,
360
+ completionMarker,
361
+ expectedCaptureLabels: [...expectedCaptureLabels],
362
+ runtimeIdentity,
363
+ stage,
364
+ workloadIdentity: {
365
+ scenario: workloadIdentity.scenario,
366
+ sourceSha256: workloadIdentity.sourceSha256,
367
+ },
368
+ }
369
+ }
370
+
204
371
  export function cpuProfileInteractionBarrierValid(
205
372
  barrier: CpuProfileInteractionBarrier | null,
206
373
  windowStartedAtEpochMs: number,
@@ -237,14 +404,6 @@ function readInteractionBarrierState(
237
404
  return { marker, reachedAtEpochMs, releasedBy, releasedAtEpochMs }
238
405
  }
239
406
 
240
- function readActionEpochs(value: unknown): number[] {
241
- if (!Array.isArray(value)) return []
242
- return value.filter(
243
- (epochMs): epochMs is number =>
244
- typeof epochMs === 'number' && Number.isFinite(epochMs),
245
- )
246
- }
247
-
248
407
  export async function runCpuProfile(
249
408
  args: string[],
250
409
  opts: ProfileOptions,
@@ -555,38 +714,32 @@ export async function runCpuProfile(
555
714
  )
556
715
  // querying the page while five high-frequency profilers are still active
557
716
  // can itself time out and lengthen the requested sampling interval. stop
558
- // first, then read the already-recorded action timestamps.
559
- const workloadActionEpochMs = interactionBarrierEnabled
560
- ? readActionEpochs(
561
- await evaluatePage(`(() => {
562
- const partial = Reflect.get(globalThis, '__sootsimInteractionPartialResult')
563
- const captures = partial && typeof partial === 'object'
564
- ? Reflect.get(partial, 'captures')
565
- : null
566
- if (!Array.isArray(captures)) return []
567
- return captures.map((capture) => {
568
- if (!capture || typeof capture !== 'object') return null
569
- const note = Reflect.get(capture, 'note')
570
- return note && typeof note === 'object'
571
- ? Reflect.get(note, 'actionEpochMs')
572
- : null
573
- })
574
- })()`),
717
+ // first, then read the already-recorded workload completion evidence.
718
+ const workloadEvidence = interactionBarrierEnabled
719
+ ? readCpuProfileWorkloadEvidence(
720
+ await evaluatePage(
721
+ `Reflect.get(globalThis, '__sootsimInteractionPartialResult') ?? null`,
722
+ ),
575
723
  )
576
- : []
724
+ : null
725
+ const workloadActionEpochMs =
726
+ workloadEvidence?.captures.map((capture) => capture.actionEpochMs) ?? []
577
727
 
578
728
  mkdirSync(dirname(outputPath), { recursive: true })
579
- const roleCounts = new Map<string, number>()
580
- const manifest = results.map((target) => {
729
+ const roleLabels = cpuProfileRoleLabels(
730
+ results.map((target) => ({
731
+ captured: target.profile !== undefined,
732
+ role: target.role,
733
+ })),
734
+ )
735
+ const manifest = results.map((target, index) => {
581
736
  const coverage = cpuProfileCoverage(
582
737
  target.profileStartedAtMs,
583
738
  target.profileStoppedAtMs,
584
739
  captureWindowStartedAtMs,
585
740
  captureWindowEndedAtMs,
586
741
  )
587
- const priorCount = roleCounts.get(target.role) ?? 0
588
- roleCounts.set(target.role, priorCount + 1)
589
- const role = priorCount === 0 ? target.role : `${target.role}-${priorCount + 1}`
742
+ const role = roleLabels[index]
590
743
  const profilePath = target.profile
591
744
  ? outputPath.replace(/(\.[^.]+)?$/, `.${role}$1`)
592
745
  : null
@@ -607,11 +760,20 @@ export async function runCpuProfile(
607
760
  }
608
761
  return {
609
762
  role,
763
+ baseRole: target.role,
610
764
  type: target.type,
611
765
  title: target.title,
612
766
  url: target.url,
613
767
  detached: target.detached,
614
768
  attachedOffsetMs: target.attachedAtMs - captureWindowStartedAtMs,
769
+ detachedOffsetMs:
770
+ target.detachedAtMs === undefined
771
+ ? null
772
+ : target.detachedAtMs - captureWindowStartedAtMs,
773
+ requiredForComplete: cpuProfileTargetOverlapsWindow(
774
+ target.detachedAtMs,
775
+ captureWindowStartedAtMs,
776
+ ),
615
777
  ...coverage,
616
778
  samples: target.profile?.samples.length ?? 0,
617
779
  profilePath,
@@ -621,8 +783,8 @@ export async function runCpuProfile(
621
783
  const requiredRoles = ['page', 'shell', 'compositor', 'tenant']
622
784
  const capturedRoles = new Set(
623
785
  manifest
624
- .filter((target) => target.profilePath !== null)
625
- .map((target) => target.role),
786
+ .filter((target) => target.requiredForComplete && target.profilePath !== null)
787
+ .map((target) => target.baseRole),
626
788
  )
627
789
  const missingRoles = requiredRoles.filter((role) => !capturedRoles.has(role))
628
790
  const interactionBarrierComplete =
@@ -632,6 +794,7 @@ export async function runCpuProfile(
632
794
  captureWindowStartedAtEpochMs,
633
795
  captureWindowEndedAtEpochMs,
634
796
  ) &&
797
+ workloadEvidence !== null &&
635
798
  cpuProfileActionsWithinWindow(
636
799
  workloadActionEpochMs,
637
800
  captureWindowStartedAtEpochMs,
@@ -641,12 +804,14 @@ export async function runCpuProfile(
641
804
  missingRoles.length === 0 &&
642
805
  interactionBarrierComplete &&
643
806
  manifest.length > 0 &&
644
- manifest.every(
645
- (target) =>
646
- target.profilePath !== null &&
647
- target.error === null &&
648
- target.coverageRatio >= 0.99,
649
- )
807
+ manifest
808
+ .filter((target) => target.requiredForComplete)
809
+ .every(
810
+ (target) =>
811
+ target.profilePath !== null &&
812
+ target.error === null &&
813
+ target.coverageRatio >= 0.99,
814
+ )
650
815
  const manifestPath = outputPath.replace(/(\.[^.]+)?$/, '.manifest.json')
651
816
  const executableSha256 = IS_STANDALONE
652
817
  ? createHash('sha256').update(readFileSync(process.execPath)).digest('hex')
@@ -669,6 +834,7 @@ export async function runCpuProfile(
669
834
  captureWindowStartedAt: new Date(captureWindowStartedAtEpochMs).toISOString(),
670
835
  captureWindowEndedAt: new Date(captureWindowEndedAtEpochMs).toISOString(),
671
836
  interactionBarrier,
837
+ workloadEvidence,
672
838
  workloadActionEpochMs,
673
839
  manifest,
674
840
  },
@@ -683,7 +849,7 @@ export async function runCpuProfile(
683
849
  )
684
850
  if (!interactionBarrierComplete) {
685
851
  console.error(
686
- ' workload actions did not fall inside the interaction profile window',
852
+ ' workload did not complete every expected action inside the interaction profile window',
687
853
  )
688
854
  }
689
855
  }
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract-input.ts
4
4
  var BridgeInputError = class extends Error {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/bridge-contract.ts
4
4
  var SEMANTIC_READY_CONTENT_NODE_FLOOR = 100;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION = "rnxsim";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.384 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.386 | (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.384",
3
+ "version": "0.1.386",
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",
@@ -189,12 +189,14 @@ visible nonpersistent WKWebView for Safari-engine claims; Playwright WebKit is
189
189
  not the installed Safari engine.
190
190
 
191
191
  every receipt must carry the exact page and frame URLs, browser user agent,
192
+ browser executable path and content hash,
192
193
  harness-source identity, capture time, engine build identity and generation,
193
194
  runtime bundle receipt, sampled host capacity at run start, runtime errors, and
194
195
  any partial failure. use the shared host-capacity sampler; do not record raw
195
196
  `freemem()` or decide from macOS load average.
196
197
  partial artifacts remain inadmissible until every requested run number for that
197
- scenario exists with one harness, engine, seed, and viewport identity. browser
198
+ scenario exists with one harness, browser executable, engine, seed, and
199
+ viewport identity. browser
198
200
  comparisons use the same root/target viewport tuple and backing scale. for a
199
201
  wrapper or embedded surface, first prove the target has nonzero presented
200
202
  geometry; a finite host viewport that responsively hides the target measures a
@@ -263,8 +265,11 @@ a post-workload delay long enough to remain open through profiler stop. the
263
265
  pre-workload delay alone is not synchronization: it can end the profile while
264
266
  the workload is still preparing. barrier mode pauses the workload before its
265
267
  first measured capture until every discovered target is profiling, then rejects
266
- the manifest unless a recorded action timestamp falls inside the capture
267
- interval. the barrier also has a bounded page-side lease so an interrupted
268
+ the manifest unless the workload publishes its completion marker, every expected
269
+ capture label, and action timestamps inside the capture interval. retain its
270
+ browser executable, engine build and generation, root and target viewports, and
271
+ workload source identity in the CPU manifest. the barrier also has a bounded
272
+ page-side lease so an interrupted
268
273
  profiler cannot strand the workload; lease expiry releases the runner but
269
274
  invalidates the profile.
270
275