sootsim 0.1.44 → 0.1.46

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 (137) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-NVU7E7EV.js → agent-4SFE3DNP.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-CLEYNPJK.js → agent-wrapper-BCXD55HW.js} +2 -2
  4. package/dist-cli/chunks/{assert-F7B6TVEQ.js → assert-ILRVN6CB.js} +2 -2
  5. package/dist-cli/chunks/auto-bootstrap-A4ML6QTW.js +2 -0
  6. package/dist-cli/chunks/beta-34TOAZFI.js +2 -0
  7. package/dist-cli/chunks/{chunk-ECIHLBNE.js → chunk-4OPZYTVB.js} +1 -1
  8. package/dist-cli/chunks/{chunk-IMTTDIJJ.js → chunk-7CZ5VL7E.js} +1 -1
  9. package/dist-cli/chunks/{chunk-F76MMAMV.js → chunk-BVXZZOBA.js} +2 -2
  10. package/dist-cli/chunks/{chunk-HIQJTM66.js → chunk-DGAHFMAU.js} +2 -2
  11. package/dist-cli/chunks/{chunk-KWU3WMFD.js → chunk-FCFKR7EM.js} +4 -4
  12. package/dist-cli/chunks/{chunk-54V7OVL6.js → chunk-FLJAN5PS.js} +2 -2
  13. package/dist-cli/chunks/{chunk-4ZA3J2BV.js → chunk-GWOV6KFE.js} +1 -1
  14. package/dist-cli/chunks/{chunk-LCDWXJ6X.js → chunk-H46ZLTT5.js} +1 -1
  15. package/dist-cli/chunks/{chunk-JK3BWGI5.js → chunk-K3I6VLF3.js} +1 -1
  16. package/dist-cli/chunks/{chunk-IIFZNK4R.js → chunk-KETYRULQ.js} +2 -2
  17. package/dist-cli/chunks/chunk-KV7XS7WL.js +1 -0
  18. package/dist-cli/chunks/{chunk-7PUVSCSF.js → chunk-M5HZVUQQ.js} +1 -1
  19. package/dist-cli/chunks/{chunk-6TO2XBUK.js → chunk-MDSET24U.js} +2 -2
  20. package/dist-cli/chunks/chunk-MGEB3WEI.js +117 -0
  21. package/dist-cli/chunks/{chunk-QB4INK6X.js → chunk-MJD6C3BG.js} +2 -2
  22. package/dist-cli/chunks/{chunk-FBCGPPDA.js → chunk-N7DDQ5ZB.js} +2 -2
  23. package/dist-cli/chunks/{chunk-L7V75VQK.js → chunk-OHI4DJSD.js} +1 -1
  24. package/dist-cli/chunks/{chunk-BU7OXA7Y.js → chunk-OMPAUB4V.js} +3 -3
  25. package/dist-cli/chunks/{chunk-EAMMI2FH.js → chunk-OZICEBUA.js} +2 -2
  26. package/dist-cli/chunks/{chunk-ZZOYYBLO.js → chunk-PAOOYAVI.js} +2 -2
  27. package/dist-cli/chunks/{chunk-ZNMOLPG5.js → chunk-PEXPACO5.js} +1 -1
  28. package/dist-cli/chunks/{chunk-K4BRBIGO.js → chunk-PG6FUKZX.js} +2 -2
  29. package/dist-cli/chunks/{chunk-VP52RZT7.js → chunk-PKVNCXQD.js} +2 -2
  30. package/dist-cli/chunks/{chunk-WLH4MLBC.js → chunk-PRRVFNFG.js} +2 -2
  31. package/dist-cli/chunks/{chunk-RN5LEOFJ.js → chunk-QXJR74QV.js} +1 -1
  32. package/dist-cli/chunks/chunk-RSMU24BE.js +1 -0
  33. package/dist-cli/chunks/{chunk-YWBUHBLD.js → chunk-S4OSFQIC.js} +2 -2
  34. package/dist-cli/chunks/{chunk-GLLMLIXC.js → chunk-SG7ICXM2.js} +3 -3
  35. package/dist-cli/chunks/chunk-T4H37KU7.js +2 -0
  36. package/dist-cli/chunks/chunk-UH5PKJXT.js +1 -0
  37. package/dist-cli/chunks/chunk-VWJ4O366.js +1 -0
  38. package/dist-cli/chunks/{chunk-VQKQSSUD.js → chunk-W52DGZNV.js} +1 -1
  39. package/dist-cli/chunks/{chunk-6QY5P2H6.js → chunk-WD36PEEJ.js} +2 -2
  40. package/dist-cli/chunks/{chunk-LCUVF6MI.js → chunk-WRNSX5RR.js} +2 -2
  41. package/dist-cli/chunks/{chunk-OBIALIWI.js → chunk-WWEMLI77.js} +1 -1
  42. package/dist-cli/chunks/{chunk-E3DHOL7O.js → chunk-X7P3CGPY.js} +3 -3
  43. package/dist-cli/chunks/{chunk-NMFN4EIE.js → chunk-XKNZR4BB.js} +2 -2
  44. package/dist-cli/chunks/{chunk-MS5QBIOB.js → chunk-XSJ4SU63.js} +31 -31
  45. package/dist-cli/chunks/{chunk-VFUO52ZQ.js → chunk-XT36ZR2H.js} +1 -1
  46. package/dist-cli/chunks/{chunk-2Q5YKX76.js → chunk-XU27QCRX.js} +1 -1
  47. package/dist-cli/chunks/{chunk-B4B6RECG.js → chunk-YZ7BSNJJ.js} +2 -2
  48. package/dist-cli/chunks/{chunk-T5UKNA5K.js → chunk-Z6BJVYOU.js} +1 -1
  49. package/dist-cli/chunks/{chunk-YROS5I43.js → chunk-Z7J6LG53.js} +2 -2
  50. package/dist-cli/chunks/chunk-ZM4JL3VP.js +11 -0
  51. package/dist-cli/chunks/{compat-5XJPHPPL.js → compat-IC7P6QWF.js} +3 -3
  52. package/dist-cli/chunks/{config-SHZ662ER.js → config-WVL2Y7UU.js} +2 -2
  53. package/dist-cli/chunks/control-7VDRDQXQ.js +2 -0
  54. package/dist-cli/chunks/cpu-profile-FJIMZKXF.js +2 -0
  55. package/dist-cli/chunks/{daemon-QRHS6CAR.js → daemon-TH7B22C4.js} +2 -2
  56. package/dist-cli/chunks/{debug-CRQNVODN.js → debug-MN6RXRJO.js} +3 -3
  57. package/dist-cli/chunks/demo-app-registry-ISNBFJTI.js +2 -0
  58. package/dist-cli/chunks/{detox-PEPICVRX.js → detox-BUJ3IOIB.js} +2 -2
  59. package/dist-cli/chunks/{device-4GRKBTIY.js → device-MUCGW2TT.js} +2 -2
  60. package/dist-cli/chunks/{diagnose-FRGJNGVH.js → diagnose-5NADXMRL.js} +2 -2
  61. package/dist-cli/chunks/drivers-RXVSKXUD.js +2 -0
  62. package/dist-cli/chunks/{electron-KAAQYVLY.js → electron-ON6434HQ.js} +3 -3
  63. package/dist-cli/chunks/flow-WI5MN76X.js +2 -0
  64. package/dist-cli/chunks/{hints-JDTUIEQI.js → hints-23C3BW62.js} +2 -2
  65. package/dist-cli/chunks/{home-paths-MCK43U6W.js → home-paths-DAI3XZLG.js} +2 -2
  66. package/dist-cli/chunks/{inspect-2ORQQN7T.js → inspect-UVS4UIJF.js} +91 -91
  67. package/dist-cli/chunks/install-QKH2JQGE.js +2 -0
  68. package/dist-cli/chunks/{install-desktop-YEGVQFNS.js → install-desktop-6BT3VL2C.js} +3 -3
  69. package/dist-cli/chunks/{keys-2QRSFPVS.js → keys-4OT37H4C.js} +2 -2
  70. package/dist-cli/chunks/{launch-L25GI237.js → launch-2C3YGABQ.js} +3 -3
  71. package/dist-cli/chunks/{login-FHC2PLFD.js → login-NWY5ENAT.js} +4 -4
  72. package/dist-cli/chunks/{logout-FJQU7HI2.js → logout-6BHGSVMN.js} +2 -2
  73. package/dist-cli/chunks/{maestro-Z6YMB7VM.js → maestro-V7WIYUNE.js} +2 -2
  74. package/dist-cli/chunks/{preview-7ZCBU2IE.js → preview-H2ACZ26A.js} +2 -2
  75. package/dist-cli/chunks/{profile-JTJF6PY6.js → profile-ZLDFCIZA.js} +2 -2
  76. package/dist-cli/chunks/{react-XP2AJQ4T.js → react-PEM4I7YB.js} +2 -2
  77. package/dist-cli/chunks/record-KVBDN3GC.js +18 -0
  78. package/dist-cli/chunks/runtime-LLWAHSVR.js +2 -0
  79. package/dist-cli/chunks/{runtime-delivery-O655KIUB.js → runtime-delivery-ECDTRILR.js} +2 -2
  80. package/dist-cli/chunks/{screenshot-CPCNSTFP.js → screenshot-PJEMMFQO.js} +2 -2
  81. package/dist-cli/chunks/{screenshot-mode-MGWQGOM7.js → screenshot-mode-DKPHJONC.js} +2 -2
  82. package/dist-cli/chunks/{screenshots-ZD7HJ4GA.js → screenshots-5UQ36N7Q.js} +2 -2
  83. package/dist-cli/chunks/{server-V55GYTFF.js → server-LADTO7OS.js} +2 -2
  84. package/dist-cli/chunks/setup-repo-TXI7Q6F6.js +2 -0
  85. package/dist-cli/chunks/{skills-PGTMJCNI.js → skills-FUN6M66H.js} +2 -2
  86. package/dist-cli/chunks/{start-OB5MRSE4.js → start-A6FDAXGU.js} +4 -4
  87. package/dist-cli/chunks/store-KTDAA7SP.js +2 -0
  88. package/dist-cli/chunks/telemetry-VPFS3BGR.js +2 -0
  89. package/dist-cli/chunks/{test-OXVUTEEX.js → test-HPXQTADO.js} +3 -3
  90. package/dist-cli/chunks/{three-mode-P6JQUJEA.js → three-mode-2APCW2N7.js} +2 -2
  91. package/dist-cli/chunks/{timeline-TVXCZIHI.js → timeline-6D6V6LRX.js} +2 -2
  92. package/dist-cli/chunks/{upgrade-PDM3N57Q.js → upgrade-KZIO3ZJH.js} +2 -2
  93. package/dist-cli/chunks/upload-LDL3FZKD.js +2 -0
  94. package/dist-cli/chunks/{web-F5K7GAGR.js → web-MR4EQWCC.js} +2 -2
  95. package/dist-cli/chunks/{what-happened-QE3IR6K4.js → what-happened-FHQD42JV.js} +2 -2
  96. package/dist-cli/chunks/{whoami-NPO62CNB.js → whoami-GHNFMMK4.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 +1 -1
  109. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  110. package/dist-lib/index.cjs +1 -1
  111. package/dist-lib/metro.cjs +1 -1
  112. package/dist-lib/profiles.cjs +1 -1
  113. package/dist-lib/render-mode.cjs +1 -1
  114. package/dist-lib/vite-base.cjs +1 -1
  115. package/dist-lib/vite.cjs +1 -1
  116. package/package.json +1 -1
  117. package/dist-cli/chunks/auto-bootstrap-BIH3TKGB.js +0 -2
  118. package/dist-cli/chunks/beta-DD7XOVXJ.js +0 -2
  119. package/dist-cli/chunks/chunk-2TU7QJGH.js +0 -1
  120. package/dist-cli/chunks/chunk-5A7UO4OE.js +0 -1
  121. package/dist-cli/chunks/chunk-KVJEI5YO.js +0 -1
  122. package/dist-cli/chunks/chunk-POPZHYTD.js +0 -117
  123. package/dist-cli/chunks/chunk-TXCWW2IX.js +0 -11
  124. package/dist-cli/chunks/chunk-ZLOUP7JS.js +0 -1
  125. package/dist-cli/chunks/chunk-ZP4PF72U.js +0 -2
  126. package/dist-cli/chunks/control-ONCNZDD5.js +0 -2
  127. package/dist-cli/chunks/cpu-profile-KFM3R5MY.js +0 -2
  128. package/dist-cli/chunks/demo-app-registry-GCDJ3DX7.js +0 -2
  129. package/dist-cli/chunks/drivers-LRMIFMFF.js +0 -2
  130. package/dist-cli/chunks/flow-P6N565XT.js +0 -2
  131. package/dist-cli/chunks/install-KVZFRP22.js +0 -2
  132. package/dist-cli/chunks/record-56JAGJUN.js +0 -17
  133. package/dist-cli/chunks/runtime-T2X2XY72.js +0 -2
  134. package/dist-cli/chunks/setup-repo-SGAHUDYC.js +0 -2
  135. package/dist-cli/chunks/store-SUEZBGQY.js +0 -2
  136. package/dist-cli/chunks/telemetry-COZXGX5D.js +0 -2
  137. package/dist-cli/chunks/upload-U55QDSSX.js +0 -2
@@ -1,11 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as B,b as H,c as ne}from"./chunk-L7V75VQK.js";import{b as T}from"./chunk-ZNMOLPG5.js";import{g as se}from"./chunk-KWU3WMFD.js";import{a as x,b as z}from"./chunk-2Q5YKX76.js";import{c as re}from"./chunk-NMFN4EIE.js";import{d as oe}from"./chunk-ECIHLBNE.js";import{a as Y}from"./chunk-ZP4PF72U.js";import{b as te,c as S,d as w,e as $}from"./chunk-HIQJTM66.js";import{c as N,d as g,e as F}from"./chunk-OBIALIWI.js";import{E as Z,F as ee}from"./chunk-7PUVSCSF.js";import xe from"node:fs";import Ce from"node:os";import j from"node:path";function ge(e){return e.replace(/^\[|\]$/g,"").toLowerCase()}function _(e){let t=ge(e);return t==="localhost"||t.endsWith(".localhost")||t==="0.0.0.0"||t==="::1"||/^127(?:\.\d{1,3}){3}$/.test(t)}function ie(e){return new Error(`could not resolve a native bundle for ${e}. pass an explicit bundle URL or open Connect and choose the app there.`)}function we(e,t){return e?.includes("/one/metro-entry.bundle")?"one":typeof t=="string"&&t?"expo":"unknown"}function ce(e,t,o){return`${e}//${t}:${o}`}function be(e){if(typeof window>"u")return!1;try{let t=new URL(e);return _(t.hostname)&&_(window.location.hostname)&&t.origin!==window.location.origin}catch{return!1}}async function ae(e,t){let o={...t,cache:t?.cache??"no-store"};return be(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,o):fetch(e,o)}function ye(e){return e==="https:"?443:80}function Se(e){let t=e.pathname||"/";return(t==="/"||t==="")&&!e.search&&!e.hash}async function le(e,t){let o=e.replace(/\/+$/,"");try{let n=await ae(`${o}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),s=r?.extra?.expoClient||r?.extra||{},i=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(i||s.name)return{bundleUrl:ne(i||`${o}${H}`),port:t,framework:we(i,s.sdkVersion),projectName:s.name}}}catch{}try{let n=await ae(`${o}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${o}${H}`,port:t,framework:"metro"}}catch{}return null}async function $e(e){return le(ce("http:","localhost",e),e)}async function q(e){let t=e.trim();if(/^\d+$/.test(t)){let a=parseInt(t,10),l=await $e(a);if(l)return l;throw ie(`localhost:${a}`)}let o=t.startsWith("http")?t:`http://${t}`,n;try{n=new URL(o)}catch{throw new Error(`could not parse "${e}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let r=n.protocol||"http:",s=n.port?parseInt(n.port,10):ye(r),i=ce(r,n.hostname,s);if(_(n.hostname)&&Se(n)){let a=await le(i,s);if(a)return a;throw ie(i)}return{bundleUrl:n.toString(),port:s,framework:"unknown"}}function je(){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 me(e){let t=x();if(console.log(` note: no sootsim bridge detected on port ${e}`),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(e){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${e}.`),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(e,t,o){let n=[];try{n=await e.listSims()}catch{}if(console.error(""),n.length===0){ve(t);return}console.error(` no sim with id "${o}" is connected to the bridge on port ${t}.`),console.error(""),console.error(" connected sims:");for(let r of n){let s=[r.isPrimary?"primary":null,r.readyState].filter(Boolean).join(", ");console.error(` ${r.id} (${s})`)}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 I(e){return new Promise(t=>setTimeout(t,e))}function G(e){return e.trim()}function W(e){try{let t=new URL(e),o=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")||o==="/sootsim"||t.pathname==="/__soot"||t.pathname==="/__soot/"||o==="/rn"||/^\/rn\/[^/]+$/i.test(o)||/^\/app\/[^/]+$/i.test(o)||o==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(o)||/^\/__soot\/app\/[^/]+$/i.test(o)}catch{return!1}}async function co(e){let t=G(e);return(await q(t)).bundleUrl}function Q(e){let t=e.replace(/\/+$/,"")||"/";return t==="/__soot"||t.startsWith("/__soot/")?"/__soot":""}function Ie(e,t){let o=G(e),n=new URL(t),r=Q(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(o)?n.pathname=`${r}/rn/${o}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",o)),n.toString()}function Ue(e){let t=G(e);return/^\d+$/.test(t)||/^https?:\/\//i.test(t)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(t)}async function ke(e,t){let o=await q(e),n=new URL(t),r=Q(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",o.bundleUrl),n.toString()}function Me(e){return e.startsWith("~/")?j.join(Ce.homedir(),e.slice(2)):j.isAbsolute(e)?e:j.resolve(process.cwd(),e)}function Te(e){let t={};for(let o=0;o<e.length;o++){if(e[o]!=="--replace")continue;let n=e[o+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 s=n.slice(0,r).trim(),i=Me(n.slice(r+1).trim());xe.existsSync(i)||(console.error(` sootsim open: replacement file not found: ${i}`),process.exit(1)),t[s]={file:i},o++}return Object.keys(t).length>0?{modules:t}:void 0}function ue(){let e=Z();return ee(e)&&e.runtimePort>0?`http://localhost:${e.runtimePort}/`:Y}async function R(e,t=ue()){if(!e)return new URL(t).toString();if(W(e))return new URL(e).toString();let o=Pe[e.toLowerCase()];if(o){let n=new URL(t),r=Q(n.pathname);return n.pathname=`${r}${o}`,n.toString()}return Ue(e)?ke(e,t):Ie(e,t)}function de(e,t){let o=e?.url||e?.origin||t;try{let n=new URL(o);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(e,t,o){let n=new URL(await R(e,t));return n.searchParams.set("inspectOpen",o),n.toString()}async function _e(e,t,o,n={}){let r=n.attempts??30,s=n.intervalMs??500,i=n.minNodeCount??10;for(let a=0;a<r;a++){let l=w(e,{commandTimeoutMs:t,simId:o,simIdSource:"flag"});try{let m=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof m=="number"&&m>i)return{bridge:l,count:m}}catch{}l.close(),await I(s)}return null}function Oe(e){if(!e)return null;try{let t=new URL(e);if(t.searchParams.has("bundle")){let o=t.searchParams.get("bundle")||"";try{let n=new URL(o),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(e,t){if(e.length===0){console.log(" no sims connected");return}console.log(` connected sims (${e.length}):
3
- `);for(let o of e){let n=o.lockedBy&&o.lockExpiresAt?`locked by ${o.lockedBy} (${Math.max(0,Math.round((o.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[o.isPrimary?"primary":"",o.id===t?"selected":"",o.readyState,o.attachedCliCount&&o.attachedCliCount>0?"in use":"",o.userFocused?"focused":"",n].filter(Boolean);console.log(` ${o.id}${r.length?` [${r.join(", ")}]`:""}`);let s=Oe(o.url);if(s&&console.log(` loaded: ${s}`),o.url?console.log(` url: ${o.url}`):o.origin&&console.log(` origin: ${o.origin}`),o.title&&console.log(` title: ${o.title}`),console.log(` connected: ${new Date(o.connectedAt).toISOString()}`),o.lastActiveAt&&o.lastActiveAt>0){let i=Math.round((Date.now()-o.lastActiveAt)/1e3),a=i<60?`${i}s ago`:i<3600?`${Math.round(i/60)}m ago`:`${Math.round(i/3600)}h ago`;console.log(` last active: ${a}`)}}}async function O(e,t,o,n={}){let r=n.attempts??30,s=n.intervalMs??500;for(let i=0;i<r;i++){let a=w(e,{commandTimeoutMs:t});try{let m=(await a.listSims()).find(o);if(m)return m}catch{}finally{a.close()}await I(s)}return null}async function Le(e,t,o,n={}){let r=n.attempts??20,s=n.intervalMs??250;for(let i=0;i<r;i++){let a=w(e,{commandTimeoutMs:t});try{let m=(await a.listSims()).find(b=>b.id===o);if(!m||m.readyState!=="open")return!0}catch{return!0}finally{a.close()}await I(s)}return!1}function L(e,t){if(t){let r=t.trim(),s=e.find(i=>i.id===r);if(!s)throw new Error(`no sim connected with id ${r}`);return s}let o=e.find(r=>r.isPrimary&&r.readyState==="open");if(o)return o;let n=e.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function C(e,t,o){console.log(` ${o==="current sim"?"loaded":"opened"}: ${e} [${o}]`),console.log(` current sim: ${t.id}`),console.log(JSON.stringify({simId:t.id,url:t.url},null,2))}async function P(e,t,o){if(o.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Ee(e,t,{stableMs:150,maxMs:400});let r=w(e,{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
- })()`,a=await r.send({type:"evaluate",code:i});if(!a?.tree)return;if(console.log(""),a.shell?.state){let l=[`state=${a.shell.state}`,a.shell.activeApp?`app=${a.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${l.join(" ")}`)}console.log(a.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 Ee(e,t,o){let n=Date.now()+o.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",s=w(e,{commandTimeoutMs:2e3,simId:t,simIdSource:"flag"});try{let i=-1,a=0;for(;Date.now()<n;){let l=-1;try{let m=await s.send({type:"evaluate",code:r});typeof m=="number"&&(l=m)}catch{}if(l>=0&&l===i){if(Date.now()-a>=o.stableMs)return}else i=l,a=Date.now();await I(50)}}finally{s.close()}}async function lo(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=$(o);try{let r=await n.listSims();Re(r,o.simId)}finally{n.close()}}async function mo(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile"]}),n=e.find((c,d)=>e[d-1]==="--profile"),r=e.includes("--ephemeral");n&&r&&(console.error(" sootsim open: --profile cannot be combined with --ephemeral"),process.exit(1));let s=n?re(n).id:void 0,i=!!s||r,a=e.includes("--new")||i,l=Te(e);a&&o.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let m=o.positional[0]||"",b=e.find((c,d)=>e[d-1]==="--driver")||"",fe=e.includes("--headless"),v=e.find((c,d)=>e[d-1]==="--base-url")||ue(),J=e.includes("--base-url"),K=N();if(!a&&(o.simIdSource==="flag"||o.simIdSource==="saved"&&!!K)){let c=$(o),d=o.simId?` --sim ${o.simId}`:"",u=!1;try{let p=null;try{let h=await c.listSims();if(o.simIdSource==="saved"?(p=h.find(y=>y.id===K&&y.readyState==="open")??null,p||F()):p=L(h,o.simId),!p)if(o.simIdSource==="saved")u=!0;else throw new Error("no sim connected");if(!u&&p){let y=J||W(m)?v:de(p,v),M=await R(m,B(y,l));c.send({type:"evaluate",simId:p.id,code:`window.location.href = ${JSON.stringify(M)}`}).catch(()=>{})}}catch(h){console.error(` open failed: ${h instanceof Error?h.message:String(h)}`),await T(c,{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 I(1500);let h=await _e(o.wsPort,o.commandTimeoutMs,p.id);h||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),h.bridge.close(),g(p.id);let y=J||W(m)?v:de(p,v),M=await R(m,B(y,l));C(M,{...p,url:M},"current sim"),await P(o.wsPort,p.id,e);return}}finally{c.close()}}let V=B(v,l),he=await R(m,V),X=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,f=await Be(m,V,X),E={newWindow:!0},U=c=>c.url?.includes(`inspectOpen=${X}`)??!1;if(b){let c=se(b);c||(console.error(` unknown driver "${b}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let d=await c.launch({url:f,headless:fe,newWindow:E.newWindow,profileId:s,ephemeralProfile:r});d.launched||(console.error(` ${c.name} driver: ${d.message}`),process.exit(1));let u=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:60,intervalMs:500});u||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(u.id),C(f,u,`${c.name} driver`),await P(o.wsPort,u.id,e);return}if(i){let c=x();c||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await z(f,c,{profileId:s,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 O(o.wsPort,o.commandTimeoutMs,U,{attempts:40,intervalMs:500});d||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),g(d.id),C(f,d,"desktop companion"),await P(o.wsPort,d.id,e);return}let D=!1,A=!1;try{let c=w(o.wsPort,{commandTimeoutMs:2e3});try{await c.listSims(),D=!0}finally{c.close()}}catch{}if(D)try{let c=w(o.wsPort,{commandTimeoutMs:3e3});try{await c.openUrl(f,E),A=!0}finally{c.close()}}catch{}if(!A){let c=x();if(c)try{if((await z(f,c)).launched){let u=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:20,intervalMs:500});if(u){g(u.id),C(f,u,"desktop companion"),await P(o.wsPort,u.id,e);return}}}catch{}if(await oe(f,E),!D){console.log(` opened: ${he}`),me(o.wsPort);return}}let k=await O(o.wsPort,o.commandTimeoutMs,U,{attempts:30,intervalMs:500});k||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),g(k.id),C(f,k,A?"bridge":"direct shell open"),await P(o.wsPort,k.id,e)}async function pe(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=$(o),r=o.simId?` --sim ${o.simId}`:"";try{try{let s=await n.listSims(),i=L(s,o.positional[0]||o.simId);await n.focusSim(i.id),g(i.id),console.log(` using: ${i.id}`)}catch(s){console.error(` use failed: ${s instanceof Error?s.message:String(s)}`),await T(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()}}async function uo(e,t={}){await pe(e,t)}async function po(e,t={}){await pe(e,t)}async function fo(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs,stripBooleanFlags:["--force"]}),n=e.includes("--force"),r=$(o);try{try{let s=await r.listSims(),i=L(s,o.positional[0]||o.simId),a=n&&i.lockedBy&&i.lockedByKind!=="user-active"?i.lockedBy:null,l=await r.claim(i.id,{force:n});g(i.id);let m=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),b=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${m}s]${b}`),a&&console.log(` took over from: ${a}`)}catch(s){if(s instanceof te){let i=Math.max(0,Math.round(s.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${s.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: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}}finally{r.close()}}async function ho(e,t={}){let o=S(e,{port:t.port,commandTimeoutMs:t.timeoutMs}),n=$(o),r=o.simId?` --sim ${o.simId}`:"";try{try{let s=await n.listSims(),i=L(s,o.positional[0]||o.simId),a=s.find(m=>m.id!==i.id&&m.readyState==="open");if(await n.closeSim(i.id),!await Le(o.wsPort,o.commandTimeoutMs,i.id)){console.log(` close requested: ${i.id} (still connected)`);return}N()===i.id&&(a?g(a.id):F()),console.log(` closed: ${i.id}`)}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await T(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{je as a,ve as b,We as c,co as d,ue as e,R as f,Be as g,Oe as h,Re as i,O as j,lo as k,mo as l,uo as m,po as n,fo as o,ho as p};
@@ -1 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- var t="http://localhost:5173/";export{t as a};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as a,e as b,f as c,g as d,h as e,i as f,j as g,k as h,l as i,m as j,n as k,o as l,p as m}from"./chunk-TXCWW2IX.js";import"./chunk-L7V75VQK.js";import"./chunk-ZNMOLPG5.js";import"./chunk-KWU3WMFD.js";import"./chunk-2Q5YKX76.js";import"./chunk-NMFN4EIE.js";import"./chunk-2TU7QJGH.js";import"./chunk-ECIHLBNE.js";import"./chunk-ZP4PF72U.js";import"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{d as buildOpenUrl,c as buildShellUrl,f as printConnectedSims,a as resolveBundleTarget,b as resolveDefaultShellBaseUrl,l as runClaimCommand,m as runCloseCommand,k as runFocusCommand,h as runListCommand,i as runOpenCommand,j as runUseCommand,e as summarizeSimUrl,g as waitForSimMatch};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as I,e as N,i as S}from"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";import{createWriteStream as k,mkdirSync as v,writeFileSync as C}from"fs";import{dirname as T,resolve as w}from"path";import{Readable as F}from"stream";import{pipeline as y}from"stream/promises";import{createGzip as x}from"zlib";async function U(o,m){let t=Number(b(o,"--duration")??"5");if(!Number.isFinite(t)||t<=0)return console.error(" --duration must be a positive number (seconds)"),1;let a=Number(b(o,"--sample-interval")??"10");if(!Number.isFinite(a)||a<=0)return console.error(" --sample-interval must be a positive number (milliseconds)"),1;let s=Number(b(o,"--max-buffer")??"100000");if(!Number.isFinite(s)||s<=0)return console.error(" --max-buffer must be a positive number"),1;let p=b(o,"--output")??b(o,"-o"),u=w(process.cwd(),p??"/tmp/sootsim.cpuprofile"),g=u.endsWith(".gz"),h=I(o,{port:m.port,stripValueFlags:["--duration","--output","-o","--sample-interval","--max-buffer"]}),c=N({...h,commandTimeoutMs:Math.max(3e4,(t+20)*1e3)});try{let l=await S(c,"SootSim.bridges.workerCpuProfileStart",{sampleInterval:a,maxBufferSize:s});if(!l?.started)return console.error(" could not start tenant-worker profiler."),console.error(" is sootsim running? (try `bun sootsim list`)"),1;m.verbose&&console.error(` started: sampleInterval=${l.sampleInterval}ms buffer=${l.maxBufferSize}`),console.log(` recording for ${t}s\u2026`),await new Promise(r=>setTimeout(r,t*1e3));let n=await S(c,"SootSim.bridges.workerCpuProfileStop");if(!n||n.error||!n.trace)return n?.error?.includes("cpu-profile-unsupported")?(console.error(" cpu-profile is currently unsupported."),console.error(" the JS Self-Profiler API cannot profile a dedicated worker, and"),console.error(" sootsim runs the guest app in the tenant worker. a CDP-based"),console.error(" profiler is required \u2014 tracked as the F28 follow-up.")):console.error(` profile capture failed: ${n?.error??"no trace returned"}`),1;let P=B(n.trace),e=JSON.stringify(P);v(T(u),{recursive:!0}),g?await y(F.from([e]),x(),k(u)):C(u,e);let i=(Buffer.byteLength(e)/1024/1024).toFixed(2);return console.log(` samples: ${P.samples.length} (${i} MB uncompressed)`),console.log(` saved: ${u}`),console.log(" open in chrome devtools \u2192 Performance \u2192 Load profile to inspect."),0}catch(l){let n=l?.message??String(l);return console.error(` profile failed: ${n}`),/could not connect|ECONNREFUSED/i.test(n)&&console.error(" is sootsim running? (try `bun sootsim list`)"),1}finally{c.close()}}function B(o){let m=o.frames??[],t=o.resources??[],a=o.stacks??[],s=o.samples??[],p=1,u=[{id:p,callFrame:{functionName:"(root)",scriptId:"0",url:"",lineNumber:-1,columnNumber:-1},hitCount:0,children:[]}];for(let e=0;e<a.length;e++){let i=a[e],r=m[i.frameId]??{name:"(unknown)"},f=r.resource!==void 0?t[r.resource]??"":"";u.push({id:e+2,callFrame:{functionName:r.name||"(anonymous)",scriptId:r.resource!==void 0?String(r.resource):"0",url:f,lineNumber:typeof r.line=="number"?r.line-1:-1,columnNumber:typeof r.column=="number"?r.column-1:-1},hitCount:0,children:[]})}for(let e=0;e<a.length;e++){let i=a[e],r=e+2,f=i.parentId!==void 0?i.parentId+2:p,d=u[f-1];d&&!d.children.includes(r)&&d.children.push(r)}let g=[],h=[],c=s.length>0?s[0].timestamp:0,l=c;for(let e=0;e<s.length;e++){let i=s[e],r=i.stackId!==void 0?i.stackId+2:p;g.push(r);let f=u[r-1];f&&f.hitCount++;let d=e===0?0:i.timestamp-l;h.push(Math.max(0,Math.round(d*1e3))),l=i.timestamp}let n=Math.round(c*1e3),P=s.length>0?Math.round(s[s.length-1].timestamp*1e3):n;return{nodes:u,startTime:n,endTime:P,samples:g,timeDeltas:h}}function b(o,m){let t=o.indexOf(m);if(!(t<0||t===o.length-1))return o[t+1]}export{U as runCpuProfile};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-K4BRBIGO.js";import"./chunk-4ZA3J2BV.js";export{a as APPS};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-ZLOUP7JS.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-KWU3WMFD.js";import"./chunk-2Q5YKX76.js";import"./chunk-NMFN4EIE.js";import"./chunk-2TU7QJGH.js";import"./chunk-ECIHLBNE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{e as ALL_DRIVERS,i as buildDriverListRows,a as chromiumDriver,b as electronDriver,f as getAllDrivers,g as getDriver,c as playwrightDriver,h as resolveDriver,d as systemDriver};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c,d}from"./chunk-MS5QBIOB.js";import"./chunk-EAMMI2FH.js";import"./chunk-54V7OVL6.js";import"./chunk-KVJEI5YO.js";import"./chunk-YROS5I43.js";import"./chunk-GLLMLIXC.js";import"./chunk-TXCWW2IX.js";import"./chunk-L7V75VQK.js";import"./chunk-ZNMOLPG5.js";import"./chunk-KWU3WMFD.js";import"./chunk-2Q5YKX76.js";import"./chunk-NMFN4EIE.js";import"./chunk-K4BRBIGO.js";import"./chunk-VP52RZT7.js";import"./chunk-IIFZNK4R.js";import"./chunk-2TU7QJGH.js";import"./chunk-ECIHLBNE.js";import"./chunk-QB4INK6X.js";import"./chunk-ZP4PF72U.js";import"./chunk-6TO2XBUK.js";import"./chunk-RN5LEOFJ.js";import"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-ZZOYYBLO.js";import"./chunk-LCUVF6MI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{b as discoverSootsimUrl,a as parseFlowFile,d as runFlow,c as runFlowPlayback};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as o}from"./chunk-YWBUHBLD.js";import"./chunk-LCDWXJ6X.js";import"./chunk-E3DHOL7O.js";import"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-ZZOYYBLO.js";import"./chunk-LCUVF6MI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";async function t(n){console.error(" note: `sootsim install` is now `sootsim setup-repo`. forwarding\u2026\n"),await o(n)}export{t as runInstall};
@@ -1,17 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as C}from"./chunk-YROS5I43.js";import"./chunk-VP52RZT7.js";import{d as V}from"./chunk-IIFZNK4R.js";import"./chunk-2TU7QJGH.js";import{d as L}from"./chunk-ECIHLBNE.js";import{c as b,e as y}from"./chunk-HIQJTM66.js";import{b as j}from"./chunk-OBIALIWI.js";import"./chunk-ZZOYYBLO.js";import"./chunk-LCUVF6MI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";import{existsSync as de,mkdirSync as x,readdirSync as ce,readFileSync as le,rmSync as W,writeFileSync as M}from"fs";import{homedir as ue,tmpdir as me}from"os";import{dirname as P,extname as G,join as I,resolve as fe}from"path";var q=6e4,pe=new Set(["--sim","--port","-p","--mode","--duration","--fps","--format","--output","-o","--frames","--max-width","--origin"]),ge=new Set(["start","stop","cancel","status"]);function we(e){for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("-")){pe.has(o)&&r++;continue}return ge.has(o)?{name:o,index:r}:null}return null}async function Ee(e,r){let o=we(e);if(o){let a=[...e.slice(0,o.index),...e.slice(o.index+1)];if(o.name==="start"){await $e(a,r);return}if(o.name==="stop"){await _e(a,r);return}if(o.name==="cancel"){await xe(a,r);return}await Re(a,r);return}let n=b(e,{port:r.port,stripBooleanFlags:["--no-shell","--shell-only","--open"],stripValueFlags:["--mode","--duration","--fps","--format","--output","--frames","--max-width","--origin"]}),t=X(l(e,"--mode")),i=e.includes("--shell-only")?"shell":e.includes("--no-shell")?"tenant":void 0,d=l(e,"--format");d&&!["webm","mp4","gif","png"].includes(d)&&(console.error(` invalid --format "${d}" \u2014 expected webm | mp4 | gif | png`),process.exit(1));let c=l(e,"--output"),s=Number(l(e,"--duration")??"10");(!Number.isFinite(s)||s<=0)&&(console.error(` invalid --duration "${l(e,"--duration")}" \u2014 expected a positive number of seconds`),process.exit(1));let u=Number(l(e,"--fps")??"30"),f=l(e,"--frames");if(f!==void 0){let a=Number(f);(!Number.isInteger(a)||a<=0)&&(console.error(` invalid --frames "${f}" \u2014 expected a positive integer count`),process.exit(1))}let _=e.includes("--open"),J=l(e,"--max-width")?Number(l(e,"--max-width")):void 0,h=Math.max(100,Math.round(s*1e3)),ie=l(e,"--origin");if(t==="live"||t==="combined"){c&&console.log(` note: --output is ignored for --mode ${t} \u2014 the recording uploads to /preview/<id>`),await C("record",{originOverride:ie});let a=y({...n,commandTimeoutMs:6e4});try{await Z(a),await ee(a),await oe(a,t)||(console.error(` start failed: recording store refused to start (${t})`),process.exit(1)),console.log(` recording ${t} for ${s}s`),await new Promise(S=>setTimeout(S,h)),await re(a);let k=await te(a);ne(k,_,t)}finally{a.close()}return}let F=f?Number(f):null,$=ve(d,c,F),g=y({...n,commandTimeoutMs:6e4});try{if(await H(g),$==="png"){let v=F??10,p=B(c,`sootsim-frames-${O()}`);c&&G(c)&&console.log(` note: --frames writes multiple pngs, so --output "${c}" is a directory \u2014 frame-NNN.png files land inside it`),x(p,{recursive:!0});for(let m of ce(p))/^frame-\d+\.png$/.test(m)&&W(I(p,m),{force:!0});console.log(` sampling ${v} frames over ${s}s \u2192 ${p}`);let w=await g.send({type:"evaluate",code:`window.__sootsimRecorder.startFrameCapture({ count: ${v}, durationMs: ${h}${i?`, layers: ${JSON.stringify(i)}`:""} })`});(!w.ok||!w.requestId)&&(console.error(` frame capture start failed: ${w.error??"unknown error"}`),process.exit(1)),await new Promise(m=>setTimeout(m,h));let se=Date.now()+Math.max(5e3,h),E=null;for(;;){let m=await g.send({type:"evaluate",code:`window.__sootsimRecorder.getFrameCaptureResult(${w.requestId})`});if(m||(console.error(" frame capture result missing"),process.exit(1)),m.done){m.ok||(console.error(` frame capture failed: ${m.error??"unknown error"}`),process.exit(1)),E=m.frames??[];break}Date.now()>=se&&(console.error(" frame capture timed out"),process.exit(1)),await new Promise(N=>setTimeout(N,100))}E.forEach((m,N)=>{let ae=`${p}/frame-${String(N+1).padStart(3,"0")}.png`;M(ae,Buffer.from(m.data,"base64"))}),console.log(` saved ${E.length} frames`);return}if($==="gif"){let v=F??Math.max(10,Math.round(s*u/3)),p=B(c,`sootsim-${O()}.gif`);x(P(p),{recursive:!0}),console.log(` encoding gif: ${v} frames over ${s}s \u2192 ${p}`);let w=await g.send({type:"evaluate",code:`window.__sootsimRecorder.captureGif({ frames: ${v}, durationMs: ${h}${J?`, maxWidth: ${J}`:""}${i?`, layers: ${JSON.stringify(i)}`:""} })`});w||(console.error(" gif capture returned no frames"),process.exit(1)),M(p,Buffer.from(w.data,"base64")),console.log(` saved: ${p} (${T(w.size)})`);return}let a=B(c,`sootsim-${O()}.${$}`);x(P(a),{recursive:!0});let A={format:$,fps:u};i&&(A.layers=i);let k=await g.send({type:"evaluate",code:`window.__sootsimRecorder.start(${JSON.stringify(A)})`});k.ok||(console.error(` start failed: ${k.error??"unknown error"}`),process.exit(1)),console.log(` recording ${$} for ${s}s \u2192 ${a}`),await new Promise(v=>setTimeout(v,h));let S=await g.send({type:"evaluate",code:"window.__sootsimRecorder.stop()"});S.ok||(console.error(` stop failed: ${S.error??"unknown error"}`),process.exit(1)),S.size||(console.error(" recorder returned an empty blob \u2014 nothing written"),process.exit(1)),await Q(g,a),console.log(` saved: ${a} (${T(S.size)})`)}finally{g.close()}}var be=6e3;async function K(e,r){try{return await e.send({type:"evaluate",code:r},{timeoutMs:be})}catch(o){let n=o instanceof Error?o.message:String(o);throw/^command timed out after \d+s$/.test(n)&&(console.error(" sim did not respond \u2014 it is connected to the bridge but has not\n loaded an app (or its page is unresponsive). run `sootsim list`\n and target a sim with a loaded app via --sim <id>."),process.exit(1)),o}}async function H(e){await K(e,'typeof window.__sootsimRecorder !== "undefined"')||(console.error(" window.__sootsimRecorder missing \u2014 is sootsim engine running in this sim?"),process.exit(1))}async function Q(e,r){let o=[],n=0;for(;;){let t=await e.send({type:"evaluate",code:`window.__sootsimRecorder.getBlobBase64({ offset: ${n}, chunk: 2097152 })`});if(!t)throw new Error("no blob available on recorder");if(o.push(Buffer.from(t.data,"base64")),n=t.offset,t.done)break}M(r,Buffer.concat(o))}function l(e,r){let o=e.indexOf(r);if(!(o<0||o===e.length-1))return e[o+1]}function ye(e){if(!e)return;let r=G(e).toLowerCase().replace(/^\./,"");if(r==="webm"||r==="mp4"||r==="gif")return r;if(r==="png")return"png"}function ve(e,r,o){return e||(o!=null?"png":ye(r)??"webm")}function O(){return new Date().toISOString().replace(/[:T]/g,"-").replace(/\..+/,"")}function he(){let e=I(ue(),".sootsim","recordings");return x(e,{recursive:!0}),e}function B(e,r){return e?fe(process.cwd(),e):I(he(),r)}function T(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(2)}MB`}function X(e){if(!e)return"video";if(e==="video"||e==="live"||e==="combined")return e;console.error(` invalid --mode "${e}" \u2014 expected video | live | combined`),process.exit(1)}function D(){return I(me(),`sootsim-recording-${j()}.json`)}function U(){let e=D();if(!de(e))return null;try{return{mode:"video",...JSON.parse(le(e,"utf8"))}}catch{return W(e,{force:!0}),null}}function Se(e){M(D(),JSON.stringify(e,null,2))}function R(){W(D(),{force:!0})}function z(e,r){e&&r.simId&&e!==r.simId&&console.log(` note: the tracked recording session is on sim ${r.simId}, not the
3
- requested sim ${e}. record state is global (not per-sim);
4
- this command acts on that session regardless of --sim.`)}async function $e(e,r){let o=U();o&&(console.error(` recording already in progress (started ${o.startedAt}, sim ${o.simId??"?"}). run \`sootsim record stop\` first, or \`sootsim record cancel\` to discard.`),process.exit(1));let n=b(e,{port:r.port,stripBooleanFlags:["--no-shell","--shell-only"],stripValueFlags:["--mode","--fps","--format","--max-width","--origin"]}),t=X(l(e,"--mode")),i=e.includes("--shell-only")?"shell":e.includes("--no-shell")?"tenant":void 0,d=l(e,"--format"),c=d==="mp4"?"mp4":"webm";d&&c!==d&&(console.error(` record start only supports webm or mp4 (got: ${d}). for gif/png use atomic mode: sootsim record --format ${d} --duration <s>`),process.exit(1));let s=Number(l(e,"--fps")??"30"),u=y({...n,commandTimeoutMs:15e3});try{if(t==="live"||t==="combined")await C("record",{originOverride:l(e,"--origin")}),await Z(u),await ee(u),await oe(u,t)||(console.error(` start failed: recording store refused to start (${t})`),process.exit(1));else{await H(u);let f={format:c,fps:s};i&&(f.layers=i);let _=await u.send({type:"evaluate",code:`window.__sootsimRecorder.start(${JSON.stringify(f)})`});_.ok||(console.error(` start failed: ${_.error??"unknown error"}`),process.exit(1))}Se({simId:n.simId??null,mode:t,format:c,fps:s,layers:i,startedAt:new Date().toISOString()}),console.log(t==="video"?` recording ${c} @ ${s}fps${i?` (${i})`:""} \u2014 run \`sootsim record stop --output <path>\` when done`:` recording ${t} \u2014 run \`sootsim record stop\` when done (add --open to launch the preview URL)`)}finally{u.close()}}async function Y(e){try{let r=await e.send({type:"evaluate",code:`(() => {
5
- const store = window.SootSim?.bridges?.getRecordingState?.();
6
- const headless = window.__sootsimRecorder?.state?.();
7
- return { store: store ? store.state : undefined, headless };
8
- })()`});return r?r.store==="recording"||r.headless==="recording"?"recording":r.store==="processing"?"processing":r.store==="idle"||r.headless==="idle"?"idle":null:null}catch{return null}}async function Re(e,r){let o=U();if(o){z(b(e,{port:r.port}).simId,o),o.mode==="video"?console.log(` recording ${o.mode} (${o.format} @ ${o.fps}fps) on sim ${o.simId??"?"} since ${o.startedAt}`):console.log(` recording ${o.mode} on sim ${o.simId??"?"} since ${o.startedAt}`);return}let n=b(e,{port:r.port}),t=y({...n,commandTimeoutMs:8e3});try{let i=await Y(t);console.log(i==="recording"||i==="processing"?` a recording is in progress (engine state: ${i}), but not via
9
- \`record start\` \u2014 likely an atomic \`record --duration\` run or the
10
- in-browser record button. it will finish and upload on its own.
11
- \`record stop\` / \`record cancel\` only manage \`record start\` sessions.`:" no recording in progress")}finally{t.close()}}async function xe(e,r){let o=U();if(!o){let d=b(e,{port:r.port}),c=y({...d,commandTimeoutMs:8e3});try{let s=await Y(c);console.log(s==="recording"||s==="processing"?" a recording is in progress, but not via `record start` \u2014 it was\n started by an atomic `record --duration` run or the in-browser\n record button, which own their own lifecycle. it cannot be\n cancelled from here; it will finish on its own.":" no recording in progress")}finally{c.close()}return}let n=b(e,{port:r.port});z(n.simId,o);let t=o.simId??n.simId??void 0,i=y({...n,simId:t,commandTimeoutMs:15e3});try{o.mode==="live"||o.mode==="combined"?await i.send({type:"evaluate",code:"void window.SootSim?.bridges?.cancelRecording?.()"}):await i.send({type:"evaluate",code:"window.__sootsimRecorder.stop()"})}catch{}finally{R(),i.close()}console.log(" recording cancelled")}async function _e(e,r){let o=U();o||(console.error(" no recording in progress. start one with `sootsim record start`."),process.exit(1));let n=b(e,{port:r.port,stripBooleanFlags:["--open"],stripValueFlags:["--output"]});z(n.simId,o);let t=o.simId??n.simId??void 0,i=e.includes("--open"),d=y({...n,simId:t,commandTimeoutMs:6e4});try{if(o.mode==="live"||o.mode==="combined"){await re(d);let f=await te(d);R(),ne(f,i,o.mode);return}let c=l(e,"--output"),s=B(c,`sootsim-${O()}.${o.format}`);x(P(s),{recursive:!0});let u=await d.send({type:"evaluate",code:"window.__sootsimRecorder.stop()"});u.ok||(console.error(` stop failed: ${u.error??"unknown error"}`),R(),process.exit(1)),u.size||(console.error(" recorder returned an empty blob \u2014 nothing written"),R(),process.exit(1)),await Q(d,s),R(),console.log(` saved: ${s} (${T(u.size)})`)}finally{d.close()}}async function Z(e){await K(e,'typeof window.SootSim?.bridges?.startRecording === "function" && typeof window.SootSim?.bridges?.stopRecording === "function"')||(console.error(" SootSim.bridges.startRecording missing \u2014 is sootsim engine running in this sim?"),process.exit(1))}async function ee(e){let r=V();if(!r)return;let o=r.kind==="api-key"?r.secret:r.token;await e.send({type:"evaluate",code:`(() => {
12
- const set = window.SootSim && window.SootSim.bridges && window.SootSim.bridges.setSession
13
- if (typeof set !== 'function') return false
14
- set({ token: ${JSON.stringify(o)}, user: null })
15
- return true
16
- })()`})||(console.error(" SootSim.bridges.setSession missing \u2014 this sim is running an engine\n build without CLI-injected preview auth. reload the sim or open a\n fresh one (`sootsim open --new`); if it persists, update sootsim."),process.exit(1))}async function oe(e,r){return await e.send({type:"evaluate",code:`window.SootSim.bridges.startRecording(${JSON.stringify(r)})`})===!0}async function re(e){await e.send({type:"evaluate",code:"void window.SootSim.bridges.stopRecording()"})}async function te(e){let r=Date.now()+q;for(;Date.now()<r;){let o=await e.send({type:"evaluate",code:"(() => { const s = window.SootSim?.bridges?.getRecordingState?.(); return s ? { state: s.state, lastUpload: s.lastUpload, uploadError: s.uploadError } : null })()"});if(o&&o.state==="idle"){if(o.uploadError)return{uploadError:o.uploadError};if(o.lastUpload?.previewUrl)return{previewUrl:o.lastUpload.previewUrl,eventCount:o.lastUpload.eventCount}}await new Promise(n=>setTimeout(n,300))}return{uploadError:`upload did not settle within ${q/1e3}s`}}function ne(e,r,o){e.uploadError&&(console.error(` upload failed: ${e.uploadError}`),process.exit(1)),e.previewUrl||(console.error(" upload returned no preview URL"),process.exit(1)),console.log(` preview: ${e.previewUrl}`),o==="live"&&e.eventCount===0&&console.log(` note: this live recording captured no events \u2014 the preview has nothing
17
- to replay and will boot a fresh interactive session instead.`),r&&L(e.previewUrl)}export{ye as extToFormat,ve as resolveFormat,Ee as runRecord,l as valueOf};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-BU7OXA7Y.js";import"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-FBCGPPDA.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{a as runRuntime};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-YWBUHBLD.js";import"./chunk-LCDWXJ6X.js";import"./chunk-E3DHOL7O.js";import"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-ZZOYYBLO.js";import"./chunk-LCUVF6MI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{a as runSetupRepo};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-6TO2XBUK.js";import"./chunk-RN5LEOFJ.js";import"./chunk-4ZA3J2BV.js";export{a as settingsStore};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-ZZOYYBLO.js";import"./chunk-LCUVF6MI.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{b as flushCliTelemetry,a as trackCliEvent};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.44 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b,c}from"./chunk-VP52RZT7.js";import"./chunk-IIFZNK4R.js";import"./chunk-2TU7QJGH.js";import"./chunk-ECIHLBNE.js";import"./chunk-HIQJTM66.js";import"./chunk-OBIALIWI.js";import"./chunk-ZZOYYBLO.js";import"./chunk-LCUVF6MI.js";import"./chunk-5A7UO4OE.js";import"./chunk-7PUVSCSF.js";import"./chunk-4ZA3J2BV.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};