sootsim 0.1.302 → 0.1.304

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 (159) hide show
  1. package/dist-cli/bin.js +5 -5
  2. package/dist-cli/chunks/{agent-QM5DJK6B.js → agent-EK355OQM.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-HDOQKZ2C.js → agent-wrapper-LCJJWHZE.js} +2 -2
  4. package/dist-cli/chunks/app-fonts-LIPU2DLT.js +4 -0
  5. package/dist-cli/chunks/{assert-URPY7JOQ.js → assert-OASKCPBX.js} +2 -2
  6. package/dist-cli/chunks/{auth-LDIGTG4T.js → auth-XYYKD33F.js} +2 -2
  7. package/dist-cli/chunks/{beta-7X7SMIUJ.js → beta-TOL55XPM.js} +2 -2
  8. package/dist-cli/chunks/{camera-44FBN2AD.js → camera-PHKVEQHR.js} +2 -2
  9. package/dist-cli/chunks/{chunk-47FKMZKZ.js → chunk-2MEUZOSD.js} +1 -1
  10. package/dist-cli/chunks/{chunk-N53HDXGW.js → chunk-2RLFUM3C.js} +8 -8
  11. package/dist-cli/chunks/{chunk-YY54A626.js → chunk-3UUHIHA6.js} +2 -2
  12. package/dist-cli/chunks/{chunk-QNA5RNYZ.js → chunk-5NJTX5OP.js} +2 -2
  13. package/dist-cli/chunks/{chunk-YY27LKQF.js → chunk-76OLOD2G.js} +2 -2
  14. package/dist-cli/chunks/{chunk-UEFW7TPW.js → chunk-7RFXZXKH.js} +1 -1
  15. package/dist-cli/chunks/{chunk-2BQCOQBK.js → chunk-A4UYZTV7.js} +2 -2
  16. package/dist-cli/chunks/{chunk-T3UJXMFJ.js → chunk-ABHNOM2C.js} +1 -1
  17. package/dist-cli/chunks/{chunk-PDB5OX3V.js → chunk-AJYA6R3N.js} +2 -2
  18. package/dist-cli/chunks/{chunk-TWOBAP7S.js → chunk-BJOT2LL6.js} +2 -2
  19. package/dist-cli/chunks/{chunk-UNDGU5PA.js → chunk-BPRMA4IC.js} +2 -2
  20. package/dist-cli/chunks/{chunk-QN5DSQNG.js → chunk-CMYVGJBQ.js} +1 -1
  21. package/dist-cli/chunks/{chunk-ZORZTTQL.js → chunk-ENXLKDQ6.js} +3 -3
  22. package/dist-cli/chunks/{chunk-WQWYWERD.js → chunk-EXW6TH3O.js} +2 -2
  23. package/dist-cli/chunks/{chunk-QOS3GSOM.js → chunk-FNI75AD7.js} +1 -1
  24. package/dist-cli/chunks/{chunk-KNBZZC7R.js → chunk-G4R7CPCY.js} +2 -2
  25. package/dist-cli/chunks/{chunk-XLAZCK5H.js → chunk-GF3LDVWF.js} +2 -2
  26. package/dist-cli/chunks/{chunk-ZADSXYX7.js → chunk-GMILMS7P.js} +2 -2
  27. package/dist-cli/chunks/{chunk-IJKBAKAA.js → chunk-HFA5ZACE.js} +21 -10
  28. package/dist-cli/chunks/{chunk-XRRW4YFF.js → chunk-HFKQUS4I.js} +3 -3
  29. package/dist-cli/chunks/{chunk-SMBMOSXY.js → chunk-INBBOCU4.js} +2 -2
  30. package/dist-cli/chunks/chunk-ITDTSNN2.js +4 -0
  31. package/dist-cli/chunks/{chunk-ZQLQVJUB.js → chunk-IWRRIQDJ.js} +2 -2
  32. package/dist-cli/chunks/{chunk-7F57RUPB.js → chunk-JDKWIB6V.js} +1 -1
  33. package/dist-cli/chunks/{chunk-XKUUILJ2.js → chunk-LRXSLMX4.js} +1 -1
  34. package/dist-cli/chunks/{chunk-H7J7U34H.js → chunk-M3ETYVNL.js} +1 -1
  35. package/dist-cli/chunks/{chunk-2AD7UVSQ.js → chunk-MSYPDBFG.js} +2 -2
  36. package/dist-cli/chunks/{chunk-LLCCT4VC.js → chunk-NXYKNKNL.js} +2 -2
  37. package/dist-cli/chunks/{chunk-NFC3BJMX.js → chunk-OSH6526H.js} +1 -1
  38. package/dist-cli/chunks/{chunk-HFHHYL3K.js → chunk-QWQHSUZC.js} +2 -2
  39. package/dist-cli/chunks/chunk-RJWQ3VAD.js +14 -0
  40. package/dist-cli/chunks/{chunk-VEOPRCNX.js → chunk-RQJDIDJ3.js} +1 -1
  41. package/dist-cli/chunks/{chunk-FNJ2IEDC.js → chunk-RT7TUHH7.js} +2 -2
  42. package/dist-cli/chunks/{chunk-W6XC5TUY.js → chunk-RYQUO6LT.js} +1 -1
  43. package/dist-cli/chunks/{chunk-N7ATA44P.js → chunk-SN6ARNCL.js} +2 -2
  44. package/dist-cli/chunks/{chunk-BJDIJYWM.js → chunk-SVFN66PF.js} +2 -2
  45. package/dist-cli/chunks/{chunk-5CWTAN4D.js → chunk-UB3OWUVK.js} +1 -1
  46. package/dist-cli/chunks/{chunk-D4BPRTTD.js → chunk-V6JDDX4B.js} +2 -2
  47. package/dist-cli/chunks/{chunk-RZLCDDE2.js → chunk-VUR5QXVX.js} +2 -2
  48. package/dist-cli/chunks/{chunk-BVUQ2PVZ.js → chunk-W3CSYOSQ.js} +1 -1
  49. package/dist-cli/chunks/{chunk-7UIDSSWQ.js → chunk-WNDYTKLC.js} +1 -1
  50. package/dist-cli/chunks/{chunk-2ELPPBLQ.js → chunk-XCVSB47R.js} +2 -2
  51. package/dist-cli/chunks/{chunk-C36FJ7OB.js → chunk-XHYSASAX.js} +1 -1
  52. package/dist-cli/chunks/{chunk-HNYGEEPF.js → chunk-XXS4TCOO.js} +3 -3
  53. package/dist-cli/chunks/{chunk-OOP74SPV.js → chunk-Y5YM7XHU.js} +1 -1
  54. package/dist-cli/chunks/{chunk-UJ7P2CWC.js → chunk-YAV6BH3A.js} +2 -2
  55. package/dist-cli/chunks/{chunk-AHPEOPNQ.js → chunk-YXHO2OUL.js} +1 -1
  56. package/dist-cli/chunks/chunk-ZDRI2LUG.js +125 -0
  57. package/dist-cli/chunks/{chunk-REJQMXOG.js → chunk-ZONISYZ5.js} +1 -1
  58. package/dist-cli/chunks/{cleanup-QTLASIO7.js → cleanup-GCTEGJMP.js} +2 -2
  59. package/dist-cli/chunks/{cli-version-EUG2MGT7.js → cli-version-G72HUH4E.js} +2 -2
  60. package/dist-cli/chunks/{compat-DA2Z6HOU.js → compat-IC4JHGBH.js} +2 -2
  61. package/dist-cli/chunks/{config-U65JAS2W.js → config-C65MZFU3.js} +2 -2
  62. package/dist-cli/chunks/{control-ZCFRXISU.js → control-RWLYBKQR.js} +2 -2
  63. package/dist-cli/chunks/daemon-D77E5G6Z.js +4 -0
  64. package/dist-cli/chunks/{debug-OXP67EDF.js → debug-LEL32PDN.js} +3 -3
  65. package/dist-cli/chunks/{desktop-ZEQXNFI2.js → desktop-RDSISJH2.js} +3 -3
  66. package/dist-cli/chunks/{detox-M4JBLH5P.js → detox-SCCWUIKK.js} +2 -2
  67. package/dist-cli/chunks/{device-ISL5YP5C.js → device-MTDEKDUK.js} +2 -2
  68. package/dist-cli/chunks/{diagnose-H2TRXSVS.js → diagnose-UZJCKLPZ.js} +2 -2
  69. package/dist-cli/chunks/disk-cleanup-HLWRVTVW.js +4 -0
  70. package/dist-cli/chunks/drivers-Q7GMKTBM.js +4 -0
  71. package/dist-cli/chunks/{film-LKYPZOJD.js → film-YBE544PG.js} +3 -3
  72. package/dist-cli/chunks/flow-5VOVAVZN.js +4 -0
  73. package/dist-cli/chunks/help-2PESJ7V2.js +4 -0
  74. package/dist-cli/chunks/{hidden-runtime-alias-JMWSVMJD.js → hidden-runtime-alias-KJYCJLSR.js} +2 -2
  75. package/dist-cli/chunks/{home-paths-S66AEW3L.js → home-paths-NSHWNEGK.js} +2 -2
  76. package/dist-cli/chunks/inspect-OIA3Q5MD.js +4 -0
  77. package/dist-cli/chunks/install-desktop-7KLACQUW.js +4 -0
  78. package/dist-cli/chunks/{login-EJEEYZGB.js → login-AEVUU72R.js} +4 -4
  79. package/dist-cli/chunks/{logout-QCEW2MME.js → logout-72XHF6J2.js} +2 -2
  80. package/dist-cli/chunks/{maestro-4IKBKIUF.js → maestro-OXSKQJ6B.js} +3 -3
  81. package/dist-cli/chunks/{maestro-generate-WSYSKMND.js → maestro-generate-AKZFORVJ.js} +3 -3
  82. package/dist-cli/chunks/{mode-KQ5VDMPP.js → mode-U6KRG2PE.js} +2 -2
  83. package/dist-cli/chunks/{optional-demo-registry-MMHEMCBJ.js → optional-demo-registry-L3VIWBI2.js} +2 -2
  84. package/dist-cli/chunks/{perf-LGZDBRUM.js → perf-KF2BJZIN.js} +2 -2
  85. package/dist-cli/chunks/{permissions-DA4JXY2N.js → permissions-TRJG4QAI.js} +2 -2
  86. package/dist-cli/chunks/{record-TPU2TOEU.js → record-TICJYZOA.js} +3 -3
  87. package/dist-cli/chunks/{report-issue-PPUNSEEQ.js → report-issue-OQPLBQMJ.js} +2 -2
  88. package/dist-cli/chunks/runtime-HDMLWNXW.js +4 -0
  89. package/dist-cli/chunks/screenshot-command-XLERKHVW.js +159 -0
  90. package/dist-cli/chunks/{screenshots-capture-AG2TIYLG.js → screenshots-capture-B6OORSD4.js} +2 -2
  91. package/dist-cli/chunks/{serve-C3WLV2OX.js → serve-5M7MIPWF.js} +2 -2
  92. package/dist-cli/chunks/{setup-4KZKLDZV.js → setup-HJZDC4PK.js} +2 -2
  93. package/dist-cli/chunks/{skills-65XCNSNM.js → skills-RXHLMGGL.js} +2 -2
  94. package/dist-cli/chunks/{storage-ADWG4UT7.js → storage-MMPD2XBS.js} +2 -2
  95. package/dist-cli/chunks/store-APKY72ZY.js +4 -0
  96. package/dist-cli/chunks/telemetry-W3YRHE67.js +4 -0
  97. package/dist-cli/chunks/{timeline-BRHYLQTW.js → timeline-6PF5BZ37.js} +2 -2
  98. package/dist-cli/chunks/{upgrade-AEJNAP6O.js → upgrade-QSMIK3RC.js} +2 -2
  99. package/dist-cli/chunks/upload-HQEOYILQ.js +4 -0
  100. package/dist-cli/chunks/{version-HZWBK4KJ.js → version-WLTFXEDC.js} +2 -2
  101. package/dist-cli/chunks/{web-LCSSJCZ4.js → web-DI73LQ7N.js} +2 -2
  102. package/dist-cli/chunks/{what-happened-GWA24LHG.js → what-happened-4SAMGZWR.js} +2 -2
  103. package/dist-lib/agent-daemon-client.cjs +1 -1
  104. package/dist-lib/agent-events.cjs +1 -1
  105. package/dist-lib/agent-identity.cjs +1 -1
  106. package/dist-lib/agent-sessions.cjs +1 -1
  107. package/dist-lib/attached-projects.cjs +1 -1
  108. package/dist-lib/auth/shared-session.cjs +1 -1
  109. package/dist-lib/backend-origin.cjs +1 -1
  110. package/dist-lib/beta.cjs +1 -1
  111. package/dist-lib/beta.mjs +1 -1
  112. package/dist-lib/bridge-constants.cjs +1 -1
  113. package/dist-lib/cli-constants.cjs +1 -1
  114. package/dist-lib/config.cjs +1 -1
  115. package/dist-lib/detox/index.cjs +1 -1
  116. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  117. package/dist-lib/home-paths.cjs +1 -1
  118. package/dist-lib/host/bridge-host.cjs +17 -8
  119. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  120. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  121. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  122. package/dist-lib/host/websocket-proxy.cjs +1 -1
  123. package/dist-lib/index.cjs +1 -1
  124. package/dist-lib/jump-to-source-babel.cjs +1 -1
  125. package/dist-lib/menu.cjs +1 -1
  126. package/dist-lib/menu.mjs +1 -1
  127. package/dist-lib/metro.cjs +1 -1
  128. package/dist-lib/profiles.cjs +1 -1
  129. package/dist-lib/render-mode.cjs +1 -1
  130. package/dist-lib/scripts/dev-server-scanner.cjs +58 -3
  131. package/dist-lib/sdk.cjs +18 -6
  132. package/dist-lib/sdk.mjs +18 -6
  133. package/dist-lib/skills.cjs +26 -12
  134. package/dist-lib/vite.cjs +1 -1
  135. package/package.json +2 -2
  136. package/scripts/dev-server-scanner.ts +95 -9
  137. package/skills/sootsim-debug/SKILL.md +6 -0
  138. package/skills/sootsim-setup/SKILL.md +38 -0
  139. package/src/attached-projects.ts +2 -2
  140. package/src/host/bridge-host.ts +2 -2
  141. package/src/runtime-assets.ts +1 -1
  142. package/src/runtime-delivery.ts +1 -1
  143. package/src/vite-plugin.ts +1 -1
  144. package/dist-cli/chunks/app-fonts-VPJDIM5M.js +0 -4
  145. package/dist-cli/chunks/chunk-5TWYZNIF.js +0 -125
  146. package/dist-cli/chunks/chunk-GRMK3BZY.js +0 -4
  147. package/dist-cli/chunks/chunk-I4NP3TJR.js +0 -12
  148. package/dist-cli/chunks/daemon-S25HJFIG.js +0 -4
  149. package/dist-cli/chunks/disk-cleanup-DY6JAHH3.js +0 -4
  150. package/dist-cli/chunks/drivers-EE4LTPSZ.js +0 -4
  151. package/dist-cli/chunks/flow-WGICJ5KS.js +0 -4
  152. package/dist-cli/chunks/help-YQ63GAW6.js +0 -4
  153. package/dist-cli/chunks/inspect-VKVWW64M.js +0 -4
  154. package/dist-cli/chunks/install-desktop-CH27FTQI.js +0 -4
  155. package/dist-cli/chunks/runtime-7MZZR6SC.js +0 -4
  156. package/dist-cli/chunks/screenshot-command-2YSWGL4X.js +0 -156
  157. package/dist-cli/chunks/store-FEQIGIYH.js +0 -4
  158. package/dist-cli/chunks/telemetry-KBOJKIRS.js +0 -4
  159. package/dist-cli/chunks/upload-QKJRNNL3.js +0 -4
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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;
@@ -88,6 +88,7 @@ var import_ws2 = require("ws");
88
88
 
89
89
  // scripts/dev-server-scanner.ts
90
90
  var import_child_process = require("child_process");
91
+ var import_promises2 = require("fs/promises");
91
92
  var import_http = __toESM(require("http"), 1);
92
93
  var import_net = __toESM(require("net"), 1);
93
94
  var import_util = require("util");
@@ -599,9 +600,17 @@ async function resolveProcessCwd(pid) {
599
600
  const cached3 = cwdByPid.get(pid);
600
601
  if (cached3) return cached3;
601
602
  try {
602
- const { stdout } = await execP(`lsof -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
603
+ const cwd = await (0, import_promises2.readlink)(`/proc/${pid}/cwd`);
604
+ if (cwd) {
605
+ cwdByPid.set(pid, cwd);
606
+ return cwd;
607
+ }
608
+ } catch {
609
+ }
610
+ try {
611
+ const { stdout } = await execP(`lsof -b -w -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
603
612
  encoding: "utf8",
604
- timeout: 1500
613
+ timeout: 8e3
605
614
  });
606
615
  for (const line of stdout.split("\n")) {
607
616
  if (line.startsWith("n") && line.length > 1) {
@@ -1151,7 +1160,7 @@ var import_node_fs4 = __toESM(require("node:fs"), 1);
1151
1160
  var import_node_os2 = __toESM(require("node:os"), 1);
1152
1161
  var import_node_path4 = __toESM(require("node:path"), 1);
1153
1162
  var import_node_stream = require("node:stream");
1154
- var import_promises2 = require("node:stream/promises");
1163
+ var import_promises3 = require("node:stream/promises");
1155
1164
 
1156
1165
  // ../contrast-runtime-delivery/src/product.ts
1157
1166
  var import_node_fs3 = __toESM(require("node:fs"), 1);
@@ -1511,7 +1520,7 @@ async function downloadToFile(url, destPath) {
1511
1520
  import_node_fs4.default.mkdirSync(import_node_path4.default.dirname(destPath), { recursive: true });
1512
1521
  const tmp = `${destPath}.partial`;
1513
1522
  try {
1514
- await (0, import_promises2.pipeline)(
1523
+ await (0, import_promises3.pipeline)(
1515
1524
  import_node_stream.Readable.fromWeb(res.body),
1516
1525
  import_node_fs4.default.createWriteStream(tmp)
1517
1526
  );
@@ -2962,7 +2971,7 @@ function mapFrameworkToProjectFramework(fw) {
2962
2971
  // src/host/fetch-proxy-handler.ts
2963
2972
  var import_http2 = __toESM(require("http"), 1);
2964
2973
  var import_https = __toESM(require("https"), 1);
2965
- var import_promises3 = require("stream/promises");
2974
+ var import_promises4 = require("stream/promises");
2966
2975
 
2967
2976
  // src/backend-origin.ts
2968
2977
  function normalizeHostname(hostname) {
@@ -3174,7 +3183,7 @@ async function handleFetchProxyRequest(req, res) {
3174
3183
  const switchToGet = (status === 301 || status === 302) && method === "POST" || status === 303 && method !== "GET" && method !== "HEAD";
3175
3184
  const redirectUrl = new URL(location, targetUrl2);
3176
3185
  proxyRes.resume();
3177
- await (0, import_promises3.finished)(proxyRes);
3186
+ await (0, import_promises4.finished)(proxyRes);
3178
3187
  await proxy(
3179
3188
  redirectUrl,
3180
3189
  switchToGet ? "GET" : method,
@@ -3199,7 +3208,7 @@ async function handleFetchProxyRequest(req, res) {
3199
3208
  );
3200
3209
  }
3201
3210
  res.statusCode = status;
3202
- await (0, import_promises3.pipeline)(proxyRes, res);
3211
+ await (0, import_promises4.pipeline)(proxyRes, res);
3203
3212
  };
3204
3213
  try {
3205
3214
  await proxy(upstreamUrl, originalMethod, body, 0);
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/host/fetch-proxy-overrides.ts
4
4
  var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/menu.ts
4
4
  var SOOTSIM_ENGINE_EVENT_NAME = "sootsim:engine-event";
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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;
@@ -39,12 +39,15 @@ __export(dev_server_scanner_exports, {
39
39
  __shouldReuseScannerCacheEntry: () => __shouldReuseScannerCacheEntry,
40
40
  discoverListeningPorts: () => discoverListeningPorts,
41
41
  discoverListeningProcesses: () => discoverListeningProcesses,
42
+ pidFromNetstat: () => pidFromNetstat,
42
43
  probePort: () => probePort,
44
+ resolveListeningPid: () => resolveListeningPid,
43
45
  resolveProcessCwd: () => resolveProcessCwd,
44
46
  scanDevServers: () => scanDevServers
45
47
  });
46
48
  module.exports = __toCommonJS(dev_server_scanner_exports);
47
49
  var import_child_process = require("child_process");
50
+ var import_promises2 = require("fs/promises");
48
51
  var import_http = __toESM(require("http"), 1);
49
52
  var import_net = __toESM(require("net"), 1);
50
53
  var import_util = require("util");
@@ -576,15 +579,65 @@ async function discoverListeningPorts(excludePorts = []) {
576
579
  const processes = await discoverListeningProcesses(excludePorts);
577
580
  return processes.map((p) => p.port);
578
581
  }
582
+ function pidFromNetstat(stdout, port) {
583
+ for (const line of stdout.split("\n")) {
584
+ if (!line.includes("LISTEN")) continue;
585
+ const parts = line.trim().split(/\s+/);
586
+ if (!parts[3]?.endsWith(`.${port}`)) continue;
587
+ for (const token of parts) {
588
+ const owner = token.match(/^\S+:(\d+)$/);
589
+ if (owner) {
590
+ const pid = Number(owner[1]);
591
+ if (pid > 0) return pid;
592
+ }
593
+ }
594
+ }
595
+ return null;
596
+ }
597
+ async function resolveListeningPid(port) {
598
+ if (!Number.isInteger(port) || port <= 0) return null;
599
+ try {
600
+ const { stdout } = await execP("netstat -anv -p tcp 2>/dev/null", {
601
+ encoding: "utf8",
602
+ timeout: 8e3,
603
+ maxBuffer: 16 * 1024 * 1024
604
+ });
605
+ const pid = pidFromNetstat(stdout, port);
606
+ if (pid !== null) return pid;
607
+ } catch {
608
+ }
609
+ try {
610
+ const { stdout } = await execP(`ss -tlnp 2>/dev/null`, {
611
+ encoding: "utf8",
612
+ timeout: 8e3,
613
+ maxBuffer: 16 * 1024 * 1024
614
+ });
615
+ for (const line of stdout.split("\n")) {
616
+ if (!new RegExp(`:${port}\\s`).test(line)) continue;
617
+ const pid = Number(line.match(/pid=(\d+)/)?.[1]);
618
+ if (pid > 0) return pid;
619
+ }
620
+ } catch {
621
+ }
622
+ return null;
623
+ }
579
624
  var cwdByPid = /* @__PURE__ */ new Map();
580
625
  async function resolveProcessCwd(pid) {
581
626
  if (pid <= 0) return null;
582
627
  const cached2 = cwdByPid.get(pid);
583
628
  if (cached2) return cached2;
584
629
  try {
585
- const { stdout } = await execP(`lsof -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
630
+ const cwd = await (0, import_promises2.readlink)(`/proc/${pid}/cwd`);
631
+ if (cwd) {
632
+ cwdByPid.set(pid, cwd);
633
+ return cwd;
634
+ }
635
+ } catch {
636
+ }
637
+ try {
638
+ const { stdout } = await execP(`lsof -b -w -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
586
639
  encoding: "utf8",
587
- timeout: 1500
640
+ timeout: 8e3
588
641
  });
589
642
  for (const line of stdout.split("\n")) {
590
643
  if (line.startsWith("n") && line.length > 1) {
@@ -923,7 +976,9 @@ async function scanDevServers(opts = {}) {
923
976
  __shouldReuseScannerCacheEntry,
924
977
  discoverListeningPorts,
925
978
  discoverListeningProcesses,
979
+ pidFromNetstat,
926
980
  probePort,
981
+ resolveListeningPid,
927
982
  resolveProcessCwd,
928
983
  scanDevServers
929
984
  });
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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;
@@ -175,9 +175,14 @@ async function inspectDescribe(bridge, dumpOpts) {
175
175
  const body = escaped.replace(/\\*/g, '.*').replace(/\\?/g, '.')
176
176
  return new RegExp('^' + body + '$', 'i')
177
177
  }
178
- const truncate = (value, max) => {
178
+ // clipping a describe line is a DISPLAY decision. opts.fullText (set by
179
+ // \`describe --json\`) keeps the real string, so a bundle-eval stack or a
180
+ // red-box message reaches the caller whole instead of ending in an
181
+ // ellipsis nothing downstream can undo.
182
+ const clipForDisplay = (value, max) => {
179
183
  const text = typeof value === 'string' ? value.replace(/\\s+/g, ' ').trim() : ''
180
- return text.length > max ? text.slice(0, max - 1).trimEnd() + '\u2026' : text
184
+ if (opts.fullText || text.length <= max) return text
185
+ return text.slice(0, max - 1).trimEnd() + '\u2026'
181
186
  }
182
187
  const formatInspectableTree = async () => {
183
188
  if (typeof t.listInspectable !== 'function') return null
@@ -205,10 +210,12 @@ async function inspectDescribe(bridge, dumpOpts) {
205
210
  if (role) parts.push('[' + role + ']')
206
211
  else if (handlers.length > 0) parts.push('[tap]')
207
212
  else parts.push('<' + type + '>')
208
- const visibleText = truncate(text, 50)
213
+ const visibleText = clipForDisplay(text, 50)
209
214
  if (visibleText) parts.push(JSON.stringify(visibleText))
210
215
  if (testID) parts.push('#' + testID)
211
- if (label && label !== text) parts.push('label=' + JSON.stringify(truncate(label, 50)))
216
+ if (label && label !== text) {
217
+ parts.push('label=' + JSON.stringify(clipForDisplay(label, 50)))
218
+ }
212
219
  if (!opts.hideXy) {
213
220
  const abs = node?.absolute || {}
214
221
  const layout = node?.layout || {}
@@ -960,7 +967,11 @@ var WAIT_READY_PROBE = `(async () => {
960
967
  const suppressed = external.entryErrors.find((item) => isReal(item) && item.suppressed === true)
961
968
  if (suppressed) suppressedEntryError = suppressed.message
962
969
  }
963
- if (externalReady === false && externalStatus) loadingText = externalStatus
970
+ // once the app has errored its last status ("injecting sootsim
971
+ // modules...") is stale \u2014 reporting it makes a dead app read as one that
972
+ // is still booting.
973
+ if (externalError) loadingText = ''
974
+ else if (externalReady === false && externalStatus) loadingText = externalStatus
964
975
  } catch {}
965
976
  let errors = 0
966
977
  try { errors = window.__sootsimConsole?.count?.()?.errors ?? 0 } catch {}
@@ -1062,6 +1073,7 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
1062
1073
  };
1063
1074
  }
1064
1075
  }
1076
+ if (last.externalError) return status;
1065
1077
  if (options.onProgress && progressIntervalMs > 0 && now >= nextProgressAt) {
1066
1078
  options.onProgress(status);
1067
1079
  do {
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -83,9 +83,14 @@ async function inspectDescribe(bridge, dumpOpts) {
83
83
  const body = escaped.replace(/\\*/g, '.*').replace(/\\?/g, '.')
84
84
  return new RegExp('^' + body + '$', 'i')
85
85
  }
86
- const truncate = (value, max) => {
86
+ // clipping a describe line is a DISPLAY decision. opts.fullText (set by
87
+ // \`describe --json\`) keeps the real string, so a bundle-eval stack or a
88
+ // red-box message reaches the caller whole instead of ending in an
89
+ // ellipsis nothing downstream can undo.
90
+ const clipForDisplay = (value, max) => {
87
91
  const text = typeof value === 'string' ? value.replace(/\\s+/g, ' ').trim() : ''
88
- return text.length > max ? text.slice(0, max - 1).trimEnd() + '\u2026' : text
92
+ if (opts.fullText || text.length <= max) return text
93
+ return text.slice(0, max - 1).trimEnd() + '\u2026'
89
94
  }
90
95
  const formatInspectableTree = async () => {
91
96
  if (typeof t.listInspectable !== 'function') return null
@@ -113,10 +118,12 @@ async function inspectDescribe(bridge, dumpOpts) {
113
118
  if (role) parts.push('[' + role + ']')
114
119
  else if (handlers.length > 0) parts.push('[tap]')
115
120
  else parts.push('<' + type + '>')
116
- const visibleText = truncate(text, 50)
121
+ const visibleText = clipForDisplay(text, 50)
117
122
  if (visibleText) parts.push(JSON.stringify(visibleText))
118
123
  if (testID) parts.push('#' + testID)
119
- if (label && label !== text) parts.push('label=' + JSON.stringify(truncate(label, 50)))
124
+ if (label && label !== text) {
125
+ parts.push('label=' + JSON.stringify(clipForDisplay(label, 50)))
126
+ }
120
127
  if (!opts.hideXy) {
121
128
  const abs = node?.absolute || {}
122
129
  const layout = node?.layout || {}
@@ -868,7 +875,11 @@ var WAIT_READY_PROBE = `(async () => {
868
875
  const suppressed = external.entryErrors.find((item) => isReal(item) && item.suppressed === true)
869
876
  if (suppressed) suppressedEntryError = suppressed.message
870
877
  }
871
- if (externalReady === false && externalStatus) loadingText = externalStatus
878
+ // once the app has errored its last status ("injecting sootsim
879
+ // modules...") is stale \u2014 reporting it makes a dead app read as one that
880
+ // is still booting.
881
+ if (externalError) loadingText = ''
882
+ else if (externalReady === false && externalStatus) loadingText = externalStatus
872
883
  } catch {}
873
884
  let errors = 0
874
885
  try { errors = window.__sootsimConsole?.count?.()?.errors ?? 0 } catch {}
@@ -970,6 +981,7 @@ async function inspectWaitReady(bridge, timeoutMs = 2e4, options = {}) {
970
981
  };
971
982
  }
972
983
  }
984
+ if (last.externalError) return status;
973
985
  if (options.onProgress && progressIntervalMs > 0 && now >= nextProgressAt) {
974
986
  options.onProgress(status);
975
987
  do {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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;
@@ -11386,9 +11386,17 @@ async function resolveProcessCwd(pid) {
11386
11386
  const cached4 = cwdByPid.get(pid);
11387
11387
  if (cached4) return cached4;
11388
11388
  try {
11389
- const { stdout } = await execP(`lsof -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
11389
+ const cwd = await (0, import_promises2.readlink)(`/proc/${pid}/cwd`);
11390
+ if (cwd) {
11391
+ cwdByPid.set(pid, cwd);
11392
+ return cwd;
11393
+ }
11394
+ } catch {
11395
+ }
11396
+ try {
11397
+ const { stdout } = await execP(`lsof -b -w -p ${pid} -a -d cwd -Fn 2>/dev/null`, {
11390
11398
  encoding: "utf8",
11391
- timeout: 1500
11399
+ timeout: 8e3
11392
11400
  });
11393
11401
  for (const line of stdout.split("\n")) {
11394
11402
  if (line.startsWith("n") && line.length > 1) {
@@ -11695,11 +11703,12 @@ async function scanDevServers(opts = {}) {
11695
11703
  }
11696
11704
  return results.filter((r) => !isSootSimSelfServer(r));
11697
11705
  }
11698
- 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;
11706
+ var import_child_process, import_promises2, 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;
11699
11707
  var init_dev_server_scanner = __esm({
11700
11708
  "scripts/dev-server-scanner.ts"() {
11701
11709
  "use strict";
11702
11710
  import_child_process = require("child_process");
11711
+ import_promises2 = require("fs/promises");
11703
11712
  import_http = __toESM(require("http"), 1);
11704
11713
  import_net = __toESM(require("net"), 1);
11705
11714
  import_util = require("util");
@@ -12355,7 +12364,7 @@ async function downloadToFile(url, destPath) {
12355
12364
  import_node_fs4.default.mkdirSync(import_node_path4.default.dirname(destPath), { recursive: true });
12356
12365
  const tmp = `${destPath}.partial`;
12357
12366
  try {
12358
- await (0, import_promises2.pipeline)(
12367
+ await (0, import_promises3.pipeline)(
12359
12368
  import_node_stream.Readable.fromWeb(res.body),
12360
12369
  import_node_fs4.default.createWriteStream(tmp)
12361
12370
  );
@@ -12389,7 +12398,7 @@ function extractTarball(tarPath, destDir) {
12389
12398
  });
12390
12399
  });
12391
12400
  }
12392
- var import_node_child_process2, import_node_crypto, import_node_fs4, import_node_os2, import_node_path4, import_node_stream, import_promises2, DEFAULT_LOCAL_RUNTIME_RETENTION_COUNT;
12401
+ var import_node_child_process2, import_node_crypto, import_node_fs4, import_node_os2, import_node_path4, import_node_stream, import_promises3, DEFAULT_LOCAL_RUNTIME_RETENTION_COUNT;
12393
12402
  var init_src = __esm({
12394
12403
  "../contrast-runtime-delivery/src/index.ts"() {
12395
12404
  "use strict";
@@ -12399,7 +12408,7 @@ var init_src = __esm({
12399
12408
  import_node_os2 = __toESM(require("node:os"), 1);
12400
12409
  import_node_path4 = __toESM(require("node:path"), 1);
12401
12410
  import_node_stream = require("node:stream");
12402
- import_promises2 = require("node:stream/promises");
12411
+ import_promises3 = require("node:stream/promises");
12403
12412
  init_product();
12404
12413
  init_product();
12405
12414
  DEFAULT_LOCAL_RUNTIME_RETENTION_COUNT = 2;
@@ -14069,7 +14078,7 @@ async function handleFetchProxyRequest(req, res) {
14069
14078
  const switchToGet = (status === 301 || status === 302) && method === "POST" || status === 303 && method !== "GET" && method !== "HEAD";
14070
14079
  const redirectUrl = new URL(location, targetUrl2);
14071
14080
  proxyRes.resume();
14072
- await (0, import_promises3.finished)(proxyRes);
14081
+ await (0, import_promises4.finished)(proxyRes);
14073
14082
  await proxy(
14074
14083
  redirectUrl,
14075
14084
  switchToGet ? "GET" : method,
@@ -14094,7 +14103,7 @@ async function handleFetchProxyRequest(req, res) {
14094
14103
  );
14095
14104
  }
14096
14105
  res.statusCode = status;
14097
- await (0, import_promises3.pipeline)(proxyRes, res);
14106
+ await (0, import_promises4.pipeline)(proxyRes, res);
14098
14107
  };
14099
14108
  try {
14100
14109
  await proxy(upstreamUrl, originalMethod, body, 0);
@@ -14177,13 +14186,13 @@ function handleAppApiRequest(req, res) {
14177
14186
  req.pipe(proxyReq);
14178
14187
  return true;
14179
14188
  }
14180
- var import_http2, import_https, import_promises3, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS, APP_API_HEADER_REWRITES;
14189
+ var import_http2, import_https, import_promises4, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS, APP_API_HEADER_REWRITES;
14181
14190
  var init_fetch_proxy_handler = __esm({
14182
14191
  "src/host/fetch-proxy-handler.ts"() {
14183
14192
  "use strict";
14184
14193
  import_http2 = __toESM(require("http"), 1);
14185
14194
  import_https = __toESM(require("https"), 1);
14186
- import_promises3 = require("stream/promises");
14195
+ import_promises4 = require("stream/promises");
14187
14196
  init_backend_origin();
14188
14197
  init_fetch_proxy_overrides();
14189
14198
  STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
@@ -18044,7 +18053,11 @@ var init_core = __esm({
18044
18053
  const suppressed = external.entryErrors.find((item) => isReal(item) && item.suppressed === true)
18045
18054
  if (suppressed) suppressedEntryError = suppressed.message
18046
18055
  }
18047
- if (externalReady === false && externalStatus) loadingText = externalStatus
18056
+ // once the app has errored its last status ("injecting sootsim
18057
+ // modules...") is stale \u2014 reporting it makes a dead app read as one that
18058
+ // is still booting.
18059
+ if (externalError) loadingText = ''
18060
+ else if (externalReady === false && externalStatus) loadingText = externalStatus
18048
18061
  } catch {}
18049
18062
  let errors = 0
18050
18063
  try { errors = window.__sootsimConsole?.count?.()?.errors ?? 0 } catch {}
@@ -18632,6 +18645,7 @@ var init_app_fonts = __esm({
18632
18645
  "use strict";
18633
18646
  import_node_module = require("node:module");
18634
18647
  import_config_plugin_fonts = require("sootsim-engine/engine/config-plugin-fonts");
18648
+ init_dev_server_scanner();
18635
18649
  init_app_project();
18636
18650
  require2 = (0, import_node_module.createRequire)(__sootsim_import_meta_url);
18637
18651
  }
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.302 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.304 | (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.302",
3
+ "version": "0.1.304",
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",
@@ -189,7 +189,7 @@
189
189
  "esbuild": "^0.25.0",
190
190
  "sootsim-engine": "workspace:*",
191
191
  "typescript": "^5.7.0",
192
- "vite": "^8.0.14",
192
+ "vite": "^8.2.2",
193
193
  "yaml": "^2.8.3"
194
194
  }
195
195
  }