peachsim 0.1.661 → 0.1.663

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 (82) hide show
  1. package/cli/commands/inspect/core.ts +9 -1
  2. package/cli/commands/inspect/settling.ts +44 -1
  3. package/cli/commands/inspect/wait-ready.ts +40 -61
  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 +6 -2
  15. package/dist-lib/bridge-contract-input.mjs +6 -2
  16. package/dist-lib/bridge-contract.cjs +1 -1
  17. package/dist-lib/bridge-contract.mjs +1 -1
  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 +1 -1
  22. package/dist-lib/cloud-contract.mjs +1 -1
  23. package/dist-lib/cloud-test-args.cjs +1 -1
  24. package/dist-lib/cloud-test-args.mjs +1 -1
  25. package/dist-lib/cloud.cjs +1 -1
  26. package/dist-lib/cloud.mjs +1 -1
  27. package/dist-lib/config.cjs +1 -1
  28. package/dist-lib/detox/index.cjs +1 -1
  29. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  30. package/dist-lib/home-paths.cjs +1 -1
  31. package/dist-lib/host/bridge-host.cjs +1 -1
  32. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  33. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  34. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  35. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  36. package/dist-lib/host/websocket-proxy.cjs +1 -1
  37. package/dist-lib/index.cjs +8 -2
  38. package/dist-lib/jump-to-source-babel.cjs +1 -1
  39. package/dist-lib/jump-to-source-native.cjs +1 -1
  40. package/dist-lib/kotlin-host.cjs +197 -60
  41. package/dist-lib/menu.cjs +1 -1
  42. package/dist-lib/menu.mjs +1 -1
  43. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  44. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  45. package/dist-lib/metro-production-bundle.cjs +1 -1
  46. package/dist-lib/metro-production-bundle.mjs +1 -1
  47. package/dist-lib/metro.cjs +1 -1
  48. package/dist-lib/native-app-identity.cjs +1 -1
  49. package/dist-lib/native-app-identity.mjs +1 -1
  50. package/dist-lib/plist.cjs +1 -1
  51. package/dist-lib/plist.mjs +1 -1
  52. package/dist-lib/profiles.cjs +1 -1
  53. package/dist-lib/public-brand.cjs +1 -1
  54. package/dist-lib/react-native-host-modules.cjs +1 -1
  55. package/dist-lib/react-native-host-modules.mjs +1 -1
  56. package/dist-lib/render-mode.cjs +1 -1
  57. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  58. package/dist-lib/sdk.cjs +29 -2
  59. package/dist-lib/sdk.mjs +28 -2
  60. package/dist-lib/skills.cjs +9 -2
  61. package/dist-lib/swift-compile.cjs +1 -1
  62. package/dist-lib/swift-compile.mjs +1 -1
  63. package/dist-lib/swift-package.cjs +1 -1
  64. package/dist-lib/swift-package.mjs +1 -1
  65. package/dist-lib/swift-submit.cjs +1 -1
  66. package/dist-lib/swift-submit.mjs +1 -1
  67. package/dist-lib/swift.cjs +1 -1
  68. package/dist-lib/vite-swift.cjs +1 -1
  69. package/dist-lib/vite.cjs +1 -1
  70. package/kotlin/AppSources/androidx/activity/ActivityViewModelLazy.kt +21 -0
  71. package/kotlin/AppSources/androidx/activity/ComponentActivity.kt +5 -3
  72. package/kotlin/AppSources/androidx/lifecycle/AndroidViewModel.kt +10 -0
  73. package/kotlin/AppSources/dev/peach/app/PeachApp.kt +16 -2
  74. package/kotlin/tools/abi-classes.main.kts +41 -0
  75. package/package.json +1 -1
  76. package/src/bridge-contract-input.ts +5 -1
  77. package/src/bridge-contract.ts +4 -1
  78. package/src/generated/android-framework-themes.json +341 -0
  79. package/src/kotlin-app.ts +47 -26
  80. package/src/kotlin-host.ts +105 -17
  81. package/src/kotlin-view-models.ts +133 -0
  82. package/src/sdk.ts +2 -1
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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;
@@ -65,6 +65,81 @@ function isRecord(value) {
65
65
  return typeof value === "object" && value !== null && !Array.isArray(value);
66
66
  }
67
67
 
68
+ // src/kotlin-view-models.ts
69
+ var VIEW_MODEL = "androidx.lifecycle.ViewModel";
70
+ var ANDROID_VIEW_MODEL = "androidx.lifecycle.AndroidViewModel";
71
+ var APPLICATION = "android.app.Application";
72
+ var HANDLE = "androidx.lifecycle.SavedStateHandle";
73
+ function strings(value) {
74
+ if (!Array.isArray(value) || !value.every((item) => typeof item === "string"))
75
+ throw new Error("abi-classes printed an invalid list");
76
+ return value;
77
+ }
78
+ function readAbiClasses(output) {
79
+ return output.split("\n").filter((line) => line.startsWith("{")).map((line) => {
80
+ const row = JSON.parse(line);
81
+ if (!isRecord(row) || typeof row.name !== "string" || typeof row.kind !== "string" || typeof row.modality !== "string" || typeof row.inner !== "boolean" || typeof row.generic !== "boolean" || !Array.isArray(row.constructors))
82
+ throw new Error(`abi-classes printed an invalid class: ${line}`);
83
+ return {
84
+ name: row.name,
85
+ kind: row.kind,
86
+ modality: row.modality,
87
+ inner: row.inner,
88
+ generic: row.generic,
89
+ supers: strings(row.supers),
90
+ constructors: row.constructors.map((constructor) => {
91
+ if (!isRecord(constructor) || typeof constructor.defaulted !== "boolean")
92
+ throw new Error(`abi-classes printed an invalid constructor: ${line}`);
93
+ return {
94
+ parameters: strings(constructor.parameters),
95
+ defaulted: constructor.defaulted
96
+ };
97
+ })
98
+ };
99
+ });
100
+ }
101
+ function matching(row, signature) {
102
+ for (const { parameters } of row.constructors) {
103
+ if (parameters.join() === signature.join()) return "match";
104
+ if (parameters.length === signature.length && signature.every((type) => parameters.includes(type)))
105
+ return "misordered";
106
+ }
107
+ return null;
108
+ }
109
+ function signatureOf(row, android) {
110
+ const handled = matching(row, android ? [APPLICATION, HANDLE] : [HANDLE]);
111
+ if (handled === "misordered") return "misordered";
112
+ if (handled) return android ? "application-handle" : "handle";
113
+ if (android)
114
+ return row.constructors.some(({ parameters }) => parameters.join() === APPLICATION) ? "application" : null;
115
+ return row.constructors.some(
116
+ ({ parameters, defaulted }) => parameters.length === 0 || defaulted
117
+ ) ? "none" : null;
118
+ }
119
+ function viewModelClasses(rows) {
120
+ const byName = new Map(rows.map((row) => [row.name, row]));
121
+ const base = (row, seen) => {
122
+ for (const name of row.supers) {
123
+ if (name === VIEW_MODEL || name === ANDROID_VIEW_MODEL) return name;
124
+ const parent = byName.get(name);
125
+ if (parent && !seen.has(name)) {
126
+ seen.add(name);
127
+ const found = base(parent, seen);
128
+ if (found) return found;
129
+ }
130
+ }
131
+ return null;
132
+ };
133
+ return rows.flatMap((row) => {
134
+ if (row.kind !== "CLASS" || row.inner || row.generic) return [];
135
+ if (row.modality === "ABSTRACT" || row.modality === "SEALED") return [];
136
+ const root = base(row, /* @__PURE__ */ new Set());
137
+ if (!root) return [];
138
+ const signature = signatureOf(row, root === ANDROID_VIEW_MODEL);
139
+ return signature ? [{ name: row.name, signature }] : [];
140
+ });
141
+ }
142
+
68
143
  // src/kotlin-host.ts
69
144
  var run = (0, import_node_util.promisify)(import_node_child_process.execFile);
70
145
  var KOTLIN_ARTIFACT_PREFIX = "/__peach/kotlin-artifact/";
@@ -236,7 +311,7 @@ function entrySource(ids) {
236
311
  ""
237
312
  ].join("\n");
238
313
  }
239
- var BUILD_FORMAT = 7;
314
+ var BUILD_FORMAT = 8;
240
315
  var builds = /* @__PURE__ */ new Map();
241
316
  function buildsDir() {
242
317
  return import_node_path2.default.join(kotlinHome(), "builds");
@@ -283,45 +358,74 @@ function viewsSource(viewIds) {
283
358
  "}"
284
359
  ].join("\n");
285
360
  }
361
+ function viewModelInitializer({ name, signature }) {
362
+ const call = (args) => ` addInitializer(${name}::class) { ${name}(${args}) }`;
363
+ switch (signature) {
364
+ case "none":
365
+ return call("");
366
+ case "handle":
367
+ return call("createSavedStateHandle()");
368
+ case "application":
369
+ return call("dev.peach.app.peachApplication()");
370
+ case "application-handle":
371
+ return call("dev.peach.app.peachApplication(), createSavedStateHandle()");
372
+ case "misordered":
373
+ return ` addInitializer(${name}::class) { throw UnsupportedOperationException(${JSON.stringify(
374
+ `Class ${name.split(".").pop()} must have parameters in the proper order: [class android.app.Application, class androidx.lifecycle.SavedStateHandle]`
375
+ )}) }`;
376
+ }
377
+ }
378
+ function windowTheme(window) {
379
+ const argb = (color) => `0x${color.toString(16).padStart(8, "0")}.toInt()`;
380
+ return [
381
+ " android.view.WindowTheme(",
382
+ ` ${window.edgeToEdgeEnforced}, ${argb(window.statusBarColor)}, ${argb(window.navigationBarColor)},`,
383
+ ` ${window.statusBarContrastEnforced}, ${window.navigationBarContrastEnforced},`,
384
+ ` ${window.lightStatusBar}, ${window.lightNavigationBar},`,
385
+ " ),"
386
+ ];
387
+ }
286
388
  async function kotlinAppArtifact(app, moduleRoot, origin) {
287
389
  const toolchain = readToolchain(moduleRoot);
288
390
  const kotlinString = (value) => JSON.stringify(value).replaceAll("$", "\\$");
391
+ const appEntry = (viewModels) => [
392
+ "@file:OptIn(kotlin.js.ExperimentalJsExport::class)",
393
+ "",
394
+ "import androidx.lifecycle.createSavedStateHandle",
395
+ "",
396
+ "@JsExport",
397
+ "fun peachAppMount(density: Float, fontScale: Float, locale: String, backend: String, stencilBits: Int,",
398
+ " regular: String, medium: String, bold: String, insets: String, night: Boolean,",
399
+ " invalidate: (Boolean) -> Unit): String = dev.peach.app.peachStartApp(",
400
+ " dev.peach.app.PeachAppSpec(",
401
+ ` android.content.ComponentName(${kotlinString(app.packageName)}, ${kotlinString(app.launcher.name)}),`,
402
+ ` android.content.ComponentName(${kotlinString(app.packageName)}, ${kotlinString(app.launcher.targetClass)}),`,
403
+ ...windowTheme(app.window.day),
404
+ ...windowTheme(app.window.night),
405
+ ` { ${app.applicationClass ?? "android.app.Application"}() },`,
406
+ ` { ${app.launcher.targetClass}() },`,
407
+ ` ${app.handlesUiMode},`,
408
+ " androidx.lifecycle.viewmodel.viewModelFactory {",
409
+ ...viewModels.map(viewModelInitializer),
410
+ " },",
411
+ " ),",
412
+ " density, fontScale, locale, backend, stencilBits, regular, medium, bold, insets, night, invalidate,",
413
+ ")",
414
+ "",
415
+ "@JsExport",
416
+ `fun peachAppBack(): Boolean = dev.peach.app.peachAppBack(${app.predictiveBack})`,
417
+ "",
418
+ "@JsExport",
419
+ "fun peachAppTask(foreground: Boolean) = dev.peach.app.peachAppTask(foreground)",
420
+ "",
421
+ "@JsExport",
422
+ "fun peachAppNight(night: Boolean) = dev.peach.app.peachAppNight(night)",
423
+ ""
424
+ ].join("\n");
289
425
  const generated = {
290
426
  "PeachEntry.kt": entrySource([]),
291
427
  "PeachViews.kt": viewsSource([]),
292
- "PeachAppEntry.kt": [
293
- "@file:OptIn(kotlin.js.ExperimentalJsExport::class)",
294
- "",
295
- "@JsExport",
296
- "fun peachAppMount(density: Float, fontScale: Float, locale: String, backend: String, stencilBits: Int,",
297
- " regular: String, medium: String, bold: String, insets: String, night: Boolean,",
298
- " invalidate: (Boolean) -> Unit): String = dev.peach.app.peachStartApp(",
299
- " dev.peach.app.PeachAppSpec(",
300
- ` android.content.ComponentName(${kotlinString(app.packageName)}, ${kotlinString(app.launcher.name)}),`,
301
- ` android.content.ComponentName(${kotlinString(app.packageName)}, ${kotlinString(app.launcher.targetClass)}),`,
302
- " android.view.WindowTheme(",
303
- ` ${app.window.edgeToEdgeEnforced}, 0x${app.window.statusBarColor.toString(16).padStart(8, "0")}.toInt(),`,
304
- ` 0x${app.window.navigationBarColor.toString(16).padStart(8, "0")}.toInt(),`,
305
- ` ${app.window.statusBarContrastEnforced}, ${app.window.navigationBarContrastEnforced},`,
306
- ` ${app.window.lightStatusBar}, ${app.window.lightNavigationBar},`,
307
- " ),",
308
- ` { ${app.applicationClass ?? "android.app.Application"}() },`,
309
- ` { ${app.launcher.targetClass}() },`,
310
- ` ${app.handlesUiMode},`,
311
- " ),",
312
- " density, fontScale, locale, backend, stencilBits, regular, medium, bold, insets, night, invalidate,",
313
- ")",
314
- "",
315
- "@JsExport",
316
- `fun peachAppBack(): Boolean = dev.peach.app.peachAppBack(${app.predictiveBack})`,
317
- "",
318
- "@JsExport",
319
- "fun peachAppTask(foreground: Boolean) = dev.peach.app.peachAppTask(foreground)",
320
- "",
321
- "@JsExport",
322
- "fun peachAppNight(night: Boolean) = dev.peach.app.peachAppNight(night)",
323
- ""
324
- ].join("\n")
428
+ "PeachAppEntry.kt": appEntry([])
325
429
  };
326
430
  const shims = [
327
431
  ...kotlinSources(import_node_path2.default.join(moduleRoot, "Sources")),
@@ -336,13 +440,27 @@ async function kotlinAppArtifact(app, moduleRoot, origin) {
336
440
  sources: app.sources,
337
441
  generated,
338
442
  shims,
339
- usesCompose: true
443
+ usesCompose: true,
444
+ viewModels: {
445
+ file: "PeachAppEntry.kt",
446
+ render: appEntry,
447
+ script: import_node_path2.default.join(moduleRoot, "tools/abi-classes.main.kts")
448
+ }
340
449
  },
341
450
  origin
342
451
  );
343
452
  }
344
453
  async function compileKotlin(input, origin) {
345
- const { root, toolchain, language, sources, generated, shims, usesCompose } = input;
454
+ const {
455
+ root,
456
+ toolchain,
457
+ language,
458
+ sources,
459
+ generated,
460
+ shims,
461
+ usesCompose,
462
+ viewModels
463
+ } = input;
346
464
  const digest = (0, import_node_crypto.createHash)("sha256");
347
465
  digest.update(JSON.stringify({ format: BUILD_FORMAT, toolchain, language }));
348
466
  for (const file of [...shims, ...sources])
@@ -388,30 +506,49 @@ async function compileKotlin(input, origin) {
388
506
  "-libraries",
389
507
  libraries.join(import_node_path2.default.delimiter)
390
508
  ];
509
+ const compileKlib = (outputDir) => run(
510
+ kotlinc,
511
+ [
512
+ ...common,
513
+ ...usesCompose ? [
514
+ `-Xplugin=${import_node_path2.default.resolve(import_node_path2.default.dirname(kotlinc), "../lib/compose-compiler-plugin.jar")}`
515
+ ] : [],
516
+ "-language-version",
517
+ language,
518
+ "-api-version",
519
+ language,
520
+ "-nowarn",
521
+ "-nopack",
522
+ "-ir-output-dir",
523
+ outputDir,
524
+ "-ir-output-name",
525
+ "app",
526
+ ...shims,
527
+ ...sources,
528
+ ...Object.keys(generated).map((name) => import_node_path2.default.join(generatedDir, name))
529
+ ],
530
+ { maxBuffer: 16 * 1024 * 1024 }
531
+ );
391
532
  try {
392
- await run(
393
- kotlinc,
394
- [
395
- ...common,
396
- ...usesCompose ? [
397
- `-Xplugin=${import_node_path2.default.resolve(import_node_path2.default.dirname(kotlinc), "../lib/compose-compiler-plugin.jar")}`
398
- ] : [],
399
- "-language-version",
400
- language,
401
- "-api-version",
402
- language,
403
- "-nowarn",
404
- "-nopack",
405
- "-ir-output-dir",
406
- import_node_path2.default.join(work, "klib"),
407
- "-ir-output-name",
408
- "app",
409
- ...shims,
410
- ...sources,
411
- ...Object.keys(generated).map((name) => import_node_path2.default.join(generatedDir, name))
412
- ],
413
- { maxBuffer: 16 * 1024 * 1024 }
414
- );
533
+ if (viewModels && sources.some((file) => import_node_fs.default.readFileSync(file, "utf8").includes("ViewModel"))) {
534
+ await compileKlib(import_node_path2.default.join(work, "abi"));
535
+ const { stdout } = await run(
536
+ import_node_path2.default.join(import_node_path2.default.dirname(kotlinc), "kotlinc"),
537
+ [
538
+ "-cp",
539
+ import_node_path2.default.resolve(import_node_path2.default.dirname(kotlinc), "../lib/kotlin-compiler.jar"),
540
+ "-script",
541
+ viewModels.script,
542
+ import_node_path2.default.join(work, "abi")
543
+ ],
544
+ { maxBuffer: 64 * 1024 * 1024 }
545
+ );
546
+ import_node_fs.default.writeFileSync(
547
+ import_node_path2.default.join(generatedDir, viewModels.file),
548
+ viewModels.render(viewModelClasses(readAbiClasses(stdout)))
549
+ );
550
+ }
551
+ await compileKlib(import_node_path2.default.join(work, "klib"));
415
552
  await run(
416
553
  kotlinc,
417
554
  [
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "Peach";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/native-app-identity.ts
4
4
  var NATIVE_APP_IDENTITY_PREFIX = "globalThis.__sootsimNativeAppIdentity=";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plistModule from "@expo/plist";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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,6 +99,7 @@ __export(sdk_exports, {
99
99
  tapResolvedTarget: () => tapResolvedTarget,
100
100
  tapTargetFromPayload: () => tapTargetFromPayload,
101
101
  waitForSootsimIdle: () => waitForSootsimIdle,
102
+ waitReadyAndSettle: () => waitReadyAndSettle,
102
103
  waitReadyReason: () => waitReadyReason
103
104
  });
104
105
  module.exports = __toCommonJS(sdk_exports);
@@ -860,7 +861,13 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
860
861
  {
861
862
  type: "waitFor",
862
863
  ...options.simId ? { simId: options.simId } : {},
863
- waitForOptions: { condition: { type: "ready" }, timeoutMs }
864
+ waitForOptions: {
865
+ condition: {
866
+ type: "ready",
867
+ ...options.stableMs === void 0 ? {} : { stableMs: options.stableMs }
868
+ },
869
+ timeoutMs
870
+ }
864
871
  },
865
872
  { timeoutMs: timeoutMs + 1e3 }
866
873
  );
@@ -1683,6 +1690,25 @@ async function waitForSootsimIdle({
1683
1690
  blockedBy: typeof blockedBy === "string" ? blockedBy : "unknown"
1684
1691
  };
1685
1692
  }
1693
+ async function waitReadyAndSettle(bridge, timeoutMs, options = {}) {
1694
+ const start = Date.now();
1695
+ const ready = await inspectWaitReady(bridge, timeoutMs, options);
1696
+ if (!ready.ready) return { status: ready, idle: null, elapsedMs: Date.now() - start };
1697
+ const idle = await waitForSootsimIdle({
1698
+ bridge,
1699
+ simId: options.simId,
1700
+ maxMs: Math.max(100, Math.min(1e4, timeoutMs - (Date.now() - start))),
1701
+ pollMs: 32,
1702
+ stablePolls: 2
1703
+ });
1704
+ if (!idle.settled) return { status: ready, idle, elapsedMs: Date.now() - start };
1705
+ const settled = await inspectWaitReady(
1706
+ bridge,
1707
+ Math.max(1e3, timeoutMs - (Date.now() - start)),
1708
+ { ...options.simId ? { simId: options.simId } : {}, stableMs: 0 }
1709
+ );
1710
+ return { status: settled, idle, elapsedMs: Date.now() - start };
1711
+ }
1686
1712
 
1687
1713
  // cli/commands/inspect/actions.ts
1688
1714
  var DEFAULT_AGENT_TIMING = {
@@ -2619,5 +2645,6 @@ var SimClient = class {
2619
2645
  tapResolvedTarget,
2620
2646
  tapTargetFromPayload,
2621
2647
  waitForSootsimIdle,
2648
+ waitReadyAndSettle,
2622
2649
  waitReadyReason
2623
2650
  });
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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);
@@ -760,7 +760,13 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
760
760
  {
761
761
  type: "waitFor",
762
762
  ...options.simId ? { simId: options.simId } : {},
763
- waitForOptions: { condition: { type: "ready" }, timeoutMs }
763
+ waitForOptions: {
764
+ condition: {
765
+ type: "ready",
766
+ ...options.stableMs === void 0 ? {} : { stableMs: options.stableMs }
767
+ },
768
+ timeoutMs
769
+ }
764
770
  },
765
771
  { timeoutMs: timeoutMs + 1e3 }
766
772
  );
@@ -1583,6 +1589,25 @@ async function waitForSootsimIdle({
1583
1589
  blockedBy: typeof blockedBy === "string" ? blockedBy : "unknown"
1584
1590
  };
1585
1591
  }
1592
+ async function waitReadyAndSettle(bridge, timeoutMs, options = {}) {
1593
+ const start = Date.now();
1594
+ const ready = await inspectWaitReady(bridge, timeoutMs, options);
1595
+ if (!ready.ready) return { status: ready, idle: null, elapsedMs: Date.now() - start };
1596
+ const idle = await waitForSootsimIdle({
1597
+ bridge,
1598
+ simId: options.simId,
1599
+ maxMs: Math.max(100, Math.min(1e4, timeoutMs - (Date.now() - start))),
1600
+ pollMs: 32,
1601
+ stablePolls: 2
1602
+ });
1603
+ if (!idle.settled) return { status: ready, idle, elapsedMs: Date.now() - start };
1604
+ const settled = await inspectWaitReady(
1605
+ bridge,
1606
+ Math.max(1e3, timeoutMs - (Date.now() - start)),
1607
+ { ...options.simId ? { simId: options.simId } : {}, stableMs: 0 }
1608
+ );
1609
+ return { status: settled, idle, elapsedMs: Date.now() - start };
1610
+ }
1586
1611
 
1587
1612
  // cli/commands/inspect/actions.ts
1588
1613
  var DEFAULT_AGENT_TIMING = {
@@ -2518,5 +2543,6 @@ export {
2518
2543
  tapResolvedTarget,
2519
2544
  tapTargetFromPayload,
2520
2545
  waitForSootsimIdle,
2546
+ waitReadyAndSettle,
2521
2547
  waitReadyReason
2522
2548
  };
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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;
@@ -33769,7 +33769,13 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
33769
33769
  {
33770
33770
  type: "waitFor",
33771
33771
  ...options.simId ? { simId: options.simId } : {},
33772
- waitForOptions: { condition: { type: "ready" }, timeoutMs }
33772
+ waitForOptions: {
33773
+ condition: {
33774
+ type: "ready",
33775
+ ...options.stableMs === void 0 ? {} : { stableMs: options.stableMs }
33776
+ },
33777
+ timeoutMs
33778
+ }
33773
33779
  },
33774
33780
  { timeoutMs: timeoutMs + 1e3 }
33775
33781
  );
@@ -38965,6 +38971,7 @@ async function waitForSootsimIdle({
38965
38971
  var init_settling = __esm({
38966
38972
  "cli/commands/inspect/settling.ts"() {
38967
38973
  "use strict";
38974
+ init_core();
38968
38975
  }
38969
38976
  });
38970
38977
 
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-compile.ts
4
4
  import { execFile as execFile2 } from "node:child_process";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-package.ts
4
4
  function isSwiftManifestFile(file) {
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/swift-submit.ts
4
4
  var SWIFT_COMPILE_PATH = "/api/swift-compile";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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.661 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.663 | (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;