sootsim 0.1.57 → 0.1.59

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 (140) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-NPPYTJGQ.js → agent-GD3Q5RPA.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-HGFLL2SN.js → agent-wrapper-LBIAKQGM.js} +2 -2
  4. package/dist-cli/chunks/{assert-YQVUXART.js → assert-LZUX5QVA.js} +2 -2
  5. package/dist-cli/chunks/auto-bootstrap-RGEU3N4Y.js +2 -0
  6. package/dist-cli/chunks/beta-7YMPFJF7.js +2 -0
  7. package/dist-cli/chunks/{chunk-6TCB2Q4M.js → chunk-24VAZEFY.js} +2 -2
  8. package/dist-cli/chunks/{chunk-G5C63TCD.js → chunk-4ENZNH7P.js} +2 -2
  9. package/dist-cli/chunks/{chunk-LAHQ2FEO.js → chunk-4L72FYCQ.js} +1 -1
  10. package/dist-cli/chunks/{chunk-LKN5ZD7R.js → chunk-4VNKLERI.js} +2 -2
  11. package/dist-cli/chunks/{chunk-IUNCVIGJ.js → chunk-5DO55JWB.js} +22 -22
  12. package/dist-cli/chunks/{chunk-JTEXFSXZ.js → chunk-5RLJWEFW.js} +1 -1
  13. package/dist-cli/chunks/{chunk-5UGWXEKB.js → chunk-5S62LOV4.js} +2 -2
  14. package/dist-cli/chunks/{chunk-R5LXB5S4.js → chunk-A3ATSCOF.js} +2 -2
  15. package/dist-cli/chunks/{chunk-YDARYKX2.js → chunk-AMEUPM6D.js} +1 -1
  16. package/dist-cli/chunks/{chunk-NIWIP5DP.js → chunk-BL3IZLNB.js} +2 -2
  17. package/dist-cli/chunks/{chunk-X7TK37NG.js → chunk-D26QPCEP.js} +2 -2
  18. package/dist-cli/chunks/{chunk-ZR5BC6VJ.js → chunk-D6O2NXGB.js} +2 -2
  19. package/dist-cli/chunks/chunk-DFXUPNYD.js +119 -0
  20. package/dist-cli/chunks/{chunk-YG56VEHZ.js → chunk-F2DSLYX4.js} +1 -1
  21. package/dist-cli/chunks/{chunk-M7CZODKE.js → chunk-G3A23B5Q.js} +1 -1
  22. package/dist-cli/chunks/chunk-GL3JT3P7.js +1 -0
  23. package/dist-cli/chunks/{chunk-XWXPKTF2.js → chunk-HMPHDE5A.js} +1 -1
  24. package/dist-cli/chunks/{chunk-UYA3TUXI.js → chunk-IY3JNNU7.js} +2 -2
  25. package/dist-cli/chunks/{chunk-CH2EJFOY.js → chunk-KYP5XLIR.js} +2 -2
  26. package/dist-cli/chunks/chunk-L5PBH3V6.js +1 -0
  27. package/dist-cli/chunks/{chunk-4V3332SD.js → chunk-LLOURJ3N.js} +3 -3
  28. package/dist-cli/chunks/chunk-N7OHTYFK.js +2 -0
  29. package/dist-cli/chunks/{chunk-4VABMOJO.js → chunk-NGEPSXEE.js} +1 -1
  30. package/dist-cli/chunks/chunk-O2W7EB7L.js +11 -0
  31. package/dist-cli/chunks/{chunk-CQVVHX4D.js → chunk-O4I44BRL.js} +1 -1
  32. package/dist-cli/chunks/{chunk-4JMDLWL4.js → chunk-PS57ERTY.js} +2 -2
  33. package/dist-cli/chunks/{chunk-VXXUZASJ.js → chunk-PSPZTTCO.js} +2 -2
  34. package/dist-cli/chunks/{chunk-S5J72XOK.js → chunk-QNH7IX5F.js} +2 -2
  35. package/dist-cli/chunks/{chunk-M4ZH4OIE.js → chunk-TYRPY3SN.js} +1 -1
  36. package/dist-cli/chunks/chunk-UPW76NDZ.js +2 -0
  37. package/dist-cli/chunks/{chunk-GBVUYE2G.js → chunk-V4SMVFRV.js} +1 -1
  38. package/dist-cli/chunks/{chunk-PNPC7W2J.js → chunk-V6NAG62D.js} +1 -1
  39. package/dist-cli/chunks/chunk-WMTMNKH2.js +5 -0
  40. package/dist-cli/chunks/{chunk-3CK32EYC.js → chunk-WQOEMVXN.js} +1 -1
  41. package/dist-cli/chunks/{chunk-BV7CKWAT.js → chunk-WQXLD5YU.js} +2 -2
  42. package/dist-cli/chunks/{chunk-OTAD7RDA.js → chunk-XDIT5SEC.js} +2 -2
  43. package/dist-cli/chunks/{chunk-7ZKQDFIO.js → chunk-XM4D43UP.js} +2 -2
  44. package/dist-cli/chunks/{chunk-OZCCQDNO.js → chunk-XRMTMRS5.js} +1 -1
  45. package/dist-cli/chunks/{chunk-SLDVUFO7.js → chunk-Y65GFG22.js} +3 -3
  46. package/dist-cli/chunks/{chunk-KDGASCBH.js → chunk-YT54ZKTQ.js} +2 -2
  47. package/dist-cli/chunks/chunk-ZEB4DGC6.js +1 -0
  48. package/dist-cli/chunks/{chunk-QYFYKTLA.js → chunk-ZLMNBI7T.js} +2 -2
  49. package/dist-cli/chunks/{chunk-IE22T725.js → chunk-ZX66GIXV.js} +2 -2
  50. package/dist-cli/chunks/cli-version-CL32HHD6.js +2 -0
  51. package/dist-cli/chunks/{compat-GGWXFSDX.js → compat-77WWLIGJ.js} +3 -3
  52. package/dist-cli/chunks/{config-INZ3CE26.js → config-WGPGLVTW.js} +2 -2
  53. package/dist-cli/chunks/control-KZYO5BDN.js +2 -0
  54. package/dist-cli/chunks/{cpu-profile-LNRJPUD5.js → cpu-profile-XMBVCI7K.js} +2 -2
  55. package/dist-cli/chunks/{daemon-3VIZBQY3.js → daemon-FFHD2I32.js} +2 -2
  56. package/dist-cli/chunks/{debug-K6QL7KYQ.js → debug-FMXTU6TB.js} +3 -3
  57. package/dist-cli/chunks/demo-app-registry-RSAPXLUE.js +2 -0
  58. package/dist-cli/chunks/{detox-YTAIPFJF.js → detox-QGFGC5RT.js} +2 -2
  59. package/dist-cli/chunks/{device-CK65C5X7.js → device-OL7VGMK7.js} +2 -2
  60. package/dist-cli/chunks/{diagnose-7C6AI3GH.js → diagnose-6CSSFWBQ.js} +2 -2
  61. package/dist-cli/chunks/drivers-7PFWCFVQ.js +2 -0
  62. package/dist-cli/chunks/{electron-KM4B6VDZ.js → electron-MHXT6NTC.js} +3 -3
  63. package/dist-cli/chunks/flow-HMBOPMQV.js +2 -0
  64. package/dist-cli/chunks/{hints-3VJUMXQP.js → hints-W5DK2COL.js} +2 -2
  65. package/dist-cli/chunks/{home-paths-ME2IXNVP.js → home-paths-RWCQ7AU2.js} +2 -2
  66. package/dist-cli/chunks/{inspect-UZOX4LSH.js → inspect-5XMF34Y7.js} +3 -3
  67. package/dist-cli/chunks/install-3MNX7DSK.js +2 -0
  68. package/dist-cli/chunks/{install-desktop-C4V5KZDJ.js → install-desktop-YVHWBC3T.js} +3 -3
  69. package/dist-cli/chunks/{keys-UT3KWBZT.js → keys-6HAEB4IC.js} +2 -2
  70. package/dist-cli/chunks/{launch-6I6O6JXS.js → launch-OHCK4MRM.js} +3 -3
  71. package/dist-cli/chunks/{login-JDESDPHM.js → login-VBHIW5ZN.js} +4 -4
  72. package/dist-cli/chunks/{logout-575N5O5U.js → logout-LHFYJFHT.js} +2 -2
  73. package/dist-cli/chunks/{maestro-ROOBQSNV.js → maestro-56F3HFUH.js} +2 -2
  74. package/dist-cli/chunks/{preview-HG2CMGQN.js → preview-ATGWKYQI.js} +2 -2
  75. package/dist-cli/chunks/{profile-I6LG4B5V.js → profile-UII6DPNJ.js} +2 -2
  76. package/dist-cli/chunks/{react-P5PD7U5N.js → react-4F2HFSY7.js} +2 -2
  77. package/dist-cli/chunks/{record-JYYV3HCE.js → record-YHRJJJRY.js} +2 -2
  78. package/dist-cli/chunks/runtime-HOPZF7H6.js +2 -0
  79. package/dist-cli/chunks/{runtime-delivery-GPLRM7XV.js → runtime-delivery-CUCNWWQP.js} +2 -2
  80. package/dist-cli/chunks/{screenshot-LPZAW47Y.js → screenshot-GKJ4ICW4.js} +2 -2
  81. package/dist-cli/chunks/{screenshot-mode-T3Y4GCJ7.js → screenshot-mode-OCP4HA3H.js} +2 -2
  82. package/dist-cli/chunks/{screenshots-2OS6IUGR.js → screenshots-RTRJF63K.js} +2 -2
  83. package/dist-cli/chunks/{server-OIA2CFJT.js → server-SY6BQAVD.js} +14 -14
  84. package/dist-cli/chunks/setup-repo-Z7WKSSP5.js +2 -0
  85. package/dist-cli/chunks/{skills-CHO7ZM3B.js → skills-KX3LI7Y6.js} +2 -2
  86. package/dist-cli/chunks/{start-J2KTUJ7X.js → start-5IOHCWG6.js} +4 -4
  87. package/dist-cli/chunks/store-WYV5UMFH.js +2 -0
  88. package/dist-cli/chunks/telemetry-XABHSL5O.js +2 -0
  89. package/dist-cli/chunks/{test-GBMTAVTE.js → test-2QTF7GWW.js} +3 -3
  90. package/dist-cli/chunks/{three-mode-4YSGPVCQ.js → three-mode-EQSSYVHT.js} +2 -2
  91. package/dist-cli/chunks/{timeline-K3VJQZPK.js → timeline-GZZYRE2U.js} +2 -2
  92. package/dist-cli/chunks/{upgrade-QGDSW6BS.js → upgrade-KVJ2HKRH.js} +2 -2
  93. package/dist-cli/chunks/upload-4VWBZXY4.js +2 -0
  94. package/dist-cli/chunks/web-2C5AJBCN.js +2 -0
  95. package/dist-cli/chunks/{what-happened-CKT743CC.js → what-happened-YECRPXV5.js} +2 -2
  96. package/dist-cli/chunks/{whoami-IQR7JHXG.js → whoami-WCPVDNPA.js} +2 -2
  97. package/dist-lib/agent-daemon-client.cjs +1 -1
  98. package/dist-lib/agent-events.cjs +1 -1
  99. package/dist-lib/agent-sessions.cjs +1 -1
  100. package/dist-lib/attached-projects.cjs +1 -1
  101. package/dist-lib/auth/shared-session.cjs +1 -1
  102. package/dist-lib/backend-origin.cjs +1 -1
  103. package/dist-lib/bridge-constants.cjs +1 -1
  104. package/dist-lib/cli-constants.cjs +1 -1
  105. package/dist-lib/config.cjs +1 -1
  106. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  107. package/dist-lib/home-paths.cjs +1 -1
  108. package/dist-lib/host/bridge-host.cjs +38 -5
  109. package/dist-lib/host/fetch-proxy-handler.cjs +38 -5
  110. package/dist-lib/host/fetch-proxy-overrides.cjs +59 -0
  111. package/dist-lib/index.cjs +1 -1
  112. package/dist-lib/metro.cjs +1 -1
  113. package/dist-lib/profiles.cjs +1 -1
  114. package/dist-lib/render-mode.cjs +1 -1
  115. package/dist-lib/vite-base.cjs +44 -6
  116. package/dist-lib/vite.cjs +1 -1
  117. package/package.json +2 -1
  118. package/dist-cli/chunks/auto-bootstrap-66WKUSFO.js +0 -2
  119. package/dist-cli/chunks/beta-OOQIHH7M.js +0 -2
  120. package/dist-cli/chunks/chunk-6N7UI27S.js +0 -11
  121. package/dist-cli/chunks/chunk-6XN3BLTW.js +0 -1
  122. package/dist-cli/chunks/chunk-CU7PKBB2.js +0 -2
  123. package/dist-cli/chunks/chunk-ERTESYYX.js +0 -1
  124. package/dist-cli/chunks/chunk-GFA6ML6B.js +0 -5
  125. package/dist-cli/chunks/chunk-GPYMDARN.js +0 -2
  126. package/dist-cli/chunks/chunk-I6SSZCZN.js +0 -117
  127. package/dist-cli/chunks/chunk-O3VFZJ2R.js +0 -1
  128. package/dist-cli/chunks/chunk-TL3533Q6.js +0 -2
  129. package/dist-cli/chunks/cli-version-J2PCS6AU.js +0 -2
  130. package/dist-cli/chunks/control-UKVK76QN.js +0 -2
  131. package/dist-cli/chunks/demo-app-registry-H5TBKOQ6.js +0 -2
  132. package/dist-cli/chunks/drivers-R2Z4BW5R.js +0 -2
  133. package/dist-cli/chunks/flow-ODCQTIYH.js +0 -2
  134. package/dist-cli/chunks/install-KTTJWYUW.js +0 -2
  135. package/dist-cli/chunks/runtime-4YFLZ5OB.js +0 -2
  136. package/dist-cli/chunks/setup-repo-QFKXN4PA.js +0 -2
  137. package/dist-cli/chunks/store-BJFYF6GX.js +0 -2
  138. package/dist-cli/chunks/telemetry-7I3DB4GJ.js +0 -2
  139. package/dist-cli/chunks/upload-Z3ZD5WUL.js +0 -2
  140. package/dist-cli/chunks/web-OASYPGA5.js +0 -2
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{J as F,w as S,x as k,y as g}from"./chunk-4VABMOJO.js";import{c as b,e as y}from"./chunk-CH2EJFOY.js";import{b as w}from"./chunk-LAHQ2FEO.js";import"./chunk-GPYMDARN.js";import"./chunk-PNPC7W2J.js";import"./chunk-YDARYKX2.js";function M(t){let e=[];for(let n=0;n<t.length;n++)if(t[n]==="--since"&&n+1<t.length){e.push(n,n+1);let s=t[n+1].trim(),a=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(a){let l=Number(a[1]),u=a[2]??"ms",r=u==="s"?l*1e3:u==="m"?l*6e4:l;return{since:Date.now()-r,consumed:e}}let o=Number(s);if(Number.isFinite(o)&&o>1e12)return{since:o,consumed:e}}return{consumed:e}}function E(t){let e=[];for(let n=0;n<t.length;n++)if(t[n]==="--kinds"&&n+1<t.length)return e.push(n,n+1),{kinds:t[n+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:e};return{consumed:e}}function C(t){let e=[];for(let n=0;n<t.length;n++)if(t[n]==="--limit"&&n+1<t.length){e.push(n,n+1);let s=Number(t[n+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:e}}return{consumed:e}}function _(t,e){if(e===null)return new Date(t).toLocaleTimeString();let n=(t-e)/1e3;return`${n>=0?"+":""}${n.toFixed(2)}s`}function j(t,e){switch(t){case"app-launch":return e.phase==="launch"?`launch ${e.appName??e.toAppId??""}`:`dismiss ${e.appName??e.fromAppId??""} \u2192 ${e.toAppId??""}`;case"toast":return`"${e.text??""}"${e.durationMs?` (${e.durationMs}ms)`:""}`;case"keyboard":return`${e.phase??"?"}${e.heightPx?` h=${e.heightPx}`:""}${e.mode?` ${e.mode}`:""}`;case"screen":return`${e.phase??"?"} ${e.name??e.activeName??""}`;case"route":return`${e.phase??"?"} ${e.path??e.pathname??""}`;case"alert":case"actionsheet":case"picker":return`${e.phase??"?"} ${e.title??e.message??""}`;case"notification":return`${e.title??""}${e.body?` \u2014 ${e.body}`:""}`;case"fetch":return`${e.method??"GET"} ${e.url??""}${e.status?` -> ${e.status}`:""}`;case"console":return`${e.level??"log"}: ${(e.message??"").toString().slice(0,120)}`;case"shell":return`${e.event??e.type??e.phase??""}`;case"scroll":return`${e.phase??"?"} ${e.target??""}`;case"gesture":return`${e.phase??"?"} ${e.type??""}`;case"text-input":return`${e.phase??"?"}${e.value!==void 0?` "${String(e.value).slice(0,40)}"`:""}`;case"react-commit":{let n=e.slowest;return`${e.fiberCount??"?"} fibers ${e.durationMs??"?"}ms${n?.displayName?` \xB7 ${n.displayName} ${n.durationMs??"?"}ms`:""}`}case"reanimated":case"animation":return`${e.kind??""} ${e.target??""}${e.durationMs?` ${e.durationMs}ms`:""}`}}function N(t,e){let n=_(t.t,e).padStart(8),s=t.context.padEnd(6),a=`[${t.kind}]`.padEnd(15),o="",l=t.data;return l&&typeof l=="object"&&(o=j(t.kind,l)),` ${n} ${s} ${a} ${o}`}function T(t){let e=[],n={label:"initial state",events:[],startedAt:t[0]?.t??null};e.push(n);for(let s of t)if(n.events.push(s),s.kind==="screen"||s.kind==="route"){let a=s.data,o=a?.phase;if(!o||o==="enter"||o==="appear"||o==="active"){let l=a?.name||a?.activeName||a?.path||a?.pathname||s.kind;e.length===1&&n.events.length===1?n.label=`${s.kind}: ${l}`:(n={label:`${s.kind}: ${l}`,events:[],startedAt:s.t},e.push(n))}}return e}async function O(t,e){let n=b(t,{port:e.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow"],stripValueFlags:["--since","--kinds","--limit"]});(t.includes("--help")||t.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{J as F,w as S,x as k,y as g}from"./chunk-NGEPSXEE.js";import{c as b,e as y}from"./chunk-KYP5XLIR.js";import{b as w}from"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";function M(t){let e=[];for(let n=0;n<t.length;n++)if(t[n]==="--since"&&n+1<t.length){e.push(n,n+1);let s=t[n+1].trim(),a=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(a){let l=Number(a[1]),u=a[2]??"ms",r=u==="s"?l*1e3:u==="m"?l*6e4:l;return{since:Date.now()-r,consumed:e}}let o=Number(s);if(Number.isFinite(o)&&o>1e12)return{since:o,consumed:e}}return{consumed:e}}function E(t){let e=[];for(let n=0;n<t.length;n++)if(t[n]==="--kinds"&&n+1<t.length)return e.push(n,n+1),{kinds:t[n+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:e};return{consumed:e}}function C(t){let e=[];for(let n=0;n<t.length;n++)if(t[n]==="--limit"&&n+1<t.length){e.push(n,n+1);let s=Number(t[n+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:e}}return{consumed:e}}function _(t,e){if(e===null)return new Date(t).toLocaleTimeString();let n=(t-e)/1e3;return`${n>=0?"+":""}${n.toFixed(2)}s`}function j(t,e){switch(t){case"app-launch":return e.phase==="launch"?`launch ${e.appName??e.toAppId??""}`:`dismiss ${e.appName??e.fromAppId??""} \u2192 ${e.toAppId??""}`;case"toast":return`"${e.text??""}"${e.durationMs?` (${e.durationMs}ms)`:""}`;case"keyboard":return`${e.phase??"?"}${e.heightPx?` h=${e.heightPx}`:""}${e.mode?` ${e.mode}`:""}`;case"screen":return`${e.phase??"?"} ${e.name??e.activeName??""}`;case"route":return`${e.phase??"?"} ${e.path??e.pathname??""}`;case"alert":case"actionsheet":case"picker":return`${e.phase??"?"} ${e.title??e.message??""}`;case"notification":return`${e.title??""}${e.body?` \u2014 ${e.body}`:""}`;case"fetch":return`${e.method??"GET"} ${e.url??""}${e.status?` -> ${e.status}`:""}`;case"console":return`${e.level??"log"}: ${(e.message??"").toString().slice(0,120)}`;case"shell":return`${e.event??e.type??e.phase??""}`;case"scroll":return`${e.phase??"?"} ${e.target??""}`;case"gesture":return`${e.phase??"?"} ${e.type??""}`;case"text-input":return`${e.phase??"?"}${e.value!==void 0?` "${String(e.value).slice(0,40)}"`:""}`;case"react-commit":{let n=e.slowest;return`${e.fiberCount??"?"} fibers ${e.durationMs??"?"}ms${n?.displayName?` \xB7 ${n.displayName} ${n.durationMs??"?"}ms`:""}`}case"reanimated":case"animation":return`${e.kind??""} ${e.target??""}${e.durationMs?` ${e.durationMs}ms`:""}`}}function N(t,e){let n=_(t.t,e).padStart(8),s=t.context.padEnd(6),a=`[${t.kind}]`.padEnd(15),o="",l=t.data;return l&&typeof l=="object"&&(o=j(t.kind,l)),` ${n} ${s} ${a} ${o}`}function T(t){let e=[],n={label:"initial state",events:[],startedAt:t[0]?.t??null};e.push(n);for(let s of t)if(n.events.push(s),s.kind==="screen"||s.kind==="route"){let a=s.data,o=a?.phase;if(!o||o==="enter"||o==="appear"||o==="active"){let l=a?.name||a?.activeName||a?.path||a?.pathname||s.kind;e.length===1&&n.events.length===1?n.label=`${s.kind}: ${l}`:(n={label:`${s.kind}: ${l}`,events:[],startedAt:s.t},e.push(n))}}return e}async function O(t,e){let n=b(t,{port:e.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow"],stripValueFlags:["--since","--kinds","--limit"]});(t.includes("--help")||t.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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as i}from"./chunk-6TCB2Q4M.js";import{d as n}from"./chunk-G5C63TCD.js";import"./chunk-PNPC7W2J.js";import"./chunk-YDARYKX2.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.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as i}from"./chunk-24VAZEFY.js";import{d as n}from"./chunk-4ENZNH7P.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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;
@@ -2840,12 +2840,42 @@ function mapFrameworkToProjectFramework(fw) {
2840
2840
  // src/host/fetch-proxy-handler.ts
2841
2841
  var import_http2 = __toESM(require("http"), 1);
2842
2842
  var import_https = __toESM(require("https"), 1);
2843
- var FETCH_PROXY_USER_AGENT = "sootsim";
2843
+
2844
+ // src/host/fetch-proxy-overrides.ts
2845
+ 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";
2846
+ var HOST_HEADER_OVERRIDES = [
2847
+ {
2848
+ hostSuffix: "uniswap.org",
2849
+ headers: {
2850
+ origin: "https://app.uniswap.org",
2851
+ referer: "https://app.uniswap.org/"
2852
+ }
2853
+ }
2854
+ ];
2855
+ function headerOverridesFor(hostname) {
2856
+ const host = hostname.toLowerCase();
2857
+ for (const override of HOST_HEADER_OVERRIDES) {
2858
+ if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
2859
+ return override.headers;
2860
+ }
2861
+ }
2862
+ return {};
2863
+ }
2864
+ function getFetchProxyTargetHeaders(targetUrl) {
2865
+ return {
2866
+ "accept-encoding": "identity",
2867
+ "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
2868
+ ...headerOverridesFor(targetUrl.hostname)
2869
+ };
2870
+ }
2871
+
2872
+ // src/host/fetch-proxy-handler.ts
2844
2873
  var STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
2845
2874
  "host",
2846
2875
  "origin",
2847
2876
  "referer",
2848
2877
  "user-agent",
2878
+ "accept-encoding",
2849
2879
  "cookie",
2850
2880
  "connection",
2851
2881
  "keep-alive",
@@ -2885,14 +2915,17 @@ function formatFetchProxyError(targetUrl, err) {
2885
2915
  }
2886
2916
  return message;
2887
2917
  }
2888
- function buildFetchProxyHeaders(reqHeaders) {
2918
+ function buildFetchProxyHeaders(reqHeaders, targetUrl) {
2889
2919
  const headers = {};
2890
2920
  for (const [key, value] of Object.entries(reqHeaders)) {
2891
2921
  if (!value) continue;
2892
2922
  if (STRIP_FETCH_PROXY_HEADERS.has(key.toLowerCase())) continue;
2893
2923
  headers[key] = Array.isArray(value) ? value.join(", ") : value;
2894
2924
  }
2895
- headers["user-agent"] = FETCH_PROXY_USER_AGENT;
2925
+ Object.assign(
2926
+ headers,
2927
+ targetUrl ? getFetchProxyTargetHeaders(targetUrl) : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT }
2928
+ );
2896
2929
  return headers;
2897
2930
  }
2898
2931
  function isFetchProxyRequestUrl(rawUrl) {
@@ -2928,7 +2961,7 @@ async function handleFetchProxyRequest(req, res) {
2928
2961
  res.end("invalid url param");
2929
2962
  return;
2930
2963
  }
2931
- const headers = buildFetchProxyHeaders(req.headers);
2964
+ const headers = buildFetchProxyHeaders(req.headers, upstreamUrl);
2932
2965
  let body;
2933
2966
  if (req.method !== "GET" && req.method !== "HEAD") {
2934
2967
  const chunks = [];
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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;
@@ -41,12 +41,42 @@ __export(fetch_proxy_handler_exports, {
41
41
  module.exports = __toCommonJS(fetch_proxy_handler_exports);
42
42
  var import_http = __toESM(require("http"), 1);
43
43
  var import_https = __toESM(require("https"), 1);
44
- var FETCH_PROXY_USER_AGENT = "sootsim";
44
+
45
+ // src/host/fetch-proxy-overrides.ts
46
+ 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";
47
+ var HOST_HEADER_OVERRIDES = [
48
+ {
49
+ hostSuffix: "uniswap.org",
50
+ headers: {
51
+ origin: "https://app.uniswap.org",
52
+ referer: "https://app.uniswap.org/"
53
+ }
54
+ }
55
+ ];
56
+ function headerOverridesFor(hostname) {
57
+ const host = hostname.toLowerCase();
58
+ for (const override of HOST_HEADER_OVERRIDES) {
59
+ if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
60
+ return override.headers;
61
+ }
62
+ }
63
+ return {};
64
+ }
65
+ function getFetchProxyTargetHeaders(targetUrl) {
66
+ return {
67
+ "accept-encoding": "identity",
68
+ "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
69
+ ...headerOverridesFor(targetUrl.hostname)
70
+ };
71
+ }
72
+
73
+ // src/host/fetch-proxy-handler.ts
45
74
  var STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
46
75
  "host",
47
76
  "origin",
48
77
  "referer",
49
78
  "user-agent",
79
+ "accept-encoding",
50
80
  "cookie",
51
81
  "connection",
52
82
  "keep-alive",
@@ -86,14 +116,17 @@ function formatFetchProxyError(targetUrl, err) {
86
116
  }
87
117
  return message;
88
118
  }
89
- function buildFetchProxyHeaders(reqHeaders) {
119
+ function buildFetchProxyHeaders(reqHeaders, targetUrl) {
90
120
  const headers = {};
91
121
  for (const [key, value] of Object.entries(reqHeaders)) {
92
122
  if (!value) continue;
93
123
  if (STRIP_FETCH_PROXY_HEADERS.has(key.toLowerCase())) continue;
94
124
  headers[key] = Array.isArray(value) ? value.join(", ") : value;
95
125
  }
96
- headers["user-agent"] = FETCH_PROXY_USER_AGENT;
126
+ Object.assign(
127
+ headers,
128
+ targetUrl ? getFetchProxyTargetHeaders(targetUrl) : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT }
129
+ );
97
130
  return headers;
98
131
  }
99
132
  function isFetchProxyRequestUrl(rawUrl) {
@@ -129,7 +162,7 @@ async function handleFetchProxyRequest(req, res) {
129
162
  res.end("invalid url param");
130
163
  return;
131
164
  }
132
- const headers = buildFetchProxyHeaders(req.headers);
165
+ const headers = buildFetchProxyHeaders(req.headers, upstreamUrl);
133
166
  let body;
134
167
  if (req.method !== "GET" && req.method !== "HEAD") {
135
168
  const chunks = [];
@@ -0,0 +1,59 @@
1
+ /*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/host/fetch-proxy-overrides.ts
23
+ var fetch_proxy_overrides_exports = {};
24
+ __export(fetch_proxy_overrides_exports, {
25
+ FETCH_PROXY_BROWSER_USER_AGENT: () => FETCH_PROXY_BROWSER_USER_AGENT,
26
+ getFetchProxyTargetHeaders: () => getFetchProxyTargetHeaders
27
+ });
28
+ module.exports = __toCommonJS(fetch_proxy_overrides_exports);
29
+ 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";
30
+ var HOST_HEADER_OVERRIDES = [
31
+ {
32
+ hostSuffix: "uniswap.org",
33
+ headers: {
34
+ origin: "https://app.uniswap.org",
35
+ referer: "https://app.uniswap.org/"
36
+ }
37
+ }
38
+ ];
39
+ function headerOverridesFor(hostname) {
40
+ const host = hostname.toLowerCase();
41
+ for (const override of HOST_HEADER_OVERRIDES) {
42
+ if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
43
+ return override.headers;
44
+ }
45
+ }
46
+ return {};
47
+ }
48
+ function getFetchProxyTargetHeaders(targetUrl) {
49
+ return {
50
+ "accept-encoding": "identity",
51
+ "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
52
+ ...headerOverridesFor(targetUrl.hostname)
53
+ };
54
+ }
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ FETCH_PROXY_BROWSER_USER_AGENT,
58
+ getFetchProxyTargetHeaders
59
+ });
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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;
@@ -2909,6 +2909,40 @@ var init_agent_host = __esm({
2909
2909
  }
2910
2910
  });
2911
2911
 
2912
+ // src/host/fetch-proxy-overrides.ts
2913
+ function headerOverridesFor(hostname) {
2914
+ const host = hostname.toLowerCase();
2915
+ for (const override of HOST_HEADER_OVERRIDES) {
2916
+ if (host === override.hostSuffix || host.endsWith(`.${override.hostSuffix}`)) {
2917
+ return override.headers;
2918
+ }
2919
+ }
2920
+ return {};
2921
+ }
2922
+ function getFetchProxyTargetHeaders(targetUrl) {
2923
+ return {
2924
+ "accept-encoding": "identity",
2925
+ "user-agent": FETCH_PROXY_BROWSER_USER_AGENT,
2926
+ ...headerOverridesFor(targetUrl.hostname)
2927
+ };
2928
+ }
2929
+ var FETCH_PROXY_BROWSER_USER_AGENT, HOST_HEADER_OVERRIDES;
2930
+ var init_fetch_proxy_overrides = __esm({
2931
+ "src/host/fetch-proxy-overrides.ts"() {
2932
+ "use strict";
2933
+ 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";
2934
+ HOST_HEADER_OVERRIDES = [
2935
+ {
2936
+ hostSuffix: "uniswap.org",
2937
+ headers: {
2938
+ origin: "https://app.uniswap.org",
2939
+ referer: "https://app.uniswap.org/"
2940
+ }
2941
+ }
2942
+ ];
2943
+ }
2944
+ });
2945
+
2912
2946
  // src/host/fetch-proxy-handler.ts
2913
2947
  function applyFetchProxyCors(res) {
2914
2948
  for (const [key, value] of Object.entries(FETCH_PROXY_CORS_HEADERS)) {
@@ -2929,14 +2963,17 @@ function formatFetchProxyError(targetUrl, err) {
2929
2963
  }
2930
2964
  return message;
2931
2965
  }
2932
- function buildFetchProxyHeaders(reqHeaders) {
2966
+ function buildFetchProxyHeaders(reqHeaders, targetUrl) {
2933
2967
  const headers = {};
2934
2968
  for (const [key, value] of Object.entries(reqHeaders)) {
2935
2969
  if (!value) continue;
2936
2970
  if (STRIP_FETCH_PROXY_HEADERS.has(key.toLowerCase())) continue;
2937
2971
  headers[key] = Array.isArray(value) ? value.join(", ") : value;
2938
2972
  }
2939
- headers["user-agent"] = FETCH_PROXY_USER_AGENT;
2973
+ Object.assign(
2974
+ headers,
2975
+ targetUrl ? getFetchProxyTargetHeaders(targetUrl) : { "user-agent": FETCH_PROXY_BROWSER_USER_AGENT }
2976
+ );
2940
2977
  return headers;
2941
2978
  }
2942
2979
  function isFetchProxyRequestUrl(rawUrl) {
@@ -2972,7 +3009,7 @@ async function handleFetchProxyRequest(req, res) {
2972
3009
  res.end("invalid url param");
2973
3010
  return;
2974
3011
  }
2975
- const headers = buildFetchProxyHeaders(req.headers);
3012
+ const headers = buildFetchProxyHeaders(req.headers, upstreamUrl);
2976
3013
  let body;
2977
3014
  if (req.method !== "GET" && req.method !== "HEAD") {
2978
3015
  const chunks = [];
@@ -3081,18 +3118,19 @@ function handleAppApiRequest(req, res) {
3081
3118
  req.pipe(proxyReq);
3082
3119
  return true;
3083
3120
  }
3084
- var import_http2, import_https, FETCH_PROXY_USER_AGENT, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS;
3121
+ var import_http2, import_https, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS;
3085
3122
  var init_fetch_proxy_handler = __esm({
3086
3123
  "src/host/fetch-proxy-handler.ts"() {
3087
3124
  "use strict";
3088
3125
  import_http2 = __toESM(require("http"), 1);
3089
3126
  import_https = __toESM(require("https"), 1);
3090
- FETCH_PROXY_USER_AGENT = "sootsim";
3127
+ init_fetch_proxy_overrides();
3091
3128
  STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
3092
3129
  "host",
3093
3130
  "origin",
3094
3131
  "referer",
3095
3132
  "user-agent",
3133
+ "accept-encoding",
3096
3134
  "cookie",
3097
3135
  "connection",
3098
3136
  "keep-alive",
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.59 | (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.57",
3
+ "version": "0.1.59",
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",
@@ -85,6 +85,7 @@
85
85
  "default": "./dist-lib/host/bridge-host.cjs"
86
86
  },
87
87
  "./host/fetch-proxy-handler": "./src/host/fetch-proxy-handler.ts",
88
+ "./host/fetch-proxy-overrides": "./src/host/fetch-proxy-overrides.ts",
88
89
  "./scripts/dev-server-scanner": "./scripts/dev-server-scanner.ts",
89
90
  "./scripts/demo-app-registry": "./scripts/demo-app-registry.ts",
90
91
  "./detox": "./detox/index.ts",
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-SLDVUFO7.js";import"./chunk-CH2EJFOY.js";import"./chunk-LAHQ2FEO.js";import"./chunk-GPYMDARN.js";import"./chunk-PNPC7W2J.js";import"./chunk-YDARYKX2.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d,e}from"./chunk-M4ZH4OIE.js";import"./chunk-YDARYKX2.js";export{e as BETA_ASK_HEADLINE,c as BETA_LABEL,d as BETA_TAGLINE,b as BETA_VERSION_TARGET,a as IS_BETA};
@@ -1,11 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as D,b as j,c as se}from"./chunk-TL3533Q6.js";import{b as L}from"./chunk-CQVVHX4D.js";import{g as W}from"./chunk-S5J72XOK.js";import{a as I,b as q}from"./chunk-JTEXFSXZ.js";import{c as ie}from"./chunk-ZR5BC6VJ.js";import{d as ne}from"./chunk-M7CZODKE.js";import{a as ee}from"./chunk-CU7PKBB2.js";import{b as re,c as x,d as b,e as C}from"./chunk-CH2EJFOY.js";import{c as k,d as g,e as E}from"./chunk-LAHQ2FEO.js";import{E as oe,F as te}from"./chunk-PNPC7W2J.js";import xe from"node:fs";import Ce from"node:os";import K from"node:path";function he(o){return o.replace(/^\[|\]$/g,"").toLowerCase()}function G(o){let t=he(o);return t==="localhost"||t.endsWith(".localhost")||t==="0.0.0.0"||t==="::1"||/^127(?:\.\d{1,3}){3}$/.test(t)}function ae(o){return new Error(`could not resolve a native bundle for ${o}. pass an explicit bundle URL or open Connect and choose the app there.`)}function we(o,t){return o?.includes("/one/metro-entry.bundle")?"one":typeof t=="string"&&t?"expo":"unknown"}function le(o,t,e){return`${o}//${t}:${e}`}function ye(o){if(typeof window>"u")return!1;try{let t=new URL(o);return G(t.hostname)&&G(window.location.hostname)&&t.origin!==window.location.origin}catch{return!1}}async function ce(o,t){let e={...t,cache:t?.cache??"no-store"};return ye(o)?fetch(`/__fetch-proxy?url=${encodeURIComponent(o)}`,e):fetch(o,e)}function be(o){return o==="https:"?443:80}function Se(o){let t=o.pathname||"/";return(t==="/"||t==="")&&!o.search&&!o.hash}async function me(o,t){let e=o.replace(/\/+$/,"");try{let n=await ce(`${e}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),a=r?.extra?.expoClient||r?.extra||{},i=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(i||a.name)return{bundleUrl:se(i||`${e}${j}`),port:t,framework:we(i,a.sdkVersion),projectName:a.name}}}catch{}try{let n=await ce(`${e}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${e}${j}`,port:t,framework:"metro"}}catch{}return null}async function $e(o){return me(le("http:","localhost",o),o)}async function Q(o){let t=o.trim();if(/^\d+$/.test(t)){let s=parseInt(t,10),l=await $e(s);if(l)return l;throw ae(`localhost:${s}`)}let e=t.startsWith("http")?t:`http://${t}`,n;try{n=new URL(e)}catch{throw new Error(`could not parse "${o}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let r=n.protocol||"http:",a=n.port?parseInt(n.port,10):be(r),i=le(r,n.hostname,a);if(Se(n)){let s=await me(i,a);if(s)return s;throw ae(i)}return{bundleUrl:n.toString(),port:a,framework:"unknown"}}function qe(){console.error(" no sootsim desktop companion found."),console.error(""),console.error(" install the desktop app:"),console.error(" sootsim install-desktop"),console.error(""),console.error(" or wire sootsim into your own project so your dev server hosts the bridge:"),console.error(" sootsim setup-repo"),console.error("")}function de(o){let t=I();if(console.log(` note: no sootsim bridge detected on port ${o}`),t){console.log(" launch the installed companion with:"),console.log(" sootsim electron");return}console.log(""),console.log(" to get a bridge running, either:"),console.log(" sootsim install-desktop # download the electron app"),console.log(" sootsim setup-repo # wire sootsim into your own project")}function ve(o){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${o}.`),console.error(""),console.error(" start your app dev server, then open it in sootsim:"),console.error(" npx expo start --localhost --port 8081"),console.error(" sootsim open 8081"),console.error(""),console.error(" then inspect the live app:"),console.error(" sootsim describe")}async function We(o,t,e){let n=[];try{n=await o.listSims()}catch{}if(console.error(""),n.length===0){ve(t);return}console.error(` no sim with id "${e}" is connected to the bridge on port ${t}.`),console.error(""),console.error(" connected sims:");for(let r of n){let a=[r.isPrimary?"primary":null,r.readyState].filter(Boolean).join(", ");console.error(` ${r.id} (${a})`)}console.error(""),console.error(" pass a valid --sim id, or run `sootsim list` to see all sessions.")}var Pe={rn:"/rn",connectrn:"/rn","connect-rn":"/rn",clock:"/app/clock","native-ui":"/app/native-ui",tamagui:"/app/tamagui",settings:"/app/settings",photos:"/app/photos",camera:"/app/camera"};function P(o){return new Promise(t=>setTimeout(t,o))}function V(o){return o.trim()}function J(o){try{let t=new URL(o),e=t.pathname.replace(/\/+$/,"")||"/";return t.searchParams.has("open")||t.searchParams.has("port")||t.searchParams.has("bundle")||t.searchParams.has("demo")||t.pathname.includes("/sootsim/index.html")||e==="/sootsim"||t.pathname==="/__soot"||t.pathname==="/__soot/"||e==="/rn"||/^\/rn\/[^/]+$/i.test(e)||/^\/app\/[^/]+$/i.test(e)||e==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(e)||/^\/__soot\/app\/[^/]+$/i.test(e)}catch{return!1}}async function co(o){let t=V(o);return(await Q(t)).bundleUrl}function X(o){let t=o.replace(/\/+$/,"")||"/";return t==="/__soot"||t.startsWith("/__soot/")?"/__soot":""}function ke(o,t){let e=V(o),n=new URL(t),r=X(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),/^\d+$/.test(e)?n.pathname=`${r}/rn/${e}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",e)),n.toString()}function Ie(o){let t=V(o);return/^\d+$/.test(t)||/^https?:\/\//i.test(t)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(t)}async function Me(o,t){let e=await Q(o),n=new URL(t),r=X(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.set("bundle",e.bundleUrl),n.toString()}function Te(o){return o.startsWith("~/")?K.join(Ce.homedir(),o.slice(2)):K.isAbsolute(o)?o:K.resolve(process.cwd(),o)}function Ue(o){let t={};for(let e=0;e<o.length;e++){if(o[e]!=="--replace")continue;let n=o[e+1];n||(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let r=n.indexOf("=");(r<=0||r===n.length-1)&&(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let a=n.slice(0,r).trim(),i=Te(n.slice(r+1).trim());xe.existsSync(i)||(console.error(` sootsim open: replacement file not found: ${i}`),process.exit(1)),t[a]={file:i},e++}return Object.keys(t).length>0?{modules:t}:void 0}function pe(){let o=oe();return te(o)&&o.runtimePort>0?`http://localhost:${o.runtimePort}/`:ee}async function N(o,t=pe()){if(!o)return new URL(t).toString();if(J(o))return new URL(o).toString();let e=Pe[o.toLowerCase()];if(e){let n=new URL(t),r=X(n.pathname);return n.pathname=`${r}${e}`,n.toString()}return Ie(o)?Me(o,t):ke(o,t)}function ue(o,t){let e=o?.url||o?.origin||t;try{let n=new URL(e);return n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("inspectOpen"),n.toString()}catch{return t}}async function Be(o,t,e){let n=new URL(await N(o,t));return n.searchParams.set("inspectOpen",e),n.toString()}async function Oe(o,t,e,n={}){let r=n.attempts??30,a=n.intervalMs??500,i=n.minNodeCount??10;for(let s=0;s<r;s++){let l=b(o,{commandTimeoutMs:t,simId:e,simIdSource:"flag"});try{let c=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof c=="number"&&c>i)return{bridge:l,count:c}}catch{}l.close(),await P(a)}return null}function _e(o){if(!o)return null;try{let t=new URL(o);if(t.searchParams.has("bundle")){let e=t.searchParams.get("bundle")||"";try{let n=new URL(e),r=n.pathname.length>36?`...${n.pathname.slice(-36)}`:n.pathname;return`bundle ${n.host}${r}`}catch{return"bundle"}}return t.searchParams.has("port")?`connect :${t.searchParams.get("port")||""}`:t.searchParams.has("open")?`connect ${t.searchParams.get("open")||""}`:t.searchParams.has("demo")?`demo ${t.searchParams.get("demo")||"default"}`:t.pathname.includes("/sootsim/index.html")||t.pathname==="/sootsim/"||t.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function Re(o,t){if(o.length===0){console.log(" no sims connected");return}console.log(` connected sims (${o.length}):
3
- `);for(let e of o){let n=e.lockedBy&&e.lockExpiresAt?`locked by ${e.lockedBy} (${Math.max(0,Math.round((e.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[e.isPrimary?"primary":"",e.id===t?"selected":"",e.readyState,e.attachedCliCount&&e.attachedCliCount>0?"in use":"",e.userFocused?"focused":"",n].filter(Boolean);console.log(` ${e.id}${r.length?` [${r.join(", ")}]`:""}`);let a=_e(e.url);if(a&&console.log(` loaded: ${a}`),e.url?console.log(` url: ${e.url}`):e.origin&&console.log(` origin: ${e.origin}`),e.title&&console.log(` title: ${e.title}`),console.log(` connected: ${new Date(e.connectedAt).toISOString()}`),e.lastActiveAt&&e.lastActiveAt>0){let i=Math.round((Date.now()-e.lastActiveAt)/1e3),s=i<60?`${i}s ago`:i<3600?`${Math.round(i/60)}m ago`:`${Math.round(i/3600)}h ago`;console.log(` last active: ${s}`)}}}async function A(o,t,e,n={}){let r=n.attempts??30,a=n.intervalMs??500;for(let i=0;i<r;i++){let s=b(o,{commandTimeoutMs:t});try{let c=(await s.listSims()).find(e);if(c)return c}catch{}finally{s.close()}await P(a)}return null}async function Ee(o,t,e,n={}){let r=n.attempts??20,a=n.intervalMs??250;for(let i=0;i<r;i++){let s=b(o,{commandTimeoutMs:t});try{let c=(await s.listSims()).find(f=>f.id===e);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{s.close()}await P(a)}return!1}function U(o,t){if(t){let r=t.trim(),a=o.find(i=>i.id===r);if(!a)throw new Error(`no sim connected with id ${r}`);return a}let e=o.find(r=>r.isPrimary&&r.readyState==="open");if(e)return e;let n=o.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function M(o,t,e){console.log(` ${e==="current sim"?"loaded":"opened"}: ${o} [${e}]`),console.log(` current sim: ${t.id}`),console.log(JSON.stringify({simId:t.id,url:t.url},null,2))}async function T(o,t,e){if(e.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Le(o,t,{stableMs:150,maxMs:400});let r=b(o,{commandTimeoutMs:3e3,simId:t,cliLabel:"open --describe",simIdSource:"flag"});try{let i=`(async () => {
4
- const t = window.__sootsimTest
5
- const ms = window.SootSim?.bridges?.mainShell
6
- if (!t) return null
7
- let shell = null
8
- try { shell = ms?.getState ? await ms.getState() : null } catch {}
9
- const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
10
- return { tree, shell }
11
- })()`,s=await r.send({type:"evaluate",code:i});if(!s?.tree)return;if(console.log(""),s.shell?.state){let l=[`state=${s.shell.state}`,s.shell.activeApp?`app=${s.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${l.join(" ")}`)}console.log(s.tree)}finally{r.close()}}catch{}finally{n===void 0?delete process.env.SOOTSIM_QUIET_TARGET_NOTICE:process.env.SOOTSIM_QUIET_TARGET_NOTICE=n}}async function Le(o,t,e){let n=Date.now()+e.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",a=b(o,{commandTimeoutMs:2e3,simId:t,simIdSource:"flag"});try{let i=-1,s=0;for(;Date.now()<n;){let l=-1;try{let c=await a.send({type:"evaluate",code:r});typeof c=="number"&&(l=c)}catch{}if(l>=0&&l===i){if(Date.now()-s>=e.stableMs)return}else i=l,s=Date.now();await P(50)}}finally{a.close()}}async function lo(o,t={}){let e=x(o,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=C(e);try{let r=await n.listSims();Re(r,e.simId)}finally{n.close()}}async function mo(o,t={}){let e=x(o,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile"]}),n=o.find((m,d)=>o[d-1]==="--profile"),r=o.includes("--ephemeral");n&&r&&(console.error(" sootsim open: --profile cannot be combined with --ephemeral"),process.exit(1));let a=n?ie(n).id:void 0,i=!!a||r,s=o.includes("--new")||i,l=Ue(o);s&&e.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let c=e.positional[0]||"",f=o.find((m,d)=>o[d-1]==="--driver")||"",h=o.includes("--headless"),S=o.find((m,d)=>o[d-1]==="--base-url")||pe(),B=o.includes("--base-url"),$=k();if(!f&&!s&&(e.simIdSource==="flag"||e.simIdSource==="saved"&&!!$)){let m=C(e),d=e.simId?` --sim ${e.simId}`:"",u=!1;try{let p=null;try{let y=await m.listSims();if(e.simIdSource==="saved"?(p=y.find(v=>v.id===$&&v.readyState==="open")??null,p||E()):p=U(y,e.simId),!p)if(e.simIdSource==="saved")u=!0;else throw new Error("no sim connected");if(!u&&p){let v=B||J(c)?S:ue(p,S),R=await N(c,D(v,l));m.send({type:"evaluate",simId:p.id,code:`window.location.href = ${JSON.stringify(R)}`}).catch(()=>{})}}catch(y){console.error(` open failed: ${y instanceof Error?y.message:String(y)}`),await L(m,{errorsCommand:`sootsim get errors 5${d}`,warningsCommand:`sootsim get warnings 5${d}`,requestsCommand:`sootsim get requests 5${d}`}),process.exit(1)}if(!u&&p){await P(1500);let y=await Oe(e.wsPort,e.commandTimeoutMs,p.id);y||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),y.bridge.close(),g(p.id);let v=B||J(c)?S:ue(p,S),R=await N(c,D(v,l));M(R,{...p,url:R},"current sim"),await T(e.wsPort,p.id,o);return}}finally{m.close()}}let Y=D(S,l),ge=await N(c,Y),Z=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,w=await Be(c,Y,Z),F={newWindow:!0},O=m=>m.url?.includes(`inspectOpen=${Z}`)??!1;if(f){let m=W(f);m||(console.error(` unknown driver "${f}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let d=await m.launch({url:w,headless:h,newWindow:F.newWindow,profileId:a,ephemeralProfile:r});d.launched||(console.error(` ${m.name} driver: ${d.message}`),process.exit(1));let u=await A(e.wsPort,e.commandTimeoutMs,O,{attempts:60,intervalMs:500});u||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(u.id),M(w,u,`${m.name} driver`),await T(e.wsPort,u.id,o);return}if(i){let m=I();m||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await q(w,m,{profileId:a,ephemeralProfile:r})).launched||(console.error(" desktop companion failed to start"),process.exit(1))}catch(u){console.error(` desktop companion failed: ${u instanceof Error?u.message:String(u)}`),process.exit(1)}let d=await A(e.wsPort,e.commandTimeoutMs,O,{attempts:40,intervalMs:500});d||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),g(d.id),M(w,d,"desktop companion"),await T(e.wsPort,d.id,o);return}let H=!1,z=!1;try{let m=b(e.wsPort,{commandTimeoutMs:2e3});try{await m.listSims(),H=!0}finally{m.close()}}catch{}if(H)try{let m=b(e.wsPort,{commandTimeoutMs:3e3});try{await m.openUrl(w,F),z=!0}finally{m.close()}}catch{}if(!z){let m=I();if(m)try{if((await q(w,m)).launched){let u=await A(e.wsPort,e.commandTimeoutMs,O,{attempts:20,intervalMs:500});if(u){g(u.id),M(w,u,"desktop companion"),await T(e.wsPort,u.id,o);return}}}catch{}try{await ne(w,F)}catch(d){console.error(` open failed: ${d instanceof Error?d.message:String(d)}`),W("playwright")?.availability().available?console.error(" no system browser found \u2014 retry with `sootsim open \u2026 --driver playwright` for a headless sim."):console.error(" run `sootsim list --drivers` to see available drivers."),process.exit(1)}if(!H){console.log(` opened: ${ge}`),de(e.wsPort);return}}let _=await A(e.wsPort,e.commandTimeoutMs,O,{attempts:30,intervalMs:500});_||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(_.id),M(w,_,z?"bridge":"direct shell open"),await T(e.wsPort,_.id,o)}async function fe(o,t={}){let e=x(o,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--force"]}),n=o.includes("--force"),r=C(e),a=e.simId?` --sim ${e.simId}`:"";try{try{let i=await r.listSims(),s=U(i,e.positional[0]||e.simId);if(s.lockedBy&&s.lockExpiresAt&&s.lockExpiresAt>Date.now()){let l=Math.max(0,Math.round((s.lockExpiresAt-Date.now())/1e3));s.lockedByKind==="user-active"&&(console.error(` refused: ${s.id} is locked by the active user (${l}s) \u2014 that's a live human tab`),console.error(" run `sootsim open --new` for a fresh investigation sim"),process.exit(1)),n||(console.error(` refused: ${s.id} is leased by ${s.lockedBy} (${l}s)`),console.error(` \`sootsim use ${s.id} --force\` to take it, or \`sootsim open --new\` for a fresh sim`),process.exit(1))}await r.focusSim(s.id),g(s.id),console.log(` using: ${s.id}`)}catch(i){console.error(` use failed: ${i instanceof Error?i.message:String(i)}`),await L(r,{errorsCommand:`sootsim get errors 5${a}`,warningsCommand:`sootsim get warnings 5${a}`,requestsCommand:`sootsim get requests 5${a}`}),process.exit(1)}}finally{r.close()}}async function uo(o,t={}){await fe(o,t)}async function po(o,t={}){await fe(o,t)}async function fo(o,t={}){let e=x(o,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--force"]}),n=o.includes("--force"),r=C(e);try{try{let a=await r.listSims(),i=U(a,e.positional[0]||e.simId),s=n&&i.lockedBy&&i.lockedByKind!=="user-active"?i.lockedBy:null,l=await r.claim(i.id,{force:n});g(i.id);let c=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),f=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${c}s]${f}`),s&&console.log(` took over from: ${s}`)}catch(a){if(a instanceof re){let i=Math.max(0,Math.round(a.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${a.lock.by} for ${i}s more`),console.error(" use --force to take it, or `sootsim open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}}finally{r.close()}}async function De(o,t,e,n){if(n.length===0)return{closed:[],remaining:[]};await Promise.all(n.map(a=>o.closeSim(a).catch(()=>{})));let r=new Set(n);for(let a=0;a<40;a++){let i=[];try{let s=b(t,{commandTimeoutMs:e});try{i=(await s.listSims()).filter(c=>r.has(c.id)&&c.readyState==="open").map(c=>c.id)}finally{s.close()}}catch{i=[]}if(i.length===0)return{closed:[...r],remaining:[]};if(a===39)return{closed:[...r].filter(s=>!i.includes(s)),remaining:i};await P(250)}return{closed:[...r],remaining:[]}}async function go(o,t={}){let e=x(o,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--all","--others"]}),n=C(e),r=e.simId?` --sim ${e.simId}`:"",a=o.includes("--all"),i=o.includes("--others");if(a||i){try{let s=await n.listSims(),l=s.filter($=>$.readyState==="open"),c=null;if(i)try{c=U(s,e.positional[0]||e.simId||k()||void 0).id}catch{c=null}let f=l.map($=>$.id).filter($=>$!==c);if(f.length===0){console.log(c?` nothing to close \u2014 only the kept sim ${c} is connected`:" nothing to close \u2014 no sims connected");return}let h=await De(n,e.wsPort,e.commandTimeoutMs,f),S=k();S&&h.closed.includes(S)&&(c?g(c):E());let B=` closed ${h.closed.length} sim(s)${c?` (kept ${c})`:""}`;console.log(B),h.remaining.length>0&&(console.error(` close failed: still connected: ${h.remaining.join(", ")}`),process.exit(1))}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}finally{n.close()}return}try{try{let s=await n.listSims(),l=U(s,e.positional[0]||e.simId),c=s.find(h=>h.id!==l.id&&h.readyState==="open");await n.closeSim(l.id),await Ee(e.wsPort,e.commandTimeoutMs,l.id)||(console.error(` close failed: ${l.id} is still connected`),process.exit(1)),k()===l.id&&(c?g(c.id):E()),console.log(` closed: ${l.id}`)}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await L(n,{errorsCommand:`sootsim get errors 5${r}`,warningsCommand:`sootsim get warnings 5${r}`,requestsCommand:`sootsim get requests 5${r}`}),process.exit(1)}}finally{n.close()}}export{qe as a,ve as b,We as c,co as d,pe as e,N as f,Be as g,_e as h,Re as i,A as j,lo as k,mo as l,uo as m,po as n,fo as o,go as p};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,5 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as y,c as C}from"./chunk-TL3533Q6.js";import{a as x}from"./chunk-IE22T725.js";import{exec as U}from"child_process";import _ from"http";import D from"net";import{promisify as T}from"util";var P=T(U),E=250,A=1500,M=120;function R(e,r=M){return new Promise(s=>{let t=new D.Socket,o=!1,i=a=>{o||(o=!0,t.destroy(),s(a))};t.setTimeout(r),t.once("connect",()=>i(!0)),t.once("timeout",()=>i(!1)),t.once("error",()=>i(!1)),t.connect(e,"localhost")})}function h(e,r,s="GET",t=E,o={}){return new Promise(i=>{let a=_.request({hostname:"localhost",port:e,path:r,method:s,timeout:t,headers:o},n=>{let c="";n.on("data",l=>c+=l.toString());let u=(()=>{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:c,contentType:u}))});a.on("error",()=>i(null)),a.setTimeout(t,()=>{a.destroy(),i(null)}),a.end()})}var N=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function v(e,r){return!(e<=0||e>=2e4||r.has(e)||e>=5170&&e<=5200)}async function L(e=[]){let r=new Set(e);try{let{stdout:s}=await P("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(s.trim()){let t=new Map;for(let o of s.trim().split(`
3
- `)){let i=o.trim().split(/\s+/);if(i.length<9)continue;let a=Number(i[1]),c=i[8].match(/:(\d+)$/);if(!c)continue;let u=Number(c[1]);v(u,r)&&(t.has(u)||t.set(u,a))}if(t.size>0)return[...t.entries()].map(([o,i])=>({port:o,pid:i}))}}catch{}try{let{stdout:s}=await P(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(s.trim()){let t=new Map;for(let o of s.trim().split(`
4
- `)){let i=o.match(/:(\d+)\s/),a=o.match(/pid=(\d+)/);if(!i)continue;let n=Number(i[1]),c=a?Number(a[1]):0;v(n,r)&&(t.has(n)||t.set(n,c))}if(t.size>0)return[...t.entries()].map(([o,i])=>({port:o,pid:i}))}}catch{}return N.filter(s=>v(s.port,r))}var S=new Map;async function $(e){if(e<=0)return null;let r=S.get(e);if(r)return r;try{let{stdout:s}=await P(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let t of s.split(`
5
- `))if(t.startsWith("n")&&t.length>1){let o=t.slice(1).trim();if(o)return S.set(e,o),o}}catch{}return null}function I(e,r){return{port:e,framework:r,bundleUrl:m(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function m(e,r){let s=x.find(o=>o.preferredPort===e),t=s?.runtimeConfig?y(r,s.runtimeConfig):r;return C(t)}function O(e){return e.includes("/node_modules/one/metro-entry.bundle")}function j(e){try{let r=JSON.parse(e);return r&&typeof r=="object"?r:null}catch{return null}}function w(e,r,s){if(!r)return e;try{let t=JSON.parse(r.body),o=t?.extra?.expoClient||t?.extra||{};o.name&&(e.projectName=o.name),o.ios?.bundleIdentifier&&(e.bundleId=o.ios.bundleIdentifier),e.framework==="metro"&&o.sdkVersion&&(e.framework="expo");let i=t?.launchAsset?.url;i&&!e.patched&&!O(e.bundleUrl)&&(e.bundleUrl=m(e.port,i));let a=o.iconUrl||o.ios?.iconUrl||o.icon||o.ios?.icon;if(a)if(e.iconPath=a,s)if(a.startsWith("http"))e.iconUrl=s(a);else{let n=a.replace(/^\.\//,"");e.iconUrl=s(`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,f=new Set,b=new Set;async function H(e,r){if(!await R(e))return null;let s="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[t,o,i,a,n]=await Promise.all([d.has(e)?Promise.resolve(null):h(e,"/__soot/"),h(e,"/status"),h(e,s,"HEAD"),b.has(e)?Promise.resolve(null):h(e,"/","GET",A,{"expo-platform":"ios"}),f.has(e)?Promise.resolve(null):h(e,"/_expo/status")]);n&&n.statusCode===200?f.delete(e):f.has(e)||f.add(e);let c=a?j(a.body):null,u=typeof c?.launchAsset?.url=="string"?c.launchAsset.url:null,l=c?.extra?.expoClient||c?.extra||{};if(c&&(u||typeof l.name=="string")){d.add(e);let p=u||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,k=p.includes("/one/metro-entry.bundle")?"one":"expo";return w({port:e,framework:k,bundleUrl:m(e,p),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},a,r)}return i&&i.statusCode>0&&i.statusCode<400&&/application\/javascript/i.test(i.contentType||"")?(d.add(e),b.add(e),w({port:e,framework:"one",bundleUrl:m(e,`http://localhost:${e}${s}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},a,r)):o&&o.body.includes("packager-status:running")?(d.add(e),w(I(e,n&&n.statusCode===200?"expo":"metro"),a,r)):t&&t.statusCode===200&&t.body.includes("sootsim-patched")?(d.delete(e),w({port:e,framework:"one",bundleUrl:m(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},a,r)):(d.add(e),null)}function B(e){let r=e.projectName?.trim().toLowerCase();return!!(r==="soot"||r==="sootsim"||e.bundleId?.trim().toLowerCase()?.startsWith("dev.soot"))}var g=new Map,G=3e4,W=1500;function F(e){return!e||e.framework==="metro"||e.framework==="unknown"}function z(e){return e?m(e.port,e.bundleUrl)===e.bundleUrl:!0}function q(e,r,s=Date.now()){if(r===0||e.pid!==r||!z(e.result))return!1;let t=s-e.cachedAt;return!(e.result===null&&t>=G||F(e.result)&&t>=W)}async function ee(e={}){let r=await L(e.excludePorts),s=new Set(r.map(n=>n.port));for(let n of[...g.keys()])s.has(n)||g.delete(n);for(let n of[...d])s.has(n)||d.delete(n);for(let n of[...f])s.has(n)||f.delete(n);for(let n of[...b])s.has(n)||b.delete(n);let t=[],o=[];for(let{port:n,pid:c}of r){let u=g.get(n);if(u&&q(u,c)){u.result&&t.push(u.result);continue}u&&u.pid!==c&&(d.delete(n),f.delete(n),b.delete(n)),o.push({port:n,pid:c})}o.length>0&&(await Promise.all(o.map(c=>H(c.port,e.buildIconProxyUrl)))).forEach((c,u)=>{let{port:l,pid:p}=o[u];p!==0&&g.set(l,{pid:p,result:c,cachedAt:Date.now()}),c&&t.push(c)});let i=new Map;for(let{port:n,pid:c}of r)c>0&&i.set(n,c);await Promise.all(t.map(async n=>{let c=i.get(n.port);if(!c)return;n.pid=c;let u=await $(c);u&&(n.cwd=u)}));let a=new Set(i.values());for(let n of[...S.keys()])a.has(n)||S.delete(n);return t.filter(n=>!B(n))}export{ee as a};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.57 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var O="sootsim close";export{O as a};