sootsim 0.1.301 → 0.1.303

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 (156) hide show
  1. package/dist-cli/bin.js +5 -5
  2. package/dist-cli/chunks/{agent-DWXNDXDJ.js → agent-NKFJH2RJ.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-DTPQFEMR.js → agent-wrapper-WEA3TGWF.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-MKW6UNBO.js → app-fonts-L5JXOKIF.js} +2 -2
  5. package/dist-cli/chunks/{assert-GN4KR5TI.js → assert-ZG65AUNK.js} +2 -2
  6. package/dist-cli/chunks/{auth-HLOV4GZN.js → auth-RMFBZQIW.js} +2 -2
  7. package/dist-cli/chunks/{beta-DP7K4JVJ.js → beta-RR6TCDCJ.js} +2 -2
  8. package/dist-cli/chunks/{camera-SH6FT7ZA.js → camera-JWOAFE6U.js} +2 -2
  9. package/dist-cli/chunks/{chunk-4PKUB2QX.js → chunk-2LMSJNAH.js} +2 -2
  10. package/dist-cli/chunks/{chunk-WKSX2VHB.js → chunk-3I647BPF.js} +1 -1
  11. package/dist-cli/chunks/{chunk-HEPIUAFX.js → chunk-3YYCMGOR.js} +3 -3
  12. package/dist-cli/chunks/{chunk-SOBEJUH4.js → chunk-4F7VUXKY.js} +2 -2
  13. package/dist-cli/chunks/{chunk-KYGB26L4.js → chunk-5NHCBHYZ.js} +2 -2
  14. package/dist-cli/chunks/{chunk-4MNKKMYG.js → chunk-657GXEAT.js} +2 -2
  15. package/dist-cli/chunks/{chunk-VXRYV6G6.js → chunk-6Q5PHS4F.js} +1 -1
  16. package/dist-cli/chunks/{chunk-M33LQWC2.js → chunk-APBN2B6C.js} +1 -1
  17. package/dist-cli/chunks/{chunk-NWM62KI3.js → chunk-ATRV3MGB.js} +2 -2
  18. package/dist-cli/chunks/{chunk-KEFBMDYK.js → chunk-AWE4ZKR3.js} +1 -1
  19. package/dist-cli/chunks/{chunk-MKQNHDDF.js → chunk-AXDVKOGM.js} +2 -2
  20. package/dist-cli/chunks/{chunk-V2SZPQJF.js → chunk-BDZ7GDAA.js} +1 -1
  21. package/dist-cli/chunks/{chunk-IRNRCBRW.js → chunk-BQLQCPXE.js} +1 -1
  22. package/dist-cli/chunks/{chunk-FVNWUEK2.js → chunk-BYCMWKNX.js} +3 -3
  23. package/dist-cli/chunks/{chunk-STF4UH5I.js → chunk-CQEK4J75.js} +2 -2
  24. package/dist-cli/chunks/{chunk-7RU45W2O.js → chunk-CVRPU5KX.js} +1 -1
  25. package/dist-cli/chunks/{chunk-QNQP3WYV.js → chunk-DTQ4XGJP.js} +3 -3
  26. package/dist-cli/chunks/chunk-E3POCZJT.js +4 -0
  27. package/dist-cli/chunks/{chunk-4FCN3KOD.js → chunk-FLLDNYUC.js} +2 -2
  28. package/dist-cli/chunks/{chunk-Q4ZLYMUP.js → chunk-FQZQKJZ5.js} +1 -1
  29. package/dist-cli/chunks/{chunk-YTUW6DGN.js → chunk-G4B2PTUA.js} +2 -2
  30. package/dist-cli/chunks/{chunk-RW75MMQZ.js → chunk-GVC4ZNVM.js} +2 -2
  31. package/dist-cli/chunks/{chunk-YXRD4B4X.js → chunk-H3U7LAZG.js} +2 -2
  32. package/dist-cli/chunks/{chunk-4OZG2LQA.js → chunk-HKWQLGKK.js} +8 -8
  33. package/dist-cli/chunks/{chunk-7LULF3D2.js → chunk-JZZIA5BR.js} +21 -10
  34. package/dist-cli/chunks/{chunk-OVEH5OOR.js → chunk-LIK6FJNR.js} +1 -1
  35. package/dist-cli/chunks/{chunk-UK7X4OX3.js → chunk-LK63GSPB.js} +1 -1
  36. package/dist-cli/chunks/{chunk-J22XZAGG.js → chunk-M4SIQQDE.js} +2 -2
  37. package/dist-cli/chunks/{chunk-YIBVYNHV.js → chunk-MLHEWBGL.js} +1 -1
  38. package/dist-cli/chunks/{chunk-NEKVW4FE.js → chunk-MLX2UIH7.js} +2 -2
  39. package/dist-cli/chunks/{chunk-WE74HC52.js → chunk-NRPNLTJI.js} +2 -2
  40. package/dist-cli/chunks/{chunk-LE6JWEXU.js → chunk-OSCWNNYR.js} +1 -1
  41. package/dist-cli/chunks/{chunk-DNH4ZWVK.js → chunk-QR4A5JV3.js} +2 -2
  42. package/dist-cli/chunks/{chunk-JDQ5AJJ4.js → chunk-SSGGUPY7.js} +2 -2
  43. package/dist-cli/chunks/{chunk-MFLCDFRS.js → chunk-TDM4IQS3.js} +2 -2
  44. package/dist-cli/chunks/{chunk-TABUERS3.js → chunk-TFWWL3HI.js} +1 -1
  45. package/dist-cli/chunks/{chunk-MPDBF324.js → chunk-TL6D2L7C.js} +2 -2
  46. package/dist-cli/chunks/{chunk-EODC7ZE7.js → chunk-U7GJF4CQ.js} +2 -2
  47. package/dist-cli/chunks/{chunk-RCH5EVVP.js → chunk-UJIGVLKD.js} +1 -1
  48. package/dist-cli/chunks/{chunk-Y4EES4A2.js → chunk-VGNEIUJ7.js} +2 -2
  49. package/dist-cli/chunks/{chunk-P2HUPEXS.js → chunk-VLLTUTO5.js} +2 -2
  50. package/dist-cli/chunks/{chunk-BGY7U4IH.js → chunk-WI5GVQ6M.js} +2 -2
  51. package/dist-cli/chunks/{chunk-SDBIR5ON.js → chunk-XAHT6BRW.js} +1 -1
  52. package/dist-cli/chunks/{chunk-YOLPZLST.js → chunk-XE2DUF5Z.js} +1 -1
  53. package/dist-cli/chunks/{chunk-6MFFAN7Q.js → chunk-YOV3CQIH.js} +1 -1
  54. package/dist-cli/chunks/{chunk-PPD77GEP.js → chunk-YPZDXYHV.js} +2 -2
  55. package/dist-cli/chunks/{chunk-3XC55LRK.js → chunk-YWAV3FQJ.js} +2 -2
  56. package/dist-cli/chunks/chunk-ZED5FLNC.js +125 -0
  57. package/dist-cli/chunks/{chunk-77CFHIGG.js → chunk-ZJ6EL5FU.js} +1 -1
  58. package/dist-cli/chunks/{cleanup-DIDGDPIX.js → cleanup-MTGLBGPQ.js} +2 -2
  59. package/dist-cli/chunks/{cli-version-K3UX3EWQ.js → cli-version-KF6SJ5QC.js} +2 -2
  60. package/dist-cli/chunks/{compat-CU5BZOTA.js → compat-NIROXTXH.js} +2 -2
  61. package/dist-cli/chunks/{config-ZDPMF7NT.js → config-GVI5ADMM.js} +2 -2
  62. package/dist-cli/chunks/{control-PKNXORO3.js → control-RLM3WBEH.js} +2 -2
  63. package/dist-cli/chunks/daemon-O2R2GEWR.js +4 -0
  64. package/dist-cli/chunks/{debug-FRVAHAUX.js → debug-QLQ6VFDL.js} +3 -3
  65. package/dist-cli/chunks/{desktop-RM4LA63P.js → desktop-4KAE6XGD.js} +3 -3
  66. package/dist-cli/chunks/{detox-XXPJIQFG.js → detox-XW4L3NAA.js} +2 -2
  67. package/dist-cli/chunks/{device-5CWUNYYM.js → device-IMVFXWBB.js} +2 -2
  68. package/dist-cli/chunks/{diagnose-7WHQUJOH.js → diagnose-JTFFK6SX.js} +2 -2
  69. package/dist-cli/chunks/disk-cleanup-3HBGT6XT.js +4 -0
  70. package/dist-cli/chunks/drivers-BHLLX7OX.js +4 -0
  71. package/dist-cli/chunks/{film-EEAFWERR.js → film-BTQI2ZPO.js} +3 -3
  72. package/dist-cli/chunks/flow-C7PWEH4C.js +4 -0
  73. package/dist-cli/chunks/help-LOC2M6FR.js +4 -0
  74. package/dist-cli/chunks/{hidden-runtime-alias-GEDAK5VD.js → hidden-runtime-alias-5Y3QDZ2L.js} +2 -2
  75. package/dist-cli/chunks/{home-paths-PE4236U4.js → home-paths-K2P3TAAX.js} +2 -2
  76. package/dist-cli/chunks/inspect-JH64MAHP.js +4 -0
  77. package/dist-cli/chunks/install-desktop-C6KE3OM5.js +4 -0
  78. package/dist-cli/chunks/{login-NBG6XEI2.js → login-DIHEERZB.js} +4 -4
  79. package/dist-cli/chunks/{logout-TLDRLFXP.js → logout-HXABB5BG.js} +2 -2
  80. package/dist-cli/chunks/{maestro-DHRICU2K.js → maestro-LF67TXN2.js} +3 -3
  81. package/dist-cli/chunks/{maestro-generate-QZAGYXXJ.js → maestro-generate-XU7IAT4W.js} +3 -3
  82. package/dist-cli/chunks/{mode-XOMKPZZG.js → mode-GJRNBJWL.js} +2 -2
  83. package/dist-cli/chunks/{optional-demo-registry-L66RRINW.js → optional-demo-registry-SXOSQMWZ.js} +2 -2
  84. package/dist-cli/chunks/{perf-GSKQKH3W.js → perf-IZY2XMUE.js} +2 -2
  85. package/dist-cli/chunks/{permissions-D4XQ4HBT.js → permissions-RLZXUFQU.js} +2 -2
  86. package/dist-cli/chunks/{record-QTA3IWSU.js → record-OBWLYFSP.js} +3 -3
  87. package/dist-cli/chunks/{report-issue-BVPBXZEM.js → report-issue-DU7TRHJK.js} +2 -2
  88. package/dist-cli/chunks/runtime-E7SIB4P3.js +4 -0
  89. package/dist-cli/chunks/screenshot-command-5IF4BSJ4.js +159 -0
  90. package/dist-cli/chunks/{screenshots-capture-NUVPCCYY.js → screenshots-capture-OFYWMTVR.js} +2 -2
  91. package/dist-cli/chunks/{serve-FR5M2RRQ.js → serve-DUES2MUY.js} +2 -2
  92. package/dist-cli/chunks/{setup-O4WMVQVP.js → setup-7JBMUE6Q.js} +2 -2
  93. package/dist-cli/chunks/{skills-RUYLHJED.js → skills-J5HVAM75.js} +2 -2
  94. package/dist-cli/chunks/{storage-OCCDGKMN.js → storage-EPTR6RW5.js} +2 -2
  95. package/dist-cli/chunks/store-W3YDQEZQ.js +4 -0
  96. package/dist-cli/chunks/telemetry-WXVIVQ4Y.js +4 -0
  97. package/dist-cli/chunks/{timeline-QWPHBXJ2.js → timeline-QR2474MZ.js} +2 -2
  98. package/dist-cli/chunks/{upgrade-WUQAUREZ.js → upgrade-MQL27HMQ.js} +2 -2
  99. package/dist-cli/chunks/upload-6IA2EKEH.js +4 -0
  100. package/dist-cli/chunks/{version-TCSZK3WH.js → version-ILGJD7EH.js} +2 -2
  101. package/dist-cli/chunks/{web-7P7SQTFS.js → web-NEPM3SZU.js} +2 -2
  102. package/dist-cli/chunks/{what-happened-KIUBAPFB.js → what-happened-KGOUXBW4.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 +1 -1
  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 +1 -1
  131. package/dist-lib/sdk.cjs +18 -6
  132. package/dist-lib/sdk.mjs +18 -6
  133. package/dist-lib/skills.cjs +6 -2
  134. package/dist-lib/vite.cjs +1 -1
  135. package/package.json +2 -2
  136. package/skills/sootsim-debug/SKILL.md +6 -0
  137. package/skills/sootsim-setup/SKILL.md +26 -0
  138. package/src/attached-projects.ts +2 -2
  139. package/src/host/bridge-host.ts +2 -2
  140. package/src/runtime-assets.ts +1 -1
  141. package/src/runtime-delivery.ts +1 -1
  142. package/src/vite-plugin.ts +1 -1
  143. package/dist-cli/chunks/chunk-EKNSKDBI.js +0 -125
  144. package/dist-cli/chunks/chunk-NR2G2PSN.js +0 -4
  145. package/dist-cli/chunks/daemon-OXELSM3C.js +0 -4
  146. package/dist-cli/chunks/disk-cleanup-EGAZA7DS.js +0 -4
  147. package/dist-cli/chunks/drivers-JEAO6IWD.js +0 -4
  148. package/dist-cli/chunks/flow-DMSEJ526.js +0 -4
  149. package/dist-cli/chunks/help-BTYQFHMT.js +0 -4
  150. package/dist-cli/chunks/inspect-RKOCZZ2A.js +0 -4
  151. package/dist-cli/chunks/install-desktop-25G42KWB.js +0 -4
  152. package/dist-cli/chunks/runtime-UQY75DPC.js +0 -4
  153. package/dist-cli/chunks/screenshot-command-YWDQBPE6.js +0 -156
  154. package/dist-cli/chunks/store-56RG4ZWJ.js +0 -4
  155. package/dist-cli/chunks/telemetry-YSUNFE7N.js +0 -4
  156. package/dist-cli/chunks/upload-D5BXJTXK.js +0 -4
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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;
@@ -18044,7 +18044,11 @@ var init_core = __esm({
18044
18044
  const suppressed = external.entryErrors.find((item) => isReal(item) && item.suppressed === true)
18045
18045
  if (suppressed) suppressedEntryError = suppressed.message
18046
18046
  }
18047
- if (externalReady === false && externalStatus) loadingText = externalStatus
18047
+ // once the app has errored its last status ("injecting sootsim
18048
+ // modules...") is stale \u2014 reporting it makes a dead app read as one that
18049
+ // is still booting.
18050
+ if (externalError) loadingText = ''
18051
+ else if (externalReady === false && externalStatus) loadingText = externalStatus
18048
18052
  } catch {}
18049
18053
  let errors = 0
18050
18054
  try { errors = window.__sootsimConsole?.count?.()?.errors ?? 0 } catch {}
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.301 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.303 | (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.301",
3
+ "version": "0.1.303",
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
  }
@@ -63,6 +63,12 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
63
63
  query against it.
64
64
  - **pin a sim once.** if more than one is live, an unpinned command
65
65
  refuses to choose. run `sootsim use <id>` at the start of the workflow.
66
+ - **keep one sim and reuse its browser tab.** before `sootsim open`, run
67
+ `sootsim list --all`. if the target is already connected, pin it and use
68
+ `sootsim do reload`; do not open another tab to reload or retry a capture.
69
+ re-run `list --all` after each reload or reconnect; when another entry appears,
70
+ run `sootsim close --others` against the pinned sim immediately.
71
+ if the current sim must be replaced, close it before opening the replacement.
66
72
  - **`debug eval` is an escape hatch.** if a top-level command feels
67
73
  broken or missing, file an issue — every agent after you benefits from
68
74
  a better CLI, not a pile of ad-hoc scripts.
@@ -23,6 +23,32 @@ debugging or `/sootsim-test` for writing tests.
23
23
  - **an empty `sootsim list` is not "broken sootsim"** — it usually means the
24
24
  daemon is down, the dev server port is wrong, or the runtime is missing.
25
25
  walk the recovery checklist before reinstalling.
26
+ - **one sim per investigation. `--new` is an escape hatch, not the normal
27
+ invocation.** plain `sootsim open <port>` loads the target into the sim you
28
+ already have, `sootsim reload` reloads it in place, and `sootsim close`
29
+ disposes it when you are done. reach for `--new` only when the current sim is
30
+ held by another CLI, and close it afterwards. passing `--new` on every command
31
+ leaves a trail of abandoned browser tabs on whatever machine you are running
32
+ on, which is somebody's actual desktop.
33
+ - **sharing a machine with other agents? open ONE sim with `--new`, pin it, and
34
+ pass `--sim <id>` from then on.** this is the case `--new` exists for. an
35
+ unpinned command has no sim of its own, so it falls back to whatever sim is
36
+ currently PRIMARY — and that can be another agent's live sim, mid-run. a plain
37
+ `sootsim open <port>` from an unpinned CLI will happily retarget somebody
38
+ else's sim to your port and take over their session; the warning it prints is
39
+ easy to miss in a transcript. the current-sim pin is stored per CLI identity
40
+ (`sootsim-current-sim-<identity>.json`, keyed by your process-tree root), so
41
+ pinning is genuinely per-agent and does not fight anyone else:
42
+
43
+ ```sh
44
+ sootsim open --new 8086 # your own sim; also records it as yours
45
+ sootsim list # read back its id
46
+ sootsim use <id> # pin it explicitly
47
+ sootsim describe --sim <id> # name it on every command after that
48
+ ```
49
+
50
+ still close it when you are done. the reason not to pass `--new` on every
51
+ command is unchanged: each one spawns another browser tree.
26
52
  - **never retry-loop `sootsim open` against a wedged or slow stack.** a
27
53
  connect-timeout ("timed out waiting for opened sim to connect") means STOP and
28
54
  diagnose — not retry. each retried open spawns a new browser tree (a
@@ -10,7 +10,7 @@
10
10
  import { randomBytes, createHash } from 'node:crypto'
11
11
  import fs from 'node:fs'
12
12
  import path from 'node:path'
13
- import { electronUserDataDir } from './home-paths'
13
+ import { electronUserDataDir } from './home-paths.ts'
14
14
 
15
15
  // plan → attached-projects-and-agents.md §data model
16
16
  export interface AttachedProject {
@@ -510,7 +510,7 @@ export async function seedFromDemoAppRegistry(): Promise<void> {
510
510
  // optional internal-only registry — resolves to [] on a published install
511
511
  // (the registry is not shipped), so this seed is a no-op for real users and
512
512
  // never pins their ports to internal demo apps.
513
- const { loadOptionalDemoApps } = await import('../scripts/optional-demo-registry')
513
+ const { loadOptionalDemoApps } = await import('../scripts/optional-demo-registry.ts')
514
514
  const apps = await loadOptionalDemoApps()
515
515
  if (apps.length === 0) return
516
516
  mutateStore((store) => {
@@ -44,9 +44,9 @@ import {
44
44
  handleFetchProxyRequest,
45
45
  isAppApiRequestUrl,
46
46
  isFetchProxyRequestUrl,
47
- } from './fetch-proxy-handler'
47
+ } from './fetch-proxy-handler.ts'
48
48
  import { openUrl as openUrlInBrowser, type OpenUrlOptions } from './open-url.ts'
49
- import { handleWebSocketProxyUpgrade } from './websocket-proxy'
49
+ import { handleWebSocketProxyUpgrade } from './websocket-proxy.ts'
50
50
 
51
51
  const SOOTSIM_CROSS_ORIGIN_EMBEDDER_POLICY = 'require-corp'
52
52
 
@@ -6,7 +6,7 @@ import fs from 'fs'
6
6
  import path from 'path'
7
7
  import { fileURLToPath } from 'url'
8
8
  import { isValidRuntimeVersion } from '@contrast/runtime-delivery'
9
- import { readActiveRuntime, runtimeDir } from './home-paths'
9
+ import { readActiveRuntime, runtimeDir } from './home-paths.ts'
10
10
 
11
11
  export const SOOTSIM_RUNTIME_MISSING_MESSAGE =
12
12
  '[sootsim] no engine runtime installed — run `sootsim setup`, or `sootsim runtime install`'
@@ -19,7 +19,7 @@ import {
19
19
  runtimeDir,
20
20
  runtimesDir,
21
21
  writeActiveRuntime,
22
- } from './home-paths'
22
+ } from './home-paths.ts'
23
23
 
24
24
  export const DEFAULT_RUNTIME_CDN_ORIGIN = 'https://contrast.dev'
25
25
 
@@ -661,7 +661,7 @@ export function reanimatedNativeSeamRedirect(): Plugin {
661
661
  // the reanimated plugin above stays separate because it has package-specific
662
662
  // edge cases (fabricUtils, validate-worklets-version). new migrations should
663
663
  // use the manifest path unless they need similar special handling.
664
- import { NATIVE_SEAM_MANIFEST } from './native-seam-manifest'
664
+ import { NATIVE_SEAM_MANIFEST } from './native-seam-manifest.ts'
665
665
  export function manifestNativeSeamRedirect(): Plugin {
666
666
  // build a fast lookup: pkg → { basenames, target }
667
667
  const byPkg = new Map<