sootsim 0.1.164 → 0.1.166

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 (166) hide show
  1. package/README.md +7 -0
  2. package/dist-cli/bin.js +3 -3
  3. package/dist-cli/chunks/{agent-5PVW4KHZ.js → agent-C2HTMDLW.js} +2 -2
  4. package/dist-cli/chunks/{agent-wrapper-REXQODXV.js → agent-wrapper-EE2BNDAQ.js} +2 -2
  5. package/dist-cli/chunks/{app-fonts-XAXAUEB5.js → app-fonts-5JUWVRIA.js} +2 -2
  6. package/dist-cli/chunks/{assert-QDOO5I6J.js → assert-KF2OHBES.js} +2 -2
  7. package/dist-cli/chunks/auto-bootstrap-ITBEBASC.js +2 -0
  8. package/dist-cli/chunks/beta-FUBQGOA5.js +2 -0
  9. package/dist-cli/chunks/{camera-VUJYI6SX.js → camera-L2DDKMHH.js} +2 -2
  10. package/dist-cli/chunks/{chunk-3VE6THTL.js → chunk-2TE65ODE.js} +1 -1
  11. package/dist-cli/chunks/chunk-3CTBL6ST.js +1 -0
  12. package/dist-cli/chunks/chunk-4SYV3YPR.js +4 -0
  13. package/dist-cli/chunks/{chunk-XFJGEFTK.js → chunk-6OOIOB2X.js} +3 -3
  14. package/dist-cli/chunks/{chunk-TFB7NU6N.js → chunk-7534S5IR.js} +1 -1
  15. package/dist-cli/chunks/{chunk-6RAT7QRJ.js → chunk-7RFYWPAN.js} +1 -1
  16. package/dist-cli/chunks/chunk-B47GJVB3.js +3 -0
  17. package/dist-cli/chunks/{chunk-LJUGD5H3.js → chunk-BFEM7E4T.js} +2 -2
  18. package/dist-cli/chunks/{chunk-7UZSNS5H.js → chunk-C7KANC2Z.js} +2 -2
  19. package/dist-cli/chunks/{chunk-46J7FLJB.js → chunk-D3GGZIBS.js} +5 -4
  20. package/dist-cli/chunks/{chunk-ZE2PAAZW.js → chunk-EFCPQBFY.js} +1 -1
  21. package/dist-cli/chunks/{chunk-LN5AJIPO.js → chunk-F4FR47MS.js} +3 -3
  22. package/dist-cli/chunks/chunk-FEWTUTZE.js +1 -0
  23. package/dist-cli/chunks/chunk-FLDFTC6A.js +27 -0
  24. package/dist-cli/chunks/chunk-GS6OBVQR.js +1 -0
  25. package/dist-cli/chunks/{chunk-J6TNRMST.js → chunk-H52Z73AU.js} +2 -2
  26. package/dist-cli/chunks/{chunk-RHWMAYGO.js → chunk-HHMW6MXX.js} +2 -2
  27. package/dist-cli/chunks/{chunk-PQMXEPA5.js → chunk-HNZF4VNH.js} +1 -1
  28. package/dist-cli/chunks/{chunk-R4K3EZQP.js → chunk-ITF7FOSZ.js} +1 -1
  29. package/dist-cli/chunks/{chunk-422J3RDX.js → chunk-ITJSVY3L.js} +2 -2
  30. package/dist-cli/chunks/{chunk-SG5ONZJA.js → chunk-J7FYMPIN.js} +1 -1
  31. package/dist-cli/chunks/{chunk-YDZJR4M3.js → chunk-JXHFW3SD.js} +1 -1
  32. package/dist-cli/chunks/{chunk-T6VPZ5ES.js → chunk-KCP7TTSW.js} +2 -2
  33. package/dist-cli/chunks/chunk-LIYFRTZG.js +2 -0
  34. package/dist-cli/chunks/{chunk-JNC5ZO7K.js → chunk-LOGFVSIT.js} +1 -1
  35. package/dist-cli/chunks/{chunk-AZMD3HP3.js → chunk-LSDWJEFJ.js} +2 -2
  36. package/dist-cli/chunks/{chunk-TDPLTM27.js → chunk-M77N57QN.js} +1 -1
  37. package/dist-cli/chunks/{chunk-53DOSJFQ.js → chunk-MC5ENPQM.js} +2 -2
  38. package/dist-cli/chunks/{chunk-FUD4ZCJ2.js → chunk-MPJ2W2JQ.js} +1 -1
  39. package/dist-cli/chunks/{chunk-2QMMSZ4Z.js → chunk-O3PHDVRF.js} +2 -2
  40. package/dist-cli/chunks/chunk-OIVSYUZ4.js +5 -0
  41. package/dist-cli/chunks/{chunk-YJ3CJUUU.js → chunk-OY57XV3X.js} +2 -2
  42. package/dist-cli/chunks/{chunk-4PJLRB36.js → chunk-OYY6EJM7.js} +2 -2
  43. package/dist-cli/chunks/chunk-QIPSGUG7.js +13 -0
  44. package/dist-cli/chunks/{chunk-3C3MA5ZZ.js → chunk-R3YXB2EL.js} +2 -2
  45. package/dist-cli/chunks/{chunk-AXSNLS34.js → chunk-S2MAMEQX.js} +1 -1
  46. package/dist-cli/chunks/{chunk-XHNXDUYR.js → chunk-S4DTM5EZ.js} +23 -13
  47. package/dist-cli/chunks/chunk-SBMHSZXI.js +119 -0
  48. package/dist-cli/chunks/{chunk-PGN2263R.js → chunk-USUANHKD.js} +2 -2
  49. package/dist-cli/chunks/{chunk-4V6DKD5E.js → chunk-V6OGDC6H.js} +1 -1
  50. package/dist-cli/chunks/{chunk-NKAWHNJR.js → chunk-VKAJ6AJC.js} +1 -1
  51. package/dist-cli/chunks/{chunk-E5KU4NBO.js → chunk-VS5TCZSA.js} +6 -6
  52. package/dist-cli/chunks/{chunk-ZUYTGVNA.js → chunk-WCJQSVYO.js} +1 -1
  53. package/dist-cli/chunks/{chunk-2U5VK6PG.js → chunk-WPJGFVZ5.js} +2 -2
  54. package/dist-cli/chunks/{chunk-YBO4Z43H.js → chunk-Y6RN5IR4.js} +1 -1
  55. package/dist-cli/chunks/{chunk-EOQBPXIN.js → chunk-Y7PCKIZD.js} +2 -2
  56. package/dist-cli/chunks/cli-version-7JACJRBF.js +2 -0
  57. package/dist-cli/chunks/{compat-UKAJB7JZ.js → compat-SSS76KYC.js} +3 -3
  58. package/dist-cli/chunks/{config-MTGWPMUR.js → config-6HJMGQPE.js} +2 -2
  59. package/dist-cli/chunks/control-X3X6VYUC.js +2 -0
  60. package/dist-cli/chunks/{cpu-profile-4GAXCXJO.js → cpu-profile-UQKTGYR7.js} +2 -2
  61. package/dist-cli/chunks/daemon-XSH6YITB.js +67 -0
  62. package/dist-cli/chunks/{debug-MKV3W32U.js → debug-UCOOENBO.js} +3 -3
  63. package/dist-cli/chunks/{detox-PHFTGHRM.js → detox-BJP2O7XH.js} +2 -2
  64. package/dist-cli/chunks/{device-ACKEFGW6.js → device-CVN2YZJF.js} +2 -2
  65. package/dist-cli/chunks/{diagnose-TSP4DCH2.js → diagnose-7XEK27S3.js} +2 -2
  66. package/dist-cli/chunks/drivers-JQ5QIRRE.js +2 -0
  67. package/dist-cli/chunks/{electron-N7KR775O.js → electron-4HYAKJ2I.js} +3 -3
  68. package/dist-cli/chunks/flow-YTT2UHCY.js +2 -0
  69. package/dist-cli/chunks/help-C4GBFKLP.js +2 -0
  70. package/dist-cli/chunks/{hints-6IYSDQA3.js → hints-DWCFCVNT.js} +2 -2
  71. package/dist-cli/chunks/{home-paths-5P4PDEPL.js → home-paths-V6KYK6EL.js} +2 -2
  72. package/dist-cli/chunks/{inspect-F6KLATMN.js → inspect-TCCQEJHM.js} +3 -3
  73. package/dist-cli/chunks/install-EN2VEO4H.js +2 -0
  74. package/dist-cli/chunks/{install-desktop-65COOWJC.js → install-desktop-2YKS5HAY.js} +3 -3
  75. package/dist-cli/chunks/{keys-2RI5OCTX.js → keys-GQWGTUBQ.js} +2 -2
  76. package/dist-cli/chunks/{launch-JKAX6AOP.js → launch-26WSX7AZ.js} +3 -3
  77. package/dist-cli/chunks/{login-CD2MYGGF.js → login-TD7H5EDV.js} +4 -4
  78. package/dist-cli/chunks/{logout-2SPZSYJD.js → logout-6ARTPVDG.js} +2 -2
  79. package/dist-cli/chunks/{maestro-B4XYYVZV.js → maestro-DPZQ34MP.js} +2 -2
  80. package/dist-cli/chunks/optional-demo-registry-J65S4L7Y.js +2 -0
  81. package/dist-cli/chunks/{preview-YWXGWAZR.js → preview-RFQX4EDS.js} +2 -2
  82. package/dist-cli/chunks/{profile-YPKBHJOK.js → profile-RCTOBUDR.js} +2 -2
  83. package/dist-cli/chunks/{react-NNFPIW6R.js → react-ECJL6YMK.js} +2 -2
  84. package/dist-cli/chunks/{record-JGTPXRTW.js → record-3UMKAJKA.js} +4 -4
  85. package/dist-cli/chunks/runtime-GPY6OO6J.js +2 -0
  86. package/dist-cli/chunks/runtime-delivery-F4P6KJZM.js +2 -0
  87. package/dist-cli/chunks/{screenshot-RF55R7LF.js → screenshot-N2UGTFR3.js} +2 -2
  88. package/dist-cli/chunks/{screenshot-mode-X76SGXYB.js → screenshot-mode-OAMJJM3R.js} +2 -2
  89. package/dist-cli/chunks/{screenshots-FVO7MYFJ.js → screenshots-WRE3VRYN.js} +2 -2
  90. package/dist-cli/chunks/{server-BGZ2S4NF.js → server-6CLFPGMH.js} +3 -3
  91. package/dist-cli/chunks/setup-repo-2FQX6VMQ.js +2 -0
  92. package/dist-cli/chunks/{skills-DH5NOT3N.js → skills-HO4NIDC3.js} +2 -2
  93. package/dist-cli/chunks/{slides-CXQMYD3P.js → slides-PJ3DY3WK.js} +2 -2
  94. package/dist-cli/chunks/{start-6AZUCGBI.js → start-P2UWHC5R.js} +4 -4
  95. package/dist-cli/chunks/store-KUJUGFQQ.js +2 -0
  96. package/dist-cli/chunks/telemetry-ZD3GGZT5.js +2 -0
  97. package/dist-cli/chunks/{test-WEATIZNI.js → test-WV2CC6VE.js} +3 -3
  98. package/dist-cli/chunks/{three-mode-ZPRCTDNM.js → three-mode-BLBIUFK7.js} +2 -2
  99. package/dist-cli/chunks/{timeline-AA7E4QQF.js → timeline-T7DCGGXA.js} +2 -2
  100. package/dist-cli/chunks/{upgrade-O3HVW3U3.js → upgrade-MDJCUJG3.js} +2 -2
  101. package/dist-cli/chunks/upload-DBW7W7BM.js +2 -0
  102. package/dist-cli/chunks/version-LPLNI3HW.js +4 -0
  103. package/dist-cli/chunks/{web-VODHXXG7.js → web-BQYICLPD.js} +2 -2
  104. package/dist-cli/chunks/{what-happened-6KGU7OQL.js → what-happened-7QAYQKHI.js} +2 -2
  105. package/dist-cli/chunks/{whoami-4FBBNV5W.js → whoami-3PLHCC2N.js} +2 -2
  106. package/dist-lib/agent-daemon-client.cjs +1 -1
  107. package/dist-lib/agent-events.cjs +1 -1
  108. package/dist-lib/agent-sessions.cjs +1 -1
  109. package/dist-lib/attached-projects.cjs +1 -1
  110. package/dist-lib/auth/shared-session.cjs +1 -1
  111. package/dist-lib/backend-origin.cjs +1 -1
  112. package/dist-lib/beta.cjs +1 -1
  113. package/dist-lib/beta.mjs +1 -1
  114. package/dist-lib/bridge-constants.cjs +1 -1
  115. package/dist-lib/cli-constants.cjs +1 -1
  116. package/dist-lib/config.cjs +1 -1
  117. package/dist-lib/detox/index.cjs +1 -1
  118. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  119. package/dist-lib/home-paths.cjs +1 -1
  120. package/dist-lib/host/bridge-host.cjs +1 -1
  121. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  122. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  123. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  124. package/dist-lib/host/websocket-proxy.cjs +1 -1
  125. package/dist-lib/index.cjs +1 -1
  126. package/dist-lib/menu.cjs +1 -1
  127. package/dist-lib/menu.mjs +1 -1
  128. package/dist-lib/metro.cjs +1 -1
  129. package/dist-lib/profiles.cjs +1 -1
  130. package/dist-lib/render-mode.cjs +1 -1
  131. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  132. package/dist-lib/sdk.cjs +1 -1
  133. package/dist-lib/sdk.mjs +1 -1
  134. package/dist-lib/skills.cjs +1 -1
  135. package/dist-lib/vite.cjs +1 -1
  136. package/package.json +4 -2
  137. package/scripts/preuninstall.cjs +118 -0
  138. package/src/native-dev-bundle-url.ts +22 -0
  139. package/src/runtime-delivery.ts +6 -99
  140. package/dist-cli/chunks/auto-bootstrap-PAA3FSVB.js +0 -2
  141. package/dist-cli/chunks/beta-5ICQFWFG.js +0 -2
  142. package/dist-cli/chunks/chunk-36HXTKWO.js +0 -5
  143. package/dist-cli/chunks/chunk-CBKH2EZL.js +0 -4
  144. package/dist-cli/chunks/chunk-HAP45V4J.js +0 -13
  145. package/dist-cli/chunks/chunk-JTWMHYRS.js +0 -1
  146. package/dist-cli/chunks/chunk-PYX7POQN.js +0 -33
  147. package/dist-cli/chunks/chunk-Q2IYU4KK.js +0 -2
  148. package/dist-cli/chunks/chunk-SSTIFD3Y.js +0 -119
  149. package/dist-cli/chunks/chunk-U2Z32HGJ.js +0 -1
  150. package/dist-cli/chunks/chunk-VEQNMRGS.js +0 -1
  151. package/dist-cli/chunks/chunk-ZCPGEUMM.js +0 -3
  152. package/dist-cli/chunks/cli-version-4TLMMPH2.js +0 -2
  153. package/dist-cli/chunks/control-5FU4OLTE.js +0 -2
  154. package/dist-cli/chunks/daemon-VYP6PWR2.js +0 -67
  155. package/dist-cli/chunks/drivers-SDO5XDCT.js +0 -2
  156. package/dist-cli/chunks/flow-3NGH6OZO.js +0 -2
  157. package/dist-cli/chunks/help-ZKCJG65K.js +0 -2
  158. package/dist-cli/chunks/install-6EKDNJOM.js +0 -2
  159. package/dist-cli/chunks/optional-demo-registry-OBP5WLPI.js +0 -2
  160. package/dist-cli/chunks/runtime-D4T7CD4H.js +0 -2
  161. package/dist-cli/chunks/runtime-delivery-DN7LYYY6.js +0 -2
  162. package/dist-cli/chunks/setup-repo-FNIP3MNA.js +0 -2
  163. package/dist-cli/chunks/store-VWLWKCQT.js +0 -2
  164. package/dist-cli/chunks/telemetry-7C5WB6PU.js +0 -2
  165. package/dist-cli/chunks/upload-DQBOMRID.js +0 -2
  166. package/dist-cli/chunks/version-M2DLT2IX.js +0 -4
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.164 | (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-YDZJR4M3.js";import{c as N,e as F}from"./chunk-T6VPZ5ES.js";import{b as k}from"./chunk-3VE6THTL.js";import"./chunk-ZUYTGVNA.js";import"./chunk-4V6DKD5E.js";import"./chunk-TDPLTM27.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.166 | (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-JXHFW3SD.js";import{c as N,e as F}from"./chunk-KCP7TTSW.js";import"./chunk-WCJQSVYO.js";import{b as k}from"./chunk-2TE65ODE.js";import"./chunk-V6OGDC6H.js";import"./chunk-M77N57QN.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(`
3
3
  sootsim what-happened \u2014 show recent events from the semantic timeline
4
4
 
5
5
  usage:
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-J6TNRMST.js";import{d as n}from"./chunk-EOQBPXIN.js";import"./chunk-4V6DKD5E.js";import"./chunk-TDPLTM27.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.166 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-H52Z73AU.js";import{d as n}from"./chunk-Y7PCKIZD.js";import"./chunk-V6OGDC6H.js";import"./chunk-M77N57QN.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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/beta.ts
4
4
  var IS_BETA = true;
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // cli/commands/inspect/core.ts
4
4
  function resolveMaxMsFlag(args, fallbackMs) {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.166 | (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.164",
3
+ "version": "0.1.166",
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",
@@ -136,6 +136,7 @@
136
136
  "scripts/optional-demo-registry.ts",
137
137
  "detox/",
138
138
  "scripts/postinstall.cjs",
139
+ "scripts/preuninstall.cjs",
139
140
  "README.md",
140
141
  "LICENSE"
141
142
  ],
@@ -144,7 +145,8 @@
144
145
  "build:cli": "bun scripts/build-cli.ts",
145
146
  "build:cli-binary": "bun scripts/build-cli-binary.ts",
146
147
  "pack:smoke": "bun scripts/pack-smoke.ts",
147
- "postinstall": "node ./scripts/postinstall.cjs"
148
+ "postinstall": "node ./scripts/postinstall.cjs",
149
+ "preuninstall": "node ./scripts/preuninstall.cjs"
148
150
  },
149
151
  "dependencies": {
150
152
  "ws": "^8.18.0"
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ // preuninstall — runs before `npm rm -g sootsim` actually removes the bin.
3
+ //
4
+ // without this hook the user is left with a 79MB ghost: a launchd/systemd
5
+ // service still ENABLED + actively running (with ExecStart pointing at the
6
+ // now-missing binary), ~/.sootsim/ (cache + runtimes + electron + profiles +
7
+ // daemon.json), and the user's first instinct (`sootsim daemon uninstall`)
8
+ // is gone with the package. so we tear it all down here, while the bin still
9
+ // exists.
10
+ //
11
+ // reliability: npm preuninstall hooks are best-effort — they don't fire when
12
+ // the package wasn't installed by npm (yarn/bun/pnpm have their own lifecycle
13
+ // rules), and they don't run as part of `npm cache verify` cleanup or manual
14
+ // dir removal. that's why we also document `sootsim daemon uninstall` as the
15
+ // manual fallback and show a hint pointing at it.
16
+ //
17
+ // strategy: spawn the bundled bin to run `daemon uninstall` (single source of
18
+ // truth — the same logic the user invokes manually). if that fails for any
19
+ // reason — node version mismatch, the bin already removed by a previous
20
+ // half-completed run, missing $HOME — do a best-effort raw fs cleanup so the
21
+ // machine isn't left in a broken state.
22
+
23
+ const { spawnSync } = require('child_process')
24
+ const fs = require('fs')
25
+ const os = require('os')
26
+ const path = require('path')
27
+
28
+ if (process.env.SOOTSIM_SKIP_PREUNINSTALL === '1') {
29
+ process.exit(0)
30
+ }
31
+
32
+ // dev / workspace installs (running inside the soot monorepo, not in a
33
+ // node_modules tree) — don't tear anything down. the developer is rebuilding
34
+ // the workspace, not actually uninstalling.
35
+ const pkgDir = path.resolve(__dirname, '..')
36
+ if (!pkgDir.includes(`${path.sep}node_modules${path.sep}`)) {
37
+ process.exit(0)
38
+ }
39
+
40
+ // skipped under sudo for the same reason as postinstall: $HOME would be /root,
41
+ // but the user who needs cleanup is the one who installed sootsim. they can
42
+ // run `sootsim daemon uninstall` themselves before `sudo npm rm -g sootsim`
43
+ // to clean their own home.
44
+ const isRoot = typeof process.getuid === 'function' && process.getuid() === 0
45
+ if (isRoot && process.env.SUDO_USER) {
46
+ console.log(
47
+ 'sootsim: preuninstall skipped under sudo — run `sootsim daemon uninstall` ' +
48
+ 'as your user first to remove ~/.sootsim and the bridge daemon',
49
+ )
50
+ process.exit(0)
51
+ }
52
+
53
+ const bin = path.join(pkgDir, 'dist-cli', 'bin.js')
54
+ let unifiedOk = false
55
+ if (fs.existsSync(bin)) {
56
+ const res = spawnSync(process.execPath, [bin, 'daemon', 'uninstall'], {
57
+ stdio: 'inherit',
58
+ timeout: 30_000,
59
+ })
60
+ unifiedOk = res.status === 0
61
+ }
62
+
63
+ if (!unifiedOk) {
64
+ // raw fallback. mirrors teardownDaemonService + teardownSootsimHome from
65
+ // cli/commands/daemon.ts. idempotent: each entry is checked before remove.
66
+ console.log('sootsim: bin path failed — running raw cleanup fallback')
67
+ rawCleanup()
68
+ }
69
+
70
+ process.exit(0)
71
+
72
+ function rawCleanup() {
73
+ const home = sootsimHomeDir()
74
+ if (process.platform === 'darwin') {
75
+ safeSpawn('launchctl', ['bootout', `gui/${getuid()}/dev.sootsim.daemon`])
76
+ safeSpawn('launchctl', ['bootout', `gui/${getuid()}/dev.sootsim.server`])
77
+ safeRemove(path.join(os.homedir(), 'Library/LaunchAgents/dev.sootsim.daemon.plist'))
78
+ safeRemove(path.join(os.homedir(), 'Library/LaunchAgents/dev.sootsim.server.plist'))
79
+ safeRemove(path.join(os.homedir(), 'Library/Logs/sootsim'), {
80
+ recursive: true,
81
+ })
82
+ } else if (process.platform === 'linux') {
83
+ safeSpawn('systemctl', ['--user', 'disable', '--now', 'sootsim-server'])
84
+ safeSpawn('systemctl', ['--user', 'daemon-reload'])
85
+ safeSpawn('systemctl', ['--user', 'reset-failed', 'sootsim-server'])
86
+ safeRemove(path.join(os.homedir(), '.config/systemd/user/sootsim-server.service'))
87
+ safeRemove(path.join(os.homedir(), '.local/state/sootsim'), { recursive: true })
88
+ }
89
+ // ~/.sootsim is the same on every platform; honor $SOOTSIM_HOME.
90
+ safeRemove(home, { recursive: true })
91
+ }
92
+
93
+ function sootsimHomeDir() {
94
+ const env = process.env.SOOTSIM_HOME
95
+ if (env && env.length > 0) return path.resolve(env)
96
+ return path.join(os.homedir(), '.sootsim')
97
+ }
98
+
99
+ function safeRemove(p, opts) {
100
+ try {
101
+ if (fs.existsSync(p)) {
102
+ fs.rmSync(p, { force: true, ...(opts || {}) })
103
+ console.log(` removed ${p}`)
104
+ }
105
+ } catch (err) {
106
+ console.log(` could not remove ${p}: ${err && err.message}`)
107
+ }
108
+ }
109
+
110
+ function safeSpawn(cmd, args) {
111
+ try {
112
+ spawnSync(cmd, args, { stdio: 'ignore' })
113
+ } catch {}
114
+ }
115
+
116
+ function getuid() {
117
+ return typeof process.getuid === 'function' ? process.getuid() : 0
118
+ }
@@ -60,3 +60,25 @@ export function normalizeNativeDevBundleUrl(bundleUrl: string): string {
60
60
  return bundleUrl
61
61
  }
62
62
  }
63
+
64
+ // explicit override used by `sootsim open` to flip metro's `hot` query when
65
+ // the caller knows their context: interactive opens want `hot=true` so metro
66
+ // includes its HMR/react-refresh runtime in the bundle prelude and pushes
67
+ // edits as `update` events; `--driver playwright` / agent-test runs want
68
+ // `hot=false` for deterministic e2e (no in-bundle refresh wiring, no
69
+ // background ws). normalizeNativeDevBundleUrl deliberately preserves
70
+ // whatever value the launchAsset URL carries so metro's bundle cache is
71
+ // shared with real iOS sims; this helper is the one place that breaks that
72
+ // rule on purpose. non-`.bundle` paths pass through unchanged.
73
+ export function applyHotMode(bundleUrl: string, hot: boolean): string {
74
+ try {
75
+ const isAbsolute = isAbsoluteHttpUrl(bundleUrl)
76
+ const parsed = new URL(bundleUrl, 'http://soot.local')
77
+ if (!isNativeDevBundlePath(parsed.pathname)) return bundleUrl
78
+ parsed.searchParams.set('hot', hot ? 'true' : 'false')
79
+ if (isAbsolute) return parsed.toString()
80
+ return `${parsed.pathname}${parsed.search}${parsed.hash}`
81
+ } catch {
82
+ return bundleUrl
83
+ }
84
+ }
@@ -34,50 +34,12 @@ export interface RuntimeManifest {
34
34
  versions: Record<string, RuntimeManifestVersion>
35
35
  }
36
36
 
37
- // --- release notes (the sootsim changelog) ----------------------------------
38
- // written by scripts/changelog/generate.ts (product: sootsim), stored at
39
- // changelog/sootsim.json in R2 and served at /api/changelog/sootsim. this is
40
- // the changelog history, kept separate from the install manifest (which pruning
41
- // trims to a single version). consumed read-only here + on the website.
42
-
43
- export interface RuntimeReleaseNoteItem {
44
- /** LLM-condensed proper-case one-liner. */
45
- summary: string
46
- scope?: string
47
- hash: string
48
- breaking?: boolean
49
- }
50
-
51
- export interface RuntimeReleaseSection {
52
- kind: 'breaking' | 'features' | 'fixes' | 'performance' | 'other'
53
- title: string
54
- items: RuntimeReleaseNoteItem[]
55
- }
56
-
57
- export interface RuntimeReleaseEntry {
58
- title: string
59
- version: string
60
- channel: string
61
- commit: string
62
- date: string
63
- cliVersion?: string
64
- sections: RuntimeReleaseSection[]
65
- commitCount: number
66
- }
67
-
68
- /** one page of the changelog, as returned by /api/changelog/sootsim. the stored
69
- * R2 file holds the full history; the endpoint paginates it (see
70
- * app/api/changelog/[product]+api.ts), so the CLI drains pages via hasMore. */
71
- export interface RuntimeReleasesPage {
72
- product: string
73
- updatedThrough: string | null
74
- page: number
75
- pageSize: number
76
- total: number
77
- totalPages: number
78
- hasMore: boolean
79
- entries: RuntimeReleaseEntry[]
80
- }
37
+ /** website URL where the sootsim changelog is rendered. the CLI used to drain
38
+ * a paginated /api/changelog/sootsim endpoint here; the changelog is now a
39
+ * static page checked into the soot repo (one MDX file per runtime release
40
+ * under src/features/site/changelog/sootsim-entries/), so `sootsim runtime
41
+ * notes` points users at the page. */
42
+ export const SOOTSIM_CHANGELOG_URL = 'https://sootsim.com/changelog'
81
43
 
82
44
  export interface RuntimeInstallOptions {
83
45
  version?: string | null
@@ -156,61 +118,6 @@ export async function fetchRuntimeManifest(cdnOrigin?: string): Promise<RuntimeM
156
118
  return (await res.json()) as RuntimeManifest
157
119
  }
158
120
 
159
- export function runtimeReleasesUrl(page: number, cdnOrigin?: string): string {
160
- const url = new URL(`${resolveRuntimeCdnOrigin(cdnOrigin)}/api/changelog/sootsim`)
161
- url.searchParams.set('page', String(page))
162
- // bust cdn edge caching so `sootsim runtime notes` always sees the latest.
163
- url.searchParams.set('t', String(Date.now()))
164
- return url.toString()
165
- }
166
-
167
- async function fetchReleasesPage(
168
- page: number,
169
- cdnOrigin?: string,
170
- ): Promise<RuntimeReleasesPage> {
171
- const url = runtimeReleasesUrl(page, cdnOrigin)
172
- const res = await fetch(url, { headers: { Accept: 'application/json' } })
173
- // a missing file is a valid state until the first release ships — callers
174
- // render "no release notes yet" rather than an error.
175
- if (res.status === 404) {
176
- return {
177
- product: 'sootsim',
178
- updatedThrough: null,
179
- page,
180
- pageSize: 0,
181
- total: 0,
182
- totalPages: 0,
183
- hasMore: false,
184
- entries: [],
185
- }
186
- }
187
- if (!res.ok) {
188
- throw new Error(`releases fetch failed: ${res.status} ${res.statusText} (${url})`)
189
- }
190
- return (await res.json()) as RuntimeReleasesPage
191
- }
192
-
193
- /** fetch the full sootsim changelog (newest release first) by draining every
194
- * page of the paginated endpoint. the CLI wants the whole history (notes
195
- * --all, version lookups for any release), so it pages through; the website
196
- * loads one page at a time. throws on network/parse failure so callers can
197
- * surface a clear message. */
198
- export async function fetchRuntimeReleases(
199
- cdnOrigin?: string,
200
- ): Promise<RuntimeReleaseEntry[]> {
201
- const entries: RuntimeReleaseEntry[] = []
202
- let page = 1
203
- // bounded by totalPages from the first response; the guard is a backstop
204
- // against a malformed hasMore that never settles.
205
- for (let guard = 0; guard < 1000; guard++) {
206
- const result = await fetchReleasesPage(page, cdnOrigin)
207
- if (Array.isArray(result.entries)) entries.push(...result.entries)
208
- if (!result.hasMore || result.entries.length === 0) break
209
- page++
210
- }
211
- return entries
212
- }
213
-
214
121
  export function resolveRuntimeVersion(
215
122
  manifest: RuntimeManifest,
216
123
  opts: Pick<RuntimeInstallOptions, 'version' | 'channel'> = {},
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-LN5AJIPO.js";import"./chunk-T6VPZ5ES.js";import"./chunk-3VE6THTL.js";import"./chunk-ZUYTGVNA.js";import"./chunk-4V6DKD5E.js";import"./chunk-TDPLTM27.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-R4K3EZQP.js";import"./chunk-TDPLTM27.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1,5 +0,0 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as C,b as k}from"./chunk-FUD4ZCJ2.js";var x="sootsimConfig";function m(e){return!!e&&Object.keys(e).length>0}function D(e){return e?m(e.modules)||m(e.turboModules)||m(e.nativeModules)||m(e.env)||m(e.network?.remap)||m(e.settings)||m(e.initialState):!1}function M(e,o){let t=new URL(e);return D(o)?t.searchParams.set(x,JSON.stringify(o)):t.searchParams.delete(x),t.toString()}import{exec as N}from"child_process";import L from"http";import O from"net";import{promisify as $}from"util";var te="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function T(e){return/^https?:\/\//i.test(e)}function E(e){return e.endsWith(".bundle")}function A(e){process.env.SOOTSIM_PREVIEW_PROD_BUNDLE&&(e.searchParams.set("dev","false"),e.searchParams.set("minify","true"),e.searchParams.has("hot")&&e.searchParams.set("hot","false"))}function U(e){try{let o=T(e),t=new URL(e,"http://soot.local");return t.pathname=t.pathname.replace(/\.\.bundle$/,".bundle"),E(t.pathname)?(t.searchParams.delete("transform.bytecode"),A(t),o?t.toString():`${t.pathname}${t.search}${t.hash}`):e}catch{return e}}var v=$(N);C();var I=250,B=1500,H=120;function j(e,o=H){return new Promise(t=>{let r=new O.Socket,s=!1,i=a=>{s||(s=!0,r.destroy(),t(a))};r.setTimeout(o),r.once("connect",()=>i(!0)),r.once("timeout",()=>i(!1)),r.once("error",()=>i(!1)),r.connect(e,"localhost")})}function h(e,o,t="GET",r=I,s={}){return new Promise(i=>{let a=L.request({hostname:"localhost",port:e,path:o,method:t,timeout:r,headers:s},n=>{let u="";n.on("data",l=>u+=l.toString());let c=(()=>{let l=n.headers["content-type"];if(typeof l=="string")return l;if(Array.isArray(l))return l[0]})();n.on("end",()=>i({statusCode:n.statusCode||0,body:u,contentType:c}))});a.on("error",()=>i(null)),a.setTimeout(r,()=>{a.destroy(),i(null)}),a.end()})}var W=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function P(e,o){return!(e<=0||e>=2e4||o.has(e)||e>=5170&&e<=5200)}async function F(e=[]){let o=new Set(e);try{let{stdout:t}=await v("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(t.trim()){let r=new Map;for(let s of t.trim().split(`
3
- `)){let i=s.trim().split(/\s+/);if(i.length<9)continue;let a=Number(i[1]),u=i[8].match(/:(\d+)$/);if(!u)continue;let c=Number(u[1]);P(c,o)&&(r.has(c)||r.set(c,a))}if(r.size>0)return[...r.entries()].map(([s,i])=>({port:s,pid:i}))}}catch{}try{let{stdout:t}=await v(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(t.trim()){let r=new Map;for(let s of t.trim().split(`
4
- `)){let i=s.match(/:(\d+)\s/),a=s.match(/pid=(\d+)/);if(!i)continue;let n=Number(i[1]),u=a?Number(a[1]):0;P(n,o)&&(r.has(n)||r.set(n,u))}if(r.size>0)return[...r.entries()].map(([s,i])=>({port:s,pid:i}))}}catch{}return W.filter(t=>P(t.port,o))}var y=new Map;async function G(e){if(e<=0)return null;let o=y.get(e);if(o)return o;try{let{stdout:t}=await v(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let r of t.split(`
5
- `))if(r.startsWith("n")&&r.length>1){let s=r.slice(1).trim();if(s)return y.set(e,s),s}}catch{}return null}function z(e,o){return{port:e,framework:o,bundleUrl:g(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function g(e,o){let t=k().find(s=>s.preferredPort===e),r=t?.runtimeConfig?M(o,t.runtimeConfig):o;return U(r)}function J(e){return e.includes("/node_modules/one/metro-entry.bundle")}function K(e){try{let o=JSON.parse(e);return o&&typeof o=="object"?o:null}catch{return null}}function w(e,o,t){if(!o)return e;try{let r=JSON.parse(o.body),s=r?.extra?.expoClient||r?.extra||{};s.name&&(e.projectName=s.name),s.ios?.bundleIdentifier&&(e.bundleId=s.ios.bundleIdentifier),e.framework==="metro"&&s.sdkVersion&&(e.framework="expo");let i=r?.launchAsset?.url;i&&!e.patched&&!J(e.bundleUrl)&&(e.bundleUrl=g(e.port,i));let a=s.iconUrl||s.ios?.iconUrl||s.icon||s.ios?.icon;if(a)if(e.iconPath=a,t)if(a.startsWith("http"))e.iconUrl=t(a);else{let n=a.replace(/^\.\//,"");e.iconUrl=t(`http://localhost:${e.port}/assets/${n}`)}else e.iconUrl=a.startsWith("http")?a:`http://localhost:${e.port}/assets/${a.replace(/^\.\//,"")}`}catch{}return e}var d=new Set,p=new Set,S=new Set;async function V(e,o){if(!await j(e))return null;let t="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[r,s,i,a]=await Promise.all([d.has(e)?Promise.resolve(null):h(e,"/__soot/"),h(e,"/status"),S.has(e)?Promise.resolve(null):h(e,"/","GET",B,{"expo-platform":"ios"}),p.has(e)?Promise.resolve(null):h(e,"/_expo/status")]);a&&a.statusCode===200?p.delete(e):p.has(e)||p.add(e);let n=i?K(i.body):null,u=typeof n?.launchAsset?.url=="string"?n.launchAsset.url:null,c=n?.extra?.expoClient||n?.extra||{};if(n&&(u||typeof c.name=="string")){d.add(e);let R=u||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,_=R.includes("/one/metro-entry.bundle")?"one":"expo";return w({port:e,framework:_,bundleUrl:g(e,R),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},i,o)}if(s&&s.body.includes("packager-status:running"))return d.add(e),w(z(e,a&&a.statusCode===200?"expo":"metro"),i,o);if(r&&r.statusCode===200&&r.body.includes("sootsim-patched"))return d.delete(e),w({port:e,framework:"one",bundleUrl:g(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},i,o);if(s&&s.statusCode===200||a&&a.statusCode===200||i&&i.statusCode===200&&n!=null)return null;let f=await h(e,t,"HEAD");return f&&f.statusCode>0&&f.statusCode<400&&/application\/javascript/i.test(f.contentType||"")?(d.add(e),S.add(e),w({port:e,framework:"one",bundleUrl:g(e,`http://localhost:${e}${t}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},i,o)):(d.add(e),null)}function q(e){let o=e.projectName?.trim().toLowerCase();return!!(o==="soot"||o==="sootsim"||e.bundleId?.trim().toLowerCase()?.startsWith("dev.soot"))}var b=new Map,Q=3e4,Y=1500;function X(e){return!e||e.framework==="metro"||e.framework==="unknown"}function Z(e){return e?g(e.port,e.bundleUrl)===e.bundleUrl:!0}function ee(e,o,t=Date.now()){if(o===0||e.pid!==o||!Z(e.result))return!1;let r=t-e.cachedAt;return!(e.result===null&&r>=Q||X(e.result)&&r>=Y)}async function de(e={}){let o=await F(e.excludePorts),t=new Set(o.map(n=>n.port));for(let n of[...b.keys()])t.has(n)||b.delete(n);for(let n of[...d])t.has(n)||d.delete(n);for(let n of[...p])t.has(n)||p.delete(n);for(let n of[...S])t.has(n)||S.delete(n);let r=[],s=[];for(let{port:n,pid:u}of o){let c=b.get(n);if(c&&ee(c,u)){c.result&&r.push(c.result);continue}c&&c.pid!==u&&(d.delete(n),p.delete(n),S.delete(n)),s.push({port:n,pid:u})}s.length>0&&(await Promise.all(s.map(u=>V(u.port,e.buildIconProxyUrl)))).forEach((u,c)=>{let{port:l,pid:f}=s[c];f!==0&&b.set(l,{pid:f,result:u,cachedAt:Date.now()}),u&&r.push(u)});let i=new Map;for(let{port:n,pid:u}of o)u>0&&i.set(n,u);await Promise.all(r.map(async n=>{let u=i.get(n.port);if(!u)return;n.pid=u;let c=await G(u);c&&(n.cwd=c)}));let a=new Set(i.values());for(let n of[...y.keys()])a.has(n)||y.delete(n);return r.filter(n=>!q(n))}export{M as a,te as b,U as c,V as d,de as e};
@@ -1,4 +0,0 @@
1
- /*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{A as R,B as g,C as v,E as w,k as p,t as b,v as S}from"./chunk-4V6DKD5E.js";import{spawn as I}from"child_process";import P from"crypto";import s from"fs";import l from"path";import{Readable as k}from"stream";import{pipeline as E}from"stream/promises";var M="https://sootbean.com",C="SOOTSIM_CDN_ORIGIN",N="SOOTSIM_RUNTIME_CHANNEL";function $(){try{let e=JSON.parse(s.readFileSync(S(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return{}}}function m(e){let t=$();return(e||process.env[C]||t.cdnOrigin||M).replace(/\/+$/,"")}function x(e){let t=$();return e||process.env[N]||t.runtimeChannel||"stable"}function T(e){let t=new URL(`${m(e)}/runtimes/manifest.json`);return t.searchParams.set("t",String(Date.now())),t.toString()}function D(e,t){return`${m(t)}/runtimes/sootsim-runtime-${e}.tar.gz`}async function y(e){let t=T(e),r=await fetch(t,{headers:{Accept:"application/json"}});if(!r.ok)throw new Error(`manifest fetch failed: ${r.status} ${r.statusText} (${t})`);return await r.json()}function U(e,t){let r=new URL(`${m(t)}/api/changelog/sootsim`);return r.searchParams.set("page",String(e)),r.searchParams.set("t",String(Date.now())),r.toString()}async function V(e,t){let r=U(e,t),n=await fetch(r,{headers:{Accept:"application/json"}});if(n.status===404)return{product:"sootsim",updatedThrough:null,page:e,pageSize:0,total:0,totalPages:0,hasMore:!1,entries:[]};if(!n.ok)throw new Error(`releases fetch failed: ${n.status} ${n.statusText} (${r})`);return await n.json()}async function K(e){let t=[],r=1;for(let n=0;n<1e3;n++){let i=await V(r,e);if(Array.isArray(i.entries)&&t.push(...i.entries),!i.hasMore||i.entries.length===0)break;r++}return t}function A(e,t={}){let r=x(t.channel),n=t.version||e.channels[r]?.latest;if(!n)throw new Error(`no version specified and channel '${r}' has no latest entry in the manifest`);let i=e.versions[n];if(!i)throw new Error(`version ${n} not found in manifest; available: ${Object.keys(e.versions).slice(-10).join(", ")||"(none)"}`);return{version:n,channel:r,entry:i}}async function j(e={}){R();let t=m(e.cdnOrigin),r=await y(t),{version:n,channel:i,entry:o}=A(r,e),a=p(n),c=e.setActive!==!1;if(!e.force&&s.existsSync(l.join(a,"index.html")))return c&&v(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!1,activated:c,manifest:r};let d=o.tarball||D(n,t),f=l.join(b(),`sootsim-runtime-${n}.tar.gz`);process.stderr.write(`sootsim: downloading runtime ${n}\u2026
3
- `),await _(d,f),process.stderr.write(`sootsim: extracting runtime ${n}\u2026
4
- `);let h=await z(f);if(h!==o.sha256)throw s.rmSync(f,{force:!0}),new Error(`sha256 mismatch for runtime ${n}: expected ${o.sha256}, actual ${h}`);let u=l.join(l.dirname(a),`.installing-${n}-${process.pid}`);s.rmSync(u,{recursive:!0,force:!0}),s.mkdirSync(u,{recursive:!0});try{if(await L(f,u),!s.existsSync(l.join(u,"index.html")))throw new Error(`extracted tarball for runtime ${n} is missing index.html`);s.rmSync(a,{recursive:!0,force:!0}),s.renameSync(u,a)}catch(O){throw s.rmSync(u,{recursive:!0,force:!0}),O}return c&&v(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!0,activated:c,manifest:r}}async function Q(e={}){R();let t=m(e.cdnOrigin),r=x(e.channel),n=await y(t),i=n.channels[r]?.latest;if(!i)return{checked:!0,updated:!1,reason:`channel '${r}' has no latest runtime`,activeVersion:g()};if(!n.versions[i])return{checked:!0,updated:!1,reason:`manifest is missing version ${i}`,activeVersion:g(),latestVersion:i};let a=g(),c=a?p(a):null,d=c?s.existsSync(l.join(c,"index.html")):!1;if(!(!a||!d||w(i,a)>0))return{checked:!0,updated:!1,reason:"active runtime is current",activeVersion:a,latestVersion:i};let h=await j({version:i,channel:r,cdnOrigin:t,setActive:!1});return{checked:!0,updated:!0,activeVersion:i,latestVersion:i,install:h}}async function X(e={}){let t=g();try{let r=await y(m(e.cdnOrigin)),n=x(e.channel),i=r.channels[n]?.latest??null,o=!!(i&&(!t||w(i,t)>0));return{active:t,latest:i,outdated:o}}catch{return{active:t,latest:null,outdated:!1}}}async function _(e,t){let r=await fetch(e);if(!r.ok||!r.body)throw new Error(`download failed: ${r.status} ${r.statusText} (${e})`);s.mkdirSync(l.dirname(t),{recursive:!0});let n=`${t}.partial`;try{await E(k.fromWeb(r.body),s.createWriteStream(n)),s.renameSync(n,t)}catch(i){try{s.unlinkSync(n)}catch{}throw i}}function z(e){return new Promise((t,r)=>{let n=P.createHash("sha256"),i=s.createReadStream(e);i.on("data",o=>n.update(o)),i.on("error",r),i.on("end",()=>t(n.digest("hex")))})}function L(e,t){return new Promise((r,n)=>{let i=I("tar",["-xzf",e,"-C",t],{stdio:["ignore","inherit","inherit"]});i.on("error",n),i.on("exit",o=>{o===0?r():n(new Error(`tar exited with code ${o}`))})})}export{M as a,C as b,N as c,m as d,x as e,T as f,D as g,y as h,U as i,K as j,A as k,j as l,Q as m,X as n};