sootsim 0.1.59 → 0.1.60
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.
- package/dist-cli/bin.js +3 -3
- package/dist-cli/chunks/{agent-GD3Q5RPA.js → agent-3QM476OM.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-LBIAKQGM.js → agent-wrapper-ZGA3WMEQ.js} +2 -2
- package/dist-cli/chunks/{assert-LZUX5QVA.js → assert-7LOZ3UZU.js} +2 -2
- package/dist-cli/chunks/auto-bootstrap-5SEVYWHQ.js +2 -0
- package/dist-cli/chunks/beta-WS6QLCUE.js +2 -0
- package/dist-cli/chunks/{chunk-D6O2NXGB.js → chunk-2367OT3T.js} +2 -2
- package/dist-cli/chunks/{chunk-4VNKLERI.js → chunk-2X5KYBDL.js} +2 -2
- package/dist-cli/chunks/{chunk-PSPZTTCO.js → chunk-32X2Q5FN.js} +2 -2
- package/dist-cli/chunks/chunk-4LRESDDC.js +11 -0
- package/dist-cli/chunks/{chunk-D26QPCEP.js → chunk-4V7H5CSS.js} +2 -2
- package/dist-cli/chunks/{chunk-5RLJWEFW.js → chunk-7K3CWKDO.js} +1 -1
- package/dist-cli/chunks/{chunk-XDIT5SEC.js → chunk-A33UZUKE.js} +2 -2
- package/dist-cli/chunks/{chunk-HMPHDE5A.js → chunk-ARKBI7JL.js} +1 -1
- package/dist-cli/chunks/{chunk-4ENZNH7P.js → chunk-BOVJRVYZ.js} +2 -2
- package/dist-cli/chunks/{chunk-LLOURJ3N.js → chunk-BXZN6LGB.js} +3 -3
- package/dist-cli/chunks/chunk-C6YD4Y7P.js +1 -0
- package/dist-cli/chunks/{chunk-YT54ZKTQ.js → chunk-DMLDEQSS.js} +2 -2
- package/dist-cli/chunks/{chunk-NGEPSXEE.js → chunk-EJYB47BH.js} +9 -4
- package/dist-cli/chunks/{chunk-AMEUPM6D.js → chunk-FVH44DUL.js} +1 -1
- package/dist-cli/chunks/{chunk-Y65GFG22.js → chunk-GZQHWPLT.js} +3 -3
- package/dist-cli/chunks/chunk-HJEHZSNV.js +92 -0
- package/dist-cli/chunks/{chunk-KYP5XLIR.js → chunk-I7FBCRYN.js} +2 -2
- package/dist-cli/chunks/{chunk-F2DSLYX4.js → chunk-IDNLH47C.js} +1 -1
- package/dist-cli/chunks/chunk-IKICAURU.js +1 -0
- package/dist-cli/chunks/{chunk-V4SMVFRV.js → chunk-LKHZHA2M.js} +1 -1
- package/dist-cli/chunks/{chunk-XM4D43UP.js → chunk-LO7IVLWX.js} +2 -2
- package/dist-cli/chunks/{chunk-A3ATSCOF.js → chunk-LYEPRAQA.js} +2 -2
- package/dist-cli/chunks/{chunk-WQOEMVXN.js → chunk-N7VXONQG.js} +1 -1
- package/dist-cli/chunks/{chunk-TYRPY3SN.js → chunk-NH6WDZCD.js} +1 -1
- package/dist-cli/chunks/{chunk-V6NAG62D.js → chunk-NRYQ2JZJ.js} +1 -1
- package/dist-cli/chunks/{chunk-5S62LOV4.js → chunk-OXLLV636.js} +2 -2
- package/dist-cli/chunks/{chunk-4L72FYCQ.js → chunk-PDC6SIIZ.js} +1 -1
- package/dist-cli/chunks/{chunk-WQXLD5YU.js → chunk-PIV6WQG4.js} +2 -2
- package/dist-cli/chunks/{chunk-O4I44BRL.js → chunk-QJBS67HI.js} +1 -1
- package/dist-cli/chunks/{chunk-BL3IZLNB.js → chunk-QOWJXECZ.js} +2 -2
- package/dist-cli/chunks/{chunk-IY3JNNU7.js → chunk-RDCLJUAL.js} +2 -2
- package/dist-cli/chunks/{chunk-ZLMNBI7T.js → chunk-RFSQAGQM.js} +2 -2
- package/dist-cli/chunks/{chunk-WMTMNKH2.js → chunk-S4LMLA46.js} +2 -2
- package/dist-cli/chunks/{chunk-XRMTMRS5.js → chunk-S75CWUM2.js} +1 -1
- package/dist-cli/chunks/{chunk-ZX66GIXV.js → chunk-TNN7OYGT.js} +2 -2
- package/dist-cli/chunks/chunk-UW4IDGIR.js +2 -0
- package/dist-cli/chunks/{chunk-G3A23B5Q.js → chunk-VTLZR3XL.js} +1 -1
- package/dist-cli/chunks/chunk-W7X3YMV3.js +1 -0
- package/dist-cli/chunks/{chunk-5DO55JWB.js → chunk-WY7EM456.js} +27 -27
- package/dist-cli/chunks/{chunk-PS57ERTY.js → chunk-XNZIAKU5.js} +2 -2
- package/dist-cli/chunks/chunk-YKLWG4AA.js +119 -0
- package/dist-cli/chunks/chunk-YN2754CX.js +2 -0
- package/dist-cli/chunks/{chunk-24VAZEFY.js → chunk-YQT3TRJ5.js} +2 -2
- package/dist-cli/chunks/cli-version-ARDD24DZ.js +2 -0
- package/dist-cli/chunks/{compat-77WWLIGJ.js → compat-4TESUCFM.js} +3 -3
- package/dist-cli/chunks/{config-WGPGLVTW.js → config-GKXIKKRU.js} +2 -2
- package/dist-cli/chunks/control-NKGES73S.js +2 -0
- package/dist-cli/chunks/{cpu-profile-XMBVCI7K.js → cpu-profile-2F4C2O7S.js} +2 -2
- package/dist-cli/chunks/{daemon-FFHD2I32.js → daemon-FMZ7MNVI.js} +2 -2
- package/dist-cli/chunks/{debug-FMXTU6TB.js → debug-IJCU56E5.js} +3 -3
- package/dist-cli/chunks/demo-app-registry-B2GQWZAE.js +2 -0
- package/dist-cli/chunks/{detox-QGFGC5RT.js → detox-5UFOIOLZ.js} +2 -2
- package/dist-cli/chunks/{device-OL7VGMK7.js → device-AE6AZUWE.js} +2 -2
- package/dist-cli/chunks/{diagnose-6CSSFWBQ.js → diagnose-FE27W2WT.js} +2 -2
- package/dist-cli/chunks/drivers-EQGVLU5S.js +2 -0
- package/dist-cli/chunks/{electron-MHXT6NTC.js → electron-FFIZI3WU.js} +3 -3
- package/dist-cli/chunks/flow-DKRIB4D4.js +2 -0
- package/dist-cli/chunks/{hints-W5DK2COL.js → hints-AVO3XSF2.js} +2 -2
- package/dist-cli/chunks/{home-paths-RWCQ7AU2.js → home-paths-XCSL4IZG.js} +2 -2
- package/dist-cli/chunks/{inspect-5XMF34Y7.js → inspect-SEWOLKW2.js} +130 -108
- package/dist-cli/chunks/install-5SPPQPBO.js +2 -0
- package/dist-cli/chunks/{install-desktop-YVHWBC3T.js → install-desktop-ZVPLNWWN.js} +3 -3
- package/dist-cli/chunks/{keys-6HAEB4IC.js → keys-2ANCWIJR.js} +2 -2
- package/dist-cli/chunks/{launch-OHCK4MRM.js → launch-QBCI6F33.js} +3 -3
- package/dist-cli/chunks/{login-VBHIW5ZN.js → login-MPEC3IQC.js} +4 -4
- package/dist-cli/chunks/{logout-LHFYJFHT.js → logout-FHKV7PVB.js} +2 -2
- package/dist-cli/chunks/{maestro-56F3HFUH.js → maestro-HEPFHHZM.js} +2 -2
- package/dist-cli/chunks/{preview-ATGWKYQI.js → preview-SAM2AO6M.js} +2 -2
- package/dist-cli/chunks/{profile-UII6DPNJ.js → profile-CW3WET2M.js} +2 -2
- package/dist-cli/chunks/{react-4F2HFSY7.js → react-LFKI73YH.js} +2 -2
- package/dist-cli/chunks/record-CM3G44PK.js +45 -0
- package/dist-cli/chunks/runtime-JUMLSSWP.js +2 -0
- package/dist-cli/chunks/{runtime-delivery-CUCNWWQP.js → runtime-delivery-MSETJQQ6.js} +2 -2
- package/dist-cli/chunks/{screenshot-GKJ4ICW4.js → screenshot-D77TOEEP.js} +2 -2
- package/dist-cli/chunks/{screenshot-mode-OCP4HA3H.js → screenshot-mode-2YPUHGUB.js} +2 -2
- package/dist-cli/chunks/{screenshots-RTRJF63K.js → screenshots-RKWVNLEI.js} +2 -2
- package/dist-cli/chunks/{server-SY6BQAVD.js → server-GDOHSZQ3.js} +3 -3
- package/dist-cli/chunks/setup-repo-GGNBHKN6.js +2 -0
- package/dist-cli/chunks/{skills-KX3LI7Y6.js → skills-2KROZMJJ.js} +2 -2
- package/dist-cli/chunks/{start-5IOHCWG6.js → start-RTIULO26.js} +4 -4
- package/dist-cli/chunks/store-XAQEN3N3.js +2 -0
- package/dist-cli/chunks/telemetry-GIZM7C4U.js +2 -0
- package/dist-cli/chunks/{test-2QTF7GWW.js → test-WIBWT3SJ.js} +3 -3
- package/dist-cli/chunks/{three-mode-EQSSYVHT.js → three-mode-XMBKE6NN.js} +2 -2
- package/dist-cli/chunks/{timeline-GZZYRE2U.js → timeline-3RHZIXQV.js} +2 -2
- package/dist-cli/chunks/{upgrade-KVJ2HKRH.js → upgrade-MLQ3YZEU.js} +2 -2
- package/dist-cli/chunks/upload-K36QDGWB.js +2 -0
- package/dist-cli/chunks/{web-2C5AJBCN.js → web-6SI6NZ22.js} +2 -2
- package/dist-cli/chunks/{what-happened-YECRPXV5.js → what-happened-FK6I5XEC.js} +2 -2
- package/dist-cli/chunks/{whoami-WCPVDNPA.js → whoami-ZVUQ4ICS.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +2 -2
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/vite-base.cjs +2 -2
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/dist-cli/chunks/auto-bootstrap-RGEU3N4Y.js +0 -2
- package/dist-cli/chunks/beta-7YMPFJF7.js +0 -2
- package/dist-cli/chunks/chunk-DFXUPNYD.js +0 -119
- package/dist-cli/chunks/chunk-GL3JT3P7.js +0 -1
- package/dist-cli/chunks/chunk-L5PBH3V6.js +0 -1
- package/dist-cli/chunks/chunk-N7OHTYFK.js +0 -2
- package/dist-cli/chunks/chunk-O2W7EB7L.js +0 -11
- package/dist-cli/chunks/chunk-QNH7IX5F.js +0 -59
- package/dist-cli/chunks/chunk-UPW76NDZ.js +0 -2
- package/dist-cli/chunks/chunk-ZEB4DGC6.js +0 -1
- package/dist-cli/chunks/cli-version-CL32HHD6.js +0 -2
- package/dist-cli/chunks/control-KZYO5BDN.js +0 -2
- package/dist-cli/chunks/demo-app-registry-RSAPXLUE.js +0 -2
- package/dist-cli/chunks/drivers-7PFWCFVQ.js +0 -2
- package/dist-cli/chunks/flow-HMBOPMQV.js +0 -2
- package/dist-cli/chunks/install-3MNX7DSK.js +0 -2
- package/dist-cli/chunks/record-YHRJJJRY.js +0 -41
- package/dist-cli/chunks/runtime-HOPZF7H6.js +0 -2
- package/dist-cli/chunks/setup-repo-Z7WKSSP5.js +0 -2
- package/dist-cli/chunks/store-WYV5UMFH.js +0 -2
- package/dist-cli/chunks/telemetry-XABHSL5O.js +0 -2
- package/dist-cli/chunks/upload-4VWBZXY4.js +0 -2
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as E,b as z,c as re,d as se}from"./chunk-WMTMNKH2.js";import{b as _}from"./chunk-O4I44BRL.js";import{g as q}from"./chunk-QNH7IX5F.js";import{a as C,b as j}from"./chunk-5RLJWEFW.js";import{c as ie}from"./chunk-D6O2NXGB.js";import{d as oe}from"./chunk-G3A23B5Q.js";import{a as Z}from"./chunk-UPW76NDZ.js";import{b as ne,c as v,d as S,e as I}from"./chunk-KYP5XLIR.js";import{c as k,d as w,e as P}from"./chunk-4L72FYCQ.js";import{E as ee,F as te}from"./chunk-V6NAG62D.js";import ke from"node:fs";import Pe from"node:os";import G from"node:path";function be(t){return t.replace(/^\[|\]$/g,"").toLowerCase()}function W(t){let o=be(t);return o==="localhost"||o.endsWith(".localhost")||o==="0.0.0.0"||o==="::1"||/^127(?:\.\d{1,3}){3}$/.test(o)}function ae(t){return new Error(`could not resolve a native bundle for ${t}. pass an explicit bundle URL or open Connect and choose the app there.`)}function ye(t,o){return t?.includes("/one/metro-entry.bundle")?"one":typeof o=="string"&&o?"expo":"unknown"}function ce(t,o,e){return`${t}//${o}:${e}`}function Se(t){if(typeof window>"u")return!1;try{let o=new URL(t);return W(o.hostname)&&W(window.location.hostname)&&o.origin!==window.location.origin}catch{return!1}}async function le(t,o){let e={...o,cache:o?.cache??"no-store"};return Se(t)?fetch(`/__fetch-proxy?url=${encodeURIComponent(t)}`,e):fetch(t,e)}function $e(t){return t==="https:"?443:80}function ve(t){let o=t.pathname||"/";return(o==="/"||o==="")&&!t.search&&!t.hash}async function me(t,o){let e=t.replace(/\/+$/,"");try{let n=await le(`${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:re(i||`${e}${z}`),port:o,framework:ye(i,a.sdkVersion),projectName:a.name}}}catch{}try{let n=await le(`${e}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${e}${z}`,port:o,framework:"metro"}}catch{}return null}async function Ie(t){return me(ce("http:","localhost",t),t)}async function de(t){let o=t.trim();if(/^\d+$/.test(o)){let s=parseInt(o,10),l=await Ie(s);if(l)return l;throw ae(`localhost:${s}`)}let e=o.startsWith("http")?o:`http://${o}`,n;try{n=new URL(e)}catch{throw new Error(`could not parse "${t}". 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):$e(r),i=ce(r,n.hostname,a);if(ve(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 ue(t){let o=C();if(console.log(` note: no sootsim bridge detected on port ${t}`),o){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 xe(t){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${t}.`),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 Je(t,o,e){let n=[];try{n=await t.listSims()}catch{}if(console.error(""),n.length===0){xe(o);return}console.error(` no sim with id "${e}" is connected to the bridge on port ${o}.`),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 Ce={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 x(t){return new Promise(o=>setTimeout(o,t))}function A(t){return t.trim()}function Q(t){try{let o=new URL(t),e=o.pathname.replace(/\/+$/,"")||"/";return o.searchParams.has("open")||o.searchParams.has("port")||o.searchParams.has("bundle")||o.searchParams.has("demo")||o.pathname.includes("/sootsim/index.html")||e==="/sootsim"||o.pathname==="/__soot"||o.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 pt(t){let o=A(t);return(await fe(o)).bundleUrl}function Be(t){try{let o=new URL(t.startsWith("http")?t:`http://${t}`),e=o.pathname||"/";if(e!=="/"&&e!==""||o.search||o.hash||!/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(o.hostname))return null;let n=o.port?Number(o.port):o.protocol==="https:"?443:80;return Number.isFinite(n)&&n>0?n:null}catch{return null}}async function fe(t){let o=A(t),e=/^\d+$/.test(o)?Number(o):Be(o);if(e&&e>0){let n=await se(e);if(n)return{bundleUrl:n.bundleUrl,port:n.port,framework:n.framework,projectName:n.projectName}}return de(o)}function J(t){let o=t.replace(/\/+$/,"")||"/";return o==="/__soot"||o.startsWith("/__soot/")?"/__soot":""}function Me(t,o){let e=A(t),n=new URL(o),r=J(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 Ue(t){let o=A(t);return/^\d+$/.test(o)||/^https?:\/\//i.test(o)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(o)}async function Te(t,o){let e=await fe(t),n=new URL(o),r=J(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 Oe(t){return t.startsWith("~/")?G.join(Pe.homedir(),t.slice(2)):G.isAbsolute(t)?t:G.resolve(process.cwd(),t)}function Re(t){let o={};for(let e=0;e<t.length;e++){if(t[e]!=="--replace")continue;let n=t[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=Oe(n.slice(r+1).trim());ke.existsSync(i)||(console.error(` sootsim open: replacement file not found: ${i}`),process.exit(1)),o[a]={file:i},e++}return Object.keys(o).length>0?{modules:o}:void 0}function ge(){let t=ee();return te(t)&&t.runtimePort>0?`http://localhost:${t.runtimePort}/`:Z}async function D(t,o=ge()){if(!t)return new URL(o).toString();if(Q(t))return new URL(t).toString();let e=Ce[t.toLowerCase()];if(e){let n=new URL(o),r=J(n.pathname);return n.pathname=`${r}${e}`,n.toString()}return Ue(t)?Te(t,o):Me(t,o)}function pe(t,o){let e=t?.url||t?.origin||o;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 o}}async function _e(t,o,e){let n=new URL(await D(t,o));return n.searchParams.set("inspectOpen",e),n.toString()}async function Ee(t,o,e,n={}){let r=n.attempts??30,a=n.intervalMs??500,i=n.minNodeCount??10;for(let s=0;s<r;s++){let l=S(t,{commandTimeoutMs:o,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 x(a)}return null}function Le(t){if(!t)return null;try{let o=new URL(t);if(o.searchParams.has("bundle")){let e=o.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 o.searchParams.has("port")?`connect :${o.searchParams.get("port")||""}`:o.searchParams.has("open")?`connect ${o.searchParams.get("open")||""}`:o.searchParams.has("demo")?`demo ${o.searchParams.get("demo")||"default"}`:o.pathname.includes("/sootsim/index.html")||o.pathname==="/sootsim/"||o.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function De(t,o){if(t.length===0){console.log(" no sims connected");return}console.log(` connected sims (${t.length}):
|
|
3
|
-
`);for(let e of t){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===o?"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=Le(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 L(t,o,e,n={}){let r=n.attempts??30,a=n.intervalMs??500;for(let i=0;i<r;i++){let s=S(t,{commandTimeoutMs:o});try{let c=(await s.listSims()).find(e);if(c)return c}catch{}finally{s.close()}await x(a)}return null}async function Ae(t,o,e,n={}){let r=n.attempts??20,a=n.intervalMs??250;for(let i=0;i<r;i++){let s=S(t,{commandTimeoutMs:o});try{let c=(await s.listSims()).find(m=>m.id===e);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{s.close()}await x(a)}return!1}function N(t,o){if(o){let r=o.trim(),a=t.find(i=>i.id===r);if(!a)throw new Error(`no sim connected with id ${r}`);return a}let e=t.find(r=>r.isPrimary&&r.readyState==="open");if(e)return e;let n=t.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function B(t,o,e){console.log(` ${e==="current sim"?"loaded":"opened"}: ${t} [${e}]`),console.log(` current sim: ${o.id}`),console.log(JSON.stringify({simId:o.id,url:o.url},null,2))}async function M(t,o,e){if(e.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await Ne(t,o,{stableMs:150,maxMs:400});let r=S(t,{commandTimeoutMs:3e3,simId:o,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 Ne(t,o,e){let n=Date.now()+e.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",a=S(t,{commandTimeoutMs:2e3,simId:o,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 x(50)}}finally{a.close()}}async function ft(t,o={}){let e=v(t,{port:o.port,commandTimeoutMs:o.timeoutMs}),n=I(e);try{let r=await n.listSims();De(r,e.simId)}finally{n.close()}}async function gt(t,o={}){let e=v(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile"]}),n=t.find((d,p)=>t[p-1]==="--profile"),r=t.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=t.includes("--new")||i,l=Re(t);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]||"",m=t.find((d,p)=>t[p-1]==="--driver")||"",u=t.includes("--headless"),h=t.find((d,p)=>t[p-1]==="--base-url")||ge(),U=t.includes("--base-url"),V=k();if(!m&&!s&&(e.simIdSource==="flag"||e.simIdSource==="saved"&&!!V)){let d=I(e),p=e.simId?` --sim ${e.simId}`:"",f=!1;try{let g=null;try{let y=await d.listSims();if(e.simIdSource==="saved"?(g=y.find($=>$.id===V&&$.readyState==="open")??null,g||P()):g=N(y,e.simId),!g)if(e.simIdSource==="saved")f=!0;else throw new Error("no sim connected");if(!f&&g){let $=U||Q(c)?h:pe(g,h),R=await D(c,E($,l));d.send({type:"evaluate",simId:g.id,code:`window.location.href = ${JSON.stringify(R)}`}).catch(()=>{})}}catch(y){console.error(` open failed: ${y instanceof Error?y.message:String(y)}`),await _(d,{errorsCommand:`sootsim get errors 5${p}`,warningsCommand:`sootsim get warnings 5${p}`,requestsCommand:`sootsim get requests 5${p}`}),process.exit(1)}if(!f&&g){await x(1500);let y=await Ee(e.wsPort,e.commandTimeoutMs,g.id);y||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),y.bridge.close(),w(g.id);let $=U||Q(c)?h:pe(g,h),R=await D(c,E($,l));B(R,{...g,url:R},"current sim"),await M(e.wsPort,g.id,t);return}}finally{d.close()}}let X=E(h,l),we=await D(c,X),Y=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,b=await _e(c,X,Y),F={newWindow:!0},T=d=>d.url?.includes(`inspectOpen=${Y}`)??!1;if(m){let d=q(m);d||(console.error(` unknown driver "${m}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let p=await d.launch({url:b,headless:u,newWindow:F.newWindow,profileId:a,ephemeralProfile:r});p.launched||(console.error(` ${d.name} driver: ${p.message}`),process.exit(1));let f=await L(e.wsPort,e.commandTimeoutMs,T,{attempts:60,intervalMs:500});f||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),w(f.id),B(b,f,`${d.name} driver`),await M(e.wsPort,f.id,t);return}if(i){let d=C();d||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await j(b,d,{profileId:a,ephemeralProfile:r})).launched||(console.error(" desktop companion failed to start"),process.exit(1))}catch(f){console.error(` desktop companion failed: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}let p=await L(e.wsPort,e.commandTimeoutMs,T,{attempts:40,intervalMs:500});p||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),w(p.id),B(b,p,"desktop companion"),await M(e.wsPort,p.id,t);return}let K=!1,H=!1;try{let d=S(e.wsPort,{commandTimeoutMs:2e3});try{await d.listSims(),K=!0}finally{d.close()}}catch{}if(K)try{let d=S(e.wsPort,{commandTimeoutMs:3e3});try{await d.openUrl(b,F),H=!0}finally{d.close()}}catch{}if(!H){let d=C();if(d)try{if((await j(b,d)).launched){let f=await L(e.wsPort,e.commandTimeoutMs,T,{attempts:20,intervalMs:500});if(f){w(f.id),B(b,f,"desktop companion"),await M(e.wsPort,f.id,t);return}}}catch{}try{await oe(b,F)}catch(p){console.error(` open failed: ${p instanceof Error?p.message:String(p)}`),q("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(!K){console.log(` opened: ${we}`),ue(e.wsPort);return}}let O=await L(e.wsPort,e.commandTimeoutMs,T,{attempts:30,intervalMs:500});O||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),w(O.id),B(b,O,H?"bridge":"direct shell open"),await M(e.wsPort,O.id,t)}async function he(t,o={}){let e=v(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=t.includes("--force"),r=I(e),a=e.simId?` --sim ${e.simId}`:"";try{try{let i=await r.listSims(),s=N(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),w(s.id),console.log(` using: ${s.id}`)}catch(i){console.error(` use failed: ${i instanceof Error?i.message:String(i)}`),await _(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 ht(t,o={}){await he(t,o)}async function wt(t,o={}){await he(t,o)}async function bt(t,o={}){let e=v(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=t.includes("--force"),r=I(e);try{try{let a=await r.listSims(),i=N(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});w(i.id);let c=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),m=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${c}s]${m}`),s&&console.log(` took over from: ${s}`)}catch(a){if(a instanceof ne){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 Fe(t,o,e,n){if(n.length===0)return{closed:[],remaining:[]};await Promise.all(n.map(a=>t.closeSim(a).catch(()=>{})));let r=new Set(n);for(let a=0;a<40;a++){let i=[];try{let s=S(o,{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 x(250)}return{closed:[...r],remaining:[]}}function Ke(t,o){let e=t.filter(u=>u.readyState==="open"),n=e.map(u=>u.id),r=o.explicitKeepId?.trim()||"",a=o.savedKeepId?.trim()||"",i=a?e.some(u=>u.id===a):!1,s=a&&!i?a:null,l=null,c=null,m=null;if(o.closeOthers)if(r){let u=e.find(h=>h.id===r);u?l=u.id:c=r}else if(a&&i)l=a;else{let u=e.find(h=>h.isPrimary)??e[0]??null;u&&(l=u.id,a&&!i&&(m=u.id))}return{openIds:n,keepId:l,targets:c?[]:n.filter(u=>u!==l),staleSavedId:s,missingExplicitKeepId:c,fallbackKeepId:m}}async function yt(t,o={}){let e=v(t,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--all","--others"]}),n=I(e),r=e.simId?` --sim ${e.simId}`:"",a=t.includes("--all"),i=t.includes("--others");if(a||i){try{let s=await n.listSims(),l=k(),c=e.positional[0]||(e.simIdSource==="flag"?e.simId:void 0),m=Ke(s,{closeOthers:i,explicitKeepId:c,savedKeepId:l});if(m.staleSavedId&&P(),m.fallbackKeepId&&(w(m.fallbackKeepId),console.log(` saved sim ${m.staleSavedId} is gone \u2014 keeping primary ${m.fallbackKeepId}`)),m.missingExplicitKeepId&&(console.error(` close failed: keep sim ${m.missingExplicitKeepId} is not connected; not closing other sims`),process.exit(1)),m.targets.length===0){console.log(m.keepId?` nothing to close \u2014 only the kept sim ${m.keepId} is connected`:m.staleSavedId?` nothing to close \u2014 no sims connected (cleared stale current sim ${m.staleSavedId})`:" nothing to close \u2014 no sims connected");return}let u=await Fe(n,e.wsPort,e.commandTimeoutMs,m.targets),h=k();h&&u.closed.includes(h)&&(m.keepId?w(m.keepId):P());let U=` closed ${u.closed.length} sim(s)${m.keepId?` (kept ${m.keepId})`:""}`;console.log(U),u.remaining.length>0&&(console.error(` close failed: still connected: ${u.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=N(s,e.positional[0]||e.simId),c=s.find(u=>u.id!==l.id&&u.readyState==="open");await n.closeSim(l.id),await Ae(e.wsPort,e.commandTimeoutMs,l.id)||(console.error(` close failed: ${l.id} is still connected`),process.exit(1)),k()===l.id&&(c?w(c.id):P()),console.log(` closed: ${l.id}`)}catch(s){console.error(` close failed: ${s instanceof Error?s.message:String(s)}`),await _(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,xe as b,Je as c,pt as d,ge as e,D as f,_e as g,Le as h,De as i,L as j,ft as k,gt as l,ht as m,wt as n,bt as o,Ke as p,yt as q};
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as c,b as p}from"./chunk-5RLJWEFW.js";import{a as m,c as h}from"./chunk-D6O2NXGB.js";import{a as l,b as u,c as d}from"./chunk-G3A23B5Q.js";function L(){let e=l();return e?{available:!0,reason:null,detail:e}:{available:!1,reason:"no chromium-family browser found (chrome, chromium, edge, brave, arc)"}}async function O(e){if(e.headless)return{launched:!1,message:"the chromium driver launches a visible browser window and cannot run headless \u2014 a headless `chrome --headless=new` process exits immediately and the sim never connects. for headless automation use `--driver playwright`."};let r=l();if(!r)return{launched:!1,message:"chromium not found \u2014 install chrome or run `sootsim list --drivers`"};if(!e.url)return{launched:!1,message:"chromium driver requires a target url"};if(e.profileId||e.ephemeralProfile)return{launched:!1,message:"profiles require electron or playwright; browser tabs use your current Chrome profile"};try{let t=await d(e.url,{detached:e.detached??!0});return{launched:!0,message:`chromium launched \u2192 ${e.url}`,pid:t.pid,target:t.target??r,attachUrl:e.url}}catch(t){return{launched:!1,message:`chromium spawn failed: ${t instanceof Error?t.message:String(t)}`}}}var f={id:"chromium",name:"chromium",description:"system chrome / chromium / edge \u2014 visible window (headless: use playwright)",kind:"browser",availability:L,launch:O};function x(){let e=c();return e?{available:!0,reason:null,detail:`${e.kind} @ ${e.path}`}:{available:!1,reason:"sootsim desktop app not installed (run `sootsim install-desktop`)"}}async function k(e){let r=c();if(!r)return{launched:!1,message:"sootsim desktop app not installed"};try{let t=await p(e.url,r,{device:e.device,profileId:e.profileId,ephemeralProfile:e.ephemeralProfile});return t.launched?{launched:!0,message:e.url?`electron launched via ${t.via} \u2192 ${e.url}`:`electron launched via ${t.via}`,target:t.target,attachUrl:e.url}:{launched:!1,message:"desktop companion failed to start"}}catch(t){return{launched:!1,message:`electron launch failed: ${t instanceof Error?t.message:String(t)}`}}}var v={id:"electron",name:"electron",description:"sootsim desktop companion app (native window, menu bar)",kind:"native",availability:x,launch:k};import{spawn as I}from"child_process";import{closeSync as R,mkdtempSync as _,openSync as $,readFileSync as A}from"fs";import{createRequire as U}from"module";import{tmpdir as g}from"os";import{join as w}from"path";var T=`
|
|
3
|
-
const modulePath = process.env.SOOTSIM_PW_MODULE;
|
|
4
|
-
const url = process.env.SOOTSIM_PW_URL;
|
|
5
|
-
const headless = process.env.SOOTSIM_PW_HEADLESS === '1';
|
|
6
|
-
const userDataDir = process.env.SOOTSIM_PW_USERDATADIR || '';
|
|
7
|
-
(async () => {
|
|
8
|
-
const pw = require(modulePath);
|
|
9
|
-
let browser = null;
|
|
10
|
-
let context;
|
|
11
|
-
// channel 'chromium' forces the FULL Chromium build. playwright's
|
|
12
|
-
// default \`headless: true\` launches the stripped "headless shell"
|
|
13
|
-
// binary, which omits Web Platform features sootsim debugging relies
|
|
14
|
-
// on (full WebGL / CanvasKit GPU readback in particular). the full
|
|
15
|
-
// build runs headless via Chrome's new headless mode at full feature
|
|
16
|
-
// parity. NOTE: this is NOT enough to make \`sootsim cpu-profile\`
|
|
17
|
-
// work \u2014 that profiles the tenant *worker*, and the JS Self-Profiler
|
|
18
|
-
// API cannot be constructed in a dedicated worker by any means (see
|
|
19
|
-
// worker-handlers/cpu-profile.ts). cpu-profile needs a CDP-based
|
|
20
|
-
// profiler instead.
|
|
21
|
-
const launchOpts = { headless, channel: 'chromium' };
|
|
22
|
-
if (userDataDir) {
|
|
23
|
-
context = await pw.chromium.launchPersistentContext(userDataDir, launchOpts);
|
|
24
|
-
} else {
|
|
25
|
-
browser = await pw.chromium.launch(launchOpts);
|
|
26
|
-
context = await browser.newContext();
|
|
27
|
-
}
|
|
28
|
-
await context.exposeBinding('__sootsimHostClose', async () => {
|
|
29
|
-
await context.close().catch(() => {});
|
|
30
|
-
});
|
|
31
|
-
const page = await context.newPage();
|
|
32
|
-
// surface page-side failures (engine boot crash, failed WS registration)
|
|
33
|
-
// to stderr so a sim that never connects produces a real diagnostic
|
|
34
|
-
// instead of a silent "timed out waiting for opened sim to connect".
|
|
35
|
-
page.on('pageerror', (e) => {
|
|
36
|
-
process.stderr.write('[pageerror] ' + ((e && e.stack) || e) + '\\n');
|
|
37
|
-
});
|
|
38
|
-
page.on('console', (m) => {
|
|
39
|
-
if (m.type() === 'error') {
|
|
40
|
-
process.stderr.write('[console.error] ' + m.text() + '\\n');
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
page.on('crash', () => process.stderr.write('[page] renderer crashed\\n'));
|
|
44
|
-
try {
|
|
45
|
-
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
|
|
46
|
-
} catch (err) {
|
|
47
|
-
process.stderr.write('[goto] ' + String((err && err.message) || err) + '\\n');
|
|
48
|
-
}
|
|
49
|
-
const keepAlive = setInterval(() => {}, 1 << 30);
|
|
50
|
-
const shutdown = () => { clearInterval(keepAlive); process.exit(0); };
|
|
51
|
-
if (browser) browser.on('disconnected', shutdown);
|
|
52
|
-
context.on('close', shutdown);
|
|
53
|
-
page.on('close', () => { context.close().catch(() => {}); });
|
|
54
|
-
})().catch((err) => {
|
|
55
|
-
process.stderr.write(String((err && err.stack) || err) + '\\n');
|
|
56
|
-
process.exit(1);
|
|
57
|
-
});
|
|
58
|
-
`;function y(){let e=[process.cwd()+"/"];try{process.argv[1]&&e.push(process.argv[1])}catch{}for(let r of e)try{let t=U(r);for(let i of["playwright","playwright-chromium","playwright-core"])try{return{spec:i,modulePath:t.resolve(i)}}catch{}}catch{}return null}function E(){let e=y();return e?{available:!0,reason:null,detail:`resolved via ${e.spec}`}:{available:!1,reason:"playwright not installed in the current workspace"}}function W(e){return e.profileId?m(h(e.profileId).id):e.ephemeralProfile?_(w(g(),"sootsim-playwright-profile-")):""}async function C(e){let r=y();if(!r)return{launched:!1,message:"playwright not installed \u2014 run `bun add -D playwright` first"};if(!e.url)return{launched:!1,message:"playwright driver requires a target url"};let t=w(g(),`sootsim-playwright-host-${Date.now().toString(36)}-${process.pid}.log`),i=$(t,"a");try{let a=I(process.execPath,["-e",T],{detached:!0,stdio:["ignore","ignore",i],env:{...process.env,SOOTSIM_PW_MODULE:r.modulePath,SOOTSIM_PW_URL:e.url,SOOTSIM_PW_HEADLESS:e.headless??!0?"1":"0",SOOTSIM_PW_USERDATADIR:W(e)}});a.unref();let o=await new Promise(n=>{let S=setTimeout(()=>n(null),4e3);a.once("exit",P=>{clearTimeout(S),n(P??0)})});if(o!==null&&o!==0){let n=A(t,"utf8").trim();return{launched:!1,message:`playwright host exited early (code ${o}) \u2014 host log ${t}${n?`:
|
|
59
|
-
${n}`:""}`}}return{launched:!0,message:`playwright chromium launched \u2192 ${e.url}`,pid:a.pid,target:r.spec,attachUrl:e.url}}catch(a){return{launched:!1,message:`playwright launch failed: ${a instanceof Error?a.message:String(a)}`}}finally{R(i)}}var D={id:"playwright",name:"playwright",description:"programmatic chromium via the playwright package \u2014 headless default",kind:"automation",availability:E,launch:C};function M(){return process.platform!=="darwin"&&process.platform!=="linux"&&process.platform!=="win32"?{available:!1,reason:`unsupported platform: ${process.platform}`}:{available:!0,reason:null,detail:process.platform==="darwin"?"open(1)":process.platform==="win32"?"cmd /c start":"xdg-open(1)"}}async function q(e){if(e.headless)return{launched:!1,message:"system driver does not support --headless; use chromium or playwright"};if(!e.url)return{launched:!1,message:"system driver requires a target url"};if(e.profileId||e.ephemeralProfile)return{launched:!1,message:"profiles require electron or playwright; browser tabs use your current browser profile"};try{let r=await u(e.url,{detached:e.detached??!0,newWindow:e.newWindow});return{launched:!0,message:`${r.via} launch \u2192 ${e.url}`,pid:r.pid,target:r.target,attachUrl:e.url}}catch(r){return{launched:!1,message:`system launch failed: ${r instanceof Error?r.message:String(r)}`}}}var b={id:"system",name:"system",description:"shared browser launcher \u2014 system default or chromium window",kind:"delegate",availability:M,launch:q};var s=[f,v,D,b];function ie(){return s}function ae(e){return s.find(r=>r.id===e)??null}function ne(e,r){if(e)return s.find(i=>i.id===e)??null;for(let t of r){let i=s.find(a=>a.id===t);if(i&&i.availability().available)return i}return null}function se(){return s.map(e=>{let r=e.availability();return{id:e.id,name:e.name,kind:e.kind,description:e.description,available:r.available,reason:r.reason,detail:r.detail??null}})}export{f as a,v as b,D as c,b as d,s as e,ie as f,ae as g,ne as h,se as i};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (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,q as n}from"./chunk-O2W7EB7L.js";import"./chunk-WMTMNKH2.js";import"./chunk-O4I44BRL.js";import"./chunk-ZX66GIXV.js";import"./chunk-QNH7IX5F.js";import"./chunk-5RLJWEFW.js";import"./chunk-L5PBH3V6.js";import"./chunk-D6O2NXGB.js";import"./chunk-G3A23B5Q.js";import"./chunk-UPW76NDZ.js";import"./chunk-KYP5XLIR.js";import"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";export{d as buildOpenUrl,c as buildShellUrl,m as planBulkCloseTargets,f as printConnectedSims,a as resolveBundleTarget,b as resolveDefaultShellBaseUrl,l as runClaimCommand,n 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.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import"./chunk-GL3JT3P7.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-QNH7IX5F.js";import"./chunk-5RLJWEFW.js";import"./chunk-L5PBH3V6.js";import"./chunk-D6O2NXGB.js";import"./chunk-G3A23B5Q.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.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.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as c,b as d,c as e,d as f}from"./chunk-5DO55JWB.js";import"./chunk-YT54ZKTQ.js";import"./chunk-ZEB4DGC6.js";import"./chunk-WQXLD5YU.js";import"./chunk-D26QPCEP.js";import"./chunk-24VAZEFY.js";import{c as a,d as b}from"./chunk-BL3IZLNB.js";import"./chunk-O2W7EB7L.js";import"./chunk-WMTMNKH2.js";import"./chunk-O4I44BRL.js";import"./chunk-ZX66GIXV.js";import"./chunk-QNH7IX5F.js";import"./chunk-5RLJWEFW.js";import"./chunk-L5PBH3V6.js";import"./chunk-D6O2NXGB.js";import"./chunk-G3A23B5Q.js";import"./chunk-XM4D43UP.js";import"./chunk-UPW76NDZ.js";import"./chunk-A3ATSCOF.js";import"./chunk-4ENZNH7P.js";import"./chunk-IY3JNNU7.js";import"./chunk-V4SMVFRV.js";import"./chunk-KYP5XLIR.js";import"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";export{c as discoverSootsimUrl,e as hoistLeadingSimFlag,a as parseFlowFile,f as runFlow,d as runFlowPlayback,b as validateFlowFile};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as o}from"./chunk-PS57ERTY.js";import"./chunk-HMPHDE5A.js";import"./chunk-Y65GFG22.js";import"./chunk-A3ATSCOF.js";import"./chunk-4ENZNH7P.js";import"./chunk-KYP5XLIR.js";import"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.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,41 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as A}from"./chunk-WQXLD5YU.js";import"./chunk-D26QPCEP.js";import{d as K}from"./chunk-24VAZEFY.js";import"./chunk-L5PBH3V6.js";import{d as G}from"./chunk-G3A23B5Q.js";import"./chunk-A3ATSCOF.js";import"./chunk-4ENZNH7P.js";import{c as v,e as y}from"./chunk-KYP5XLIR.js";import{b as q}from"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";import{existsSync as ue,mkdirSync as k,readdirSync as me,readFileSync as fe,rmSync as W,writeFileSync as M}from"fs";import{homedir as pe,tmpdir as ge}from"os";import{dirname as P,extname as H,join as U,resolve as we}from"path";var X=6e4,he=3e4;async function N(e,t,o,i){let r=Math.max(2e4,i+he);try{return await e.send({type:"evaluate",code:t},{timeoutMs:r})}catch(n){let s=n instanceof Error?n.message:String(n);/^command timed out after \d+s$/.test(s)&&(console.error(` ${o} stalled \u2014 the render host did not finish within ${Math.round(r/1e3)}s; it is likely contended or wedged.
|
|
3
|
-
the capture lock auto-releases, so simply retry the recording.
|
|
4
|
-
if it persists, recover the sim with \`sootsim close --sim <id>\`.`),process.exit(1)),/render host not available|already streaming|already recording/i.test(s)&&(console.error(` ${o} failed: ${s}
|
|
5
|
-
a prior recording was abandoned and its capture is still
|
|
6
|
-
releasing. the lock self-heals in ~${Math.round((i+2e4)/1e3)}s \u2014 retry then, or recover now with
|
|
7
|
-
\`sootsim close --sim <id>\` and reopen the sim.`),process.exit(1)),console.error(` ${o} failed: ${s}`),process.exit(1)}}var be=new Set(["--sim","--port","-p","--mode","--duration","--fps","--format","--output","-o","--frames","--max-width","--origin"]),ve=new Set(["start","stop","cancel","status"]);function ye(e){for(let t=0;t<e.length;t++){let o=e[t];if(o.startsWith("-")){be.has(o)&&t++;continue}return ve.has(o)?{name:o,index:t}:null}return null}async function Pe(e,t){let o=ye(e);if(o){let d=[...e.slice(0,o.index),...e.slice(o.index+1)];if(o.name==="start"){await ke(d,t);return}if(o.name==="stop"){await Me(d,t);return}if(o.name==="cancel"){await Be(d,t);return}await Oe(d,t);return}let i=v(e,{port:t.port,stripBooleanFlags:["--no-shell","--shell-only","--open"],stripValueFlags:["--mode","--duration","--fps","--format","--output","--frames","--max-width","--origin"]}),r=Z(u(e,"--mode")),n=e.includes("--shell-only")?"shell":e.includes("--no-shell")?"tenant":void 0,s=u(e,"--format");s&&!["webm","mp4","gif","png"].includes(s)&&(console.error(` invalid --format "${s}" \u2014 expected webm | mp4 | gif | png`),process.exit(1));let c=u(e,"--output"),a=Number(u(e,"--duration")??"10");(!Number.isFinite(a)||a<=0)&&(console.error(` invalid --duration "${u(e,"--duration")}" \u2014 expected a positive number of seconds`),process.exit(1));let l=1800;a>l&&(console.error(` invalid --duration "${u(e,"--duration")}" \u2014 exceeds the ${l}s (30m) maximum`),process.exit(1));let g=Number(u(e,"--fps")??"30"),w=u(e,"--frames");if(w!==void 0){let d=Number(w);(!Number.isInteger(d)||d<=0)&&(console.error(` invalid --frames "${w}" \u2014 expected a positive integer count`),process.exit(1))}let V=e.includes("--open"),j=u(e,"--max-width")?Number(u(e,"--max-width")):void 0,f=Math.max(100,Math.round(a*1e3)),de=u(e,"--origin");if(r==="live"||r==="combined"){c&&console.log(` note: --output is ignored for --mode ${r} \u2014 the recording uploads to /preview/<id>`),n&&r==="live"&&console.log(` note: --${n==="shell"?"shell-only":"no-shell"} is ignored for --mode live \u2014 live recordings capture events only, no video`),await A("record",{originOverride:de});let d=y({...i,commandTimeoutMs:6e4});try{await oe(d),await te(d,r),await re(d),await ne(d,r,r==="combined"?n:void 0)||(console.error(` start failed: recording store refused to start (${r})`),process.exit(1)),console.log(` recording ${r} for ${a}s`),await new Promise(R=>setTimeout(R,f)),await ie(d);let x=await se(d);ae(x,V,r)}finally{d.close()}return}let I=w?Number(w):null,$=Re(s,c,I);V&&console.log(" note: --open is ignored for local-file capture \u2014 it applies to --mode live/combined");let h=y({...i,commandTimeoutMs:6e4});try{if(await Q(h),$==="png"){let S=I??10,p=B(c,`sootsim-frames-${O()}`);c&&H(c)&&console.log(` note: --frames writes multiple pngs, so --output "${c}" is a directory \u2014 frame-NNN.png files land inside it`),k(p,{recursive:!0});for(let m of me(p))/^frame-\d+\.png$/.test(m)&&W(U(p,m),{force:!0});console.log(` sampling ${S} frames over ${a}s \u2192 ${p}`);let b=await h.send({type:"evaluate",code:`window.__sootsimRecorder.startFrameCapture({ count: ${S}, durationMs: ${f}${n?`, layers: ${JSON.stringify(n)}`:""} })`});(!b.ok||!b.requestId)&&(console.error(` frame capture start failed: ${b.error??"unknown error"}`),process.exit(1)),await new Promise(m=>setTimeout(m,f));let ce=Date.now()+Math.max(5e3,f),T=null;for(;;){let m=await h.send({type:"evaluate",code:`window.__sootsimRecorder.getFrameCaptureResult(${b.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)),T=m.frames??[];break}Date.now()>=ce&&(console.error(" frame capture timed out"),process.exit(1)),await new Promise(F=>setTimeout(F,100))}T.forEach((m,F)=>{let le=`${p}/frame-${String(F+1).padStart(3,"0")}.png`;M(le,Buffer.from(m.data,"base64"))}),console.log(` saved ${T.length} frames`);return}if($==="gif"){let S=I??Math.max(10,Math.round(a*g/3)),p=B(c,`sootsim-${O()}.gif`);k(P(p),{recursive:!0}),console.log(` encoding gif: ${S} frames over ${a}s \u2192 ${p}`);let b=await N(h,`window.__sootsimRecorder.captureGif({ frames: ${S}, durationMs: ${f}${j?`, maxWidth: ${j}`:""}${n?`, layers: ${JSON.stringify(n)}`:""} })`,"gif encode",f);b||(console.error(" gif capture returned no frames"),process.exit(1)),M(p,Buffer.from(b.data,"base64")),console.log(` saved: ${p} (${D(b.size)})`);return}let d=B(c,`sootsim-${O()}.${$}`);k(P(d),{recursive:!0});let C={format:$,fps:g,durationMs:f};n&&(C.layers=n);let x=await N(h,`window.__sootsimRecorder.start(${JSON.stringify(C)})`,`${$} start`,f);x.ok||(console.error(` start failed: ${x.error??"unknown error"}`),/render host not available|already streaming|already recording/i.test(x.error??"")&&console.error(" a prior recording was abandoned and its capture is still\n releasing. retry in ~20s, or recover now with\n `sootsim close --sim <id>` then reopen the sim."),process.exit(1)),console.log(` recording ${$} for ${a}s \u2192 ${d}`),await new Promise(S=>setTimeout(S,f));let R=await N(h,"window.__sootsimRecorder.stop()",`${$} encode/flush`,f);R.ok||(console.error(` stop failed: ${R.error??"unknown error"}`),process.exit(1)),R.size||(console.error(" recorder returned an empty blob \u2014 nothing written"),process.exit(1)),await Y(h,d),console.log(` saved: ${d} (${D(R.size)})`)}finally{h.close()}}var $e=6e3;async function z(e,t){try{return await e.send({type:"evaluate",code:t},{timeoutMs:$e})}catch(o){let i=o instanceof Error?o.message:String(o);throw/^command timed out after \d+s$/.test(i)&&(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 Q(e){await z(e,'typeof window.__sootsimRecorder !== "undefined"')||(console.error(" window.__sootsimRecorder missing \u2014 is sootsim engine running in this sim?"),process.exit(1))}async function Y(e,t){let o=[],i=0;for(;;){let r=await e.send({type:"evaluate",code:`window.__sootsimRecorder.getBlobBase64({ offset: ${i}, chunk: 2097152 })`});if(!r)throw new Error("no blob available on recorder");if(o.push(Buffer.from(r.data,"base64")),i=r.offset,r.done)break}M(t,Buffer.concat(o))}function u(e,t){let o=e.indexOf(t);if(!(o<0||o===e.length-1))return e[o+1]}function Se(e){if(!e)return;let t=H(e).toLowerCase().replace(/^\./,"");if(t==="webm"||t==="mp4"||t==="gif")return t;if(t==="png")return"png"}function Re(e,t,o){return e||(o!=null?"png":Se(t)??"webm")}function O(){return new Date().toISOString().replace(/[:T]/g,"-").replace(/\..+/,"")}function xe(){let e=U(pe(),".sootsim","recordings");return k(e,{recursive:!0}),e}function B(e,t){return e?we(process.cwd(),e):U(xe(),t)}function D(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(2)}MB`}function Z(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 L(){return U(ge(),`sootsim-recording-${q()}.json`)}function E(){let e=L();if(!ue(e))return null;try{return{mode:"video",...JSON.parse(fe(e,"utf8"))}}catch{return W(e,{force:!0}),null}}function _e(e){M(L(),JSON.stringify(e,null,2))}function _(){W(L(),{force:!0})}function J(e,t){e&&t.simId&&e!==t.simId&&console.log(` note: the tracked recording session is on sim ${t.simId}, not the
|
|
8
|
-
requested sim ${e}. record state is global (not per-sim);
|
|
9
|
-
this command acts on that session regardless of --sim.`)}async function ke(e,t){let o=E();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 i=v(e,{port:t.port,stripBooleanFlags:["--no-shell","--shell-only"],stripValueFlags:["--mode","--fps","--format","--max-width","--origin"]}),r=Z(u(e,"--mode")),n=e.includes("--shell-only")?"shell":e.includes("--no-shell")?"tenant":void 0,s=u(e,"--format"),c=s==="mp4"?"mp4":"webm";s&&c!==s&&(console.error(` record start only supports webm or mp4 (got: ${s}). for gif/png use atomic mode: sootsim record --format ${s} --duration <s>`),process.exit(1));let a=Number(u(e,"--fps")??"30"),l=y({...i,commandTimeoutMs:15e3});try{if(r==="live"||r==="combined")n&&r==="live"&&console.log(` note: --${n==="shell"?"shell-only":"no-shell"} is ignored for --mode live \u2014 live recordings capture events only, no video`),await A("record",{originOverride:u(e,"--origin")}),await oe(l),await te(l,r),await re(l),await ne(l,r,r==="combined"?n:void 0)||(console.error(` start failed: recording store refused to start (${r})`),process.exit(1));else{await Q(l);let g={format:c,fps:a};n&&(g.layers=n);let w=await l.send({type:"evaluate",code:`window.__sootsimRecorder.start(${JSON.stringify(g)})`});w.ok||(console.error(` start failed: ${w.error??"unknown error"}`),process.exit(1))}_e({simId:i.simId??null,mode:r,format:c,fps:a,layers:n,startedAt:new Date().toISOString()}),console.log(r==="video"?` recording ${c} @ ${a}fps${n?` (${n})`:""} \u2014 run \`sootsim record stop --output <path>\` when done`:` recording ${r} \u2014 run \`sootsim record stop\` when done (add --open to launch the preview URL)`)}finally{l.close()}}async function ee(e){try{let t=await e.send({type:"evaluate",code:`(() => {
|
|
10
|
-
const store = window.SootSim?.bridges?.getRecordingState?.();
|
|
11
|
-
const headless = window.__sootsimRecorder?.state?.();
|
|
12
|
-
return { store: store ? store.state : undefined, headless };
|
|
13
|
-
})()`});return t?t.store==="recording"||t.headless==="recording"?"recording":t.store==="processing"?"processing":t.store==="idle"||t.headless==="idle"?"idle":null:null}catch{return null}}async function Oe(e,t){let o=E();if(o){J(v(e,{port:t.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 i=v(e,{port:t.port}),r=y({...i,commandTimeoutMs:8e3});try{let n=await ee(r);console.log(n==="recording"||n==="processing"?` a recording is in progress (engine state: ${n}), but not via
|
|
14
|
-
\`record start\` \u2014 it was started by an atomic \`record --duration\`
|
|
15
|
-
run or the in-browser record button, which own their own lifecycle.
|
|
16
|
-
if that controlling run is still alive it will finish on its own
|
|
17
|
-
(atomic \`--mode video/gif/png\` writes a local file from that
|
|
18
|
-
process; live/combined upload to /preview/<id>). if the run was
|
|
19
|
-
killed, the recording is abandoned and will NOT finish \u2014 reclaim
|
|
20
|
-
it now with \`sootsim record cancel\`, or it auto-reclaims when the
|
|
21
|
-
abandoned capture's deadline lapses.`:" no recording in progress")}finally{r.close()}}async function Be(e,t){let o=E();if(!o){let s=v(e,{port:t.port}),c=y({...s,commandTimeoutMs:8e3});try{let a=await ee(c);if(a==="recording"||a==="processing"){let l=await c.send({type:"evaluate",code:`(async () => {
|
|
22
|
-
const r = window.__sootsimRecorder;
|
|
23
|
-
if (r && typeof r.forceRelease === 'function') return await r.forceRelease();
|
|
24
|
-
return false;
|
|
25
|
-
})()`}).catch(()=>!1);console.log(l?" reclaimed an abandoned recording (started by an atomic\n `record --duration` run or the record button whose owner is\n gone). the recorder is idle again \u2014 live/combined can start.":" a recording is in progress and still owned by a live atomic\n `record --duration` run or the in-browser record button \u2014 it\n will finish on its own and nothing was reclaimed.")}else console.log(" no recording in progress")}finally{c.close()}return}let i=v(e,{port:t.port});J(i.simId,o);let r=o.simId??i.simId??void 0,n=y({...i,simId:r,commandTimeoutMs:15e3});try{o.mode==="live"||o.mode==="combined"?await n.send({type:"evaluate",code:"void window.SootSim?.bridges?.cancelRecording?.()"}):await n.send({type:"evaluate",code:"window.__sootsimRecorder.stop()"})}catch{}finally{_(),n.close()}console.log(" recording cancelled")}async function Me(e,t){let o=E();o||(console.error(" no recording in progress. start one with `sootsim record start`."),process.exit(1));let i=v(e,{port:t.port,stripBooleanFlags:["--open"],stripValueFlags:["--output"]});J(i.simId,o);let r=o.simId??i.simId??void 0,n=e.includes("--open"),s=y({...i,simId:r,commandTimeoutMs:6e4});try{if(o.mode==="live"||o.mode==="combined"){await ie(s);let g=await se(s);_(),ae(g,n,o.mode);return}let c=u(e,"--output"),a=B(c,`sootsim-${O()}.${o.format}`);k(P(a),{recursive:!0});let l=await s.send({type:"evaluate",code:"window.__sootsimRecorder.stop()"});l.ok||(console.error(` stop failed: ${l.error??"unknown error"}`),_(),process.exit(1)),l.size||(console.error(" recorder returned an empty blob \u2014 nothing written"),_(),process.exit(1)),await Y(s,a),_(),console.log(` saved: ${a} (${D(l.size)})`)}finally{s.close()}}async function oe(e){await z(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 te(e,t){await z(e,`(() => {
|
|
26
|
-
const fn = window.__sootsimCaptureBundle
|
|
27
|
-
if (typeof fn !== 'function') return false
|
|
28
|
-
const snap = fn()
|
|
29
|
-
return !!(snap && snap.bundleUrl)
|
|
30
|
-
})()`)||(console.error(` --mode ${t} needs a guest app bundle to upload to /preview/<id>,
|
|
31
|
-
but this sim has no bundle loaded (a built-in shell screen like
|
|
32
|
-
photos/settings/home has none). open a metro/guest app first, or
|
|
33
|
-
use \`--mode video\` for a local screen recording with no upload.`),process.exit(1))}async function re(e){let t=K();if(!t)return;let o=t.kind==="api-key"?t.secret:t.token;await e.send({type:"evaluate",code:`(() => {
|
|
34
|
-
const set = window.SootSim && window.SootSim.bridges && window.SootSim.bridges.setSession
|
|
35
|
-
if (typeof set !== 'function') return false
|
|
36
|
-
set({ token: ${JSON.stringify(o)}, user: null })
|
|
37
|
-
return true
|
|
38
|
-
})()`})||(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 ne(e,t,o){return await e.send({type:"evaluate",code:`window.SootSim.bridges.startRecording(${JSON.stringify(t)}${o?`, ${JSON.stringify(o)}`:""})`})===!0}async function ie(e){await e.send({type:"evaluate",code:"void window.SootSim.bridges.stopRecording()"})}async function se(e){let t=Date.now()+X;for(;Date.now()<t;){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(i=>setTimeout(i,300))}return{uploadError:`upload did not settle within ${X/1e3}s`}}function ae(e,t,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}`),console.log(` note: this URL is content-addressed \u2014 re-recording the same bundle
|
|
39
|
-
replaces this capture at the same /preview/<id>.`),(o==="live"||o==="combined")&&typeof e.eventCount=="number"&&console.log(` captured ${e.eventCount} event${e.eventCount===1?"":"s"}`),(o==="live"||o==="combined")&&e.eventCount===0&&console.log(o==="combined"?` note: this combined recording captured no events \u2014 the Live tab has
|
|
40
|
-
nothing to replay, and the Video tab may stall with no events to drive it.`:` note: this live recording captured no events \u2014 the preview has nothing
|
|
41
|
-
to replay and will boot a fresh interactive session instead.`),t&&G(e.previewUrl)}export{Se as extToFormat,Re as resolveFormat,Pe as runRecord,u as valueOf};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a}from"./chunk-LLOURJ3N.js";import"./chunk-KYP5XLIR.js";import"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-4VNKLERI.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";export{a as runRuntime};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a}from"./chunk-PS57ERTY.js";import"./chunk-HMPHDE5A.js";import"./chunk-Y65GFG22.js";import"./chunk-A3ATSCOF.js";import"./chunk-4ENZNH7P.js";import"./chunk-KYP5XLIR.js";import"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";export{a as runSetupRepo};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.59 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-D26QPCEP.js";import"./chunk-24VAZEFY.js";import"./chunk-L5PBH3V6.js";import"./chunk-G3A23B5Q.js";import"./chunk-A3ATSCOF.js";import"./chunk-4ENZNH7P.js";import"./chunk-KYP5XLIR.js";import"./chunk-4L72FYCQ.js";import"./chunk-N7OHTYFK.js";import"./chunk-V6NAG62D.js";import"./chunk-AMEUPM6D.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};
|