sootsim 0.1.169 → 0.1.170

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 (184) hide show
  1. package/README.md +66 -63
  2. package/detox/index.ts +3 -3
  3. package/dist-cli/bin.js +3 -3
  4. package/dist-cli/chunks/agent-3C2BKQKX.js +46 -0
  5. package/dist-cli/chunks/{agent-wrapper-Y5FQA3RL.js → agent-wrapper-OIKCYOXZ.js} +2 -2
  6. package/dist-cli/chunks/{app-fonts-FYVA4XV6.js → app-fonts-25O32NAP.js} +2 -2
  7. package/dist-cli/chunks/{assert-U64QBDM2.js → assert-ONEP4NQU.js} +2 -2
  8. package/dist-cli/chunks/beta-4E5USTEI.js +2 -0
  9. package/dist-cli/chunks/{camera-3GXBVIAM.js → camera-RORW4MAA.js} +2 -2
  10. package/dist-cli/chunks/{chunk-5C6BR24W.js → chunk-25RFZ6WP.js} +6 -6
  11. package/dist-cli/chunks/chunk-35GMFXVJ.js +2 -0
  12. package/dist-cli/chunks/{chunk-GLRFKYDV.js → chunk-3TM7DHWE.js} +2 -2
  13. package/dist-cli/chunks/{chunk-4F3BBP7B.js → chunk-4XVY5TUF.js} +2 -2
  14. package/dist-cli/chunks/{chunk-LZEL2RU3.js → chunk-5ZHUPPS5.js} +1 -1
  15. package/dist-cli/chunks/{chunk-GC4THE6K.js → chunk-6FAEORJ2.js} +2 -2
  16. package/dist-cli/chunks/{chunk-G2ZFDIPK.js → chunk-6TSXXN2W.js} +4 -4
  17. package/dist-cli/chunks/chunk-AJF3QF4K.js +1 -0
  18. package/dist-cli/chunks/{chunk-FIDPRJYH.js → chunk-AUCNBB6Q.js} +2 -2
  19. package/dist-cli/chunks/{chunk-SIB6I72P.js → chunk-BP3EGFER.js} +2 -2
  20. package/dist-cli/chunks/{chunk-OGLWXPVG.js → chunk-DAXME77O.js} +3 -3
  21. package/dist-cli/chunks/chunk-DGJTEFE7.js +13 -0
  22. package/dist-cli/chunks/chunk-DIRDEKRW.js +23 -0
  23. package/dist-cli/chunks/{chunk-3L4NRJ6C.js → chunk-DKTC53HV.js} +1 -1
  24. package/dist-cli/chunks/{chunk-KUUFY6FC.js → chunk-DWXC25XG.js} +1 -1
  25. package/dist-cli/chunks/{chunk-CR6DOLUD.js → chunk-E3FKMY5E.js} +1 -1
  26. package/dist-cli/chunks/chunk-ER4GBJRY.js +2 -0
  27. package/dist-cli/chunks/chunk-EX6V4ZV6.js +6 -0
  28. package/dist-cli/chunks/{chunk-VMYMPL6H.js → chunk-GQH3PD3W.js} +5 -5
  29. package/dist-cli/chunks/{chunk-MVOHANJG.js → chunk-GST4YSBO.js} +4 -4
  30. package/dist-cli/chunks/{chunk-BIWJE7CB.js → chunk-I4RV5I6V.js} +1 -1
  31. package/dist-cli/chunks/{chunk-Y6IDAARY.js → chunk-I5WXVKR6.js} +1 -1
  32. package/dist-cli/chunks/{chunk-HC72ILJK.js → chunk-IO7KAVFK.js} +2 -2
  33. package/dist-cli/chunks/{chunk-XEH4QGWB.js → chunk-LMX7UB5T.js} +2 -2
  34. package/dist-cli/chunks/{chunk-YADWU7OZ.js → chunk-N4YCSOCR.js} +2 -2
  35. package/dist-cli/chunks/{chunk-IODOTOOP.js → chunk-NI3L4A65.js} +2 -2
  36. package/dist-cli/chunks/{chunk-IACEJQIO.js → chunk-ODGEH6OW.js} +2 -2
  37. package/dist-cli/chunks/{chunk-DNA6VS6M.js → chunk-Q4NDYO2U.js} +1 -1
  38. package/dist-cli/chunks/{chunk-PV6MBKKE.js → chunk-QPRF3UYX.js} +2 -2
  39. package/dist-cli/chunks/{chunk-M2TMFGZH.js → chunk-QXJMXSQP.js} +1 -1
  40. package/dist-cli/chunks/chunk-RLKSLUNR.js +2 -0
  41. package/dist-cli/chunks/{chunk-WZG3YVJR.js → chunk-S244IT4W.js} +1 -1
  42. package/dist-cli/chunks/chunk-SDHOM6ZG.js +62 -0
  43. package/dist-cli/chunks/{chunk-B7BMSU7H.js → chunk-TXKOJ3P5.js} +1 -1
  44. package/dist-cli/chunks/{chunk-IBEMMV5E.js → chunk-UDMJSFSH.js} +8 -8
  45. package/dist-cli/chunks/{chunk-DQZEN256.js → chunk-ULV4PWN4.js} +1 -1
  46. package/dist-cli/chunks/{chunk-2TYEWVS4.js → chunk-V4HTQPMA.js} +1 -1
  47. package/dist-cli/chunks/chunk-VATHADSI.js +2 -0
  48. package/dist-cli/chunks/{chunk-5Q7IHJ7K.js → chunk-VUOCUCJ2.js} +2 -2
  49. package/dist-cli/chunks/{chunk-JDGLBW64.js → chunk-WN7R4GL4.js} +1 -1
  50. package/dist-cli/chunks/chunk-XOTJD6PU.js +118 -0
  51. package/dist-cli/chunks/chunk-XUNPVF5K.js +1 -0
  52. package/dist-cli/chunks/{chunk-KZIXAYN5.js → chunk-YMFSRCHL.js} +4 -4
  53. package/dist-cli/chunks/{chunk-X2HNVXNM.js → chunk-YV74D4MG.js} +2 -2
  54. package/dist-cli/chunks/{chunk-SNX3M4XD.js → chunk-YVTWSC5Y.js} +3 -3
  55. package/dist-cli/chunks/cli-version-EKKWCHRX.js +2 -0
  56. package/dist-cli/chunks/{compat-ORRWNXVT.js → compat-ZVZM5TML.js} +3 -3
  57. package/dist-cli/chunks/control-TWINYHMY.js +2 -0
  58. package/dist-cli/chunks/{cpu-profile-6PRSBZ2F.js → cpu-profile-RWGQTWLP.js} +2 -2
  59. package/dist-cli/chunks/daemon-AOSMNBD4.js +2 -0
  60. package/dist-cli/chunks/{debug-Q3J2X4WW.js → debug-R7PL3MHF.js} +5 -5
  61. package/dist-cli/chunks/{detox-DN57GMMJ.js → detox-UIJMKIGQ.js} +2 -2
  62. package/dist-cli/chunks/{device-IL5TPYGU.js → device-7SRVX2PU.js} +2 -2
  63. package/dist-cli/chunks/{diagnose-BW6QWP4F.js → diagnose-OXAKLLZT.js} +2 -2
  64. package/dist-cli/chunks/drivers-BPPG22VP.js +2 -0
  65. package/dist-cli/chunks/{electron-DGMSXQWG.js → electron-CTCH4VOL.js} +3 -3
  66. package/dist-cli/chunks/flow-KA2WCWDL.js +2 -0
  67. package/dist-cli/chunks/help-XBQIK2XY.js +2 -0
  68. package/dist-cli/chunks/{hints-TK3EHB4U.js → hints-P3ZIAP3Z.js} +2 -2
  69. package/dist-cli/chunks/home-paths-ZSCTLOYE.js +2 -0
  70. package/dist-cli/chunks/{inspect-NFWFGU4B.js → inspect-2ABU5WET.js} +24 -24
  71. package/dist-cli/chunks/{install-desktop-GB3JKSNX.js → install-desktop-4NOQ3YY4.js} +3 -3
  72. package/dist-cli/chunks/{keys-RAAHRIFH.js → keys-RPVEUNUC.js} +2 -2
  73. package/dist-cli/chunks/{login-KQ37GHDE.js → login-6D6DXBO3.js} +4 -4
  74. package/dist-cli/chunks/{logout-63SH2Y25.js → logout-T5OSWDTJ.js} +2 -2
  75. package/dist-cli/chunks/{maestro-24BT3MML.js → maestro-MKCHEOKA.js} +2 -2
  76. package/dist-cli/chunks/optional-demo-registry-EYD2K3QH.js +2 -0
  77. package/dist-cli/chunks/{preview-KQAOVN6R.js → preview-S52ZNGN2.js} +2 -2
  78. package/dist-cli/chunks/{profile-AN2B4NJT.js → profile-IG5F3LTL.js} +2 -2
  79. package/dist-cli/chunks/{react-ATGV35B4.js → react-275HCOFC.js} +2 -2
  80. package/dist-cli/chunks/{record-36662T3R.js → record-YT63SUHO.js} +4 -4
  81. package/dist-cli/chunks/runtime-WYZMDZAK.js +2 -0
  82. package/dist-cli/chunks/{screenshot-K4N5MPAT.js → screenshot-5AZ4MY3A.js} +4 -4
  83. package/dist-cli/chunks/{screenshot-mode-4QOJDLSH.js → screenshot-mode-4S4EX2XJ.js} +2 -2
  84. package/dist-cli/chunks/{screenshots-TB35YMSR.js → screenshots-UUJNZSG7.js} +2 -2
  85. package/dist-cli/chunks/{screenshots-capture-W6X33BZ4.js → screenshots-capture-I66JD3AD.js} +2 -2
  86. package/dist-cli/chunks/{server-L2PKDJZ2.js → serve-O46Q4WAD.js} +18 -17
  87. package/dist-cli/chunks/setup-C44N54O7.js +77 -0
  88. package/dist-cli/chunks/skills-PPVS4XOQ.js +40 -0
  89. package/dist-cli/chunks/{slides-TORKO36P.js → slides-ZWSZJZUY.js} +2 -2
  90. package/dist-cli/chunks/store-3SLGP5O3.js +2 -0
  91. package/dist-cli/chunks/telemetry-2XLLWARK.js +2 -0
  92. package/dist-cli/chunks/{test-5VCENVW3.js → test-362G4M5A.js} +3 -3
  93. package/dist-cli/chunks/{three-mode-ZVS2DSX6.js → three-mode-JNVTM2UT.js} +2 -2
  94. package/dist-cli/chunks/{timeline-TNC5OWLF.js → timeline-VKC6ULRK.js} +2 -2
  95. package/dist-cli/chunks/{upgrade-E7IO6A7Z.js → upgrade-SJPX4SPA.js} +2 -2
  96. package/dist-cli/chunks/upload-MXOBV6RT.js +2 -0
  97. package/dist-cli/chunks/version-4Z7AFNH3.js +4 -0
  98. package/dist-cli/chunks/web-WB2I2AWL.js +2 -0
  99. package/dist-cli/chunks/{what-happened-RMHZ7DGX.js → what-happened-KQCWMQJT.js} +3 -3
  100. package/dist-cli/chunks/{whoami-D53ANHR5.js → whoami-K76PXAD4.js} +2 -2
  101. package/dist-lib/agent-daemon-client.cjs +4 -5
  102. package/dist-lib/agent-events.cjs +1 -1
  103. package/dist-lib/agent-sessions.cjs +1 -1
  104. package/dist-lib/attached-projects.cjs +1 -1
  105. package/dist-lib/auth/shared-session.cjs +1 -1
  106. package/dist-lib/backend-origin.cjs +1 -1
  107. package/dist-lib/beta.cjs +3 -6
  108. package/dist-lib/beta.mjs +3 -5
  109. package/dist-lib/bridge-constants.cjs +1 -1
  110. package/dist-lib/cli-constants.cjs +1 -1
  111. package/dist-lib/config.cjs +1 -1
  112. package/dist-lib/detox/index.cjs +4 -4
  113. package/dist-lib/dev-bundle-resolution.cjs +2 -9
  114. package/dist-lib/home-paths.cjs +59 -1
  115. package/dist-lib/host/bridge-host.cjs +67 -5
  116. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  117. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  118. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  119. package/dist-lib/host/websocket-proxy.cjs +1 -1
  120. package/dist-lib/index.cjs +2 -2
  121. package/dist-lib/menu.cjs +1 -1
  122. package/dist-lib/menu.mjs +1 -1
  123. package/dist-lib/metro.cjs +2 -2
  124. package/dist-lib/profiles.cjs +1 -1
  125. package/dist-lib/render-mode.cjs +1 -1
  126. package/dist-lib/scripts/dev-server-scanner.cjs +5 -4
  127. package/dist-lib/sdk.cjs +1 -1
  128. package/dist-lib/sdk.mjs +1 -1
  129. package/dist-lib/skills.cjs +124 -8
  130. package/dist-lib/vite.cjs +2 -2
  131. package/package.json +2 -1
  132. package/scripts/dev-server-scanner.ts +3 -4
  133. package/scripts/postinstall.cjs +2 -2
  134. package/scripts/preuninstall.cjs +5 -7
  135. package/skills/soot.md +178 -0
  136. package/skills/sootsim-debug.md +384 -0
  137. package/skills/sootsim-setup.md +96 -0
  138. package/skills/sootsim-test.md +292 -0
  139. package/skills/sootsim-visual.md +122 -0
  140. package/src/agent-daemon-client.ts +4 -14
  141. package/src/beta.ts +3 -5
  142. package/src/dev-bundle-resolution.ts +1 -14
  143. package/src/home-paths.ts +77 -2
  144. package/src/host/agent-host.ts +1 -1
  145. package/src/host/bridge-host.ts +65 -6
  146. package/src/metro-plugin.ts +1 -1
  147. package/src/runtime-assets.ts +1 -1
  148. package/src/vite-plugin.ts +1 -0
  149. package/dist-cli/chunks/agent-V3GVCRPL.js +0 -46
  150. package/dist-cli/chunks/auto-bootstrap-YXDP3WKH.js +0 -2
  151. package/dist-cli/chunks/beta-FGSMZWLP.js +0 -2
  152. package/dist-cli/chunks/chunk-2IFWVIKM.js +0 -2
  153. package/dist-cli/chunks/chunk-3T36XLP3.js +0 -119
  154. package/dist-cli/chunks/chunk-5KY7TQ42.js +0 -5
  155. package/dist-cli/chunks/chunk-BQOMDL4K.js +0 -1
  156. package/dist-cli/chunks/chunk-FHMPJZKM.js +0 -7
  157. package/dist-cli/chunks/chunk-GQAWFQNN.js +0 -23
  158. package/dist-cli/chunks/chunk-HJTKKF7M.js +0 -13
  159. package/dist-cli/chunks/chunk-K4JAWKOY.js +0 -1
  160. package/dist-cli/chunks/chunk-NXGQS7IR.js +0 -2
  161. package/dist-cli/chunks/chunk-R2INPDGW.js +0 -1
  162. package/dist-cli/chunks/chunk-SLL5SZN4.js +0 -2
  163. package/dist-cli/chunks/chunk-XM66K64H.js +0 -79
  164. package/dist-cli/chunks/cli-version-3L6FFDIX.js +0 -2
  165. package/dist-cli/chunks/config-5IB6ONJ2.js +0 -45
  166. package/dist-cli/chunks/control-BM4V27OB.js +0 -2
  167. package/dist-cli/chunks/daemon-62MZT4G4.js +0 -67
  168. package/dist-cli/chunks/drivers-V6QDFZQD.js +0 -2
  169. package/dist-cli/chunks/flow-VBM6TU32.js +0 -2
  170. package/dist-cli/chunks/help-XWKNL743.js +0 -2
  171. package/dist-cli/chunks/home-paths-G23H3RO6.js +0 -2
  172. package/dist-cli/chunks/install-5YL7FITA.js +0 -2
  173. package/dist-cli/chunks/launch-DYFE4CAD.js +0 -16
  174. package/dist-cli/chunks/optional-demo-registry-JJXPB3UD.js +0 -2
  175. package/dist-cli/chunks/runtime-NRMC3U3D.js +0 -2
  176. package/dist-cli/chunks/runtime-delivery-RO6CTYPQ.js +0 -2
  177. package/dist-cli/chunks/setup-repo-AK6QOUE7.js +0 -2
  178. package/dist-cli/chunks/skills-KDSOWUOE.js +0 -10
  179. package/dist-cli/chunks/start-GH2AOUX6.js +0 -23
  180. package/dist-cli/chunks/store-JHW65VGQ.js +0 -2
  181. package/dist-cli/chunks/telemetry-SZLRXJXW.js +0 -2
  182. package/dist-cli/chunks/upload-KKEWETA5.js +0 -2
  183. package/dist-cli/chunks/version-37OD33SE.js +0 -4
  184. package/dist-cli/chunks/web-4JVMIBTB.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{C as T,D as A,E as y,P as _,Q as b,R as S}from"./chunk-DNA6VS6M.js";import{c as N,e as F}from"./chunk-GQAWFQNN.js";import"./chunk-DQZEN256.js";import{b as k}from"./chunk-KUUFY6FC.js";import"./chunk-5KY7TQ42.js";import"./chunk-JDGLBW64.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=N(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.1.170 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{C as N,D as F,E as y,P as T,Q as b,R as S}from"./chunk-Q4NDYO2U.js";import{c as A,e as _}from"./chunk-DIRDEKRW.js";import"./chunk-ULV4PWN4.js";import{b as k}from"./chunk-DWXC25XG.js";import"./chunk-EX6V4ZV6.js";import"./chunk-WN7R4GL4.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=A(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
3
3
  sootsim what-happened \u2014 show recent events from the semantic timeline
4
4
 
5
5
  usage:
@@ -15,7 +15,7 @@ usage:
15
15
 
16
16
  note: by default react-commit, layout, and scroll events are hidden as
17
17
  noise \u2014 pass --noisy or include them in --kinds to see them.
18
- `),process.exit(0));let s=n.includes("--summary"),l=n.includes("--flow"),i=n.includes("--all"),r=n.includes("--json"),u=n.includes("--no-advance"),v=n.includes("--noisy"),{since:a}=O(n),{kinds:d}=B(n),{limit:C}=D(n),g=k(),$={limit:C??200,...d&&d.length?{kinds:d}:{},...a!==void 0?{since:a}:i?{}:{sinceCursor:g}},h=F(e);try{if(s){let c=await T(h,$);if(r)console.log(JSON.stringify(c));else{let m=i?"all time":a!==void 0?`last ${((Date.now()-a)/1e3).toFixed(1)}s`:"since last call";console.log(` ${m}: ${_(c)}`)}!u&&!i&&c.lastAt&&await y(h,g,c.lastAt);return}let o=await A(h,$),E=Array.isArray(d)&&d.some(c=>b.has(c)),I=!v&&!E,f=0;if(I){let c=o.events.filter(m=>b.has(m.kind)?(f+=1,!1):!0);o.events=c}if(r)console.log(JSON.stringify(l?x(o.events):o,null,2));else{if(o.events.length===0)f>0?console.log(` no non-noise events (${f} react-commit/layout/scroll hidden)`):console.log(i?" no events recorded":a!==void 0?" no events in window":" no new events since last call");else if(l){let c=o.events[0]?.t??null,m=x(o.events),w=i?`\u2500\u2500\u2500 ${o.events.length} event(s) total \u2014 flow view \u2500\u2500\u2500`:a!==void 0?`\u2500\u2500\u2500 ${o.events.length} event(s) in last ${((Date.now()-a)/1e3).toFixed(1)}s \u2014 flow view \u2500\u2500\u2500`:`\u2500\u2500\u2500 ${o.events.length} event(s) since last call \u2014 flow view \u2500\u2500\u2500`;console.log(` ${w}`);for(let p of m){console.log(`
18
+ `),process.exit(0));let s=n.includes("--summary"),l=n.includes("--flow"),i=n.includes("--all"),r=n.includes("--json"),u=n.includes("--no-advance"),v=n.includes("--noisy"),{since:a}=O(n),{kinds:d}=B(n),{limit:C}=D(n),g=k(),$={limit:C??200,...d&&d.length?{kinds:d}:{},...a!==void 0?{since:a}:i?{}:{sinceCursor:g}},h=_(e);try{if(s){let c=await N(h,$);if(r)console.log(JSON.stringify(c));else{let m=i?"all time":a!==void 0?`last ${((Date.now()-a)/1e3).toFixed(1)}s`:"since last call";console.log(` ${m}: ${T(c)}`)}!u&&!i&&c.lastAt&&await y(h,g,c.lastAt);return}let o=await F(h,$),E=Array.isArray(d)&&d.some(c=>b.has(c)),I=!v&&!E,f=0;if(I){let c=o.events.filter(m=>b.has(m.kind)?(f+=1,!1):!0);o.events=c}if(r)console.log(JSON.stringify(l?x(o.events):o,null,2));else{if(o.events.length===0)f>0?console.log(` no non-noise events (${f} react-commit/layout/scroll hidden)`):console.log(i?" no events recorded":a!==void 0?" no events in window":" no new events since last call");else if(l){let c=o.events[0]?.t??null,m=x(o.events),w=i?`\u2500\u2500\u2500 ${o.events.length} event(s) total \u2014 flow view \u2500\u2500\u2500`:a!==void 0?`\u2500\u2500\u2500 ${o.events.length} event(s) in last ${((Date.now()-a)/1e3).toFixed(1)}s \u2014 flow view \u2500\u2500\u2500`:`\u2500\u2500\u2500 ${o.events.length} event(s) since last call \u2014 flow view \u2500\u2500\u2500`;console.log(` ${w}`);for(let p of m){console.log(`
19
19
  \u2500\u2500 ${p.label} (${p.events.length} event${p.events.length===1?"":"s"}) \u2500\u2500`);for(let M of p.events)console.log(S(M,c))}}else{let c=o.events[0]?.t??null,m=i?`\u2500\u2500\u2500 ${o.events.length} event(s) total \u2500\u2500\u2500`:a!==void 0?`\u2500\u2500\u2500 ${o.events.length} event(s) in last ${((Date.now()-a)/1e3).toFixed(1)}s \u2500\u2500\u2500`:`\u2500\u2500\u2500 ${o.events.length} event(s) since last call \u2500\u2500\u2500`;console.log(` ${m}`);for(let w of o.events)console.log(S(w,c))}f>0&&o.events.length>0&&process.stderr.write(`
20
20
  ${f} high-frequency event(s) hidden (react-commit/layout/scroll)
21
21
  rerun with --noisy or --kinds react-commit,layout,scroll to include them
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-SIB6I72P.js";import{d as n}from"./chunk-PV6MBKKE.js";import"./chunk-5KY7TQ42.js";import"./chunk-JDGLBW64.js";async function u(){let o=i();if(o||(console.log(" not signed in"),console.log(" set SOOTSIM_API_KEY=sk_sootsim_\u2026 or run `sootsim login`"),process.exit(1)),o.kind==="api-key"){let r=`${o.secret.slice(0,14)}\u2026`,t=o.source==="env"?"SOOTSIM_API_KEY env var":"saved key (~/.config/sootsim/credentials.json)";console.log(` api key ${r}`),console.log(` source: ${t}`);return}if(o.kind==="github"){console.log(` github token (${o.source})`),console.log(` repo: ${o.repoId}`);return}let e=await n(),s=e?.user;console.log(` ${s?.email||s?.name||s?.id||"signed in"}`),console.log(` origin: ${e?.origin??o.origin}`),e?.updatedAt&&console.log(` updated: ${e.updatedAt}`)}export{u as runWhoami};
1
+ /*! sootsim v0.1.170 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-BP3EGFER.js";import{d as n}from"./chunk-QPRF3UYX.js";import"./chunk-EX6V4ZV6.js";import"./chunk-WN7R4GL4.js";async function u(){let o=i();if(o||(console.log(" not signed in"),console.log(" set SOOTSIM_API_KEY=sk_sootsim_\u2026 or run `sootsim login`"),process.exit(1)),o.kind==="api-key"){let r=`${o.secret.slice(0,14)}\u2026`,t=o.source==="env"?"SOOTSIM_API_KEY env var":"saved key (~/.config/sootsim/credentials.json)";console.log(` api key ${r}`),console.log(` source: ${t}`);return}if(o.kind==="github"){console.log(` github token (${o.source})`),console.log(` repo: ${o.repoId}`);return}let e=await n(),s=e?.user;console.log(` ${s?.email||s?.name||s?.id||"signed in"}`),console.log(` origin: ${e?.origin??o.origin}`),e?.updatedAt&&console.log(` updated: ${e.updatedAt}`)}export{u as runWhoami};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -397,14 +397,13 @@ async function ensureDaemonRunning(opts = {}) {
397
397
  return { alreadyRunning: true };
398
398
  }
399
399
  if (shouldSkipPersistentDaemon()) {
400
- const why = isDevWorkstation() ? `this is a dev workstation (IS_TAMAGUI_DEV=1)` : `this is a dev checkout`;
401
400
  throw new AgentDaemonError(
402
- `no sootsim bridge on port ${port} and refusing to spawn a standalone daemon \u2014 ${why}. start the live \`bun dev\` stack so the bridge is up, or set SOOTSIM_FORCE_DAEMON_INSTALL=1 to spawn one here on purpose.`,
401
+ `no sootsim bridge on port ${port}. run \`sootsim setup\` to install the background daemon, or \`sootsim serve\` in another shell.`,
403
402
  "DEV_HOST_REFUSED"
404
403
  );
405
404
  }
406
405
  const { cmd, prefixArgs } = resolveSootsimInvocation();
407
- const args = [...prefixArgs, "server", "--quiet"];
406
+ const args = [...prefixArgs, "serve", "--quiet"];
408
407
  if (port !== DEFAULT_SOOTSIM_BRIDGE_PORT) {
409
408
  args.push("--port", String(port));
410
409
  }
@@ -421,7 +420,7 @@ async function ensureDaemonRunning(opts = {}) {
421
420
  await new Promise((r) => setTimeout(r, 100));
422
421
  }
423
422
  throw new AgentDaemonError(
424
- `spawned sootsim daemon on port ${port} but it did not come up in time. run \`sootsim server\` manually to diagnose.`,
423
+ `spawned sootsim daemon on port ${port} but it did not come up in time. run \`sootsim serve\` manually to diagnose.`,
425
424
  "SPAWN_TIMEOUT"
426
425
  );
427
426
  }
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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/beta.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -25,20 +25,17 @@ __export(beta_exports, {
25
25
  BETA_ASK_HEADLINE: () => BETA_ASK_HEADLINE,
26
26
  BETA_LABEL: () => BETA_LABEL,
27
27
  BETA_TAGLINE: () => BETA_TAGLINE,
28
- BETA_VERSION_TARGET: () => BETA_VERSION_TARGET,
29
28
  IS_BETA: () => IS_BETA
30
29
  });
31
30
  module.exports = __toCommonJS(beta_exports);
32
31
  var IS_BETA = true;
33
- var BETA_VERSION_TARGET = "1.0.0";
34
32
  var BETA_LABEL = "public beta";
35
- var BETA_TAGLINE = `${BETA_LABEL} \xB7 free until ${BETA_VERSION_TARGET}`;
36
- var BETA_ASK_HEADLINE = "free for everyone until 1.0 \u2014 we send anonymous error and dependency data while you use it";
33
+ var BETA_TAGLINE = BETA_LABEL;
34
+ var BETA_ASK_HEADLINE = "we send anonymous error and dependency data while you use it";
37
35
  // Annotate the CommonJS export names for ESM import in node:
38
36
  0 && (module.exports = {
39
37
  BETA_ASK_HEADLINE,
40
38
  BETA_LABEL,
41
39
  BETA_TAGLINE,
42
- BETA_VERSION_TARGET,
43
40
  IS_BETA
44
41
  });
package/dist-lib/beta.mjs CHANGED
@@ -1,15 +1,13 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
5
- var BETA_VERSION_TARGET = "1.0.0";
6
5
  var BETA_LABEL = "public beta";
7
- var BETA_TAGLINE = `${BETA_LABEL} \xB7 free until ${BETA_VERSION_TARGET}`;
8
- var BETA_ASK_HEADLINE = "free for everyone until 1.0 \u2014 we send anonymous error and dependency data while you use it";
6
+ var BETA_TAGLINE = BETA_LABEL;
7
+ var BETA_ASK_HEADLINE = "we send anonymous error and dependency data while you use it";
9
8
  export {
10
9
  BETA_ASK_HEADLINE,
11
10
  BETA_LABEL,
12
11
  BETA_TAGLINE,
13
- BETA_VERSION_TARGET,
14
12
  IS_BETA
15
13
  };
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -905,7 +905,7 @@ async function waitForSootsimShellReady(page, timeout = 3e4) {
905
905
  });
906
906
  if (transitionResult?.timedOut === true) {
907
907
  throw new Error(
908
- `sootsim launch transitions timed out: ${JSON.stringify(transitionResult)}`
908
+ `sootsim app launch transitions timed out: ${JSON.stringify(transitionResult)}`
909
909
  );
910
910
  }
911
911
  }
@@ -1625,7 +1625,7 @@ var device = {
1625
1625
  },
1626
1626
  // record the SootSim canvas via the engine's headless recorder
1627
1627
  // (window.__sootsimRecorder — @sootsim/plugin-recording). this is the
1628
- // SAME code path `bun sootsim record video` drives, NOT the rail-button
1628
+ // SAME code path `sootsim record video` drives, NOT the rail-button
1629
1629
  // path (SootSim.bridges.startRecording wires the dialog state machine
1630
1630
  // and never stashes the resulting blob into __sootsimRecorder.lastBlob,
1631
1631
  // which is what getBlobBase64 streams from).
@@ -1655,7 +1655,7 @@ var device = {
1655
1655
  }
1656
1656
  },
1657
1657
  // stop the headless recorder, stream the resulting blob in chunks (same
1658
- // protocol as `bun sootsim record`), and write the webm to outPath.
1658
+ // protocol as `sootsim record`), and write the webm to outPath.
1659
1659
  async stopAndSaveBridgeRecording(outPath) {
1660
1660
  const page = getPage();
1661
1661
  const stopResult = await page.evaluate(async () => {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -193,14 +193,7 @@ async function resolveConnectionInput(input) {
193
193
  const port2 = parseInt(trimmed, 10);
194
194
  const resolved = await probePortBundle(port2);
195
195
  if (resolved) return resolved;
196
- const SHIFT_WINDOW = 3;
197
- for (let offset = 1; offset <= SHIFT_WINDOW; offset++) {
198
- const shifted = await probePortBundle(port2 + offset);
199
- if (shifted) return shifted;
200
- }
201
- throw buildUnresolvedTargetError(
202
- `localhost:${port2} (also scanned +1..+${SHIFT_WINDOW})`
203
- );
196
+ throw buildUnresolvedTargetError(`localhost:${port2}`);
204
197
  }
205
198
  const bundleUrl = trimmed.startsWith("http") ? trimmed : `http://${trimmed}`;
206
199
  let parsed;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -36,6 +36,7 @@ __export(home_paths_exports, {
36
36
  CONFIG_FILE: () => CONFIG_FILE,
37
37
  DAEMON_HEARTBEAT_STALE_MS: () => DAEMON_HEARTBEAT_STALE_MS,
38
38
  DAEMON_LOCKFILE: () => DAEMON_LOCKFILE,
39
+ DEV_BRIDGE_LOCKFILE: () => DEV_BRIDGE_LOCKFILE,
39
40
  SOOTSIM_HOME_ENV: () => SOOTSIM_HOME_ENV,
40
41
  activeRuntimeDir: () => activeRuntimeDir,
41
42
  activeRuntimeFile: () => activeRuntimeFile,
@@ -47,26 +48,31 @@ __export(home_paths_exports, {
47
48
  daemonAppDir: () => daemonAppDir,
48
49
  daemonAppLauncherPath: () => daemonAppLauncherPath,
49
50
  daemonLockfilePath: () => daemonLockfilePath,
51
+ devBridgeLockfilePath: () => devBridgeLockfilePath,
50
52
  electronDir: () => electronDir,
51
53
  electronUserDataDir: () => electronUserDataDir,
52
54
  electronVersionDir: () => electronVersionDir,
53
55
  ensureSootsimHome: () => ensureSootsimHome,
54
56
  isDaemonLockfileFresh: () => isDaemonLockfileFresh,
57
+ isDevBridgeLockfileFresh: () => isDevBridgeLockfileFresh,
55
58
  isDevWorkstation: () => isDevWorkstation,
56
59
  isSootsimDevCheckout: () => isSootsimDevCheckout,
57
60
  listInstalledRuntimes: () => listInstalledRuntimes,
58
61
  profilesDir: () => profilesDir,
59
62
  readActiveRuntime: () => readActiveRuntime,
60
63
  readDaemonLockfile: () => readDaemonLockfile,
64
+ readDevBridgeLockfile: () => readDevBridgeLockfile,
61
65
  readSharedConfig: () => readSharedConfig,
62
66
  readTelemetryEnabled: () => readTelemetryEnabled,
63
67
  removeDaemonLockfile: () => removeDaemonLockfile,
68
+ removeDevBridgeLockfile: () => removeDevBridgeLockfile,
64
69
  runtimeDir: () => runtimeDir,
65
70
  runtimesDir: () => runtimesDir,
66
71
  shouldSkipPersistentDaemon: () => shouldSkipPersistentDaemon,
67
72
  sootsimHomeDir: () => sootsimHomeDir,
68
73
  writeActiveRuntime: () => writeActiveRuntime,
69
74
  writeDaemonLockfile: () => writeDaemonLockfile,
75
+ writeDevBridgeLockfile: () => writeDevBridgeLockfile,
70
76
  writeSharedConfig: () => writeSharedConfig,
71
77
  writeTelemetryEnabled: () => writeTelemetryEnabled
72
78
  });
@@ -77,6 +83,7 @@ var import_node_path = __toESM(require("node:path"), 1);
77
83
  var SOOTSIM_HOME_ENV = "SOOTSIM_HOME";
78
84
  var ACTIVE_RUNTIME_FILE = "active";
79
85
  var DAEMON_LOCKFILE = "daemon.json";
86
+ var DEV_BRIDGE_LOCKFILE = "dev-bridge.json";
80
87
  var CONFIG_FILE = "config.json";
81
88
  var DAEMON_HEARTBEAT_STALE_MS = 3e4;
82
89
  function sootsimHomeDir() {
@@ -141,6 +148,9 @@ function cacheDir() {
141
148
  function daemonLockfilePath() {
142
149
  return import_node_path.default.join(sootsimHomeDir(), DAEMON_LOCKFILE);
143
150
  }
151
+ function devBridgeLockfilePath() {
152
+ return import_node_path.default.join(sootsimHomeDir(), DEV_BRIDGE_LOCKFILE);
153
+ }
144
154
  function configFilePath() {
145
155
  return import_node_path.default.join(sootsimHomeDir(), CONFIG_FILE);
146
156
  }
@@ -253,6 +263,25 @@ function readDaemonLockfile() {
253
263
  return null;
254
264
  }
255
265
  }
266
+ function readDevBridgeLockfile() {
267
+ try {
268
+ const fd = import_node_fs.default.openSync(devBridgeLockfilePath(), "r");
269
+ try {
270
+ const buf = Buffer.alloc(DAEMON_LOCKFILE_MAX_BYTES);
271
+ const bytesRead = import_node_fs.default.readSync(fd, buf, 0, DAEMON_LOCKFILE_MAX_BYTES, 0);
272
+ const raw = buf.subarray(0, bytesRead).toString("utf8");
273
+ const parsed = JSON.parse(raw);
274
+ if (parsed && parsed.schema === 1 && parsed.source === "vite-dev" && typeof parsed.pid === "number" && typeof parsed.bridgePort === "number" && typeof parsed.runtimePort === "number" && typeof parsed.cwd === "string" && typeof parsed.startedAt === "number" && typeof parsed.heartbeatAt === "number") {
275
+ return parsed;
276
+ }
277
+ return null;
278
+ } finally {
279
+ import_node_fs.default.closeSync(fd);
280
+ }
281
+ } catch {
282
+ return null;
283
+ }
284
+ }
256
285
  function isDaemonLockfileFresh(lock, now = Date.now()) {
257
286
  if (!lock) return false;
258
287
  if (now - lock.heartbeatAt > DAEMON_HEARTBEAT_STALE_MS) return false;
@@ -263,6 +292,16 @@ function isDaemonLockfileFresh(lock, now = Date.now()) {
263
292
  return false;
264
293
  }
265
294
  }
295
+ function isDevBridgeLockfileFresh(lock, now = Date.now()) {
296
+ if (!lock) return false;
297
+ if (now - lock.heartbeatAt > DAEMON_HEARTBEAT_STALE_MS) return false;
298
+ try {
299
+ process.kill(lock.pid, 0);
300
+ return true;
301
+ } catch {
302
+ return false;
303
+ }
304
+ }
266
305
  function writeDaemonLockfile(data) {
267
306
  ensureSootsimHome();
268
307
  const tmp = `${daemonLockfilePath()}.tmp`;
@@ -270,6 +309,13 @@ function writeDaemonLockfile(data) {
270
309
  `, "utf8");
271
310
  import_node_fs.default.renameSync(tmp, daemonLockfilePath());
272
311
  }
312
+ function writeDevBridgeLockfile(data) {
313
+ ensureSootsimHome();
314
+ const tmp = `${devBridgeLockfilePath()}.tmp`;
315
+ import_node_fs.default.writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
316
+ `, "utf8");
317
+ import_node_fs.default.renameSync(tmp, devBridgeLockfilePath());
318
+ }
273
319
  function claimDaemonLockfile(data) {
274
320
  ensureSootsimHome();
275
321
  const existing = readDaemonLockfile();
@@ -285,12 +331,19 @@ function removeDaemonLockfile() {
285
331
  } catch {
286
332
  }
287
333
  }
334
+ function removeDevBridgeLockfile() {
335
+ try {
336
+ import_node_fs.default.unlinkSync(devBridgeLockfilePath());
337
+ } catch {
338
+ }
339
+ }
288
340
  // Annotate the CommonJS export names for ESM import in node:
289
341
  0 && (module.exports = {
290
342
  ACTIVE_RUNTIME_FILE,
291
343
  CONFIG_FILE,
292
344
  DAEMON_HEARTBEAT_STALE_MS,
293
345
  DAEMON_LOCKFILE,
346
+ DEV_BRIDGE_LOCKFILE,
294
347
  SOOTSIM_HOME_ENV,
295
348
  activeRuntimeDir,
296
349
  activeRuntimeFile,
@@ -302,26 +355,31 @@ function removeDaemonLockfile() {
302
355
  daemonAppDir,
303
356
  daemonAppLauncherPath,
304
357
  daemonLockfilePath,
358
+ devBridgeLockfilePath,
305
359
  electronDir,
306
360
  electronUserDataDir,
307
361
  electronVersionDir,
308
362
  ensureSootsimHome,
309
363
  isDaemonLockfileFresh,
364
+ isDevBridgeLockfileFresh,
310
365
  isDevWorkstation,
311
366
  isSootsimDevCheckout,
312
367
  listInstalledRuntimes,
313
368
  profilesDir,
314
369
  readActiveRuntime,
315
370
  readDaemonLockfile,
371
+ readDevBridgeLockfile,
316
372
  readSharedConfig,
317
373
  readTelemetryEnabled,
318
374
  removeDaemonLockfile,
375
+ removeDevBridgeLockfile,
319
376
  runtimeDir,
320
377
  runtimesDir,
321
378
  shouldSkipPersistentDaemon,
322
379
  sootsimHomeDir,
323
380
  writeActiveRuntime,
324
381
  writeDaemonLockfile,
382
+ writeDevBridgeLockfile,
325
383
  writeSharedConfig,
326
384
  writeTelemetryEnabled
327
385
  });
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -421,10 +421,8 @@ async function probePort(port, buildIconProxyUrl) {
421
421
  return null;
422
422
  }
423
423
  function isSootSelfServer(server) {
424
- const projectName = server.projectName?.trim().toLowerCase();
425
- if (projectName === "soot" || projectName === "sootsim") return true;
426
424
  const bundleId = server.bundleId?.trim().toLowerCase();
427
- if (bundleId?.startsWith("dev.soot")) return true;
425
+ if (bundleId?.startsWith("dev.sootsim.")) return true;
428
426
  return false;
429
427
  }
430
428
  var portCache = /* @__PURE__ */ new Map();
@@ -545,6 +543,7 @@ var import_node_path = __toESM(require("node:path"), 1);
545
543
  var SOOTSIM_HOME_ENV = "SOOTSIM_HOME";
546
544
  var ACTIVE_RUNTIME_FILE = "active";
547
545
  var DAEMON_LOCKFILE = "daemon.json";
546
+ var DEV_BRIDGE_LOCKFILE = "dev-bridge.json";
548
547
  var CONFIG_FILE = "config.json";
549
548
  var DAEMON_HEARTBEAT_STALE_MS = 3e4;
550
549
  function sootsimHomeDir() {
@@ -576,6 +575,9 @@ function cacheDir() {
576
575
  function daemonLockfilePath() {
577
576
  return import_node_path.default.join(sootsimHomeDir(), DAEMON_LOCKFILE);
578
577
  }
578
+ function devBridgeLockfilePath() {
579
+ return import_node_path.default.join(sootsimHomeDir(), DEV_BRIDGE_LOCKFILE);
580
+ }
579
581
  function configFilePath() {
580
582
  return import_node_path.default.join(sootsimHomeDir(), CONFIG_FILE);
581
583
  }
@@ -699,6 +701,13 @@ function writeDaemonLockfile(data) {
699
701
  `, "utf8");
700
702
  import_node_fs2.default.renameSync(tmp, daemonLockfilePath());
701
703
  }
704
+ function writeDevBridgeLockfile(data) {
705
+ ensureSootsimHome();
706
+ const tmp = `${devBridgeLockfilePath()}.tmp`;
707
+ import_node_fs2.default.writeFileSync(tmp, `${JSON.stringify(data, null, 2)}
708
+ `, "utf8");
709
+ import_node_fs2.default.renameSync(tmp, devBridgeLockfilePath());
710
+ }
702
711
  function claimDaemonLockfile(data) {
703
712
  ensureSootsimHome();
704
713
  const existing = readDaemonLockfile();
@@ -714,6 +723,12 @@ function removeDaemonLockfile() {
714
723
  } catch {
715
724
  }
716
725
  }
726
+ function removeDevBridgeLockfile() {
727
+ try {
728
+ import_node_fs2.default.unlinkSync(devBridgeLockfilePath());
729
+ } catch {
730
+ }
731
+ }
717
732
 
718
733
  // src/runtime-delivery.ts
719
734
  var import_child_process2 = require("child_process");
@@ -2806,10 +2821,12 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
2806
2821
  maxConcurrentAutomationSims;
2807
2822
  automationSimActiveGraceMs;
2808
2823
  shouldWriteLockfile;
2824
+ shouldWriteDevLockfile;
2809
2825
  sootbeanOrigin = null;
2810
2826
  effectivePort = 0;
2811
2827
  startedAt = 0;
2812
2828
  heartbeatTimer = null;
2829
+ devHeartbeatTimer = null;
2813
2830
  // ws-level heartbeat: sims that hang up uncleanly (page navigated, network
2814
2831
  // dropped, sim crashed) leave their server-side WebSocket sitting "open"
2815
2832
  // forever. ping every WS_HEARTBEAT_INTERVAL_MS; if the previous round's
@@ -2836,6 +2853,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
2836
2853
  this.preferredPort = opts.port || DEFAULT_SOOTSIM_BRIDGE_PORT;
2837
2854
  this.port = this.preferredPort;
2838
2855
  this.shouldWriteLockfile = opts.writeLockfile === true;
2856
+ this.shouldWriteDevLockfile = opts.writeDevLockfile === true;
2839
2857
  this.portFallbackCount = Math.max(1, opts.portFallbackCount ?? 10);
2840
2858
  this.openUrlHandler = opts.openUrl;
2841
2859
  this.agentHost = new AgentHost({ getExcludePorts: opts.agentScanExcludes });
@@ -3353,7 +3371,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
3353
3371
  });
3354
3372
  });
3355
3373
  }
3356
- /** after a successful bind: start the cli idle sweep, write the daemon
3374
+ /** after a successful bind: start the cli idle sweep, write the daemon/dev
3357
3375
  * lockfile (if this host owns it), seed the agent host, kick off the
3358
3376
  * heartbeat loop. idempotent across rebinds because close() tears down
3359
3377
  * every timer and the lockfile. */
@@ -3395,6 +3413,23 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
3395
3413
  this.heartbeatTimer.unref();
3396
3414
  this.startRuntimeUpdater();
3397
3415
  }
3416
+ if (this.shouldWriteDevLockfile) {
3417
+ try {
3418
+ this.writeDevLockfileSnapshot();
3419
+ } catch (err) {
3420
+ process.stderr.write(
3421
+ `ws bridge failed to write dev bridge lockfile: ${String(err)}
3422
+ `
3423
+ );
3424
+ }
3425
+ this.devHeartbeatTimer = setInterval(() => {
3426
+ try {
3427
+ this.writeDevLockfileSnapshot();
3428
+ } catch {
3429
+ }
3430
+ }, DAEMON_HEARTBEAT_INTERVAL_MS);
3431
+ this.devHeartbeatTimer.unref();
3432
+ }
3398
3433
  void this.agentHost.seedOnBoot();
3399
3434
  }
3400
3435
  bootstrapping = true;
@@ -3412,9 +3447,25 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
3412
3447
  bootstrapping: this.bootstrapping
3413
3448
  };
3414
3449
  }
3450
+ buildDevLockfileSnapshot() {
3451
+ return {
3452
+ schema: 1,
3453
+ pid: process.pid,
3454
+ platform: process.platform,
3455
+ bridgePort: this.effectivePort,
3456
+ runtimePort: this.effectivePort,
3457
+ cwd: process.cwd(),
3458
+ startedAt: this.startedAt,
3459
+ heartbeatAt: Date.now(),
3460
+ source: "vite-dev"
3461
+ };
3462
+ }
3415
3463
  writeLockfileSnapshot() {
3416
3464
  writeDaemonLockfile(this.buildLockfileSnapshot());
3417
3465
  }
3466
+ writeDevLockfileSnapshot() {
3467
+ writeDevBridgeLockfile(this.buildDevLockfileSnapshot());
3468
+ }
3418
3469
  refreshActiveRuntime() {
3419
3470
  this.activeRuntimeVersion = readActiveRuntime();
3420
3471
  this.activeRuntimeDirPath = activeRuntimeDir();
@@ -3650,6 +3701,7 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
3650
3701
  bridgePort: this.effectivePort,
3651
3702
  runtimePort: this.effectivePort,
3652
3703
  activeRuntime: this.activeRuntimeVersion,
3704
+ bridgeSource: this.shouldWriteDevLockfile ? "vite-dev" : this.shouldWriteLockfile ? "daemon" : "embedded",
3653
3705
  startedAt: this.startedAt,
3654
3706
  uptimeMs: this.startedAt > 0 ? Date.now() - this.startedAt : 0
3655
3707
  })
@@ -4031,6 +4083,10 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
4031
4083
  clearInterval(this.heartbeatTimer);
4032
4084
  this.heartbeatTimer = null;
4033
4085
  }
4086
+ if (this.devHeartbeatTimer) {
4087
+ clearInterval(this.devHeartbeatTimer);
4088
+ this.devHeartbeatTimer = null;
4089
+ }
4034
4090
  if (this.wsHeartbeatTimer) {
4035
4091
  clearInterval(this.wsHeartbeatTimer);
4036
4092
  this.wsHeartbeatTimer = null;
@@ -4045,6 +4101,12 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
4045
4101
  } catch {
4046
4102
  }
4047
4103
  }
4104
+ if (this.shouldWriteDevLockfile) {
4105
+ try {
4106
+ removeDevBridgeLockfile();
4107
+ } catch {
4108
+ }
4109
+ }
4048
4110
  this.effectivePort = 0;
4049
4111
  this.startedAt = 0;
4050
4112
  this.agentHost.close();
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -78,7 +78,7 @@ function readActiveRuntime() {
78
78
  var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
79
79
 
80
80
  // src/runtime-assets.ts
81
- var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[sootsim] no engine runtime installed \u2014 run `sootsim setup-repo` in your project, or `sootsim runtime install`";
81
+ var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[sootsim] no engine runtime installed \u2014 run `sootsim setup`, or `sootsim runtime install`";
82
82
  var MIME_TYPES = {
83
83
  ".js": "application/javascript",
84
84
  ".mjs": "application/javascript",
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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.169 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.170 | (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;
@@ -74,7 +74,7 @@ function readActiveRuntime() {
74
74
  var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
75
75
 
76
76
  // src/runtime-assets.ts
77
- var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[sootsim] no engine runtime installed \u2014 run `sootsim setup-repo` in your project, or `sootsim runtime install`";
77
+ var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[sootsim] no engine runtime installed \u2014 run `sootsim setup`, or `sootsim runtime install`";
78
78
  var MIME_TYPES = {
79
79
  ".js": "application/javascript",
80
80
  ".mjs": "application/javascript",