sootsim 0.1.178 → 0.1.180

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 (149) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-FPRPN42P.js → agent-TWCD6VWU.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-KABXHSDP.js → agent-wrapper-Z47AOSU4.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-GEL63MTY.js → app-fonts-NJDS2WKC.js} +2 -2
  5. package/dist-cli/chunks/{assert-T55K3RFP.js → assert-E4M3BGYV.js} +2 -2
  6. package/dist-cli/chunks/beta-6DYJAYMR.js +2 -0
  7. package/dist-cli/chunks/{camera-RPYSAI2K.js → camera-AGZ365WS.js} +2 -2
  8. package/dist-cli/chunks/chunk-3R532UY6.js +2 -0
  9. package/dist-cli/chunks/{chunk-LJ2DIDX3.js → chunk-5S5TI2OL.js} +3 -3
  10. package/dist-cli/chunks/{chunk-V3N55LMK.js → chunk-5UNOKZOH.js} +1 -1
  11. package/dist-cli/chunks/{chunk-YXBC4N6Z.js → chunk-5Z3IK75L.js} +2 -2
  12. package/dist-cli/chunks/chunk-655RAZI6.js +1 -0
  13. package/dist-cli/chunks/{chunk-EUIPNUT4.js → chunk-6FPNI2NJ.js} +2 -2
  14. package/dist-cli/chunks/{chunk-CVBCNRKC.js → chunk-6LLHL4Z4.js} +2 -2
  15. package/dist-cli/chunks/{chunk-RVVFK6CF.js → chunk-6W55QHRB.js} +1 -1
  16. package/dist-cli/chunks/chunk-6YPP7ICO.js +5 -0
  17. package/dist-cli/chunks/{chunk-B77YOZBY.js → chunk-7EYSKUGC.js} +2 -2
  18. package/dist-cli/chunks/{chunk-PQLLJLSM.js → chunk-7FVSMP3H.js} +1 -1
  19. package/dist-cli/chunks/{chunk-64VAJYXX.js → chunk-7HOX5AAM.js} +2 -2
  20. package/dist-cli/chunks/{chunk-JFQFJLTV.js → chunk-A3DQXEQJ.js} +2 -2
  21. package/dist-cli/chunks/{chunk-O5SQ2RZE.js → chunk-AKVADO4S.js} +1 -1
  22. package/dist-cli/chunks/chunk-BTV37XIX.js +1 -0
  23. package/dist-cli/chunks/{chunk-K66BWMVS.js → chunk-C3H3HNZU.js} +1 -1
  24. package/dist-cli/chunks/{chunk-EY3XEEE4.js → chunk-DFOQT3FH.js} +1 -1
  25. package/dist-cli/chunks/{chunk-XGU672KO.js → chunk-DPYI7WHO.js} +1 -1
  26. package/dist-cli/chunks/{chunk-YD3CNK36.js → chunk-DPZ5NOVM.js} +1 -1
  27. package/dist-cli/chunks/{chunk-YLQE2RO4.js → chunk-EC6TIZVO.js} +3 -3
  28. package/dist-cli/chunks/{chunk-Q4PUVMFU.js → chunk-EJP4NI3Q.js} +1 -1
  29. package/dist-cli/chunks/{chunk-UYKA44Y4.js → chunk-FGRK5LV4.js} +2 -2
  30. package/dist-cli/chunks/{chunk-7BHPGH6Q.js → chunk-FQ6FCKBQ.js} +1 -1
  31. package/dist-cli/chunks/{chunk-2SM7WWDI.js → chunk-GKC4WAAU.js} +1 -1
  32. package/dist-cli/chunks/{chunk-PG42I7UQ.js → chunk-J7ECVBNV.js} +2 -2
  33. package/dist-cli/chunks/chunk-KOVONBG5.js +2 -0
  34. package/dist-cli/chunks/{chunk-PTBJZ3IO.js → chunk-LTLDMMVO.js} +2 -2
  35. package/dist-cli/chunks/{chunk-42SYOZVV.js → chunk-NNEKSG7J.js} +2 -2
  36. package/dist-cli/chunks/{chunk-2IYQJHNS.js → chunk-O3P4GCIC.js} +2 -2
  37. package/dist-cli/chunks/{chunk-WY3B2Y5J.js → chunk-PJ46BMD3.js} +2 -2
  38. package/dist-cli/chunks/{chunk-7KFBB76L.js → chunk-QXRIMG3C.js} +2 -2
  39. package/dist-cli/chunks/{chunk-CJV7PX2Y.js → chunk-RVH34DLB.js} +2 -2
  40. package/dist-cli/chunks/{chunk-M7MO47BR.js → chunk-SC3LMYOI.js} +1 -1
  41. package/dist-cli/chunks/{chunk-ITOXSEMN.js → chunk-SSTY3FZ7.js} +1 -1
  42. package/dist-cli/chunks/{chunk-PHLMZYE4.js → chunk-T56KIOK2.js} +2 -2
  43. package/dist-cli/chunks/{chunk-3DSTCWVF.js → chunk-TPTEYOPH.js} +2 -2
  44. package/dist-cli/chunks/{chunk-OK22FXGF.js → chunk-W2JS7ZCS.js} +2 -2
  45. package/dist-cli/chunks/{chunk-H26BCZLV.js → chunk-WJMSITGC.js} +1 -1
  46. package/dist-cli/chunks/{chunk-B2Z36B4N.js → chunk-WNBED3UT.js} +2 -2
  47. package/dist-cli/chunks/{chunk-B5KTNMPL.js → chunk-X2S7O732.js} +2 -2
  48. package/dist-cli/chunks/{chunk-ZKGEGXVG.js → chunk-Y7PV4536.js} +2 -2
  49. package/dist-cli/chunks/{chunk-ZVZMM2RT.js → chunk-YTE645KB.js} +1 -1
  50. package/dist-cli/chunks/{chunk-YKV52CQX.js → chunk-ZBS233ZK.js} +2 -2
  51. package/dist-cli/chunks/{chunk-IFJU3COY.js → chunk-ZFKPEBUY.js} +1 -1
  52. package/dist-cli/chunks/{chunk-EHKLQO7I.js → chunk-ZU3YA54Y.js} +1 -1
  53. package/dist-cli/chunks/cli-version-3PTODKAG.js +2 -0
  54. package/dist-cli/chunks/{compat-VDOLM4JY.js → compat-I4K6EHFH.js} +3 -3
  55. package/dist-cli/chunks/{control-N6IWKWQ7.js → control-FSW56XA7.js} +2 -2
  56. package/dist-cli/chunks/{cpu-profile-CR4EKOPN.js → cpu-profile-TS44ELSM.js} +2 -2
  57. package/dist-cli/chunks/daemon-XD4ETUFL.js +2 -0
  58. package/dist-cli/chunks/{debug-4FCBFVDX.js → debug-WJBAZTDZ.js} +3 -3
  59. package/dist-cli/chunks/{detox-TP77ADA2.js → detox-NTJCZT7Y.js} +2 -2
  60. package/dist-cli/chunks/{device-YRU6RDD2.js → device-VZMWYTH6.js} +2 -2
  61. package/dist-cli/chunks/{diagnose-ZU4XLIKW.js → diagnose-VJFAE25R.js} +2 -2
  62. package/dist-cli/chunks/drivers-AXQDZXVN.js +2 -0
  63. package/dist-cli/chunks/{electron-UWTORKRO.js → electron-BUS5EZZB.js} +3 -3
  64. package/dist-cli/chunks/flow-O3SCW6BQ.js +2 -0
  65. package/dist-cli/chunks/help-X32RDYQI.js +2 -0
  66. package/dist-cli/chunks/{hints-X5YLALUQ.js → hints-WVYOKMAB.js} +2 -2
  67. package/dist-cli/chunks/{home-paths-LMEDDTAQ.js → home-paths-5G3GDTLX.js} +2 -2
  68. package/dist-cli/chunks/{inspect-IFCVFMIW.js → inspect-YZPQT6PV.js} +3 -3
  69. package/dist-cli/chunks/{install-desktop-VVQIBZRU.js → install-desktop-KPIFQ5BJ.js} +3 -3
  70. package/dist-cli/chunks/{keys-GDX235ZQ.js → keys-XMLWEKT7.js} +2 -2
  71. package/dist-cli/chunks/{login-MUIJHNM7.js → login-4KYXIZE3.js} +4 -4
  72. package/dist-cli/chunks/{logout-GV3H23TK.js → logout-GWXYQJKY.js} +2 -2
  73. package/dist-cli/chunks/{maestro-IFTHFVUR.js → maestro-73XTB4TQ.js} +2 -2
  74. package/dist-cli/chunks/optional-demo-registry-VJQAN5S5.js +2 -0
  75. package/dist-cli/chunks/{preview-COYJHGIY.js → preview-UO77YODM.js} +2 -2
  76. package/dist-cli/chunks/{profile-726ZBBXY.js → profile-ZGTZRSKI.js} +2 -2
  77. package/dist-cli/chunks/{react-LLN5L6NM.js → react-77P2ZPKP.js} +2 -2
  78. package/dist-cli/chunks/{record-TMJG2SMU.js → record-TYTQTISM.js} +2 -2
  79. package/dist-cli/chunks/runtime-YG4DSIZR.js +2 -0
  80. package/dist-cli/chunks/{screenshot-UFKR5MDO.js → screenshot-YQAQIKID.js} +2 -2
  81. package/dist-cli/chunks/{screenshot-mode-3ZGQR45L.js → screenshot-mode-2YK7P2A5.js} +2 -2
  82. package/dist-cli/chunks/{screenshots-JXS7HP2B.js → screenshots-RFAXUO6J.js} +2 -2
  83. package/dist-cli/chunks/{screenshots-capture-ZBUHYPJJ.js → screenshots-capture-5V4VLZ46.js} +2 -2
  84. package/dist-cli/chunks/{serve-ZG3KCDUO.js → serve-YKQNVYB3.js} +2 -2
  85. package/dist-cli/chunks/{setup-2XT4LRR5.js → setup-4VBJPQEG.js} +2 -2
  86. package/dist-cli/chunks/{skills-3I7UWGIB.js → skills-35JKCOHO.js} +2 -2
  87. package/dist-cli/chunks/{slides-SCGGLDQQ.js → slides-TE5ZRF32.js} +2 -2
  88. package/dist-cli/chunks/store-HKZGF2VP.js +2 -0
  89. package/dist-cli/chunks/telemetry-MZO7LCBJ.js +2 -0
  90. package/dist-cli/chunks/{test-ZRWZBUMK.js → test-ZQCKRCMQ.js} +3 -3
  91. package/dist-cli/chunks/{three-mode-LJHDX4PK.js → three-mode-MXI6TY4F.js} +2 -2
  92. package/dist-cli/chunks/{timeline-5OFJISEU.js → timeline-J4XMTY73.js} +2 -2
  93. package/dist-cli/chunks/{upgrade-M7HFPN57.js → upgrade-4YYUPYWA.js} +2 -2
  94. package/dist-cli/chunks/upload-BULXFLG3.js +2 -0
  95. package/dist-cli/chunks/{version-DHZQAZ66.js → version-SNWXESVB.js} +2 -2
  96. package/dist-cli/chunks/{web-43QEU5SE.js → web-V5EIIUBC.js} +2 -2
  97. package/dist-cli/chunks/{what-happened-RNVAVGKL.js → what-happened-DTF62KF5.js} +2 -2
  98. package/dist-cli/chunks/{whoami-F5EYWJCY.js → whoami-LXD6FRWT.js} +2 -2
  99. package/dist-lib/agent-daemon-client.cjs +1 -1
  100. package/dist-lib/agent-events.cjs +1 -1
  101. package/dist-lib/agent-sessions.cjs +1 -1
  102. package/dist-lib/attached-projects.cjs +1 -1
  103. package/dist-lib/auth/shared-session.cjs +1 -1
  104. package/dist-lib/backend-origin.cjs +1 -1
  105. package/dist-lib/beta.cjs +1 -1
  106. package/dist-lib/beta.mjs +1 -1
  107. package/dist-lib/bridge-constants.cjs +1 -1
  108. package/dist-lib/cli-constants.cjs +1 -1
  109. package/dist-lib/config.cjs +1 -1
  110. package/dist-lib/detox/index.cjs +1 -1
  111. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  112. package/dist-lib/home-paths.cjs +1 -1
  113. package/dist-lib/host/bridge-host.cjs +81 -25
  114. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  115. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  116. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  117. package/dist-lib/host/websocket-proxy.cjs +1 -1
  118. package/dist-lib/index.cjs +1 -37
  119. package/dist-lib/jump-to-source-babel.cjs +1 -1
  120. package/dist-lib/menu.cjs +10 -3
  121. package/dist-lib/menu.mjs +10 -3
  122. package/dist-lib/metro.cjs +1 -1
  123. package/dist-lib/profiles.cjs +1 -1
  124. package/dist-lib/render-mode.cjs +1 -1
  125. package/dist-lib/scripts/dev-server-scanner.cjs +83 -25
  126. package/dist-lib/sdk.cjs +1 -1
  127. package/dist-lib/sdk.mjs +1 -1
  128. package/dist-lib/skills.cjs +82 -26
  129. package/dist-lib/vite.cjs +1 -37
  130. package/package.json +1 -1
  131. package/scripts/dev-server-scanner.ts +120 -24
  132. package/src/menu.ts +10 -2
  133. package/src/vite-plugin-one.ts +0 -47
  134. package/dist-cli/chunks/beta-74JMB2XJ.js +0 -2
  135. package/dist-cli/chunks/chunk-DVBRRNWE.js +0 -2
  136. package/dist-cli/chunks/chunk-NE55HRAU.js +0 -5
  137. package/dist-cli/chunks/chunk-PNFYOQ4N.js +0 -1
  138. package/dist-cli/chunks/chunk-TBWJVJXW.js +0 -2
  139. package/dist-cli/chunks/chunk-YFLYSJL6.js +0 -1
  140. package/dist-cli/chunks/cli-version-PVBTBN2X.js +0 -2
  141. package/dist-cli/chunks/daemon-HORAEEZR.js +0 -2
  142. package/dist-cli/chunks/drivers-BSP2USRT.js +0 -2
  143. package/dist-cli/chunks/flow-ZXUEU6WL.js +0 -2
  144. package/dist-cli/chunks/help-6OSM7CI4.js +0 -2
  145. package/dist-cli/chunks/optional-demo-registry-26DVI7SE.js +0 -2
  146. package/dist-cli/chunks/runtime-3NQVPRES.js +0 -2
  147. package/dist-cli/chunks/store-7LKGHVAR.js +0 -2
  148. package/dist-cli/chunks/telemetry-SQRPQEGO.js +0 -2
  149. package/dist-cli/chunks/upload-OOTFDONE.js +0 -2
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.180 | (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;
@@ -10284,6 +10284,46 @@ function applyManifest(result, manifestRes, buildIconProxyUrl) {
10284
10284
  }
10285
10285
  return result;
10286
10286
  }
10287
+ function enrichWithManifest(result, buildIconProxyUrl) {
10288
+ if (result.projectName) return result;
10289
+ const cached4 = enrichmentCache.get(result.port);
10290
+ if (cached4) {
10291
+ if (cached4.projectName) result.projectName = cached4.projectName;
10292
+ if (cached4.iconUrl && !result.iconUrl) {
10293
+ result.iconUrl = cached4.iconUrl;
10294
+ result.iconPath = cached4.iconPath;
10295
+ }
10296
+ if (cached4.bundleId && !result.bundleId) result.bundleId = cached4.bundleId;
10297
+ return result;
10298
+ }
10299
+ if (!enrichmentInFlight.has(result.port)) {
10300
+ enrichmentInFlight.add(result.port);
10301
+ const port = result.port;
10302
+ void fetchManifestEnrichment(port, buildIconProxyUrl).finally(
10303
+ () => enrichmentInFlight.delete(port)
10304
+ );
10305
+ }
10306
+ return result;
10307
+ }
10308
+ async function fetchManifestEnrichment(port, buildIconProxyUrl) {
10309
+ const manifestRes = await httpGet(port, "/", "GET", ENRICH_TIMEOUT_MS, {
10310
+ "expo-platform": "ios"
10311
+ });
10312
+ if (!manifestRes || manifestRes.statusCode !== 200) return;
10313
+ const parsed = applyManifest(
10314
+ { port, framework: "one", bundleUrl: "", lastSeen: 0 },
10315
+ manifestRes,
10316
+ buildIconProxyUrl
10317
+ );
10318
+ if (!parsed.projectName && !parsed.iconUrl) return;
10319
+ enrichmentCache.set(port, {
10320
+ projectName: parsed.projectName,
10321
+ iconUrl: parsed.iconUrl,
10322
+ iconPath: parsed.iconPath,
10323
+ bundleId: parsed.bundleId
10324
+ });
10325
+ portCache.delete(port);
10326
+ }
10287
10327
  async function probePort(port, buildIconProxyUrl) {
10288
10328
  if (!await tcpPing(port)) return null;
10289
10329
  const onePath = `/node_modules/one/metro-entry.bundle?platform=ios&dev=true`;
@@ -10321,24 +10361,30 @@ async function probePort(port, buildIconProxyUrl) {
10321
10361
  }
10322
10362
  if (statusRes && statusRes.body.includes("packager-status:running")) {
10323
10363
  knownNonPatched.add(port);
10324
- return applyManifest(
10325
- makeResult(port, expoRes && expoRes.statusCode === 200 ? "expo" : "metro"),
10326
- manifestRes,
10364
+ return enrichWithManifest(
10365
+ applyManifest(
10366
+ makeResult(port, expoRes && expoRes.statusCode === 200 ? "expo" : "metro"),
10367
+ manifestRes,
10368
+ buildIconProxyUrl
10369
+ ),
10327
10370
  buildIconProxyUrl
10328
10371
  );
10329
10372
  }
10330
10373
  if (sootsimRes && sootsimRes.statusCode === 200 && sootsimRes.body.includes("sootsim-patched")) {
10331
10374
  knownNonPatched.delete(port);
10332
- return applyManifest(
10333
- {
10334
- port,
10335
- framework: "one",
10336
- bundleUrl: withRuntimeConfig(port, `http://localhost:${port}/__soot/bundle.js`),
10337
- hmrUrl: `ws://localhost:${port}/hot`,
10338
- lastSeen: Date.now(),
10339
- patched: true
10340
- },
10341
- manifestRes,
10375
+ return enrichWithManifest(
10376
+ applyManifest(
10377
+ {
10378
+ port,
10379
+ framework: "one",
10380
+ bundleUrl: withRuntimeConfig(port, `http://localhost:${port}/__soot/bundle.js`),
10381
+ hmrUrl: `ws://localhost:${port}/hot`,
10382
+ lastSeen: Date.now(),
10383
+ patched: true
10384
+ },
10385
+ manifestRes,
10386
+ buildIconProxyUrl
10387
+ ),
10342
10388
  buildIconProxyUrl
10343
10389
  );
10344
10390
  }
@@ -10350,18 +10396,21 @@ async function probePort(port, buildIconProxyUrl) {
10350
10396
  if (oneRes && oneRes.statusCode > 0 && oneRes.statusCode < 400 && /application\/javascript/i.test(oneRes.contentType || "")) {
10351
10397
  knownNonPatched.add(port);
10352
10398
  knownOne.add(port);
10353
- return applyManifest(
10354
- {
10355
- port,
10356
- framework: "one",
10357
- bundleUrl: withRuntimeConfig(
10399
+ return enrichWithManifest(
10400
+ applyManifest(
10401
+ {
10358
10402
  port,
10359
- `http://localhost:${port}${onePath}&minify=false`
10360
- ),
10361
- hmrUrl: `ws://localhost:${port}/hot`,
10362
- lastSeen: Date.now()
10363
- },
10364
- manifestRes,
10403
+ framework: "one",
10404
+ bundleUrl: withRuntimeConfig(
10405
+ port,
10406
+ `http://localhost:${port}${onePath}&minify=false`
10407
+ ),
10408
+ hmrUrl: `ws://localhost:${port}/hot`,
10409
+ lastSeen: Date.now()
10410
+ },
10411
+ manifestRes,
10412
+ buildIconProxyUrl
10413
+ ),
10365
10414
  buildIconProxyUrl
10366
10415
  );
10367
10416
  }
@@ -10406,6 +10455,9 @@ async function scanDevServers(opts = {}) {
10406
10455
  for (const p of [...knownOne]) {
10407
10456
  if (!currentPorts.has(p)) knownOne.delete(p);
10408
10457
  }
10458
+ for (const p of [...enrichmentCache.keys()]) {
10459
+ if (!currentPorts.has(p)) enrichmentCache.delete(p);
10460
+ }
10409
10461
  const results = [];
10410
10462
  const toProbe = [];
10411
10463
  for (const { port, pid } of processes) {
@@ -10418,6 +10470,7 @@ async function scanDevServers(opts = {}) {
10418
10470
  knownNonPatched.delete(port);
10419
10471
  knownNonExpo.delete(port);
10420
10472
  knownOne.delete(port);
10473
+ enrichmentCache.delete(port);
10421
10474
  }
10422
10475
  toProbe.push({ port, pid });
10423
10476
  }
@@ -10450,7 +10503,7 @@ async function scanDevServers(opts = {}) {
10450
10503
  }
10451
10504
  return results.filter((r) => !isSootSelfServer(r));
10452
10505
  }
10453
- var import_child_process, import_http, import_net, import_util, execP, TIMEOUT_MS, MANIFEST_TIMEOUT_MS, TCP_GATE_MS, FALLBACK_PORTS, cwdByPid, knownNonPatched, knownNonExpo, knownOne, portCache, NEGATIVE_CACHE_TTL_MS, WEAK_RESULT_CACHE_TTL_MS;
10506
+ var import_child_process, import_http, import_net, import_util, execP, TIMEOUT_MS, MANIFEST_TIMEOUT_MS, TCP_GATE_MS, FALLBACK_PORTS, cwdByPid, ENRICH_TIMEOUT_MS, enrichmentCache, enrichmentInFlight, knownNonPatched, knownNonExpo, knownOne, portCache, NEGATIVE_CACHE_TTL_MS, WEAK_RESULT_CACHE_TTL_MS;
10454
10507
  var init_dev_server_scanner = __esm({
10455
10508
  "scripts/dev-server-scanner.ts"() {
10456
10509
  "use strict";
@@ -10478,6 +10531,9 @@ var init_dev_server_scanner = __esm({
10478
10531
  19e3
10479
10532
  ].map((port) => ({ port, pid: 0 }));
10480
10533
  cwdByPid = /* @__PURE__ */ new Map();
10534
+ ENRICH_TIMEOUT_MS = 2e4;
10535
+ enrichmentCache = /* @__PURE__ */ new Map();
10536
+ enrichmentInFlight = /* @__PURE__ */ new Set();
10481
10537
  knownNonPatched = /* @__PURE__ */ new Set();
10482
10538
  knownNonExpo = /* @__PURE__ */ new Set();
10483
10539
  knownOne = /* @__PURE__ */ new Set();
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.180 | (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;
@@ -174,7 +174,6 @@ function serveRuntimeFile(res, fullPath) {
174
174
  }
175
175
 
176
176
  // src/vite-plugin-one.ts
177
- var sootsimRoot = import_path2.default.resolve(import_path2.default.dirname(new URL(__sootsim_import_meta_url).pathname), "..");
178
177
  function sootsimPlugin(options = {}) {
179
178
  if (options.enabled === false) return [];
180
179
  const prefix = options.prefix || "/__soot";
@@ -268,45 +267,10 @@ function sootsimPlugin(options = {}) {
268
267
  const port = server.config.server.port || 8081;
269
268
  const sootsimUrl = `http://localhost:${port}${prefix}/`;
270
269
  console.log(`[sootsim] serving at ${sootsimUrl}`);
271
- if (options.open !== false) {
272
- openElectronApp(sootsimUrl);
273
- }
274
270
  }
275
271
  }
276
272
  ];
277
273
  }
278
- async function openElectronApp(sootsimUrl) {
279
- if (process.platform !== "darwin") return;
280
- const { execSync, exec } = await import("child_process");
281
- const schemeUrl = `sootsim://dev?url=${encodeURIComponent(sootsimUrl)}`;
282
- try {
283
- exec(`open "${schemeUrl}"`);
284
- return;
285
- } catch {
286
- }
287
- const candidates = [
288
- "/Applications/sootsim.app",
289
- import_path2.default.join(process.env.HOME || "", "Applications/sootsim.app"),
290
- import_path2.default.join(sootsimRoot, "release/mac-arm64/sootsim.app")
291
- ];
292
- let appPath = candidates.find((p) => import_fs2.default.existsSync(p));
293
- if (!appPath) {
294
- try {
295
- const found = execSync(
296
- 'mdfind "kMDItemCFBundleIdentifier == dev.sootsim.simulator"',
297
- { encoding: "utf8", timeout: 3e3 }
298
- ).trim();
299
- if (found) appPath = found.split("\n")[0];
300
- } catch {
301
- }
302
- }
303
- if (appPath) {
304
- try {
305
- exec(`open -a "${appPath}" "${sootsimUrl}"`);
306
- } catch {
307
- }
308
- }
309
- }
310
274
  var vite_plugin_one_default = sootsimPlugin;
311
275
  // Annotate the CommonJS export names for ESM import in node:
312
276
  0 && (module.exports = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sootsim",
3
- "version": "0.1.178",
3
+ "version": "0.1.180",
4
4
  "description": "sootsim CLI + vite/metro plugins + skills registry. bridge client for driving the proprietary sootsim-engine over WebSocket.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "MIT",
@@ -344,6 +344,86 @@ export function __applyManifestForTests(
344
344
  return applyManifest(result, { statusCode: 200, body: manifestBody })
345
345
  }
346
346
 
347
+ // ── name/icon enrichment ────────────────────────────────────────────────────
348
+ // a server's display name + icon come ONLY from its expo manifest (GET / with
349
+ // expo-platform), which is far slower than the cheap signature probes: One apps
350
+ // serialize app.config per request, and some (expo-updates / asset resolution)
351
+ // block several seconds. the fast probe race times the manifest out at
352
+ // MANIFEST_TIMEOUT_MS, so a slow-manifest server is identified via /status or
353
+ // the One HEAD with no projectName and shows as ":<port>" in the dock — never
354
+ // re-probed, because that nameless result caches as a strong (expo/one) entry.
355
+ // bumping the race timeout isn't an option: it would stall every probe (and a
356
+ // non-bundler node process) for seconds. instead capture name/icon out-of-band:
357
+ // when a server is identified without them, fetch the manifest ONCE with a
358
+ // generous timeout, cache the fields per port, and drop the strong port-cache
359
+ // entry so the next scan re-probes and publishes the enriched server. discovery
360
+ // stays fast; name/icon fill in a scan or two after the app first appears.
361
+ const ENRICH_TIMEOUT_MS = 20_000
362
+ interface ManifestEnrichment {
363
+ projectName?: string
364
+ iconUrl?: string
365
+ iconPath?: string
366
+ bundleId?: string
367
+ }
368
+ const enrichmentCache = new Map<number, ManifestEnrichment>()
369
+ const enrichmentInFlight = new Set<number>()
370
+
371
+ // apply already-captured name/icon, or kick off a single background manifest
372
+ // fetch to capture them. a no-op once the in-race manifest already named the
373
+ // server, so it's safe to wrap every identified return.
374
+ function enrichWithManifest(
375
+ result: DiscoveredServer,
376
+ buildIconProxyUrl?: (externalUrl: string) => string,
377
+ ): DiscoveredServer {
378
+ if (result.projectName) return result
379
+
380
+ const cached = enrichmentCache.get(result.port)
381
+ if (cached) {
382
+ if (cached.projectName) result.projectName = cached.projectName
383
+ if (cached.iconUrl && !result.iconUrl) {
384
+ result.iconUrl = cached.iconUrl
385
+ result.iconPath = cached.iconPath
386
+ }
387
+ if (cached.bundleId && !result.bundleId) result.bundleId = cached.bundleId
388
+ return result
389
+ }
390
+
391
+ if (!enrichmentInFlight.has(result.port)) {
392
+ enrichmentInFlight.add(result.port)
393
+ const port = result.port
394
+ void fetchManifestEnrichment(port, buildIconProxyUrl).finally(() =>
395
+ enrichmentInFlight.delete(port),
396
+ )
397
+ }
398
+ return result
399
+ }
400
+
401
+ async function fetchManifestEnrichment(
402
+ port: number,
403
+ buildIconProxyUrl?: (externalUrl: string) => string,
404
+ ): Promise<void> {
405
+ const manifestRes = await httpGet(port, '/', 'GET', ENRICH_TIMEOUT_MS, {
406
+ 'expo-platform': 'ios',
407
+ })
408
+ if (!manifestRes || manifestRes.statusCode !== 200) return
409
+ // reuse applyManifest's exact field extraction against a throwaway result.
410
+ const parsed = applyManifest(
411
+ { port, framework: 'one', bundleUrl: '', lastSeen: 0 },
412
+ manifestRes,
413
+ buildIconProxyUrl,
414
+ )
415
+ if (!parsed.projectName && !parsed.iconUrl) return
416
+ enrichmentCache.set(port, {
417
+ projectName: parsed.projectName,
418
+ iconUrl: parsed.iconUrl,
419
+ iconPath: parsed.iconPath,
420
+ bundleId: parsed.bundleId,
421
+ })
422
+ // the nameless result cached as a strong entry and won't re-probe on its own;
423
+ // drop it so the next scan re-runs probePort and publishes the enriched name.
424
+ portCache.delete(port)
425
+ }
426
+
347
427
  // ports confirmed to be running a non-sootsim dev server — safe to skip the
348
428
  // /__soot/ probe on subsequent scans. cleared when the port disappears from the
349
429
  // listening set (process restarted, could now be a different server).
@@ -463,9 +543,12 @@ export async function probePort(
463
543
  // never fire the HEAD against them.
464
544
  if (statusRes && statusRes.body.includes('packager-status:running')) {
465
545
  knownNonPatched.add(port)
466
- return applyManifest(
467
- makeResult(port, expoRes && expoRes.statusCode === 200 ? 'expo' : 'metro'),
468
- manifestRes,
546
+ return enrichWithManifest(
547
+ applyManifest(
548
+ makeResult(port, expoRes && expoRes.statusCode === 200 ? 'expo' : 'metro'),
549
+ manifestRes,
550
+ buildIconProxyUrl,
551
+ ),
469
552
  buildIconProxyUrl,
470
553
  )
471
554
  }
@@ -478,16 +561,19 @@ export async function probePort(
478
561
  sootsimRes.body.includes('sootsim-patched')
479
562
  ) {
480
563
  knownNonPatched.delete(port)
481
- return applyManifest(
482
- {
483
- port,
484
- framework: 'one',
485
- bundleUrl: withRuntimeConfig(port, `http://localhost:${port}/__soot/bundle.js`),
486
- hmrUrl: `ws://localhost:${port}/hot`,
487
- lastSeen: Date.now(),
488
- patched: true,
489
- },
490
- manifestRes,
564
+ return enrichWithManifest(
565
+ applyManifest(
566
+ {
567
+ port,
568
+ framework: 'one',
569
+ bundleUrl: withRuntimeConfig(port, `http://localhost:${port}/__soot/bundle.js`),
570
+ hmrUrl: `ws://localhost:${port}/hot`,
571
+ lastSeen: Date.now(),
572
+ patched: true,
573
+ },
574
+ manifestRes,
575
+ buildIconProxyUrl,
576
+ ),
491
577
  buildIconProxyUrl,
492
578
  )
493
579
  }
@@ -528,18 +614,21 @@ export async function probePort(
528
614
  ) {
529
615
  knownNonPatched.add(port)
530
616
  knownOne.add(port)
531
- return applyManifest(
532
- {
533
- port,
534
- framework: 'one',
535
- bundleUrl: withRuntimeConfig(
617
+ return enrichWithManifest(
618
+ applyManifest(
619
+ {
536
620
  port,
537
- `http://localhost:${port}${onePath}&minify=false`,
538
- ),
539
- hmrUrl: `ws://localhost:${port}/hot`,
540
- lastSeen: Date.now(),
541
- },
542
- manifestRes,
621
+ framework: 'one',
622
+ bundleUrl: withRuntimeConfig(
623
+ port,
624
+ `http://localhost:${port}${onePath}&minify=false`,
625
+ ),
626
+ hmrUrl: `ws://localhost:${port}/hot`,
627
+ lastSeen: Date.now(),
628
+ },
629
+ manifestRes,
630
+ buildIconProxyUrl,
631
+ ),
543
632
  buildIconProxyUrl,
544
633
  )
545
634
  }
@@ -618,6 +707,8 @@ export function __resetScannerCache() {
618
707
  knownNonPatched.clear()
619
708
  knownNonExpo.clear()
620
709
  knownOne.clear()
710
+ enrichmentCache.clear()
711
+ enrichmentInFlight.clear()
621
712
  }
622
713
 
623
714
  export async function scanDevServers(
@@ -641,6 +732,9 @@ export async function scanDevServers(
641
732
  for (const p of [...knownOne]) {
642
733
  if (!currentPorts.has(p)) knownOne.delete(p)
643
734
  }
735
+ for (const p of [...enrichmentCache.keys()]) {
736
+ if (!currentPorts.has(p)) enrichmentCache.delete(p)
737
+ }
644
738
 
645
739
  const results: DiscoveredServer[] = []
646
740
  const toProbe: ListeningProcess[] = []
@@ -661,6 +755,8 @@ export async function scanDevServers(
661
755
  knownNonPatched.delete(port)
662
756
  knownNonExpo.delete(port)
663
757
  knownOne.delete(port)
758
+ // a restarted process may be a different app — drop its captured name/icon.
759
+ enrichmentCache.delete(port)
664
760
  }
665
761
  toProbe.push({ port, pid })
666
762
  }
package/src/menu.ts CHANGED
@@ -38,6 +38,7 @@ export interface SootSimMenuState {
38
38
  showTopBar: boolean
39
39
  screenshotMode: boolean
40
40
  threeMode: boolean
41
+ alwaysShowLiveWebViews: boolean
41
42
  stayOnTop: boolean
42
43
  scaleMode: SootSimScaleMode
43
44
  }
@@ -83,7 +84,7 @@ export function buildSootSimMenuDefs(
83
84
  fileMenu(state, deviceChoices),
84
85
  editMenu(),
85
86
  deviceMenu(state, deviceChoices),
86
- debugMenu(),
87
+ debugMenu(state),
87
88
  windowMenu(state),
88
89
  helpMenu(),
89
90
  ]
@@ -227,7 +228,7 @@ function deviceMenu(
227
228
  }
228
229
  }
229
230
 
230
- function debugMenu(): SootSimMenuDef {
231
+ function debugMenu(state: SootSimMenuState): SootSimMenuDef {
231
232
  return {
232
233
  label: 'Debug',
233
234
  items: [
@@ -254,6 +255,13 @@ function debugMenu(): SootSimMenuDef {
254
255
  showInShortcutDocs: true,
255
256
  },
256
257
  { type: 'separator' },
258
+ {
259
+ label: 'Always Show Live WebViews',
260
+ type: 'checkbox',
261
+ checked: state.alwaysShowLiveWebViews,
262
+ action: 'toggle-live-webviews',
263
+ },
264
+ { type: 'separator' },
257
265
  {
258
266
  label: 'Clear Cache and Reload',
259
267
  accelerator: 'CmdOrCtrl+Shift+R',
@@ -18,8 +18,6 @@ import {
18
18
  } from './runtime-assets'
19
19
  import type { Plugin } from 'vite'
20
20
 
21
- const sootsimRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..')
22
-
23
21
  export interface SootPluginOptions {
24
22
  // custom bundle URL (default: auto-detect from One's metro)
25
23
  bundleUrl?: string
@@ -27,8 +25,6 @@ export interface SootPluginOptions {
27
25
  prefix?: string
28
26
  // disable sootsim
29
27
  enabled?: boolean
30
- // open the desktop app after the dev server starts (default true)
31
- open?: boolean
32
28
  }
33
29
 
34
30
  export function sootsimPlugin(options: SootPluginOptions = {}): Plugin[] {
@@ -182,55 +178,12 @@ export function sootsimPlugin(options: SootPluginOptions = {}): Plugin[] {
182
178
  next()
183
179
  })
184
180
 
185
- // try to open sootsim electron app
186
181
  const port = server.config.server.port || 8081
187
182
  const sootsimUrl = `http://localhost:${port}${prefix}/`
188
183
  console.log(`[sootsim] serving at ${sootsimUrl}`)
189
-
190
- if (options.open !== false) {
191
- openElectronApp(sootsimUrl)
192
- }
193
184
  },
194
185
  },
195
186
  ]
196
187
  }
197
188
 
198
- // try to open the sootsim electron app via URL scheme or direct launch
199
- async function openElectronApp(sootsimUrl: string) {
200
- if (process.platform !== 'darwin') return
201
-
202
- const { execSync, exec } = await import('child_process')
203
-
204
- // try sootsim:// scheme first (works if app registered the protocol)
205
- const schemeUrl = `sootsim://dev?url=${encodeURIComponent(sootsimUrl)}`
206
- try {
207
- exec(`open "${schemeUrl}"`)
208
- return
209
- } catch {}
210
-
211
- // fallback: find the app directly
212
- const candidates = [
213
- '/Applications/sootsim.app',
214
- path.join(process.env.HOME || '', 'Applications/sootsim.app'),
215
- path.join(sootsimRoot, 'release/mac-arm64/sootsim.app'),
216
- ]
217
-
218
- let appPath = candidates.find((p) => fs.existsSync(p))
219
- if (!appPath) {
220
- try {
221
- const found = execSync(
222
- 'mdfind "kMDItemCFBundleIdentifier == dev.sootsim.simulator"',
223
- { encoding: 'utf8', timeout: 3000 },
224
- ).trim()
225
- if (found) appPath = found.split('\n')[0]
226
- } catch {}
227
- }
228
-
229
- if (appPath) {
230
- try {
231
- exec(`open -a "${appPath}" "${sootsimUrl}"`)
232
- } catch {}
233
- }
234
- }
235
-
236
189
  export default sootsimPlugin
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-YD3CNK36.js";import"./chunk-M7MO47BR.js";export{d as BETA_ASK_HEADLINE,b as BETA_LABEL,c as BETA_TAGLINE,a as IS_BETA};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};
@@ -1,5 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as C,b as x}from"./chunk-IFJU3COY.js";var k="sootsimConfig";function m(e){return!!e&&Object.keys(e).length>0}function E(e){return e?m(e.modules)||m(e.turboModules)||m(e.nativeModules)||m(e.env)||m(e.network?.remap)||m(e.settings)||m(e.initialState):!1}function M(e,o){let t=new URL(e);return E(o)?t.searchParams.set(k,JSON.stringify(o)):t.searchParams.delete(k),t.toString()}var te="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function _(e){return/^https?:\/\//i.test(e)}function D(e){return e.endsWith(".bundle")}function A(e){process.env.SOOTSIM_PREVIEW_PROD_BUNDLE&&(e.searchParams.set("dev","false"),e.searchParams.set("minify","true"),e.searchParams.has("hot")&&e.searchParams.set("hot","false"))}function U(e){try{let o=_(e),t=new URL(e,"http://soot.local");return t.pathname=t.pathname.replace(/\.\.bundle$/,".bundle"),D(t.pathname)?(t.searchParams.delete("transform.bytecode"),t.searchParams.get("lazy")==="true"&&t.searchParams.set("lazy","false"),A(t),o?t.toString():`${t.pathname}${t.search}${t.hash}`):e}catch{return e}}function re(e,o){try{let t=_(e),r=new URL(e,"http://soot.local");return D(r.pathname)?(r.searchParams.set("hot",o?"true":"false"),t?r.toString():`${r.pathname}${r.search}${r.hash}`):e}catch{return e}}import{exec as N}from"child_process";import $ from"http";import L from"net";import{promisify as O}from"util";var v=O(N);C();var I=250,B=1500,H=120;function F(e,o=H){return new Promise(t=>{let r=new L.Socket,s=!1,i=a=>{s||(s=!0,r.destroy(),t(a))};r.setTimeout(o),r.once("connect",()=>i(!0)),r.once("timeout",()=>i(!1)),r.once("error",()=>i(!1)),r.connect(e,"localhost")})}function h(e,o,t="GET",r=I,s={}){return new Promise(i=>{let a=$.request({hostname:"localhost",port:e,path:o,method:t,timeout:r,headers:s},n=>{let u="";n.on("data",l=>u+=l.toString());let c=(()=>{let l=n.headers["content-type"];if(typeof l=="string")return l;if(Array.isArray(l))return l[0]})();n.on("end",()=>i({statusCode:n.statusCode||0,body:u,contentType:c}))});a.on("error",()=>i(null)),a.setTimeout(r,()=>{a.destroy(),i(null)}),a.end()})}var W=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function P(e,o){return!(e<=0||e>=2e4||o.has(e)||e>=5170&&e<=5200)}async function G(e=[]){let o=new Set(e);try{let{stdout:t}=await v("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(t.trim()){let r=new Map;for(let s of t.trim().split(`
3
- `)){let i=s.trim().split(/\s+/);if(i.length<9)continue;let a=Number(i[1]),u=i[8].match(/:(\d+)$/);if(!u)continue;let c=Number(u[1]);P(c,o)&&(r.has(c)||r.set(c,a))}if(r.size>0)return[...r.entries()].map(([s,i])=>({port:s,pid:i}))}}catch{}try{let{stdout:t}=await v(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(t.trim()){let r=new Map;for(let s of t.trim().split(`
4
- `)){let i=s.match(/:(\d+)\s/),a=s.match(/pid=(\d+)/);if(!i)continue;let n=Number(i[1]),u=a?Number(a[1]):0;P(n,o)&&(r.has(n)||r.set(n,u))}if(r.size>0)return[...r.entries()].map(([s,i])=>({port:s,pid:i}))}}catch{}return W.filter(t=>P(t.port,o))}var y=new Map;async function j(e){if(e<=0)return null;let o=y.get(e);if(o)return o;try{let{stdout:t}=await v(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let r of t.split(`
5
- `))if(r.startsWith("n")&&r.length>1){let s=r.slice(1).trim();if(s)return y.set(e,s),s}}catch{}return null}function z(e,o){return{port:e,framework:o,bundleUrl:g(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function g(e,o){let t=x().find(s=>s.preferredPort===e),r=t?.runtimeConfig?M(o,t.runtimeConfig):o;return U(r)}function J(e){return e.includes("/node_modules/one/metro-entry.bundle")}function K(e){try{let o=JSON.parse(e);return o&&typeof o=="object"?o:null}catch{return null}}function w(e,o,t){if(!o)return e;try{let r=JSON.parse(o.body),s=r?.extra?.expoClient||r?.extra||{};s.name&&(e.projectName=s.name),s.ios?.bundleIdentifier&&(e.bundleId=s.ios.bundleIdentifier),e.framework==="metro"&&s.sdkVersion&&(e.framework="expo");let i=r?.launchAsset?.url;i&&!e.patched&&!J(e.bundleUrl)&&(e.bundleUrl=g(e.port,i));let a=s.iconUrl||s.ios?.iconUrl||s.icon||s.ios?.icon;if(a)if(e.iconPath=a,t)if(a.startsWith("http"))e.iconUrl=t(a);else{let n=a.replace(/^\.\//,"");e.iconUrl=t(`http://localhost:${e.port}/assets/${n}`)}else e.iconUrl=a.startsWith("http")?a:`http://localhost:${e.port}/assets/${a.replace(/^\.\//,"")}`}catch{}return e}var d=new Set,p=new Set,S=new Set;async function V(e,o){if(!await F(e))return null;let t="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[r,s,i,a]=await Promise.all([d.has(e)?Promise.resolve(null):h(e,"/__soot/"),h(e,"/status"),S.has(e)?Promise.resolve(null):h(e,"/","GET",B,{"expo-platform":"ios"}),p.has(e)?Promise.resolve(null):h(e,"/_expo/status")]);a&&a.statusCode===200?p.delete(e):p.has(e)||p.add(e);let n=i?K(i.body):null,u=typeof n?.launchAsset?.url=="string"?n.launchAsset.url:null,c=n?.extra?.expoClient||n?.extra||{};if(n&&(u||typeof c.name=="string")){d.add(e);let R=u||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,T=R.includes("/one/metro-entry.bundle")?"one":"expo";return w({port:e,framework:T,bundleUrl:g(e,R),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},i,o)}if(s&&s.body.includes("packager-status:running"))return d.add(e),w(z(e,a&&a.statusCode===200?"expo":"metro"),i,o);if(r&&r.statusCode===200&&r.body.includes("sootsim-patched"))return d.delete(e),w({port:e,framework:"one",bundleUrl:g(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},i,o);if(s&&s.statusCode===200||a&&a.statusCode===200||i&&i.statusCode===200&&n!=null)return null;let f=await h(e,t,"HEAD");return f&&f.statusCode>0&&f.statusCode<400&&/application\/javascript/i.test(f.contentType||"")?(d.add(e),S.add(e),w({port:e,framework:"one",bundleUrl:g(e,`http://localhost:${e}${t}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},i,o)):(d.add(e),null)}function q(e){return!!e.bundleId?.trim().toLowerCase()?.startsWith("dev.sootsim.")}var b=new Map,Q=3e4,Y=1500;function X(e){return!e||e.framework==="metro"||e.framework==="unknown"}function Z(e){return e?g(e.port,e.bundleUrl)===e.bundleUrl:!0}function ee(e,o,t=Date.now()){if(o===0||e.pid!==o||!Z(e.result))return!1;let r=t-e.cachedAt;return!(e.result===null&&r>=Q||X(e.result)&&r>=Y)}async function fe(e={}){let o=await G(e.excludePorts),t=new Set(o.map(n=>n.port));for(let n of[...b.keys()])t.has(n)||b.delete(n);for(let n of[...d])t.has(n)||d.delete(n);for(let n of[...p])t.has(n)||p.delete(n);for(let n of[...S])t.has(n)||S.delete(n);let r=[],s=[];for(let{port:n,pid:u}of o){let c=b.get(n);if(c&&ee(c,u)){c.result&&r.push(c.result);continue}c&&c.pid!==u&&(d.delete(n),p.delete(n),S.delete(n)),s.push({port:n,pid:u})}s.length>0&&(await Promise.all(s.map(u=>V(u.port,e.buildIconProxyUrl)))).forEach((u,c)=>{let{port:l,pid:f}=s[c];f!==0&&b.set(l,{pid:f,result:u,cachedAt:Date.now()}),u&&r.push(u)});let i=new Map;for(let{port:n,pid:u}of o)u>0&&i.set(n,u);await Promise.all(r.map(async n=>{let u=i.get(n.port);if(!u)return;n.pid=u;let c=await j(u);c&&(n.cwd=c)}));let a=new Set(i.values());for(let n of[...y.keys()])a.has(n)||y.delete(n);return r.filter(n=>!q(n))}export{M as a,te as b,U as c,re as d,V as e,fe as f};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{h as w,j as u,k as m,l}from"./chunk-PTBJZ3IO.js";var p="sootsim:settings",v=["errorReporting","colorScheme","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","agentProvider","onboardingComplete","betaConsentVersion","detailedTelemetry"];function S(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function g(e){let t={};for(let n of v){if(!(n in e))continue;let r=e[n],o=u[n];o.validate&&!o.validate(r)||o.options&&!o.options.includes(r)||(t[n]=r)}return t}function h(e){let t={};for(let n of v)t[n]=e[n];return t}function _(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(p);return e?g(JSON.parse(e)):{}}catch{return{}}}function V(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(p,JSON.stringify(h(e)))}catch{}}function E(){let t=S()?.sharedConfig?.settings;return!t||typeof t!="object"?{}:g(t)}function K(e){let t=S();if(t?.writeSharedConfig)try{t.writeSharedConfig({settings:h(e)})}catch{}}function k(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function j(){let e=k()?.settings;return!e||typeof e!="object"?{}:g(e)}function D(e){if(!k())return;let t={settings:h(e)};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(t))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}function b(){let e=_(),t=j(),n=E();return{...e,...t,...n}}function R(e){V(e),K(e),D(e)}function C(e){if(typeof window>"u")return()=>{};let t=i=>{if(!(i.key!==p||i.newValue==null))try{e(g(JSON.parse(i.newValue)))}catch{}};window.addEventListener("storage",t);let n=S(),r;n?.onSharedConfigChanged&&(r=n.onSharedConfigChanged(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))}));let c=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))});return()=>{window.removeEventListener("storage",t),r?.(),c?.()}}var M=l(),P=b();for(let e of Object.keys(m()))delete P[e];var s={...M,...P},f=[],a=null;function y(){for(let e of f)e();R(s)}C(e=>{let t={...s},n=!1;for(let[r,o]of Object.entries(e)){let c=r;t[c]!==o&&(t[c]=o,n=!0)}if(n){s=t,a=null;for(let r of f)r()}});var L={get(e){return s[e]},set(e,t){let n=u[e];n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]!==t&&(s={...s,[e]:t},e==="deviceModel"&&(a=null),y())},getAll(){return s},apply(e){let t=!1,n={...s};for(let[r,o]of Object.entries(e)){if(o===void 0)continue;let c=r,i=u[c];i&&(i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||n[c]!==o&&(n[c]=o,t=!0))}t&&(s=n,a=null,y())},reset(){s=l(),a=null,y()},subscribe(e){return f.push(e),()=>{f=f.filter(t=>t!==e)}},getDeviceSpec(){return a||(a=w(s.deviceModel)),a},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{L as a};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-XGU672KO.js";import"./chunk-M7MO47BR.js";export{a as getCliVersion};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-PHLMZYE4.js";import"./chunk-YKV52CQX.js";import"./chunk-42SYOZVV.js";import"./chunk-7KFBB76L.js";import"./chunk-YXBC4N6Z.js";import"./chunk-ZVZMM2RT.js";import"./chunk-UYKA44Y4.js";import"./chunk-ZKGEGXVG.js";import"./chunk-DVBRRNWE.js";import"./chunk-ITOXSEMN.js";import"./chunk-V3N55LMK.js";import"./chunk-7BHPGH6Q.js";import"./chunk-XGU672KO.js";import"./chunk-YD3CNK36.js";import"./chunk-PTBJZ3IO.js";import"./chunk-M7MO47BR.js";export{c as daemonInstall,b as getDaemonServiceStatus,a as runDaemon,d as teardownDaemonService,e as teardownSootsimHome};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-PNFYOQ4N.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-EUIPNUT4.js";import"./chunk-Q4PUVMFU.js";import"./chunk-CVBCNRKC.js";import"./chunk-O5SQ2RZE.js";import"./chunk-V3N55LMK.js";import"./chunk-7BHPGH6Q.js";import"./chunk-M7MO47BR.js";export{e as ALL_DRIVERS,i as buildDriverListRows,a as chromiumDriver,b as electronDriver,f as getAllDrivers,g as getDriver,c as playwrightDriver,h as resolveDriver,d as systemDriver};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as c,b as d,c as e,d as f}from"./chunk-LJ2DIDX3.js";import"./chunk-64VAJYXX.js";import"./chunk-YFLYSJL6.js";import"./chunk-B5KTNMPL.js";import{c as a,d as b}from"./chunk-PG42I7UQ.js";import"./chunk-JFQFJLTV.js";import"./chunk-NE55HRAU.js";import"./chunk-3DSTCWVF.js";import"./chunk-2SM7WWDI.js";import"./chunk-IFJU3COY.js";import"./chunk-EUIPNUT4.js";import"./chunk-Q4PUVMFU.js";import"./chunk-CVBCNRKC.js";import"./chunk-2IYQJHNS.js";import"./chunk-WY3B2Y5J.js";import"./chunk-H26BCZLV.js";import"./chunk-PQLLJLSM.js";import"./chunk-B2Z36B4N.js";import"./chunk-O5SQ2RZE.js";import"./chunk-YKV52CQX.js";import"./chunk-42SYOZVV.js";import"./chunk-ZKGEGXVG.js";import"./chunk-DVBRRNWE.js";import"./chunk-ITOXSEMN.js";import"./chunk-V3N55LMK.js";import"./chunk-7BHPGH6Q.js";import"./chunk-TBWJVJXW.js";import"./chunk-PTBJZ3IO.js";import"./chunk-M7MO47BR.js";export{c as discoverSootsimUrl,e as hoistLeadingSimFlag,a as parseFlowFile,f as runFlow,d as runFlowPlayback,b as validateFlowFile};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-7KFBB76L.js";import"./chunk-YXBC4N6Z.js";import"./chunk-ZVZMM2RT.js";import"./chunk-UYKA44Y4.js";import"./chunk-ZKGEGXVG.js";import"./chunk-DVBRRNWE.js";import"./chunk-ITOXSEMN.js";import"./chunk-V3N55LMK.js";import"./chunk-7BHPGH6Q.js";import"./chunk-XGU672KO.js";import"./chunk-YD3CNK36.js";import"./chunk-PTBJZ3IO.js";import"./chunk-M7MO47BR.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-IFJU3COY.js";import"./chunk-M7MO47BR.js";export{a as loadOptionalDemoApps,b as optionalDemoAppsSync};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-YLQE2RO4.js";import"./chunk-B77YOZBY.js";import"./chunk-B2Z36B4N.js";import"./chunk-ITOXSEMN.js";import"./chunk-V3N55LMK.js";import"./chunk-7BHPGH6Q.js";import"./chunk-M7MO47BR.js";export{a as runRuntime};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-TBWJVJXW.js";import"./chunk-PTBJZ3IO.js";import"./chunk-M7MO47BR.js";export{a as settingsStore};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-YKV52CQX.js";import"./chunk-42SYOZVV.js";import"./chunk-7BHPGH6Q.js";import"./chunk-M7MO47BR.js";export{b as flushCliTelemetry,a as trackCliEvent};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.178 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-2IYQJHNS.js";import"./chunk-WY3B2Y5J.js";import"./chunk-H26BCZLV.js";import"./chunk-PQLLJLSM.js";import"./chunk-B2Z36B4N.js";import"./chunk-O5SQ2RZE.js";import"./chunk-YKV52CQX.js";import"./chunk-42SYOZVV.js";import"./chunk-ITOXSEMN.js";import"./chunk-V3N55LMK.js";import"./chunk-7BHPGH6Q.js";import"./chunk-M7MO47BR.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};