sootsim 0.1.37 → 0.1.39

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 (129) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-EQRQGSBL.js → agent-HZP3LUGJ.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-AWKZ67GN.js → agent-wrapper-CS6TV5UR.js} +2 -2
  4. package/dist-cli/chunks/{assert-ZVGELUZB.js → assert-WVTX4CNR.js} +2 -2
  5. package/dist-cli/chunks/auto-bootstrap-3TUCG2BC.js +2 -0
  6. package/dist-cli/chunks/beta-3SCMB3IN.js +2 -0
  7. package/dist-cli/chunks/{chunk-L4F4JRKJ.js → chunk-223TXYOC.js} +3 -3
  8. package/dist-cli/chunks/{chunk-R77F5J3X.js → chunk-2ESCYOZW.js} +2 -2
  9. package/dist-cli/chunks/chunk-4LHQRDSN.js +2 -0
  10. package/dist-cli/chunks/chunk-4UI5OHEO.js +1 -0
  11. package/dist-cli/chunks/{chunk-CX3ZIPD3.js → chunk-4YUHJ5FX.js} +2 -2
  12. package/dist-cli/chunks/{chunk-HYYMBXIX.js → chunk-5L5SZXXG.js} +2 -2
  13. package/dist-cli/chunks/chunk-5RSSCKBF.js +1 -0
  14. package/dist-cli/chunks/{chunk-LDWXH43L.js → chunk-6TSUQHSC.js} +2 -2
  15. package/dist-cli/chunks/{chunk-56BIMCDH.js → chunk-7J4UIBA5.js} +1 -1
  16. package/dist-cli/chunks/{chunk-URSEYCC5.js → chunk-B2SCT4DL.js} +2 -2
  17. package/dist-cli/chunks/chunk-B3OEHV2C.js +1 -0
  18. package/dist-cli/chunks/{chunk-4IO3D5XG.js → chunk-C6GUAXKO.js} +1 -1
  19. package/dist-cli/chunks/{chunk-EDBFYOQB.js → chunk-CBPTHIJV.js} +1 -1
  20. package/dist-cli/chunks/{chunk-BGAPLYMS.js → chunk-DSDLGFWH.js} +2 -2
  21. package/dist-cli/chunks/{chunk-H2HSOHXN.js → chunk-E5RYQUFB.js} +3 -3
  22. package/dist-cli/chunks/{chunk-PN6FWLD4.js → chunk-ECDPQ6S7.js} +1 -1
  23. package/dist-cli/chunks/{chunk-QD7YIVPS.js → chunk-FEMOLCB5.js} +2 -2
  24. package/dist-cli/chunks/{chunk-Z5SVSAZO.js → chunk-GUHXSXNO.js} +2 -2
  25. package/dist-cli/chunks/{chunk-ZERYEI3L.js → chunk-HWRR23AJ.js} +2 -2
  26. package/dist-cli/chunks/{chunk-WHLHA5R5.js → chunk-JXKW62SL.js} +2 -2
  27. package/dist-cli/chunks/{chunk-WLIVBPPY.js → chunk-MGVTLDI3.js} +2 -2
  28. package/dist-cli/chunks/{chunk-FCQLQ7NA.js → chunk-MIE6NMPJ.js} +1 -1
  29. package/dist-cli/chunks/{chunk-5FLDI6CV.js → chunk-NF65BNJR.js} +2 -2
  30. package/dist-cli/chunks/chunk-NFJDHJHK.js +1 -0
  31. package/dist-cli/chunks/{chunk-DSTV2VJT.js → chunk-NJ4WXWKO.js} +2 -2
  32. package/dist-cli/chunks/{chunk-UIQ3536J.js → chunk-NYZGZDHI.js} +1 -1
  33. package/dist-cli/chunks/{chunk-QXMZNJV5.js → chunk-OB3TB4AN.js} +1 -1
  34. package/dist-cli/chunks/{chunk-Z5X3PITK.js → chunk-P6F636LU.js} +1 -1
  35. package/dist-cli/chunks/{chunk-X6BP5JFC.js → chunk-RJQ73DLG.js} +2 -2
  36. package/dist-cli/chunks/{chunk-PERKPZ7T.js → chunk-RLGCJT2D.js} +1 -1
  37. package/dist-cli/chunks/{chunk-RLNIKWFO.js → chunk-SLQ2GTYF.js} +2 -2
  38. package/dist-cli/chunks/{chunk-WFXYY3DU.js → chunk-UWRBEBML.js} +2 -2
  39. package/dist-cli/chunks/{chunk-S74RCIVB.js → chunk-VLUFTHBB.js} +2 -2
  40. package/dist-cli/chunks/{chunk-RX6RHGSI.js → chunk-W4QHQT64.js} +2 -2
  41. package/dist-cli/chunks/{chunk-B3RAGRK6.js → chunk-WD54RD4K.js} +1 -1
  42. package/dist-cli/chunks/chunk-WHQWINDB.js +11 -0
  43. package/dist-cli/chunks/{chunk-T5L73GJB.js → chunk-XYTDYBXJ.js} +1 -1
  44. package/dist-cli/chunks/{chunk-YFXTO4QX.js → chunk-YGUQSPU6.js} +1 -1
  45. package/dist-cli/chunks/{chunk-JMGDVXAV.js → chunk-YHYSOUIJ.js} +2 -2
  46. package/dist-cli/chunks/chunk-YUKH7HF6.js +2 -0
  47. package/dist-cli/chunks/chunk-ZBB7YS6C.js +5 -0
  48. package/dist-cli/chunks/{compat-QQ3OJDBI.js → compat-UMJ2IXUW.js} +2 -2
  49. package/dist-cli/chunks/{config-LT27SC25.js → config-YMJK426V.js} +2 -2
  50. package/dist-cli/chunks/control-DJR3DUAB.js +2 -0
  51. package/dist-cli/chunks/{cpu-profile-XEO3JCVB.js → cpu-profile-67MCPAA2.js} +2 -2
  52. package/dist-cli/chunks/{daemon-3J2SAVQZ.js → daemon-LIVCJZR3.js} +2 -2
  53. package/dist-cli/chunks/{debug-OGQLIH4U.js → debug-EV73WC7H.js} +3 -3
  54. package/dist-cli/chunks/demo-app-registry-NZBZVJ52.js +2 -0
  55. package/dist-cli/chunks/{detox-Z2OSCIQU.js → detox-NBT5BVX3.js} +2 -2
  56. package/dist-cli/chunks/{device-RPTVD25S.js → device-MMROWQZ3.js} +2 -2
  57. package/dist-cli/chunks/{diagnose-LAEXBNOQ.js → diagnose-WXOKGBAJ.js} +2 -2
  58. package/dist-cli/chunks/drivers-NSPV5S6T.js +2 -0
  59. package/dist-cli/chunks/{electron-S2463O3P.js → electron-F5DT7CFY.js} +3 -3
  60. package/dist-cli/chunks/flow-T6DZQWHE.js +2 -0
  61. package/dist-cli/chunks/{hints-E5PXPWFT.js → hints-RODH4XE4.js} +2 -2
  62. package/dist-cli/chunks/{home-paths-F5SGBTRZ.js → home-paths-PCUMN33Z.js} +2 -2
  63. package/dist-cli/chunks/{inspect-EVGMEZ3G.js → inspect-BIMFJFDR.js} +3 -3
  64. package/dist-cli/chunks/install-5YPVP466.js +2 -0
  65. package/dist-cli/chunks/{install-desktop-ZNWYKTWQ.js → install-desktop-ASRNFHZU.js} +3 -3
  66. package/dist-cli/chunks/{keys-5ETF6DYO.js → keys-DOOCGNTD.js} +2 -2
  67. package/dist-cli/chunks/{launch-DHUCNFX6.js → launch-DTVAQMZG.js} +3 -3
  68. package/dist-cli/chunks/{login-KDR34JIP.js → login-JA6VEDEP.js} +4 -4
  69. package/dist-cli/chunks/{logout-R6WIJYCW.js → logout-H4WFWTPC.js} +2 -2
  70. package/dist-cli/chunks/{maestro-ZOOJ2YVH.js → maestro-4TR7U6TS.js} +2 -2
  71. package/dist-cli/chunks/{preview-YFADHNBD.js → preview-GP7XXDW6.js} +2 -2
  72. package/dist-cli/chunks/{profile-CQSC32HB.js → profile-3FESGAZD.js} +2 -2
  73. package/dist-cli/chunks/{react-QSQD6CJE.js → react-SJD2DQQV.js} +2 -2
  74. package/dist-cli/chunks/{record-IWLEYATN.js → record-PQUAMW5K.js} +2 -2
  75. package/dist-cli/chunks/{runtime-WKMNKYTN.js → runtime-YJPWA3XA.js} +3 -3
  76. package/dist-cli/chunks/{screenshot-VJXHV57I.js → screenshot-45SAK7EW.js} +2 -2
  77. package/dist-cli/chunks/{screenshot-mode-FA4VQ76K.js → screenshot-mode-TCY7FBGR.js} +2 -2
  78. package/dist-cli/chunks/{screenshots-U4FQXHVK.js → screenshots-KZ364S2O.js} +2 -2
  79. package/dist-cli/chunks/{server-7WZLM5NQ.js → server-S5CRYXXZ.js} +7 -7
  80. package/dist-cli/chunks/setup-repo-TH3GXOP7.js +2 -0
  81. package/dist-cli/chunks/{skills-KO7RCY24.js → skills-SMXCCJCM.js} +2 -2
  82. package/dist-cli/chunks/{start-EBD7T2GW.js → start-KLSAQM3C.js} +3 -3
  83. package/dist-cli/chunks/store-E2N5NOUS.js +2 -0
  84. package/dist-cli/chunks/telemetry-RJXVYJSN.js +2 -0
  85. package/dist-cli/chunks/{test-OSVUG54G.js → test-ZXTSA5GV.js} +3 -3
  86. package/dist-cli/chunks/{three-mode-MDBXZQG4.js → three-mode-4Q65J2ZA.js} +2 -2
  87. package/dist-cli/chunks/{timeline-UJOKZKQR.js → timeline-ISEDS6XR.js} +2 -2
  88. package/dist-cli/chunks/upload-KB7INQRC.js +2 -0
  89. package/dist-cli/chunks/{what-happened-LFWH74FR.js → what-happened-STY3AOCQ.js} +2 -2
  90. package/dist-cli/chunks/{whoami-CUF56TLP.js → whoami-VKRQOG2U.js} +2 -2
  91. package/dist-lib/agent-daemon-client.cjs +1 -1
  92. package/dist-lib/agent-events.cjs +1 -1
  93. package/dist-lib/agent-sessions.cjs +1 -1
  94. package/dist-lib/attached-projects.cjs +1 -1
  95. package/dist-lib/auth/shared-session.cjs +1 -1
  96. package/dist-lib/backend-origin.cjs +1 -1
  97. package/dist-lib/bridge-constants.cjs +1 -1
  98. package/dist-lib/cli-constants.cjs +1 -1
  99. package/dist-lib/config.cjs +1 -1
  100. package/dist-lib/dev-bundle-resolution.cjs +1 -30
  101. package/dist-lib/home-paths.cjs +1 -1
  102. package/dist-lib/host/bridge-host.cjs +47 -26
  103. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  104. package/dist-lib/index.cjs +1 -1
  105. package/dist-lib/metro.cjs +1 -1
  106. package/dist-lib/profiles.cjs +1 -1
  107. package/dist-lib/render-mode.cjs +1 -1
  108. package/dist-lib/vite-base.cjs +48 -27
  109. package/dist-lib/vite.cjs +1 -1
  110. package/package.json +1 -1
  111. package/dist-cli/chunks/auto-bootstrap-UEOLNAWJ.js +0 -2
  112. package/dist-cli/chunks/beta-4MD7WSI4.js +0 -2
  113. package/dist-cli/chunks/chunk-2ZPJHSIJ.js +0 -11
  114. package/dist-cli/chunks/chunk-4OHVCGMF.js +0 -2
  115. package/dist-cli/chunks/chunk-ERLA3F77.js +0 -1
  116. package/dist-cli/chunks/chunk-JMU5IGIU.js +0 -1
  117. package/dist-cli/chunks/chunk-KA5JJCWL.js +0 -1
  118. package/dist-cli/chunks/chunk-QWKO62QM.js +0 -2
  119. package/dist-cli/chunks/chunk-SK4SOISL.js +0 -1
  120. package/dist-cli/chunks/chunk-ZBOIGEGO.js +0 -5
  121. package/dist-cli/chunks/control-3BO54QMO.js +0 -2
  122. package/dist-cli/chunks/demo-app-registry-5RZCXLWB.js +0 -2
  123. package/dist-cli/chunks/drivers-PSQUUAYC.js +0 -2
  124. package/dist-cli/chunks/flow-34YCVQDB.js +0 -2
  125. package/dist-cli/chunks/install-AM5PTJT3.js +0 -2
  126. package/dist-cli/chunks/setup-repo-3BXLAX5E.js +0 -2
  127. package/dist-cli/chunks/store-ONX3EBS4.js +0 -2
  128. package/dist-cli/chunks/telemetry-MFR7TUW7.js +0 -2
  129. package/dist-cli/chunks/upload-H2SMWP6T.js +0 -2
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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;
@@ -856,6 +856,7 @@ var APPS = [
856
856
  // scripts/dev-server-scanner.ts
857
857
  var execP = (0, import_util.promisify)(import_child_process.exec);
858
858
  var TIMEOUT_MS = 250;
859
+ var MANIFEST_TIMEOUT_MS = 1500;
859
860
  var TCP_GATE_MS = 120;
860
861
  function tcpPing(port, timeout = TCP_GATE_MS) {
861
862
  return new Promise((resolve2) => {
@@ -881,7 +882,16 @@ function httpGet(port, path7, method = "GET", timeout = TIMEOUT_MS, headers = {}
881
882
  (res) => {
882
883
  let body = "";
883
884
  res.on("data", (c) => body += c.toString());
884
- res.on("end", () => resolve2({ statusCode: res.statusCode || 0, body }));
885
+ const contentType = (() => {
886
+ const raw = res.headers["content-type"];
887
+ if (typeof raw === "string") return raw;
888
+ if (Array.isArray(raw)) return raw[0];
889
+ return void 0;
890
+ })();
891
+ res.on(
892
+ "end",
893
+ () => resolve2({ statusCode: res.statusCode || 0, body, contentType })
894
+ );
885
895
  }
886
896
  );
887
897
  req.on("error", () => resolve2(null));
@@ -1002,6 +1012,14 @@ function withRuntimeConfig(port, bundleUrl) {
1002
1012
  function isDirectOneBundleUrl(bundleUrl) {
1003
1013
  return bundleUrl.includes("/node_modules/one/metro-entry.bundle");
1004
1014
  }
1015
+ function safeParseManifest(body) {
1016
+ try {
1017
+ const parsed = JSON.parse(body);
1018
+ return parsed && typeof parsed === "object" ? parsed : null;
1019
+ } catch {
1020
+ return null;
1021
+ }
1022
+ }
1005
1023
  function applyManifest(result, manifestRes, buildIconProxyUrl) {
1006
1024
  if (!manifestRes) return result;
1007
1025
  try {
@@ -1044,7 +1062,7 @@ async function probePort(port, buildIconProxyUrl) {
1044
1062
  knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(port, "/__soot/"),
1045
1063
  httpGet(port, "/status"),
1046
1064
  httpGet(port, onePath, "HEAD"),
1047
- knownOne.has(port) ? Promise.resolve(null) : httpGet(port, "/", "GET", TIMEOUT_MS, { "expo-platform": "ios" }),
1065
+ knownOne.has(port) ? Promise.resolve(null) : httpGet(port, "/", "GET", MANIFEST_TIMEOUT_MS, { "expo-platform": "ios" }),
1048
1066
  knownNonExpo.has(port) ? Promise.resolve(null) : httpGet(port, "/_expo/status")
1049
1067
  ]);
1050
1068
  if (expoRes && expoRes.statusCode === 200) {
@@ -1052,7 +1070,28 @@ async function probePort(port, buildIconProxyUrl) {
1052
1070
  } else if (!knownNonExpo.has(port)) {
1053
1071
  knownNonExpo.add(port);
1054
1072
  }
1055
- if (oneRes && oneRes.statusCode > 0 && oneRes.statusCode < 400) {
1073
+ const manifestParsed = manifestRes ? safeParseManifest(manifestRes.body) : null;
1074
+ const manifestLaunchUrl = typeof manifestParsed?.launchAsset?.url === "string" ? manifestParsed.launchAsset.url : null;
1075
+ const manifestClient = manifestParsed?.extra?.expoClient || manifestParsed?.extra || {};
1076
+ if (manifestParsed && (manifestLaunchUrl || typeof manifestClient.name === "string")) {
1077
+ knownNonPatched.add(port);
1078
+ const launchUrl2 = manifestLaunchUrl || `http://localhost:${port}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;
1079
+ const framework = launchUrl2.includes(
1080
+ "/one/metro-entry.bundle"
1081
+ ) ? "one" : "expo";
1082
+ return applyManifest(
1083
+ {
1084
+ port,
1085
+ framework,
1086
+ bundleUrl: withRuntimeConfig(port, launchUrl2),
1087
+ hmrUrl: `ws://localhost:${port}/hot`,
1088
+ lastSeen: Date.now()
1089
+ },
1090
+ manifestRes,
1091
+ buildIconProxyUrl
1092
+ );
1093
+ }
1094
+ if (oneRes && oneRes.statusCode > 0 && oneRes.statusCode < 400 && /application\/javascript/i.test(oneRes.contentType || "")) {
1056
1095
  knownNonPatched.add(port);
1057
1096
  knownOne.add(port);
1058
1097
  return applyManifest(
@@ -1078,28 +1117,6 @@ async function probePort(port, buildIconProxyUrl) {
1078
1117
  buildIconProxyUrl
1079
1118
  );
1080
1119
  }
1081
- if (manifestRes) {
1082
- try {
1083
- const manifest = JSON.parse(manifestRes.body);
1084
- const client = manifest?.extra?.expoClient || {};
1085
- if (client.name) {
1086
- const launchUrl2 = manifest?.launchAsset?.url || `http://localhost:${port}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;
1087
- knownNonPatched.add(port);
1088
- return applyManifest(
1089
- {
1090
- port,
1091
- framework: "one",
1092
- bundleUrl: withRuntimeConfig(port, launchUrl2),
1093
- hmrUrl: `ws://localhost:${port}/hot`,
1094
- lastSeen: Date.now()
1095
- },
1096
- manifestRes,
1097
- buildIconProxyUrl
1098
- );
1099
- }
1100
- } catch {
1101
- }
1102
- }
1103
1120
  if (sootsimRes && sootsimRes.statusCode === 200 && sootsimRes.body.includes("sootsim-patched")) {
1104
1121
  knownNonPatched.delete(port);
1105
1122
  return applyManifest(
@@ -3928,6 +3945,10 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
3928
3945
  * non-upgrade routes that don't match serve index.html (SPA behavior) so
3929
3946
  * electron's webContents can navigate freely inside the runtime. */
3930
3947
  handleHttpRequest(req, res) {
3948
+ res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
3949
+ res.setHeader("Cross-Origin-Embedder-Policy", "credentialless");
3950
+ res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
3951
+ res.setHeader("Document-Policy", "js-profiling");
3931
3952
  if (isFetchProxyRequestUrl(req.url)) {
3932
3953
  void handleFetchProxyRequest(req, res);
3933
3954
  return;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (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;
@@ -889,7 +889,16 @@ function httpGet(port, path10, method = "GET", timeout = TIMEOUT_MS, headers = {
889
889
  (res) => {
890
890
  let body = "";
891
891
  res.on("data", (c) => body += c.toString());
892
- res.on("end", () => resolve2({ statusCode: res.statusCode || 0, body }));
892
+ const contentType = (() => {
893
+ const raw = res.headers["content-type"];
894
+ if (typeof raw === "string") return raw;
895
+ if (Array.isArray(raw)) return raw[0];
896
+ return void 0;
897
+ })();
898
+ res.on(
899
+ "end",
900
+ () => resolve2({ statusCode: res.statusCode || 0, body, contentType })
901
+ );
893
902
  }
894
903
  );
895
904
  req.on("error", () => resolve2(null));
@@ -998,6 +1007,14 @@ function withRuntimeConfig(port, bundleUrl) {
998
1007
  function isDirectOneBundleUrl(bundleUrl) {
999
1008
  return bundleUrl.includes("/node_modules/one/metro-entry.bundle");
1000
1009
  }
1010
+ function safeParseManifest(body) {
1011
+ try {
1012
+ const parsed = JSON.parse(body);
1013
+ return parsed && typeof parsed === "object" ? parsed : null;
1014
+ } catch {
1015
+ return null;
1016
+ }
1017
+ }
1001
1018
  function applyManifest(result, manifestRes, buildIconProxyUrl) {
1002
1019
  if (!manifestRes) return result;
1003
1020
  try {
@@ -1037,7 +1054,7 @@ async function probePort(port, buildIconProxyUrl) {
1037
1054
  knownNonPatched.has(port) ? Promise.resolve(null) : httpGet(port, "/__soot/"),
1038
1055
  httpGet(port, "/status"),
1039
1056
  httpGet(port, onePath, "HEAD"),
1040
- knownOne.has(port) ? Promise.resolve(null) : httpGet(port, "/", "GET", TIMEOUT_MS, { "expo-platform": "ios" }),
1057
+ knownOne.has(port) ? Promise.resolve(null) : httpGet(port, "/", "GET", MANIFEST_TIMEOUT_MS, { "expo-platform": "ios" }),
1041
1058
  knownNonExpo.has(port) ? Promise.resolve(null) : httpGet(port, "/_expo/status")
1042
1059
  ]);
1043
1060
  if (expoRes && expoRes.statusCode === 200) {
@@ -1045,7 +1062,28 @@ async function probePort(port, buildIconProxyUrl) {
1045
1062
  } else if (!knownNonExpo.has(port)) {
1046
1063
  knownNonExpo.add(port);
1047
1064
  }
1048
- if (oneRes && oneRes.statusCode > 0 && oneRes.statusCode < 400) {
1065
+ const manifestParsed = manifestRes ? safeParseManifest(manifestRes.body) : null;
1066
+ const manifestLaunchUrl = typeof manifestParsed?.launchAsset?.url === "string" ? manifestParsed.launchAsset.url : null;
1067
+ const manifestClient = manifestParsed?.extra?.expoClient || manifestParsed?.extra || {};
1068
+ if (manifestParsed && (manifestLaunchUrl || typeof manifestClient.name === "string")) {
1069
+ knownNonPatched.add(port);
1070
+ const launchUrl2 = manifestLaunchUrl || `http://localhost:${port}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;
1071
+ const framework = launchUrl2.includes(
1072
+ "/one/metro-entry.bundle"
1073
+ ) ? "one" : "expo";
1074
+ return applyManifest(
1075
+ {
1076
+ port,
1077
+ framework,
1078
+ bundleUrl: withRuntimeConfig(port, launchUrl2),
1079
+ hmrUrl: `ws://localhost:${port}/hot`,
1080
+ lastSeen: Date.now()
1081
+ },
1082
+ manifestRes,
1083
+ buildIconProxyUrl
1084
+ );
1085
+ }
1086
+ if (oneRes && oneRes.statusCode > 0 && oneRes.statusCode < 400 && /application\/javascript/i.test(oneRes.contentType || "")) {
1049
1087
  knownNonPatched.add(port);
1050
1088
  knownOne.add(port);
1051
1089
  return applyManifest(
@@ -1071,28 +1109,6 @@ async function probePort(port, buildIconProxyUrl) {
1071
1109
  buildIconProxyUrl
1072
1110
  );
1073
1111
  }
1074
- if (manifestRes) {
1075
- try {
1076
- const manifest = JSON.parse(manifestRes.body);
1077
- const client = manifest?.extra?.expoClient || {};
1078
- if (client.name) {
1079
- const launchUrl2 = manifest?.launchAsset?.url || `http://localhost:${port}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;
1080
- knownNonPatched.add(port);
1081
- return applyManifest(
1082
- {
1083
- port,
1084
- framework: "one",
1085
- bundleUrl: withRuntimeConfig(port, launchUrl2),
1086
- hmrUrl: `ws://localhost:${port}/hot`,
1087
- lastSeen: Date.now()
1088
- },
1089
- manifestRes,
1090
- buildIconProxyUrl
1091
- );
1092
- }
1093
- } catch {
1094
- }
1095
- }
1096
1112
  if (sootsimRes && sootsimRes.statusCode === 200 && sootsimRes.body.includes("sootsim-patched")) {
1097
1113
  knownNonPatched.delete(port);
1098
1114
  return applyManifest(
@@ -1195,7 +1211,7 @@ async function scanDevServers(opts = {}) {
1195
1211
  }
1196
1212
  return results.filter((r) => !isSootSelfServer(r));
1197
1213
  }
1198
- var import_child_process, import_http, import_net, import_util, execP, TIMEOUT_MS, TCP_GATE_MS, FALLBACK_PORTS, cwdByPid, knownNonPatched, knownNonExpo, knownOne, portCache, NEGATIVE_CACHE_TTL_MS, WEAK_RESULT_CACHE_TTL_MS;
1214
+ 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;
1199
1215
  var init_dev_server_scanner = __esm({
1200
1216
  "scripts/dev-server-scanner.ts"() {
1201
1217
  "use strict";
@@ -1208,6 +1224,7 @@ var init_dev_server_scanner = __esm({
1208
1224
  init_demo_app_registry();
1209
1225
  execP = (0, import_util.promisify)(import_child_process.exec);
1210
1226
  TIMEOUT_MS = 250;
1227
+ MANIFEST_TIMEOUT_MS = 1500;
1211
1228
  TCP_GATE_MS = 120;
1212
1229
  FALLBACK_PORTS = [
1213
1230
  8081,
@@ -4026,6 +4043,10 @@ var init_bridge_host = __esm({
4026
4043
  * non-upgrade routes that don't match serve index.html (SPA behavior) so
4027
4044
  * electron's webContents can navigate freely inside the runtime. */
4028
4045
  handleHttpRequest(req, res) {
4046
+ res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
4047
+ res.setHeader("Cross-Origin-Embedder-Policy", "credentialless");
4048
+ res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
4049
+ res.setHeader("Document-Policy", "js-profiling");
4029
4050
  if (isFetchProxyRequestUrl(req.url)) {
4030
4051
  void handleFetchProxyRequest(req, res);
4031
4052
  return;
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.39 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sootsim",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
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",
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-H2HSOHXN.js";import"./chunk-ZERYEI3L.js";import"./chunk-PERKPZ7T.js";import"./chunk-ERLA3F77.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-EDBFYOQB.js";import"./chunk-B3RAGRK6.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1,11 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as R,b as q,c as x,d as se}from"./chunk-QWKO62QM.js";import{b as B}from"./chunk-Z5X3PITK.js";import{g as ae}from"./chunk-HYYMBXIX.js";import{a as C,b as j}from"./chunk-YFXTO4QX.js";import{c as ie}from"./chunk-WLIVBPPY.js";import{a as ee}from"./chunk-4OHVCGMF.js";import{d as ne}from"./chunk-4IO3D5XG.js";import{b as re,c as $,d as w,e as S}from"./chunk-ZERYEI3L.js";import{c as F,d as g,e as z}from"./chunk-PERKPZ7T.js";import{E as te,F as oe}from"./chunk-PN6FWLD4.js";import xe from"node:fs";import Ce from"node:os";import G from"node:path";function we(t){return t.replace(/^\[|\]$/g,"").toLowerCase()}function _(t){let o=we(t);return o==="localhost"||o.endsWith(".localhost")||o==="0.0.0.0"||o==="::1"||/^127(?:\.\d{1,3}){3}$/.test(o)}function ce(t){return new Error(`could not resolve a native bundle for ${t}. pass an explicit bundle URL or open Connect and choose the app there.`)}function be(t,o){return t?.includes("/one/metro-entry.bundle")?"one":typeof o=="string"&&o?"expo":"unknown"}function le(t,o,e){return`${t}//${o}:${e}`}function ye(t){if(typeof window>"u")return!1;try{let o=new URL(t);return _(o.hostname)&&_(window.location.hostname)&&o.origin!==window.location.origin}catch{return!1}}async function O(t,o){let e={...o,cache:o?.cache??"no-store"};return ye(t)?fetch(`/__fetch-proxy?url=${encodeURIComponent(t)}`,e):fetch(t,e)}function $e(t){return t==="https:"?443:80}function Se(t){let o=t.pathname||"/";return(o==="/"||o==="")&&!t.search&&!t.hash}async function me(t,o){let e=t.replace(/\/+$/,"");try{let n=await O(`${e}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),i=r?.extra?.expoClient||r?.extra||{},s=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(s||i.name)return{bundleUrl:se(s||`${e}${x}`),port:o,framework:be(s,i.sdkVersion),projectName:i.name}}}catch{}try{if((await O(`${e}${q}`,{method:"HEAD"})).ok)return{bundleUrl:`${e}${q}`,port:o,framework:"one"}}catch{}try{if((await O(`${e}${x}`,{method:"HEAD"})).ok)return{bundleUrl:`${e}${x}`,port:o,framework:"metro"}}catch{}try{let n=await O(`${e}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${e}${x}`,port:o,framework:"metro"}}catch{}return null}async function ve(t){return me(le("http:","localhost",t),t)}async function W(t){let o=t.trim();if(/^\d+$/.test(o)){let a=parseInt(o,10),l=await ve(a);if(l)return l;throw ce(`localhost:${a}`)}let e=o.startsWith("http")?o:`http://${o}`,n;try{n=new URL(e)}catch{throw new Error(`could not parse "${t}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let r=n.protocol||"http:",i=n.port?parseInt(n.port,10):$e(r),s=le(r,n.hostname,i);if(_(n.hostname)&&Se(n)){let a=await me(s,i);if(a)return a;throw ce(s)}return{bundleUrl:n.toString(),port:i,framework:"unknown"}}function qe(){console.error(" no sootsim desktop companion found."),console.error(""),console.error(" install the desktop app:"),console.error(" sootsim install-desktop"),console.error(""),console.error(" or wire sootsim into your own project so your dev server hosts the bridge:"),console.error(" sootsim setup-repo"),console.error("")}function de(t){let o=C();if(console.log(` note: no sootsim bridge detected on port ${t}`),o){console.log(" launch the installed companion with:"),console.log(" sootsim electron");return}console.log(""),console.log(" to get a bridge running, either:"),console.log(" sootsim install-desktop # download the electron app"),console.log(" sootsim setup-repo # wire sootsim into your own project")}function je(t){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${t}.`),console.error(""),console.error(" start your app dev server, then open it in sootsim:"),console.error(" npx expo start --localhost --port 8081"),console.error(" sootsim open 8081"),console.error(""),console.error(" then inspect the live app:"),console.error(" sootsim describe")}var Pe={rn:"/rn",connectrn:"/rn","connect-rn":"/rn",clock:"/app/clock","native-ui":"/app/native-ui",tamagui:"/app/tamagui",settings:"/app/settings",photos:"/app/photos",camera:"/app/camera"};function I(t){return new Promise(o=>setTimeout(o,t))}function J(t){return t.trim()}function Q(t){try{let o=new URL(t),e=o.pathname.replace(/\/+$/,"")||"/";return o.searchParams.has("open")||o.searchParams.has("port")||o.searchParams.has("bundle")||o.searchParams.has("demo")||o.pathname.includes("/sootsim/index.html")||e==="/sootsim"||o.pathname==="/__soot"||o.pathname==="/__soot/"||e==="/rn"||/^\/rn\/[^/]+$/i.test(e)||/^\/app\/[^/]+$/i.test(e)||e==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(e)||/^\/__soot\/app\/[^/]+$/i.test(e)}catch{return!1}}async function at(t){let o=J(t);return(await W(o)).bundleUrl}function K(t){let o=t.replace(/\/+$/,"")||"/";return o==="/__soot"||o.startsWith("/__soot/")?"/__soot":""}function ke(t,o){let e=J(t),n=new URL(o),r=K(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),/^\d+$/.test(e)?n.pathname=`${r}/rn/${e}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",e)),n.toString()}function Ie(t){let o=J(t);return/^\d+$/.test(o)||/^https?:\/\//i.test(o)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(o)}async function Ue(t,o){let e=await W(t),n=new URL(o),r=K(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.set("bundle",e.bundleUrl),n.toString()}function Me(t){return t.startsWith("~/")?G.join(Ce.homedir(),t.slice(2)):G.isAbsolute(t)?t:G.resolve(process.cwd(),t)}function Te(t){let o={};for(let e=0;e<t.length;e++){if(t[e]!=="--replace")continue;let n=t[e+1];n||(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let r=n.indexOf("=");(r<=0||r===n.length-1)&&(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let i=n.slice(0,r).trim(),s=Me(n.slice(r+1).trim());xe.existsSync(s)||(console.error(` sootsim open: replacement file not found: ${s}`),process.exit(1)),o[i]={file:s},e++}return Object.keys(o).length>0?{modules:o}:void 0}function pe(){let t=te();return oe(t)&&t.runtimePort>0?`http://localhost:${t.runtimePort}/`:ee}async function L(t,o=pe()){if(!t)return new URL(o).toString();if(Q(t))return new URL(t).toString();let e=Pe[t.toLowerCase()];if(e){let n=new URL(o),r=K(n.pathname);return n.pathname=`${r}${e}`,n.toString()}return Ie(t)?Ue(t,o):ke(t,o)}function ue(t,o){let e=t?.url||t?.origin||o;try{let n=new URL(e);return n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("inspectOpen"),n.toString()}catch{return o}}async function Be(t,o,e){let n=new URL(await L(t,o));return n.searchParams.set("inspectOpen",e),n.toString()}async function Re(t,o,e,n={}){let r=n.attempts??30,i=n.intervalMs??500,s=n.minNodeCount??10;for(let a=0;a<r;a++){let l=w(t,{commandTimeoutMs:o,simId:e,simIdSource:"flag"});try{let m=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof m=="number"&&m>s)return{bridge:l,count:m}}catch{}l.close(),await I(i)}return null}function _e(t){if(!t)return null;try{let o=new URL(t);if(o.searchParams.has("bundle")){let e=o.searchParams.get("bundle")||"";try{let n=new URL(e),r=n.pathname.length>36?`...${n.pathname.slice(-36)}`:n.pathname;return`bundle ${n.host}${r}`}catch{return"bundle"}}return o.searchParams.has("port")?`connect :${o.searchParams.get("port")||""}`:o.searchParams.has("open")?`connect ${o.searchParams.get("open")||""}`:o.searchParams.has("demo")?`demo ${o.searchParams.get("demo")||"default"}`:o.pathname.includes("/sootsim/index.html")||o.pathname==="/sootsim/"||o.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function Oe(t,o){if(t.length===0){console.log(" no sims connected");return}console.log(` connected sims (${t.length}):
3
- `);for(let e of t){let n=e.lockedBy&&e.lockExpiresAt?`locked by ${e.lockedBy} (${Math.max(0,Math.round((e.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[e.isPrimary?"primary":"",e.id===o?"selected":"",e.readyState,e.attachedCliCount&&e.attachedCliCount>0?"in use":"",e.userFocused?"focused":"",n].filter(Boolean);console.log(` ${e.id}${r.length?` [${r.join(", ")}]`:""}`);let i=_e(e.url);if(i&&console.log(` loaded: ${i}`),e.url?console.log(` url: ${e.url}`):e.origin&&console.log(` origin: ${e.origin}`),e.title&&console.log(` title: ${e.title}`),console.log(` connected: ${new Date(e.connectedAt).toISOString()}`),e.lastActiveAt&&e.lastActiveAt>0){let s=Math.round((Date.now()-e.lastActiveAt)/1e3),a=s<60?`${s}s ago`:s<3600?`${Math.round(s/60)}m ago`:`${Math.round(s/3600)}h ago`;console.log(` last active: ${a}`)}}}async function E(t,o,e,n={}){let r=n.attempts??30,i=n.intervalMs??500;for(let s=0;s<r;s++){let a=w(t,{commandTimeoutMs:o});try{let m=(await a.listSims()).find(e);if(m)return m}catch{}finally{a.close()}await I(i)}return null}async function Ee(t,o,e,n={}){let r=n.attempts??20,i=n.intervalMs??250;for(let s=0;s<r;s++){let a=w(t,{commandTimeoutMs:o});try{let m=(await a.listSims()).find(b=>b.id===e);if(!m||m.readyState!=="open")return!0}catch{return!0}finally{a.close()}await I(i)}return!1}function D(t,o){if(o){let r=o.trim(),i=t.find(s=>s.id===r);if(!i)throw new Error(`no sim connected with id ${r}`);return i}let e=t.find(r=>r.isPrimary&&r.readyState==="open");if(e)return e;let n=t.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function P(t,o,e){console.log(` ${e==="current sim"?"loaded":"opened"}: ${t} [${e}]`),console.log(` current sim: ${o.id}`),console.log(JSON.stringify({simId:o.id,url:o.url},null,2))}async function k(t,o,e){if(e.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Le(t,o,{stableMs:150,maxMs:400});let r=w(t,{commandTimeoutMs:3e3,simId:o,cliLabel:"open --describe",simIdSource:"flag"});try{let s=`(async () => {
4
- const t = window.__sootsimTest
5
- const ms = window.SootSim?.bridges?.mainShell
6
- if (!t) return null
7
- let shell = null
8
- try { shell = ms?.getState ? await ms.getState() : null } catch {}
9
- const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
10
- return { tree, shell }
11
- })()`,a=await r.send({type:"evaluate",code:s});if(!a?.tree)return;if(console.log(""),a.shell?.state){let l=[`state=${a.shell.state}`,a.shell.activeApp?`app=${a.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${l.join(" ")}`)}console.log(a.tree)}finally{r.close()}}catch{}finally{n===void 0?delete process.env.SOOTSIM_QUIET_TARGET_NOTICE:process.env.SOOTSIM_QUIET_TARGET_NOTICE=n}}async function Le(t,o,e){let n=Date.now()+e.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",i=w(t,{commandTimeoutMs:2e3,simId:o,simIdSource:"flag"});try{let s=-1,a=0;for(;Date.now()<n;){let l=-1;try{let m=await i.send({type:"evaluate",code:r});typeof m=="number"&&(l=m)}catch{}if(l>=0&&l===s){if(Date.now()-a>=e.stableMs)return}else s=l,a=Date.now();await I(50)}}finally{i.close()}}async function ct(t,o={}){let e=$(t,{port:o.port,commandTimeoutMs:o.timeoutMs}),n=S(e);try{let r=await n.listSims();Oe(r,e.simId)}finally{n.close()}}async function lt(t,o={}){let e=$(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile"]}),n=t.find((c,d)=>t[d-1]==="--profile"),r=t.includes("--ephemeral");n&&r&&(console.error(" sootsim open: --profile cannot be combined with --ephemeral"),process.exit(1));let i=n?ie(n).id:void 0,s=!!i||r,a=t.includes("--new")||s,l=Te(t);a&&e.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let m=e.positional[0]||"",b=t.find((c,d)=>t[d-1]==="--driver")||"",he=t.includes("--headless"),v=t.find((c,d)=>t[d-1]==="--base-url")||pe(),V=t.includes("--base-url"),X=F();if(!a&&(e.simIdSource==="flag"||e.simIdSource==="saved"&&!!X)){let c=S(e),d=e.simId?` --sim ${e.simId}`:"",u=!1;try{let p=null;try{let h=await c.listSims();if(e.simIdSource==="saved"?(p=h.find(y=>y.id===X&&y.readyState==="open")??null,p||z()):p=D(h,e.simId),!p)if(e.simIdSource==="saved")u=!0;else throw new Error("no sim connected");if(!u&&p){let y=V||Q(m)?v:ue(p,v),T=await L(m,R(y,l));c.send({type:"evaluate",simId:p.id,code:`window.location.href = ${JSON.stringify(T)}`}).catch(()=>{})}}catch(h){console.error(` open failed: ${h instanceof Error?h.message:String(h)}`),await B(c,{errorsCommand:`sootsim get errors 5${d}`,warningsCommand:`sootsim get warnings 5${d}`,requestsCommand:`sootsim get requests 5${d}`}),process.exit(1)}if(!u&&p){await I(1500);let h=await Re(e.wsPort,e.commandTimeoutMs,p.id);h||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),h.bridge.close(),g(p.id);let y=V||Q(m)?v:ue(p,v),T=await L(m,R(y,l));P(T,{...p,url:T},"current sim"),await k(e.wsPort,p.id,t);return}}finally{c.close()}}let Y=R(v,l),ge=await L(m,Y),Z=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,f=await Be(m,Y,Z),A={newWindow:!0},U=c=>c.url?.includes(`inspectOpen=${Z}`)??!1;if(b){let c=ae(b);c||(console.error(` unknown driver "${b}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let d=await c.launch({url:f,headless:he,newWindow:A.newWindow,profileId:i,ephemeralProfile:r});d.launched||(console.error(` ${c.name} driver: ${d.message}`),process.exit(1));let u=await E(e.wsPort,e.commandTimeoutMs,U,{attempts:60,intervalMs:500});u||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(u.id),P(f,u,`${c.name} driver`),await k(e.wsPort,u.id,t);return}if(s){let c=C();c||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await j(f,c,{profileId:i,ephemeralProfile:r})).launched||(console.error(" desktop companion failed to start"),process.exit(1))}catch(u){console.error(` desktop companion failed: ${u instanceof Error?u.message:String(u)}`),process.exit(1)}let d=await E(e.wsPort,e.commandTimeoutMs,U,{attempts:40,intervalMs:500});d||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),g(d.id),P(f,d,"desktop companion"),await k(e.wsPort,d.id,t);return}let N=!1,H=!1;try{let c=w(e.wsPort,{commandTimeoutMs:2e3});try{await c.listSims(),N=!0}finally{c.close()}}catch{}if(N)try{let c=w(e.wsPort,{commandTimeoutMs:3e3});try{await c.openUrl(f,A),H=!0}finally{c.close()}}catch{}if(!H){let c=C();if(c)try{if((await j(f,c)).launched){let u=await E(e.wsPort,e.commandTimeoutMs,U,{attempts:20,intervalMs:500});if(u){g(u.id),P(f,u,"desktop companion"),await k(e.wsPort,u.id,t);return}}}catch{}if(await ne(f,A),!N){console.log(` opened: ${ge}`),de(e.wsPort);return}}let M=await E(e.wsPort,e.commandTimeoutMs,U,{attempts:30,intervalMs:500});M||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(M.id),P(f,M,H?"bridge":"direct shell open"),await k(e.wsPort,M.id,t)}async function fe(t,o={}){let e=$(t,{port:o.port,commandTimeoutMs:o.timeoutMs}),n=S(e),r=e.simId?` --sim ${e.simId}`:"";try{try{let i=await n.listSims(),s=D(i,e.positional[0]||e.simId);await n.focusSim(s.id),g(s.id),console.log(` using: ${s.id}`)}catch(i){console.error(` use failed: ${i instanceof Error?i.message:String(i)}`),await B(n,{errorsCommand:`sootsim get errors 5${r}`,warningsCommand:`sootsim get warnings 5${r}`,requestsCommand:`sootsim get requests 5${r}`}),process.exit(1)}}finally{n.close()}}async function mt(t,o={}){await fe(t,o)}async function dt(t,o={}){await fe(t,o)}async function ut(t,o={}){let e=$(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=t.includes("--force"),r=S(e);try{try{let i=await r.listSims(),s=D(i,e.positional[0]||e.simId),a=n&&s.lockedBy&&s.lockedByKind!=="user-active"?s.lockedBy:null,l=await r.claim(s.id,{force:n});g(s.id);let m=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),b=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${m}s]${b}`),a&&console.log(` took over from: ${a}`)}catch(i){if(i instanceof re){let s=Math.max(0,Math.round(i.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${i.lock.by} for ${s}s more`),console.error(" use --force to take it, or `sootsim open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}}finally{r.close()}}async function pt(t,o={}){let e=$(t,{port:o.port,commandTimeoutMs:o.timeoutMs}),n=S(e),r=e.simId?` --sim ${e.simId}`:"";try{try{let i=await n.listSims(),s=D(i,e.positional[0]||e.simId),a=i.find(m=>m.id!==s.id&&m.readyState==="open");if(await n.closeSim(s.id),!await Ee(e.wsPort,e.commandTimeoutMs,s.id)){console.log(` close requested: ${s.id} (still connected)`);return}F()===s.id&&(a?g(a.id):z()),console.log(` closed: ${s.id}`)}catch(i){console.error(` close failed: ${i instanceof Error?i.message:String(i)}`),await B(n,{errorsCommand:`sootsim get errors 5${r}`,warningsCommand:`sootsim get warnings 5${r}`,requestsCommand:`sootsim get requests 5${r}`}),process.exit(1)}}finally{n.close()}}export{qe as a,je as b,at as c,pe as d,L as e,Be as f,_e as g,Oe as h,E as i,ct as j,lt as k,mt as l,dt as m,ut as n,pt as o};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var i="sootsimConfig";function e(n){return!!n&&Object.keys(n).length>0}function s(n){return n?e(n.modules)||e(n.turboModules)||e(n.nativeModules)||e(n.env)||e(n.settings)||e(n.initialState):!1}function u(n,o){let t=new URL(n);return s(o)?t.searchParams.set(i,JSON.stringify(o)):t.searchParams.delete(i),t.toString()}var g="/node_modules/one/metro-entry.bundle?platform=ios&dev=true&minify=false",l="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function r(n){return/^https?:\/\//i.test(n)}function a(n){return n.endsWith(".bundle")}function S(n){try{let o=r(n),t=new URL(n,"http://soot.local");return t.pathname=t.pathname.replace(/\.\.bundle$/,".bundle"),a(t.pathname)?(t.searchParams.delete("transform.bytecode"),o?t.toString():`${t.pathname}${t.search}${t.hash}`):n}catch{return n}}export{u as a,g as b,l as c,S as d};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,5 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as C,d as x}from"./chunk-QWKO62QM.js";import{a as y}from"./chunk-QD7YIVPS.js";import{exec as D}from"child_process";import _ from"http";import k from"net";import{promisify as E}from"util";var v=E(D),U=250,T=120;function A(e,o=T){return new Promise(s=>{let n=new k.Socket,r=!1,i=c=>{r||(r=!0,n.destroy(),s(c))};n.setTimeout(o),n.once("connect",()=>i(!0)),n.once("timeout",()=>i(!1)),n.once("error",()=>i(!1)),n.connect(e,"localhost")})}function m(e,o,s="GET",n=U,r={}){return new Promise(i=>{let c=_.request({hostname:"localhost",port:e,path:o,method:s,timeout:n,headers:r},t=>{let a="";t.on("data",l=>a+=l.toString()),t.on("end",()=>i({statusCode:t.statusCode||0,body:a}))});c.on("error",()=>i(null)),c.setTimeout(n,()=>{c.destroy(),i(null)}),c.end()})}var M=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function S(e,o){return!(e<=0||e>=2e4||o.has(e)||e>=5170&&e<=5200)}async function N(e=[]){let o=new Set(e);try{let{stdout:s}=await v("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(s.trim()){let n=new Map;for(let r of s.trim().split(`
3
- `)){let i=r.trim().split(/\s+/);if(i.length<9)continue;let c=Number(i[1]),a=i[8].match(/:(\d+)$/);if(!a)continue;let l=Number(a[1]);S(l,o)&&(n.has(l)||n.set(l,c))}if(n.size>0)return[...n.entries()].map(([r,i])=>({port:r,pid:i}))}}catch{}try{let{stdout:s}=await v(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(s.trim()){let n=new Map;for(let r of s.trim().split(`
4
- `)){let i=r.match(/:(\d+)\s/),c=r.match(/pid=(\d+)/);if(!i)continue;let t=Number(i[1]),a=c?Number(c[1]):0;S(t,o)&&(n.has(t)||n.set(t,a))}if(n.size>0)return[...n.entries()].map(([r,i])=>({port:r,pid:i}))}}catch{}return M.filter(s=>S(s.port,o))}var w=new Map;async function R(e){if(e<=0)return null;let o=w.get(e);if(o)return o;try{let{stdout:s}=await v(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let n of s.split(`
5
- `))if(n.startsWith("n")&&n.length>1){let r=n.slice(1).trim();if(r)return w.set(e,r),r}}catch{}return null}function $(e,o){return{port:e,framework:o,bundleUrl:f(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function f(e,o){let s=y.find(r=>r.preferredPort===e),n=s?.runtimeConfig?C(o,s.runtimeConfig):o;return x(n)}function L(e){return e.includes("/node_modules/one/metro-entry.bundle")}function h(e,o,s){if(!o)return e;try{let n=JSON.parse(o.body),r=n?.extra?.expoClient||n?.extra||{};r.name&&(e.projectName=r.name),r.ios?.bundleIdentifier&&(e.bundleId=r.ios.bundleIdentifier),e.framework==="metro"&&r.sdkVersion&&(e.framework="expo");let i=n?.launchAsset?.url;i&&!e.patched&&!L(e.bundleUrl)&&(e.bundleUrl=f(e.port,i));let c=r.iconUrl||r.ios?.iconUrl||r.icon||r.ios?.icon;if(c)if(e.iconPath=c,s)if(c.startsWith("http"))e.iconUrl=s(c);else{let t=c.replace(/^\.\//,"");e.iconUrl=s(`http://localhost:${e.port}/assets/${t}`)}else e.iconUrl=c.startsWith("http")?c:`http://localhost:${e.port}/assets/${c.replace(/^\.\//,"")}`}catch{}return e}var u=new Set,d=new Set,p=new Set;async function I(e,o){if(!await A(e))return null;let s="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[n,r,i,c,t]=await Promise.all([u.has(e)?Promise.resolve(null):m(e,"/__soot/"),m(e,"/status"),m(e,s,"HEAD"),p.has(e)?Promise.resolve(null):m(e,"/","GET",U,{"expo-platform":"ios"}),d.has(e)?Promise.resolve(null):m(e,"/_expo/status")]);if(t&&t.statusCode===200?d.delete(e):d.has(e)||d.add(e),i&&i.statusCode>0&&i.statusCode<400)return u.add(e),p.add(e),h({port:e,framework:"one",bundleUrl:f(e,`http://localhost:${e}${s}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},c,o);if(r&&r.body.includes("packager-status:running"))return u.add(e),h($(e,t&&t.statusCode===200?"expo":"metro"),c,o);if(c)try{let a=JSON.parse(c.body);if((a?.extra?.expoClient||{}).name){let g=a?.launchAsset?.url||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`;return u.add(e),h({port:e,framework:"one",bundleUrl:f(e,g),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},c,o)}}catch{}return n&&n.statusCode===200&&n.body.includes("sootsim-patched")?(u.delete(e),h({port:e,framework:"one",bundleUrl:f(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},c,o)):(u.add(e),null)}function O(e){let o=e.projectName?.trim().toLowerCase();return!!(o==="soot"||o==="sootsim"||e.bundleId?.trim().toLowerCase()?.startsWith("dev.soot"))}var b=new Map,H=3e4,B=1500;function G(e){return!e||e.framework==="metro"||e.framework==="unknown"}function W(e){return e?f(e.port,e.bundleUrl)===e.bundleUrl:!0}function j(e,o,s=Date.now()){if(o===0||e.pid!==o||!W(e.result))return!1;let n=s-e.cachedAt;return!(e.result===null&&n>=H||G(e.result)&&n>=B)}async function X(e={}){let o=await N(e.excludePorts),s=new Set(o.map(t=>t.port));for(let t of[...b.keys()])s.has(t)||b.delete(t);for(let t of[...u])s.has(t)||u.delete(t);for(let t of[...d])s.has(t)||d.delete(t);for(let t of[...p])s.has(t)||p.delete(t);let n=[],r=[];for(let{port:t,pid:a}of o){let l=b.get(t);if(l&&j(l,a)){l.result&&n.push(l.result);continue}l&&l.pid!==a&&(u.delete(t),d.delete(t),p.delete(t)),r.push({port:t,pid:a})}r.length>0&&(await Promise.all(r.map(a=>I(a.port,e.buildIconProxyUrl)))).forEach((a,l)=>{let{port:g,pid:P}=r[l];P!==0&&b.set(g,{pid:P,result:a,cachedAt:Date.now()}),a&&n.push(a)});let i=new Map;for(let{port:t,pid:a}of o)a>0&&i.set(t,a);await Promise.all(n.map(async t=>{let a=i.get(t.port);if(!a)return;t.pid=a;let l=await R(a);l&&(t.cwd=l)}));let c=new Set(i.values());for(let t of[...w.keys()])c.has(t)||w.delete(t);return n.filter(t=>!O(t))}export{X as a};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m}from"./chunk-2ZPJHSIJ.js";import"./chunk-QWKO62QM.js";import"./chunk-Z5X3PITK.js";import"./chunk-HYYMBXIX.js";import"./chunk-YFXTO4QX.js";import"./chunk-WLIVBPPY.js";import"./chunk-JMU5IGIU.js";import"./chunk-4OHVCGMF.js";import"./chunk-4IO3D5XG.js";import"./chunk-ZERYEI3L.js";import"./chunk-PERKPZ7T.js";import"./chunk-ERLA3F77.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";export{d as buildOpenUrl,c as buildShellUrl,f as printConnectedSims,a as resolveBundleTarget,b as resolveDefaultShellBaseUrl,l as runClaimCommand,m as runCloseCommand,k as runFocusCommand,h as runListCommand,i as runOpenCommand,j as runUseCommand,e as summarizeSimUrl,g as waitForSimMatch};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-QD7YIVPS.js";import"./chunk-B3RAGRK6.js";export{a as APPS};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-KA5JJCWL.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-HYYMBXIX.js";import"./chunk-YFXTO4QX.js";import"./chunk-WLIVBPPY.js";import"./chunk-JMU5IGIU.js";import"./chunk-4IO3D5XG.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.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.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-L4F4JRKJ.js";import"./chunk-ZBOIGEGO.js";import"./chunk-WHLHA5R5.js";import"./chunk-SK4SOISL.js";import"./chunk-RLNIKWFO.js";import"./chunk-DSTV2VJT.js";import"./chunk-2ZPJHSIJ.js";import"./chunk-QWKO62QM.js";import"./chunk-Z5X3PITK.js";import"./chunk-HYYMBXIX.js";import"./chunk-YFXTO4QX.js";import"./chunk-WLIVBPPY.js";import"./chunk-QD7YIVPS.js";import"./chunk-5FLDI6CV.js";import"./chunk-CX3ZIPD3.js";import"./chunk-JMU5IGIU.js";import"./chunk-Z5SVSAZO.js";import"./chunk-4OHVCGMF.js";import"./chunk-RX6RHGSI.js";import"./chunk-56BIMCDH.js";import"./chunk-S74RCIVB.js";import"./chunk-WFXYY3DU.js";import"./chunk-4IO3D5XG.js";import"./chunk-ZERYEI3L.js";import"./chunk-PERKPZ7T.js";import"./chunk-ERLA3F77.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";export{b as discoverSootsimUrl,a as parseFlowFile,d as runFlow,c as runFlowPlayback};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as o}from"./chunk-BGAPLYMS.js";import"./chunk-QXMZNJV5.js";import"./chunk-H2HSOHXN.js";import"./chunk-S74RCIVB.js";import"./chunk-WFXYY3DU.js";import"./chunk-ZERYEI3L.js";import"./chunk-PERKPZ7T.js";import"./chunk-ERLA3F77.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";async function t(n){console.error(" note: `sootsim install` is now `sootsim setup-repo`. forwarding\u2026\n"),await o(n)}export{t as runInstall};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-BGAPLYMS.js";import"./chunk-QXMZNJV5.js";import"./chunk-H2HSOHXN.js";import"./chunk-S74RCIVB.js";import"./chunk-WFXYY3DU.js";import"./chunk-ZERYEI3L.js";import"./chunk-PERKPZ7T.js";import"./chunk-ERLA3F77.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";export{a as runSetupRepo};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-RX6RHGSI.js";import"./chunk-56BIMCDH.js";import"./chunk-B3RAGRK6.js";export{a as settingsStore};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-S74RCIVB.js";import"./chunk-WFXYY3DU.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";export{b as flushCliTelemetry,a as trackCliEvent};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.37 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-5FLDI6CV.js";import"./chunk-CX3ZIPD3.js";import"./chunk-JMU5IGIU.js";import"./chunk-S74RCIVB.js";import"./chunk-WFXYY3DU.js";import"./chunk-4IO3D5XG.js";import"./chunk-ZERYEI3L.js";import"./chunk-PERKPZ7T.js";import"./chunk-ERLA3F77.js";import"./chunk-PN6FWLD4.js";import"./chunk-B3RAGRK6.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};