peachsim 0.1.1465 → 0.1.1477

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 (86) hide show
  1. package/cli/bridge-flow-runner.ts +25 -17
  2. package/cli/cloud-client.ts +12 -19
  3. package/cli/commands/inspect/settling.ts +4 -1
  4. package/cli/drivers/playwright-sim-host.ts +7 -2
  5. package/cli/drivers/playwright.ts +6 -6
  6. package/dist-lib/agent-daemon-client.cjs +1 -1
  7. package/dist-lib/agent-events.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 +1 -1
  15. package/dist-lib/bridge-contract-input.mjs +1 -1
  16. package/dist-lib/bridge-contract.cjs +1 -1
  17. package/dist-lib/bridge-contract.mjs +1 -1
  18. package/dist-lib/bundle-channel.cjs +13 -2
  19. package/dist-lib/capture-contract.cjs +1 -1
  20. package/dist-lib/capture-contract.mjs +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/config.mjs +1 -1
  29. package/dist-lib/detox/index.cjs +46 -40
  30. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  31. package/dist-lib/expo-swift-bundle.cjs +7 -2
  32. package/dist-lib/expo-swift-metadata.cjs +1 -1
  33. package/dist-lib/expo-swift-metadata.mjs +1 -1
  34. package/dist-lib/home-paths.cjs +1 -1
  35. package/dist-lib/host/bridge-host.cjs +170 -16
  36. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  37. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  38. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  39. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  40. package/dist-lib/host/websocket-proxy.cjs +1 -1
  41. package/dist-lib/index.cjs +5 -2
  42. package/dist-lib/jump-to-source-babel.cjs +1 -1
  43. package/dist-lib/jump-to-source-native.cjs +1 -1
  44. package/dist-lib/kotlin-host.cjs +1 -1
  45. package/dist-lib/menu.cjs +1 -1
  46. package/dist-lib/menu.mjs +1 -1
  47. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  48. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  49. package/dist-lib/metro-production-bundle.cjs +1 -1
  50. package/dist-lib/metro-production-bundle.mjs +1 -1
  51. package/dist-lib/metro.cjs +1 -1
  52. package/dist-lib/native-app-identity-project.cjs +1 -1
  53. package/dist-lib/native-app-identity-project.mjs +1 -1
  54. package/dist-lib/native-app-identity.cjs +1 -1
  55. package/dist-lib/native-app-identity.mjs +1 -1
  56. package/dist-lib/native-firebase-metadata.cjs +1 -1
  57. package/dist-lib/native-firebase-metadata.mjs +1 -1
  58. package/dist-lib/plist.cjs +1 -1
  59. package/dist-lib/plist.mjs +1 -1
  60. package/dist-lib/profiles.cjs +1 -1
  61. package/dist-lib/public-brand.cjs +1 -1
  62. package/dist-lib/react-native-host-modules.cjs +1 -1
  63. package/dist-lib/react-native-host-modules.mjs +1 -1
  64. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  65. package/dist-lib/sdk.cjs +5 -2
  66. package/dist-lib/sdk.mjs +5 -2
  67. package/dist-lib/skills.cjs +198 -83
  68. package/dist-lib/swift-compile.cjs +7 -2
  69. package/dist-lib/swift-compile.mjs +7 -2
  70. package/dist-lib/swift-package.cjs +1 -1
  71. package/dist-lib/swift-package.mjs +1 -1
  72. package/dist-lib/swift-submit.cjs +1 -1
  73. package/dist-lib/swift-submit.mjs +1 -1
  74. package/dist-lib/swift-toolchain.cjs +1 -1
  75. package/dist-lib/swift.cjs +1 -1
  76. package/dist-lib/vite-swift.cjs +7 -2
  77. package/dist-lib/vite.cjs +1 -1
  78. package/dist-lib/worklet-executable.cjs +1 -1
  79. package/dist-lib/worklet-executable.mjs +1 -1
  80. package/package.json +1 -1
  81. package/src/admitted-mac-build.ts +12 -0
  82. package/src/bridge-constants.ts +5 -3
  83. package/src/bundle-asset-resource.ts +8 -0
  84. package/src/host/bridge-host.ts +34 -6
  85. package/src/swift-compile.ts +5 -0
  86. package/src/worker-system-chunks.ts +10 -9
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -35,6 +35,66 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
35
35
  ));
36
36
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
37
 
38
+ // ../../scripts/lib/chromium-admission.ts
39
+ function readChromiumQueue(deps, verified3, own) {
40
+ const { fs: fs25, os: os10, path: path29, childProcess: childProcess2 } = deps;
41
+ const dir = path29.join(
42
+ process.platform === "win32" ? os10.tmpdir() : "/tmp",
43
+ "chromium-admission"
44
+ );
45
+ fs25.mkdirSync(dir, { recursive: true });
46
+ const limit = Math.max(2, Math.floor(os10.availableParallelism() / 3));
47
+ const live = (entry) => {
48
+ const match = /^(\d+)-(\d+)-/.exec(entry);
49
+ if (!match) return false;
50
+ const pid = Number(match[1]);
51
+ try {
52
+ process.kill(pid, 0);
53
+ } catch (err) {
54
+ if (!(err instanceof Error && "code" in err && err.code === "EPERM")) return false;
55
+ }
56
+ const known = verified3.get(entry);
57
+ if (known !== void 0) return known;
58
+ let same = pid === process.pid;
59
+ if (!same) {
60
+ try {
61
+ const started = childProcess2.execFileSync("ps", ["-p", String(pid), "-o", "lstart="], { encoding: "utf8" }).trim();
62
+ same = Math.abs(Date.parse(started) / 1e3 - Number(match[2])) <= 2;
63
+ } catch {
64
+ same = false;
65
+ }
66
+ }
67
+ verified3.set(entry, same);
68
+ return same;
69
+ };
70
+ const tickets = [];
71
+ for (const entry of fs25.readdirSync(dir)) {
72
+ if (entry !== own && !live(entry)) {
73
+ try {
74
+ fs25.unlinkSync(path29.join(dir, entry));
75
+ } catch {
76
+ }
77
+ continue;
78
+ }
79
+ try {
80
+ tickets.push({
81
+ entry,
82
+ created: fs25.statSync(path29.join(dir, entry), { bigint: true }).ctimeNs
83
+ });
84
+ } catch {
85
+ }
86
+ }
87
+ tickets.sort(
88
+ (a, b) => a.created === b.created ? a.entry < b.entry ? -1 : 1 : a.created < b.created ? -1 : 1
89
+ );
90
+ return { dir, limit, tickets: tickets.map((t) => t.entry) };
91
+ }
92
+ var init_chromium_admission = __esm({
93
+ "../../scripts/lib/chromium-admission.ts"() {
94
+ "use strict";
95
+ }
96
+ });
97
+
38
98
  // src/backend-origin.ts
39
99
  function normalizeHostname(hostname) {
40
100
  return hostname.replace(/^\[|\]$/g, "").toLowerCase();
@@ -4556,6 +4616,15 @@ var init_metro_production_bundle = __esm({
4556
4616
  }
4557
4617
  });
4558
4618
 
4619
+ // src/bundle-asset-resource.ts
4620
+ var PEACH_BUNDLE_ASSET_PREFIX;
4621
+ var init_bundle_asset_resource = __esm({
4622
+ "src/bundle-asset-resource.ts"() {
4623
+ "use strict";
4624
+ PEACH_BUNDLE_ASSET_PREFIX = "peach-asset://";
4625
+ }
4626
+ });
4627
+
4559
4628
  // ../contrast-bundler/src/metroAssetArtifact.ts
4560
4629
  function isEmbeddedAssetDescriptor(descriptor) {
4561
4630
  return descriptor.fileUris?.length === descriptor.scales.length && descriptor.fileHashes?.length === descriptor.scales.length;
@@ -4608,6 +4677,7 @@ function quotedEnd(text3, start, end) {
4608
4677
  return end;
4609
4678
  }
4610
4679
  function decodeSingleQuoted(contents) {
4680
+ if (!contents.includes("\\")) return contents;
4611
4681
  let value = "";
4612
4682
  for (let cursor = 0; cursor < contents.length; cursor++) {
4613
4683
  const character = contents[cursor];
@@ -5027,6 +5097,15 @@ async function sha256HexBytes(bytes) {
5027
5097
  return hex;
5028
5098
  }
5029
5099
  async function assertSelfContainedMetroArtifactAssets(bundle) {
5100
+ return visitVerifiedMetroArtifactAssets(
5101
+ bundle,
5102
+ () => {
5103
+ },
5104
+ () => {
5105
+ }
5106
+ );
5107
+ }
5108
+ async function visitVerifiedMetroArtifactAssets(bundle, acceptVariant, acceptSite) {
5030
5109
  const seen = /* @__PURE__ */ new Set();
5031
5110
  const manifestLines = [];
5032
5111
  let descriptorsCount = 0;
@@ -5037,7 +5116,10 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
5037
5116
  for (const site of iterateAssetDescriptorSites(bundle)) {
5038
5117
  const descriptor = site.descriptor;
5039
5118
  const key2 = assetDescriptorKey(descriptor);
5040
- if (seen.has(key2)) continue;
5119
+ if (seen.has(key2)) {
5120
+ acceptSite(site);
5121
+ continue;
5122
+ }
5041
5123
  seen.add(key2);
5042
5124
  descriptorsCount++;
5043
5125
  const label = `${descriptor.httpServerLocation}/${descriptor.name}.${descriptor.type}`;
@@ -5072,11 +5154,13 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
5072
5154
  `peach ios --remote bundle is not self-contained: ${label} scale ${descriptor.scales[index]} bytes do not match their content hash`
5073
5155
  );
5074
5156
  }
5157
+ acceptVariant(descriptor, index, decoded);
5075
5158
  variants++;
5076
5159
  bytes += decoded.byteLength;
5077
5160
  descriptorBytes += decoded.byteLength;
5078
5161
  }
5079
5162
  sizes.push({ asset: label, bytes: descriptorBytes });
5163
+ acceptSite(site);
5080
5164
  }
5081
5165
  } catch (error) {
5082
5166
  if (error instanceof Error && error.message.startsWith("peach ios --remote bundle is not self-contained:")) {
@@ -5097,6 +5181,52 @@ async function assertSelfContainedMetroArtifactAssets(bundle) {
5097
5181
  sizes: sortedAssetSizes(sizes)
5098
5182
  };
5099
5183
  }
5184
+ async function separateMetroArtifactAssets(bundle) {
5185
+ const resources = /* @__PURE__ */ new Map();
5186
+ const entries = /* @__PURE__ */ new Map();
5187
+ const pieces = [];
5188
+ let cursor = 0;
5189
+ const assets2 = await visitVerifiedMetroArtifactAssets(
5190
+ bundle,
5191
+ (descriptor, index, bytes) => {
5192
+ const key2 = assetDescriptorKey(descriptor);
5193
+ let entry = entries.get(key2);
5194
+ if (!entry) {
5195
+ entry = { fileUris: [], fileHashes: [], scales: descriptor.scales };
5196
+ entries.set(key2, entry);
5197
+ }
5198
+ const sha256 = descriptor.fileHashes?.[index];
5199
+ const scale = descriptor.scales[index];
5200
+ if (!sha256 || scale === void 0) {
5201
+ throw new Error("verified Metro asset variant is incomplete");
5202
+ }
5203
+ const filename = metroAssetScaleFilename(descriptor.name, descriptor.type, scale);
5204
+ const uri = `${PEACH_BUNDLE_ASSET_PREFIX}${sha256}/${encodeURIComponent(filename)}`;
5205
+ if (!resources.has(uri)) {
5206
+ resources.set(uri, {
5207
+ uri,
5208
+ sha256,
5209
+ contentType: metroAssetContentType(descriptor.type),
5210
+ bytes,
5211
+ byteLength: bytes.byteLength
5212
+ });
5213
+ }
5214
+ entry.fileUris.push(uri);
5215
+ entry.fileHashes.push(sha256);
5216
+ },
5217
+ (site) => {
5218
+ const entry = entries.get(assetDescriptorKey(site.descriptor));
5219
+ if (!entry) throw new Error("verified Metro asset descriptor is missing");
5220
+ pieces.push(
5221
+ bundle.slice(cursor, site.start),
5222
+ rewriteDescriptorObject(bundle, site, entry)
5223
+ );
5224
+ cursor = site.end;
5225
+ }
5226
+ );
5227
+ pieces.push(bundle.slice(cursor));
5228
+ return { code: pieces.join(""), assets: assets2, resources: [...resources.values()] };
5229
+ }
5100
5230
  function metroAssetScaleFilename(name2, type, scale) {
5101
5231
  const suffix = scale === 1 ? "" : `@${scale}x`;
5102
5232
  return `${name2}${suffix}.${type}`;
@@ -5291,6 +5421,7 @@ var EXPRESSION_KEYWORDS, PLACEHOLDER_JPEG, METRO_ASSET_PLACEHOLDERS;
5291
5421
  var init_metroAssetArtifact = __esm({
5292
5422
  "../contrast-bundler/src/metroAssetArtifact.ts"() {
5293
5423
  "use strict";
5424
+ init_bundle_asset_resource();
5294
5425
  EXPRESSION_KEYWORDS = /* @__PURE__ */ new Set([
5295
5426
  "await",
5296
5427
  "case",
@@ -10069,11 +10200,6 @@ function searchMetroAssetDest(bundlePath, descriptors, assetsDirectory) {
10069
10200
  }
10070
10201
  return { dest: winner.dest, searched, truncated, unconfirmed: best === 0 };
10071
10202
  }
10072
- function largestEmbeddedAssets(sizes, count) {
10073
- if (sizes.length === 0) return "";
10074
- const largest = sizes.slice(0, count).map((entry) => `${entry.asset} ${entry.bytes} bytes`).join(", ");
10075
- return ` Largest embedded assets: ${largest}.`;
10076
- }
10077
10203
  async function inferCloudModuleIdentity(source) {
10078
10204
  let receipt;
10079
10205
  try {
@@ -10193,9 +10319,10 @@ async function produceArtifact(bundlePath, maxBytes, command, assetPolicy, asset
10193
10319
  });
10194
10320
  const bytes = Buffer.from(artifact.code, "utf8");
10195
10321
  const assets2 = artifact.receipt.assets;
10196
- if (bytes.length > maxBytes) {
10322
+ const executableBytes = command === PREVIEW_COMMAND ? bytes.length : Buffer.byteLength((await separateMetroArtifactAssets(artifact.code)).code, "utf8");
10323
+ if (executableBytes > maxBytes) {
10197
10324
  throw new Error(
10198
- `${REMOTE_COMMAND} artifact is ${bytes.length} bytes and exceeds the ${maxBytes}-byte limit. Embedded assets weigh ${assets2.bytes} bytes on disk, and base64 embedding costs about a third on top of that, so the practical asset budget is roughly ${Math.round(maxBytes * 0.75 / 1e6)} MB.${largestEmbeddedAssets(assets2.sizes, 10)}`
10325
+ `${command} executable is ${executableBytes} bytes and exceeds the ${maxBytes}-byte limit. The ${assets2.bytes} asset bytes are stored outside guest code.`
10199
10326
  );
10200
10327
  }
10201
10328
  const warnings = [];
@@ -10209,9 +10336,9 @@ async function produceArtifact(bundlePath, maxBytes, command, assetPolicy, asset
10209
10336
  `${command} embedded a placeholder image for ${prepared.substituted.length} asset(s) no scale of which is in ${prepared.search.searched.join(", ") || "any asset dest directory"}: ${prepared.substituted.join(", ")}. Rebuild with \`react-native bundle --assets-dest\` to ship the real images.`
10210
10337
  );
10211
10338
  }
10212
- if (bytes.length >= Math.floor(maxBytes * 0.8)) {
10339
+ if (executableBytes >= Math.floor(maxBytes * 0.8)) {
10213
10340
  warnings.push(
10214
- `${command} artifact is ${bytes.length} bytes, ${Math.round(bytes.length / maxBytes * 100)}% of the ${maxBytes}-byte limit.${largestEmbeddedAssets(assets2.sizes, 5)}`
10341
+ `${command} executable is ${executableBytes} bytes, ${Math.round(executableBytes / maxBytes * 100)}% of the ${maxBytes}-byte limit.`
10215
10342
  );
10216
10343
  }
10217
10344
  return {
@@ -10321,7 +10448,7 @@ async function createCloudBox(options) {
10321
10448
  warnings: artifact.warnings
10322
10449
  };
10323
10450
  }
10324
- var import_node_crypto15, import_node_fs33, import_node_path34, import_node_vm, DEFAULT_RNX_CLOUD_ORIGIN, MAX_RNX_CLOUD_BUNDLE_BYTES, REMOTE_COMMAND, MAX_ASSET_DEST_FILES, ACCOUNT_CHOICE_REFUSALS, PROJECT_ONLY_DIRECTORIES, MAX_PLACEMENT_COMBINATIONS;
10451
+ var import_node_crypto15, import_node_fs33, import_node_path34, import_node_vm, DEFAULT_RNX_CLOUD_ORIGIN, MAX_RNX_CLOUD_BUNDLE_BYTES, REMOTE_COMMAND, PREVIEW_COMMAND, MAX_ASSET_DEST_FILES, ACCOUNT_CHOICE_REFUSALS, PROJECT_ONLY_DIRECTORIES, MAX_PLACEMENT_COMBINATIONS;
10325
10452
  var init_cloud_client = __esm({
10326
10453
  "cli/cloud-client.ts"() {
10327
10454
  "use strict";
@@ -10346,6 +10473,7 @@ var init_cloud_client = __esm({
10346
10473
  DEFAULT_RNX_CLOUD_ORIGIN = rnxPublicBrand.origin;
10347
10474
  MAX_RNX_CLOUD_BUNDLE_BYTES = RNX_CLOUD_MAX_ARTIFACT_BYTES;
10348
10475
  REMOTE_COMMAND = "peach remote";
10476
+ PREVIEW_COMMAND = "peach preview";
10349
10477
  MAX_ASSET_DEST_FILES = 25e3;
10350
10478
  ACCOUNT_CHOICE_REFUSALS = /* @__PURE__ */ new Set([
10351
10479
  "accountId is required",
@@ -10435,11 +10563,13 @@ __export(bridge_host_exports, {
10435
10563
  injectSharedConfigIntoHtml: () => injectSharedConfigIntoHtml
10436
10564
  });
10437
10565
  module.exports = __toCommonJS(bridge_host_exports);
10438
- var import_child_process3 = require("child_process");
10566
+ var import_child_process3 = __toESM(require("child_process"), 1);
10439
10567
  var import_fs2 = __toESM(require("fs"), 1);
10440
10568
  var import_http4 = require("http");
10569
+ var import_os = __toESM(require("os"), 1);
10441
10570
  var import_path2 = __toESM(require("path"), 1);
10442
10571
  var import_ws = require("ws");
10572
+ init_chromium_admission();
10443
10573
 
10444
10574
  // scripts/dev-server-scanner.ts
10445
10575
  var import_child_process = require("child_process");
@@ -12425,6 +12555,11 @@ var import_node_os3 = __toESM(require("node:os"), 1);
12425
12555
  var import_node_path10 = __toESM(require("node:path"), 1);
12426
12556
  var import_node_util2 = require("node:util");
12427
12557
 
12558
+ // src/admitted-mac-build.ts
12559
+ function admittedMacBuilderSlot(env = process.env) {
12560
+ return env.CONTRAST_REMOTE_BUILD === "mac" && env.REMOTE_MAC_SLOT_HELD === "1" && env.CONTRAST_HEAVY_ADMITTED === "1";
12561
+ }
12562
+
12428
12563
  // src/swift-distribution-contract.ts
12429
12564
  init_is_record();
12430
12565
  var SWIFT_DISTRIBUTION_MANIFEST = "distribution.json";
@@ -14730,7 +14865,7 @@ function compileSwiftProjectUnit(input, options) {
14730
14865
  };
14731
14866
  const hash = swiftArtifactHash(input, options.release, moduleRoot);
14732
14867
  return serialize(root, async () => {
14733
- if (process.platform === "darwin" && process.env.TM_SESSION && process.env.CI !== "true" && moduleRoot === import_node_path10.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
14868
+ if (process.platform === "darwin" && process.env.TM_SESSION && !admittedMacBuilderSlot() && process.env.CI !== "true" && moduleRoot === import_node_path10.default.resolve(__sootsim_import_meta_dirname, "../../sootsim-swift") && !swiftDistributionAt(moduleRoot)) {
14734
14869
  const requestRoot = (0, import_node_fs10.mkdtempSync)(import_node_path10.default.join(root, ".builder-request-"));
14735
14870
  const output = import_node_path10.default.join(requestRoot, "output");
14736
14871
  const request = import_node_path10.default.join(requestRoot, "request.json");
@@ -25083,6 +25218,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
25083
25218
  }
25084
25219
  reapIdleSims(now = Date.now()) {
25085
25220
  const attachedSimIds = new Set(this.cliSimBySocket.values());
25221
+ let reclaimable = null;
25086
25222
  for (const sim of this.sims.values()) {
25087
25223
  if (attachedSimIds.has(sim.id)) continue;
25088
25224
  const automation = this.isAutomationSim(sim);
@@ -25091,9 +25227,27 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
25091
25227
  continue;
25092
25228
  }
25093
25229
  const idleMs = now - Math.max(sim.lastActiveAt, sim.connectedAt);
25094
- const ttl = automation ? AUTOMATION_SIM_IDLE_REAP_TTL_MS : _SootSimBridgeHost.SIM_IDLE_REAP_TTL_MS;
25095
- if (idleMs >= ttl) this.closeSimSocketFromHost(sim.ws);
25230
+ if (automation) {
25231
+ if (idleMs >= AUTOMATION_SIM_IDLE_REAP_TTL_MS && idleMs > (reclaimable?.idleMs ?? 0))
25232
+ reclaimable = { ws: sim.ws, idleMs };
25233
+ continue;
25234
+ }
25235
+ if (idleMs >= _SootSimBridgeHost.SIM_IDLE_REAP_TTL_MS)
25236
+ this.closeSimSocketFromHost(sim.ws);
25096
25237
  }
25238
+ if (reclaimable && this.chromiumLaunchWaiting())
25239
+ this.closeSimSocketFromHost(reclaimable.ws);
25240
+ }
25241
+ chromiumQueueVerified = /* @__PURE__ */ new Map();
25242
+ chromiumLaunchWaiting() {
25243
+ const queue = readChromiumQueue(
25244
+ { fs: import_fs2.default, os: import_os.default, path: import_path2.default, childProcess: import_child_process3.default },
25245
+ this.chromiumQueueVerified
25246
+ );
25247
+ const live = new Set(queue.tickets);
25248
+ for (const entry of this.chromiumQueueVerified.keys())
25249
+ if (!live.has(entry)) this.chromiumQueueVerified.delete(entry);
25250
+ return queue.tickets.length > queue.limit;
25097
25251
  }
25098
25252
  // ping every connected ws; if the previous round's ping went unanswered,
25099
25253
  // terminate the socket so 'close' fires and the sim cleanup path
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_NATIVE_USER_AGENT_HEADER = "x-sootsim-native-user-agent";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -7232,6 +7232,7 @@ async function waitForSootsimIdle({
7232
7232
  return true
7233
7233
  }
7234
7234
  while (Date.now() < deadline) {
7235
+ const pollStarted = Date.now()
7235
7236
  const snapshot = await readSnapshot()
7236
7237
  if (snapshot.runtimeUnsupported) return snapshot.runtimeUnsupported
7237
7238
  polls++
@@ -7304,7 +7305,9 @@ async function waitForSootsimIdle({
7304
7305
  lastRequestTotal = snapshot.requestTotal
7305
7306
  lastAppCommits = snapshot.appCommits
7306
7307
  lastNodeCount = snapshot.nodeCount
7307
- await sleep(pollMs)
7308
+ // reply latency belongs inside the poll interval; the stillness window
7309
+ // above remains measured from completed observations.
7310
+ await sleep(Math.max(0, pollMs - (Date.now() - pollStarted)))
7308
7311
  }
7309
7312
  const last = await readSnapshot()
7310
7313
  if (last.runtimeUnsupported) return last.runtimeUnsupported
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (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
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (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
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (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
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/native-app-identity-project.ts
4
4
  import fs2 from "node:fs";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/openstep-plist.ts
4
4
  function parseOpenStepPlist(text) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/native-firebase-metadata.ts
4
4
  var PREFIX = "globalThis.__peachNativeFirebaseConfig=";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (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
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1843,6 +1843,7 @@ async function waitForSootsimIdle({
1843
1843
  return true
1844
1844
  }
1845
1845
  while (Date.now() < deadline) {
1846
+ const pollStarted = Date.now()
1846
1847
  const snapshot = await readSnapshot()
1847
1848
  if (snapshot.runtimeUnsupported) return snapshot.runtimeUnsupported
1848
1849
  polls++
@@ -1915,7 +1916,9 @@ async function waitForSootsimIdle({
1915
1916
  lastRequestTotal = snapshot.requestTotal
1916
1917
  lastAppCommits = snapshot.appCommits
1917
1918
  lastNodeCount = snapshot.nodeCount
1918
- await sleep(pollMs)
1919
+ // reply latency belongs inside the poll interval; the stillness window
1920
+ // above remains measured from completed observations.
1921
+ await sleep(Math.max(0, pollMs - (Date.now() - pollStarted)))
1919
1922
  }
1920
1923
  const last = await readSnapshot()
1921
1924
  if (last.runtimeUnsupported) return last.runtimeUnsupported
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.1465 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.1477 | (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);
@@ -1737,6 +1737,7 @@ async function waitForSootsimIdle({
1737
1737
  return true
1738
1738
  }
1739
1739
  while (Date.now() < deadline) {
1740
+ const pollStarted = Date.now()
1740
1741
  const snapshot = await readSnapshot()
1741
1742
  if (snapshot.runtimeUnsupported) return snapshot.runtimeUnsupported
1742
1743
  polls++
@@ -1809,7 +1810,9 @@ async function waitForSootsimIdle({
1809
1810
  lastRequestTotal = snapshot.requestTotal
1810
1811
  lastAppCommits = snapshot.appCommits
1811
1812
  lastNodeCount = snapshot.nodeCount
1812
- await sleep(pollMs)
1813
+ // reply latency belongs inside the poll interval; the stillness window
1814
+ // above remains measured from completed observations.
1815
+ await sleep(Math.max(0, pollMs - (Date.now() - pollStarted)))
1813
1816
  }
1814
1817
  const last = await readSnapshot()
1815
1818
  if (last.runtimeUnsupported) return last.runtimeUnsupported