sootsim 0.1.86 → 0.1.88
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 +4 -4
- package/dist-cli/chunks/{agent-S3WLX5Z4.js → agent-ZI2Y3H3Y.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-PFPEQTPG.js → agent-wrapper-YSBDQL6H.js} +2 -2
- package/dist-cli/chunks/{assert-RQD66YGE.js → assert-KKVJVH7K.js} +2 -2
- package/dist-cli/chunks/auto-bootstrap-2DEJ2DPE.js +2 -0
- package/dist-cli/chunks/beta-FXDJPPHT.js +2 -0
- package/dist-cli/chunks/{chunk-FO52BFW4.js → chunk-2QNNBZLX.js} +2 -2
- package/dist-cli/chunks/chunk-2XLZKDMI.js +1 -0
- package/dist-cli/chunks/{chunk-XZE53P4L.js → chunk-4QXF57UL.js} +2 -2
- package/dist-cli/chunks/chunk-4TRU5DGK.js +1 -0
- package/dist-cli/chunks/{chunk-535UNERF.js → chunk-5GY5KZ33.js} +2 -2
- package/dist-cli/chunks/{chunk-P7IKKZTG.js → chunk-5ITY4LBR.js} +2 -2
- package/dist-cli/chunks/{chunk-VUYCS6QI.js → chunk-7GIE3OPK.js} +2 -2
- package/dist-cli/chunks/chunk-ACDG2MSQ.js +2 -0
- package/dist-cli/chunks/{chunk-CSJS4MRN.js → chunk-CAJ6QHMM.js} +2 -2
- package/dist-cli/chunks/{chunk-JITAVV2G.js → chunk-DA3PPE4Y.js} +1 -1
- package/dist-cli/chunks/{chunk-OBHJKTWA.js → chunk-DPOLCAFU.js} +2 -2
- package/dist-cli/chunks/{chunk-NLH7FNSG.js → chunk-FYK7GIM7.js} +1 -1
- package/dist-cli/chunks/{chunk-3GCSX5H5.js → chunk-GZUD44W5.js} +1 -1
- package/dist-cli/chunks/{chunk-UWSP2AT7.js → chunk-HFUOM2TC.js} +1 -1
- package/dist-cli/chunks/{chunk-KQYOS5SM.js → chunk-I63MGIRV.js} +1 -1
- package/dist-cli/chunks/{chunk-PVMX5UNR.js → chunk-ICPLDWHO.js} +2 -2
- package/dist-cli/chunks/{chunk-JBYW57OA.js → chunk-IPRXAXSY.js} +2 -2
- package/dist-cli/chunks/{chunk-CMAANHYQ.js → chunk-J6U3467L.js} +1 -1
- package/dist-cli/chunks/{chunk-TSNBQ4ZV.js → chunk-JDKTIGQG.js} +2 -2
- package/dist-cli/chunks/{chunk-XB4QIINM.js → chunk-JJPIAFVR.js} +5 -5
- package/dist-cli/chunks/chunk-JWR47SLY.js +2 -0
- package/dist-cli/chunks/{chunk-FF5KD3BS.js → chunk-LDBQP5NY.js} +2 -2
- package/dist-cli/chunks/{chunk-V7CFSKMC.js → chunk-LYBRU6QS.js} +2 -2
- package/dist-cli/chunks/{chunk-6LG7WJMD.js → chunk-MMNQO2HZ.js} +2 -2
- package/dist-cli/chunks/{chunk-XFJYEKYK.js → chunk-MR7YARGW.js} +3 -3
- package/dist-cli/chunks/{chunk-6A7IWFXR.js → chunk-NFOZL6H3.js} +5 -5
- package/dist-cli/chunks/{chunk-5DFVKWYQ.js → chunk-PQJTZ2Q2.js} +3 -3
- package/dist-cli/chunks/chunk-QCEJKIV5.js +2 -0
- package/dist-cli/chunks/{chunk-VFGAEMSI.js → chunk-QO3BBIOT.js} +2 -2
- package/dist-cli/chunks/{chunk-EDWDFOPL.js → chunk-QOTYEI7J.js} +22 -10
- package/dist-cli/chunks/{chunk-7YZHI7V6.js → chunk-QSZW3XPY.js} +1 -1
- package/dist-cli/chunks/chunk-RC77QMAW.js +1 -0
- package/dist-cli/chunks/{chunk-JB467MUR.js → chunk-RICUSEFS.js} +2 -2
- package/dist-cli/chunks/{chunk-STHMWSVN.js → chunk-RKII4C6H.js} +2 -2
- package/dist-cli/chunks/{chunk-OCTDP37S.js → chunk-UKQFKONV.js} +2 -2
- package/dist-cli/chunks/{chunk-CQAQTU5K.js → chunk-UOADFPJR.js} +1 -1
- package/dist-cli/chunks/{chunk-2IYMBWHL.js → chunk-VLX4A5H7.js} +1 -1
- package/dist-cli/chunks/{chunk-JMILXXI4.js → chunk-W6XDYKEI.js} +2 -2
- package/dist-cli/chunks/{chunk-3TNIXR6J.js → chunk-WV4XAMMB.js} +1 -1
- package/dist-cli/chunks/{chunk-DKW7Q4F3.js → chunk-XCFMLRSZ.js} +2 -2
- package/dist-cli/chunks/chunk-YII7ZDGB.js +23 -0
- package/dist-cli/chunks/{chunk-NBBH2PVW.js → chunk-YMAPZJC5.js} +2 -2
- package/dist-cli/chunks/{chunk-5NW6W7YF.js → chunk-ZJ7REGNA.js} +1 -1
- package/dist-cli/chunks/cli-version-3L7QYH7O.js +2 -0
- package/dist-cli/chunks/{compat-I2U3P4KP.js → compat-MVJ4SLW6.js} +3 -3
- package/dist-cli/chunks/{config-S73CCGP5.js → config-YRXKPGDD.js} +2 -2
- package/dist-cli/chunks/{control-QR6MY7RA.js → control-5VL7ZZ7H.js} +2 -2
- package/dist-cli/chunks/{cpu-profile-RFYCTVAF.js → cpu-profile-TI4YCPG7.js} +2 -2
- package/dist-cli/chunks/{daemon-D5MV2B22.js → daemon-EAT4F6GF.js} +3 -3
- package/dist-cli/chunks/{debug-ZYEI75AG.js → debug-BZQK7KMK.js} +3 -3
- package/dist-cli/chunks/{detox-J5IH52RV.js → detox-4WPDF7PV.js} +2 -2
- package/dist-cli/chunks/{device-NOBLSUOD.js → device-KNKIQ3IS.js} +2 -2
- package/dist-cli/chunks/{diagnose-B6J5ZUHV.js → diagnose-OCOEEXIA.js} +2 -2
- package/dist-cli/chunks/drivers-OP2GUBTA.js +2 -0
- package/dist-cli/chunks/{electron-PSX4KDCC.js → electron-F4OGNAMN.js} +3 -3
- package/dist-cli/chunks/flow-5E5RFKRC.js +2 -0
- package/dist-cli/chunks/help-PSZ4URF3.js +2 -0
- package/dist-cli/chunks/{hints-ZE4I3YO3.js → hints-PI7V27DL.js} +2 -2
- package/dist-cli/chunks/{home-paths-N76MJE3D.js → home-paths-FQDBE3DP.js} +2 -2
- package/dist-cli/chunks/{inspect-V2TXTDOG.js → inspect-7WG5VC3M.js} +107 -107
- package/dist-cli/chunks/install-7LDS6J3P.js +2 -0
- package/dist-cli/chunks/{install-desktop-6ZRTRRCU.js → install-desktop-DTHVNNX7.js} +3 -3
- package/dist-cli/chunks/{keys-L2RN4URM.js → keys-CWPKHEL2.js} +2 -2
- package/dist-cli/chunks/{launch-BJGXPNZR.js → launch-EXF3NWKL.js} +3 -3
- package/dist-cli/chunks/{login-HYNEMAYR.js → login-RF5HX4YK.js} +4 -4
- package/dist-cli/chunks/{logout-AO4YS27T.js → logout-NSIQDJTY.js} +2 -2
- package/dist-cli/chunks/{maestro-PRACYFKV.js → maestro-U3AWFYNR.js} +2 -2
- package/dist-cli/chunks/{preview-ZTANXVEK.js → preview-HBWH34VL.js} +2 -2
- package/dist-cli/chunks/{profile-FNMAGUDB.js → profile-B5DQIC27.js} +2 -2
- package/dist-cli/chunks/{react-6ZV2FQIM.js → react-XJM4CQDU.js} +2 -2
- package/dist-cli/chunks/{record-MLFVJZ6Y.js → record-MWURHSDY.js} +2 -2
- package/dist-cli/chunks/runtime-N7O7ZZW3.js +2 -0
- package/dist-cli/chunks/{runtime-delivery-ATYW2SQR.js → runtime-delivery-MFASKX5N.js} +2 -2
- package/dist-cli/chunks/{screenshot-UOMYMFZ4.js → screenshot-G3B6PTD2.js} +2 -2
- package/dist-cli/chunks/{screenshot-mode-MWSVD4YG.js → screenshot-mode-F27AGWOL.js} +2 -2
- package/dist-cli/chunks/{screenshots-GSA3VCWB.js → screenshots-HCDJ3V5T.js} +2 -2
- package/dist-cli/chunks/{server-YPFC6POG.js → server-ZI7V4MJW.js} +9 -9
- package/dist-cli/chunks/setup-repo-NEBHRCOI.js +2 -0
- package/dist-cli/chunks/{skills-YE5OPWMQ.js → skills-KT2MHBGR.js} +2 -2
- package/dist-cli/chunks/{start-BSSQ5U2V.js → start-AYOMCDKK.js} +4 -4
- package/dist-cli/chunks/store-3HPKFGMD.js +2 -0
- package/dist-cli/chunks/telemetry-FAMOGMOZ.js +2 -0
- package/dist-cli/chunks/{test-5JMLBH2O.js → test-6KILPMZ4.js} +3 -3
- package/dist-cli/chunks/{three-mode-TRBWZJQY.js → three-mode-MATEVUJA.js} +2 -2
- package/dist-cli/chunks/{timeline-YMZPIEB4.js → timeline-XTURFCUR.js} +2 -2
- package/dist-cli/chunks/{upgrade-JLAS7FIF.js → upgrade-5OPHZEOL.js} +3 -3
- package/dist-cli/chunks/upload-ZKE2F7SV.js +2 -0
- package/dist-cli/chunks/{web-D6S5UXOO.js → web-UWZTDXS3.js} +2 -2
- package/dist-cli/chunks/{what-happened-65NXWU2S.js → what-happened-E4QWSIJN.js} +2 -2
- package/dist-cli/chunks/{whoami-6BSB6FQC.js → whoami-PINWMH4V.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/beta.cjs +1 -1
- package/dist-lib/beta.mjs +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/detox/index.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 +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.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/scripts/demo-app-registry.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/skills.cjs +9 -2
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/dist-cli/chunks/auto-bootstrap-PWF7OYCV.js +0 -2
- package/dist-cli/chunks/beta-2HH7F2DQ.js +0 -2
- package/dist-cli/chunks/chunk-5ZYANOOI.js +0 -23
- package/dist-cli/chunks/chunk-I3JMONYJ.js +0 -2
- package/dist-cli/chunks/chunk-KGYC4SZA.js +0 -2
- package/dist-cli/chunks/chunk-M6GOCS27.js +0 -2
- package/dist-cli/chunks/chunk-NIRJVBXJ.js +0 -1
- package/dist-cli/chunks/chunk-QUYC7CVV.js +0 -1
- package/dist-cli/chunks/chunk-Y7BXSTVX.js +0 -1
- package/dist-cli/chunks/cli-version-TGWWTYQX.js +0 -2
- package/dist-cli/chunks/drivers-RRHVOU6S.js +0 -2
- package/dist-cli/chunks/flow-FWNVFKMP.js +0 -2
- package/dist-cli/chunks/install-4PINRR2O.js +0 -2
- package/dist-cli/chunks/runtime-5762IE56.js +0 -2
- package/dist-cli/chunks/setup-repo-QBQ4VWFO.js +0 -2
- package/dist-cli/chunks/store-EG4SONAH.js +0 -2
- package/dist-cli/chunks/telemetry-XXN4LRDS.js +0 -2
- package/dist-cli/chunks/upload-K6UNCFQH.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{g as w,i as u,j as m,k as l}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{g as w,i as u,j as m,k as l}from"./chunk-FYK7GIM7.js";var p="sootsim:settings",v=["errorReporting","colorScheme","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","agentProvider","onboardingComplete","betaConsentVersion","detailedTelemetry"];function S(){if(typeof window>"u")return null;let e=window.sootsimElectron;return e&&typeof e=="object"?e:null}function g(e){let t={};for(let n of v){if(!(n in e))continue;let r=e[n],o=u[n];o.validate&&!o.validate(r)||o.options&&!o.options.includes(r)||(t[n]=r)}return t}function h(e){let t={};for(let n of v)t[n]=e[n];return t}function _(){if(typeof localStorage>"u")return{};try{let e=localStorage.getItem(p);return e?g(JSON.parse(e)):{}}catch{return{}}}function V(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(p,JSON.stringify(h(e)))}catch{}}function E(){let t=S()?.sharedConfig?.settings;return!t||typeof t!="object"?{}:g(t)}function K(e){let t=S();if(t?.writeSharedConfig)try{t.writeSharedConfig({settings:h(e)})}catch{}}function k(){if(typeof window>"u")return null;let e=window.__sootsimSharedConfig;return e&&typeof e=="object"?e:null}function j(){let e=k()?.settings;return!e||typeof e!="object"?{}:g(e)}function D(e){if(!k())return;let t={settings:h(e)};try{if(globalThis.__sootsimBridgeRequest?.writeSharedConfig?.(t))return}catch{}if(!(typeof fetch>"u"))try{fetch("/__sootsim/shared-config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0}).catch(()=>{})}catch{}}function b(){let e=_(),t=j(),n=E();return{...e,...t,...n}}function R(e){V(e),K(e),D(e)}function C(e){if(typeof window>"u")return()=>{};let t=i=>{if(!(i.key!==p||i.newValue==null))try{e(g(JSON.parse(i.newValue)))}catch{}};window.addEventListener("storage",t);let n=S(),r;n?.onSharedConfigChanged&&(r=n.onSharedConfigChanged(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))}));let c=globalThis.__sootsimBridgeRequest?.subscribeSharedConfig?.(i=>{let d=i?.settings;!d||typeof d!="object"||e(g(d))});return()=>{window.removeEventListener("storage",t),r?.(),c?.()}}var M=l(),P=b();for(let e of Object.keys(m()))delete P[e];var s={...M,...P},f=[],a=null;function y(){for(let e of f)e();R(s)}C(e=>{let t={...s},n=!1;for(let[r,o]of Object.entries(e)){let c=r;t[c]!==o&&(t[c]=o,n=!0)}if(n){s=t,a=null;for(let r of f)r()}});var L={get(e){return s[e]},set(e,t){let n=u[e];n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]!==t&&(s={...s,[e]:t},e==="deviceModel"&&(a=null),y())},getAll(){return s},apply(e){let t=!1,n={...s};for(let[r,o]of Object.entries(e)){if(o===void 0)continue;let c=r,i=u[c];i&&(i.validate&&!i.validate(o)||i.options&&!i.options.includes(o)||n[c]!==o&&(n[c]=o,t=!0))}t&&(s=n,a=null,y())},reset(){s=l(),a=null,y()},subscribe(e){return f.push(e),()=>{f=f.filter(t=>t!==e)}},getDeviceSpec(){return a||(a=w(s.deviceModel)),a},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{L as a};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{a as d}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{a as d}from"./chunk-YII7ZDGB.js";import{a as p,d as w,h as $,j as y}from"./chunk-4QXF57UL.js";import{A as g,B as f,i as h,y as m,z as a}from"./chunk-VLX4A5H7.js";import b from"fs";import{WebSocket as D}from"ws";async function P(n,e={}){let[o,...t]=n;if(!o||o==="--help"||o==="-h"){R();return}switch(o){case"install":return O(t,e);case"list":case"ls":return S(t);case"use":return T(t);case"remove":case"rm":return N(t);case"which":case"active":return F();default:console.error(` unknown runtime subcommand: ${o}`),R(),process.exit(1)}}function R(){console.log(`
|
|
3
3
|
sootsim runtime \u2014 manage engine runtimes under ~/.sootsim/runtimes/
|
|
4
4
|
|
|
5
5
|
usage:
|
|
@@ -22,4 +22,4 @@ examples:
|
|
|
22
22
|
sootsim runtime install 1.2.3
|
|
23
23
|
sootsim runtime install --channel beta
|
|
24
24
|
sootsim runtime use 1.2.3
|
|
25
|
-
`)}async function O(n,e){let{version:o,flags:t}=_(n),s=t.channel??e.channel??"stable",l=t.force===!0,c=t.setActive!==!1;m(),console.log("sootsim runtime install"),console.log(` cdn: ${w()}`);try{let i=await y({version:o,channel:s,force:l,setActive:c});console.log(` version: ${i.version} (channel: ${i.channel})`),i.installed?console.log(` installed ${i.version}`):console.log(` already installed at ${i.runtimeDir}`),c&&await k(i.version)}catch(i){console.error(` ${I(i)}`),process.exit(1)}}async function k(n){g(n),console.log(` active: ${n}`),await A(n)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${n})`)}async function A(n){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-
|
|
25
|
+
`)}async function O(n,e){let{version:o,flags:t}=_(n),s=t.channel??e.channel??"stable",l=t.force===!0,c=t.setActive!==!1;m(),console.log("sootsim runtime install"),console.log(` cdn: ${w()}`);try{let i=await y({version:o,channel:s,force:l,setActive:c});console.log(` version: ${i.version} (channel: ${i.channel})`),i.installed?console.log(` installed ${i.version}`):console.log(` already installed at ${i.runtimeDir}`),c&&await k(i.version)}catch(i){console.error(` ${I(i)}`),process.exit(1)}}async function k(n){g(n),console.log(` active: ${n}`),await A(n)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${n})`)}async function A(n){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-FQDBE3DP.js"),t=o();if(!e(t))return!1;let s=d();return new Promise(l=>{let c=!1,i=!1,u=x=>{c||(c=!0,l(x))},r=new D(`ws://127.0.0.1:${s}`,{handshakeTimeout:800}),v=setTimeout(()=>{try{r.close()}catch{}u(i)},1500);r.on("open",()=>{try{r.send(JSON.stringify({type:"runtime:use",version:n,id:0})),i=!0}catch{}setTimeout(()=>{try{r.close()}catch{}},100)}),r.on("close",()=>{clearTimeout(v),u(i)}),r.on("error",()=>{clearTimeout(v),u(!1)})})}async function S(n){m();let e=f(),o=a();if(console.log("installed:"),e.length===0)console.log(" (none)");else for(let t of e)console.log(` ${t===o?"*":" "} ${t}`);try{let t=await $();console.log("available (latest per channel):");for(let[s,l]of Object.entries(t.channels))console.log(` ${s.padEnd(8)} ${l.latest}`)}catch(t){console.log(`available: (could not fetch manifest: ${I(t)})`)}}async function T(n){let e=n[0];e||(console.error(" usage: sootsim runtime use <version>"),process.exit(1));let o=f();o.includes(e)||(console.error(` version ${e} is not installed`),console.error(` installed: ${o.join(", ")||"(none)"}`),console.error(` run \`sootsim runtime install ${e}\` first`),process.exit(1)),await k(e)}async function N(n){let e=n[0];e||(console.error(" usage: sootsim runtime remove <version>"),process.exit(1)),a()===e&&(console.error(` cannot remove active runtime ${e}`),console.error(" switch with `sootsim runtime use <other>` first, or install another version"),process.exit(1));let t=h(e);if(!b.existsSync(t)){console.error(` ${e} is not installed`);return}b.rmSync(t,{recursive:!0,force:!0}),console.log(` removed ${e}`)}async function F(){let n=a();if(!n){console.log(" no active runtime");return}console.log(n)}function _(n){let e={},o=[];for(let t=0;t<n.length;t++){let s=n[t];if(s==="--channel"&&t+1<n.length){e.channel=n[t+1],t++;continue}if(s.startsWith("--channel=")){e.channel=s.slice(10);continue}if(s==="--force"){e.force=!0;continue}if(s==="--set-active=false"||s==="--no-set-active"){e.setActive=!1;continue}o.push(s)}return{version:o[0]??null,flags:e}}function I(n){return n instanceof Error?n.message:String(n)}export{P as a};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{a as Ie}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{a as Ie}from"./chunk-IPRXAXSY.js";import{a as Ae}from"./chunk-UKQFKONV.js";import{a as Pe}from"./chunk-YMAPZJC5.js";import{a as V,b as he,c as ge,d as Z,e as ee,f as ye,g as te,i as ie,j as be,k as Me}from"./chunk-W6XDYKEI.js";import{f as Te,m as Fe,o as $e,s as ke}from"./chunk-QO3BBIOT.js";import{d as ve,f as Se}from"./chunk-JDKTIGQG.js";import{l as we}from"./chunk-CAJ6QHMM.js";import{c as X,d as Q,e as pe}from"./chunk-YII7ZDGB.js";import{c as Y}from"./chunk-WV4XAMMB.js";import{a as xe}from"./chunk-ZJ7REGNA.js";import{a as me,b as G}from"./chunk-DPOLCAFU.js";import{f as fe}from"./chunk-FYK7GIM7.js";import*as A from"fs";import{tmpdir as De}from"os";import*as y from"path";import*as g from"fs";import*as w from"path";var L=1e4,B=393,C=852,Ee="__sootsimCliPerf",Ke="maestroCopiedText",_e=new Map;function f(o){return new Promise(e=>setTimeout(e,o))}function Je(o){return o?w.basename(o)===".maestro"?w.dirname(o):o:process.cwd()}function He(o,e,t){let i=e.endsWith(".png")?e:`${e}.png`;if(w.isAbsolute(i))return i;if(t.mode==="flow"&&/[\\/]/.test(i)){let r=i.startsWith("./")||i.startsWith("../")?t.flowDir??process.cwd():Je(t.flowDir);return w.resolve(r,i)}return w.join(o,i)}function qe(o){if(typeof o=="string")return{path:o,withFrame:!1};let e=o.path?.trim()||o.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:o.withFrame===!0,layers:o.layers}}function re(o){let[e,t]=o.split(",").map(r=>r.trim()),i=(r,n)=>r.endsWith("%")?Number.parseFloat(r)/100*n:Number.parseFloat(r);return{x:i(e,B),y:i(t,C)}}function ze(o){let e=o.split(/^---$/m),t=e.length>1?e[e.length-1]:o,i=ge(he.parse(t),_e);return Array.isArray(i)?i:[]}var W=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingDurationMs=null;simRouteHint=null;lastFailedStep=null;get simId(){return this.opts.simId}setSimRouteHint(e){this.simRouteHint=this.normalizeSimRoute(e)}normalizeSimRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let i=t.searchParams.toString();return`${t.origin}${t.pathname}${i?`?${i}`:""}`}catch{return e}}async refreshSimId(){if(this.opts.simId)try{let e=await this.bridge.listSims(),t=e.find(a=>a.id===this.opts.simId);if(t&&(this.simRouteHint=this.normalizeSimRoute(t.url||t.origin)),e.find(a=>a.id===this.opts.simId&&a.readyState==="open")||!this.simRouteHint)return;let r=this.simRouteHint&&e.find(a=>a.readyState==="open"&&this.normalizeSimRoute(a.url||a.origin)===this.simRouteHint);if(!r)return;let n=e.find(a=>a.isPrimary&&a.readyState==="open"),s=e.find(a=>a.readyState==="open"),l=r??n??s;l&&(this.opts.simId=l.id,console.log(` [flow] sim rotated to ${l.id}`))}catch{}}async evaluate(e,t){return this.bridge.send({type:"evaluate",simId:this.opts.simId,code:e},t?{timeoutMs:t}:void 0)}async callTest(e,...t){return this.bridge.send({type:"call",simId:this.opts.simId,path:`__sootsimTest.${e}`,args:t})}async waitForTree(e=L){let t=Date.now()+e,i=Date.now(),r=null,n=0,s=0;for(;Date.now()<t;){try{let a=await this.evaluate(`(async () => {
|
|
3
3
|
const test = window.__sootsimTest
|
|
4
4
|
if (!test) return { count: 0, loading: true }
|
|
5
5
|
const count = (await test.getNodeCount?.()) || 0
|
|
@@ -109,7 +109,7 @@ import{a as Ie}from"./chunk-JBYW57OA.js";import{a as Ae}from"./chunk-OCTDP37S.js
|
|
|
109
109
|
visible: !!keyboard?.isVisible?.(),
|
|
110
110
|
focused: !!test?.isTextInputFocused?.(),
|
|
111
111
|
}
|
|
112
|
-
})()`);if(!t?.visible&&!t?.focused){await f(80);return}await f(80)}}async eraseText(e){for(let t=0;t<e;t++)await this.pressKey("Backspace");await f(100)}async waitFor(e){let t=Date.now()+(e.timeout||L);for(;Date.now()<t;){if(await this.findElement(e))return;await f(200)}let i=await this.findElement(e),r=i?` (matched node y=${Math.round(i.absolutePosition.y)} \u2014 still off-screen at deadline)`:"";throw new Error(`waitFor: ${JSON.stringify(e)} not found after ${e.timeout||L}ms${r}`)}async takeScreenshot(e){try{await this.waitForVisualSettle()}catch{}await f(250);let t=qe(e),i=He(this.opts.screenshotDir,t.path,{mode:this.opts.screenshotPathMode??"dir",flowDir:this.opts.flowDir});g.mkdirSync(w.dirname(i),{recursive:!0});let r=t.layers??this.opts.screenshotLayers,n={type:"screenshot",simId:this.opts.simId};r&&r!=="full"&&(n.layers=r);let l=(await this.bridge.send(n)).replace(/^data:image\/png;base64,/,""),a=Buffer.from(l,"base64");if(t.withFrame){let m=await this.readCurrentDeviceModel();if(!m)throw new Error("could not read current device model for framed screenshot");let p=await Ie(a,m);g.writeFileSync(i,p),console.log(`[flow] screenshot: ${i} (frame: ${m})`);return}g.writeFileSync(i,a),console.log(`[flow] screenshot: ${i}`)}async readCurrentDeviceModel(){let e=await this.bridge.send({type:"call",simId:this.opts.simId,path:"SootSim.bridges.settings.get",args:[]}),t=e&&typeof e.deviceModel=="string"?e.deviceModel:null;return!t||!(t in
|
|
112
|
+
})()`);if(!t?.visible&&!t?.focused){await f(80);return}await f(80)}}async eraseText(e){for(let t=0;t<e;t++)await this.pressKey("Backspace");await f(100)}async waitFor(e){let t=Date.now()+(e.timeout||L);for(;Date.now()<t;){if(await this.findElement(e))return;await f(200)}let i=await this.findElement(e),r=i?` (matched node y=${Math.round(i.absolutePosition.y)} \u2014 still off-screen at deadline)`:"";throw new Error(`waitFor: ${JSON.stringify(e)} not found after ${e.timeout||L}ms${r}`)}async takeScreenshot(e){try{await this.waitForVisualSettle()}catch{}await f(250);let t=qe(e),i=He(this.opts.screenshotDir,t.path,{mode:this.opts.screenshotPathMode??"dir",flowDir:this.opts.flowDir});g.mkdirSync(w.dirname(i),{recursive:!0});let r=t.layers??this.opts.screenshotLayers,n={type:"screenshot",simId:this.opts.simId};r&&r!=="full"&&(n.layers=r);let l=(await this.bridge.send(n)).replace(/^data:image\/png;base64,/,""),a=Buffer.from(l,"base64");if(t.withFrame){let m=await this.readCurrentDeviceModel();if(!m)throw new Error("could not read current device model for framed screenshot");let p=await Ie(a,m);g.writeFileSync(i,p),console.log(`[flow] screenshot: ${i} (frame: ${m})`);return}g.writeFileSync(i,a),console.log(`[flow] screenshot: ${i}`)}async readCurrentDeviceModel(){let e=await this.bridge.send({type:"call",simId:this.opts.simId,path:"SootSim.bridges.settings.get",args:[]}),t=e&&typeof e.deviceModel=="string"?e.deviceModel:null;return!t||!(t in fe)?null:t}async captureFailureScreenshot(e){g.mkdirSync(w.dirname(e),{recursive:!0});let i=(await this.bridge.send({type:"screenshot",simId:this.opts.simId})).replace(/^data:image\/png;base64,/,"");g.writeFileSync(e,Buffer.from(i,"base64"))}async captureFailureBundle(e,t){g.mkdirSync(e,{recursive:!0});let i=(p,x)=>{try{g.writeFileSync(w.join(e,p),x)}catch{}},r=async p=>{try{return await this.bridge.send({type:"evaluate",simId:this.opts.simId,code:p})}catch{return null}},n=await r(`(async () => {
|
|
113
113
|
const out = {
|
|
114
114
|
simId: window.__sootsimBridge?.id ?? window.SootSim?.state?.simId ?? null,
|
|
115
115
|
url: location.href,
|
|
@@ -357,7 +357,7 @@ flow extension:
|
|
|
357
357
|
`),process.exit(0));let e=o[0];A.existsSync(e)||(console.error(` error: ${e} not found`),process.exit(1));let t=u=>o.find((d,h)=>o[h-1]===u),i=o.includes("--profile"),r=o.includes("--new"),n=t("--out")||"/tmp/sootsim-recordings",s=t("--screenshots")||(t("--out")?n:"/tmp/sootsim-flow"),l=t("--screenshot-paths")==="flow"?"flow":"dir",a=o.includes("--no-shell")?"tenant":o.includes("--shell-only")?"shell":void 0,m=t("--device")?.trim()||"",p=o.includes("--slow")?+(t("--slow")||"500"):0,x=o.includes("--electron"),v=o.includes("--preview"),U=await Pe(t("--preview-origin")),oe=t("--preview-public-origin"),Re=o.includes("--preview-open"),Ne=o.flatMap((u,d)=>o[d-1]==="--replace"?["--replace",u]:[]),T=o.includes("--record")||v,Ve=o.includes("--tail-wait")?Math.max(0,+(t("--tail-wait")||"2000")):T?v?6e3:2e3:0,Le=A.readFileSync(e,"utf8"),{frontmatter:k,steps:M}=Z(Le,{resolveEnv:!0});M.length===0&&(console.error(" error: flow file must contain a YAML array of steps"),process.exit(1));let E=m||k.device||"",D=x||k.electron===!0,Be=k.app===void 0||k.app===null?"":typeof k.app=="number"?String(k.app):k.app,j=Ge(Be),se={stripBooleanFlags:["--record","--profile","--electron","--new","--preview","--preview-open","--headless"],stripValueFlags:["--out","--device","--slow","--tail-wait","--url","--replace","--screenshots","--screenshot-paths","--preview-origin","--preview-public-origin","--driver"]},b=X(o,se),We=t("--url")||"";D&&!xe()&&(console.error(" error: desktop companion not found. install or build it first with `bun run build:electron`"),process.exit(1));let ne=D?"desktop companion":"bridge",Ue=j?` | target: ${j}`:"";console.log(`
|
|
358
358
|
sootsim flow \u2014 ${y.basename(e)}
|
|
359
359
|
${M.length} steps | ${ne}${Ue}${T?" | recording":""}${i?" | profiling":""}${p?` | ${p}ms delay`:""}
|
|
360
|
-
`),v&&
|
|
360
|
+
`),v&&me({event:"preview_flow_started",properties:{flowName:y.basename(e),stepCount:M.length,mode:ne,electron:D,record:T,profile:i,previewOrigin:U}});let F=We||j||"",K=r||D&&b.simIdSource!=="flag",ae=t("--driver")||"",J=!1,H=new Set,le=!1;if(!F&&!K&&b.simIdSource==="none"){let u=pe(b);try{let d=await u.listSims(),h=d.find(N=>N.isPrimary&&N.readyState==="open"),R=d.find(N=>N.readyState==="open"),ue=h??R;ue&&(le=!0,console.log(` reusing active sim: ${ue.id}`))}catch{}finally{u.close()}}if(!F&&!le&&(K||b.simIdSource==="none")){let u=await Ye();u||(console.error(" error: no current sim and no sootsim target found"),await G(),process.exit(1)),F=u}if(F&&E){let u=new URL(await Te(F));u.searchParams.set("device",E),F=u.toString()}if(F){let u=[F];if(u.push(...Ne),K&&u.push("--new"),b.simIdSource==="flag"&&b.simId&&u.push("--sim",b.simId),ae&&(u.push("--driver",ae),J=!0),o.includes("--headless")&&u.push("--headless"),await $e(u,{port:b.wsPort,timeoutMs:b.commandTimeoutMs}),J){let d=Y();d&&H.add(d)}}let P=X(o,se),q=P.simIdSource==="flag"?P.simId:Y()||P.simId,je=P.simIdSource==="flag"?"flag":q?"saved":"none",$=Q(P.wsPort,{commandTimeoutMs:P.commandTimeoutMs,simId:q,simIdSource:je}),c,ce=async()=>{if(!E)return!1;let u=await $.send({type:"evaluate",simId:c.simId,code:"window.location.href"});if(typeof u=="string"&&u.length>0){let d=new URL(u);d.searchParams.set("device",E),c.setSimRouteHint(d.toString())}return!!await $.send({type:"call",simId:c.simId,path:"SootSim.bridges.settings.set",args:["deviceModel",E]})};c=new W($,{screenshotDir:s,flowDir:y.dirname(y.resolve(e)),screenshotPathMode:l,screenshotLayers:a,simId:q,recordingOutputDir:T?n:void 0,billingOriginOverride:v?U:void 0,allowGitHubRecording:T,onAfterLaunch:async()=>{await ce()&&await c.waitForTree(12e4),v&&await $.send({type:"evaluate",simId:c.simId,code:`(() => {
|
|
361
361
|
const r = window.SootSim?.bridges?.eventRecorder ?? window.__sootsimEventRecorder
|
|
362
362
|
return r?.start?.() ?? false
|
|
363
363
|
})()`})}}),p&&(c.stepDelay=p);let I=null,S=null,_=null,z=null,O=0,de=!!M[0]?.launchApp;try{await c.waitForTree(12e4),await ce()&&await c.waitForTree(12e4),v&&!de&&!process.env.SOOTSIM_PREVIEW_RESET_DONE&&await c.launchApp({clearState:!0}),T&&(de?c.prepareRecording():await c.startRecording()),i&&await c.startProfile(),v&&(await $.send({type:"evaluate",simId:c.simId,code:`(() => {
|
|
@@ -370,7 +370,7 @@ flow extension:
|
|
|
370
370
|
+ completed (${M.length} steps)`),d>0&&console.log(` screenshots: ${d} \u2192 ${s}`),I&&Ce(I),S&&console.log(` video: ${S}`),console.log()}catch(u){if(i&&!I)try{I=await c.stopProfile()}catch{}if(T&&!S)try{S=await c.stopRecording(),_=c.getLastRecordingDurationMs()}catch(d){console.warn(` recording stop failed: ${d?.message||String(d)}`)}console.error(`
|
|
371
371
|
x failed: ${u.message}
|
|
372
372
|
`),I&&(console.log(" partial profile:"),Ce(I)),S&&console.log(` partial video: ${S}`);try{let d=c.lastFailedStep,h=d?`step-${String(d.index+1).padStart(2,"0")}-${d.kind}`:"unstaged",R=y.join(s,h);await c.captureFailureBundle(R,{error:u,stepIndex:d?.index,stepKind:d?.kind,stepTarget:d?.target}),console.log(` failure bundle: ${R}`),console.log(" (contents: screenshot.png, describe.json, a11y.txt, tree.txt, console.json, error.json)")}catch(d){try{let h=y.join(s,"error.png");await c.captureFailureScreenshot(h),console.log(` error screenshot: ${h}`)}catch{}console.log(` (failure bundle capture failed: ${d instanceof Error?d.message:String(d)})`)}await we($,{errorsCommand:`sootsim get errors 5${c.simId?` --sim ${c.simId}`:""}`,warningsCommand:`sootsim get warnings 5${c.simId?` --sim ${c.simId}`:""}`,requestsCommand:`sootsim get requests 5${c.simId?` --sim ${c.simId}`:""}`}),O=1}finally{$.close()}if(O===0&&v)try{let u=await Qe(z??[]),d=["--origin",U,"--events",u];oe&&d.push("--public-origin",oe),S&&d.push("--video",S),S&&_&&Number.isFinite(_)&&d.push("--video-duration-ms",String(Math.round(_))),c.simId&&d.push("--sim",c.simId),Re&&d.push("--open"),console.log(`
|
|
373
|
-
preparing preview upload\u2026`);let{runUpload:h}=await import("./upload-
|
|
373
|
+
preparing preview upload\u2026`);let{runUpload:h}=await import("./upload-ZKE2F7SV.js");await h(d,{})}catch(u){console.error(` preview upload failed: ${u?.message||u}`),O=1}return J&&(c.simId&&H.add(c.simId),await Xe(b.wsPort,b.commandTimeoutMs,[...H])),await G(),O}async function Xe(o,e,t){let i=[...new Set(t.filter(Boolean))];if(i.length===0)return;let r=Q(o,{commandTimeoutMs:e});try{let n=await r.listSims(),s=i.filter(a=>n.some(m=>m.id===a&&m.readyState==="open"));if(s.length===0)return;let l=await ke(r,o,e,s);await Fe(n,s),l.closed.length>0&&console.log(` closed flow sim(s): ${l.closed.join(", ")}`),l.remaining.length>0&&console.warn(` warn: flow sim(s) still connected after close: ${l.remaining.join(", ")}`)}catch(n){console.warn(` warn: failed to close flow sim(s): ${n instanceof Error?n.message:String(n)}`)}finally{r.close()}}async function Qe(o){let{gzipSync:e}=await import("zlib"),t=o.map(n=>JSON.stringify(n)).join(`
|
|
374
374
|
`)+(o.length?`
|
|
375
375
|
`:""),i=e(Buffer.from(t,"utf8")),r=y.join(De(),`sootsim-events-${Date.now()}.jsonl.gz`);return A.writeFileSync(r,i),console.log(` events: ${o.length} written to ${r} (${i.length} bytes gz)`),r}async function Ze(o){let e=o[0],t=i=>o.find((r,n)=>o[n-1]===i);switch(e){case"start":{let{path:i,state:r}=ye();console.log(" flow draft started"),console.log(` session: ${i}`),console.log(` steps: ${r.steps.length}`);return}case"keep":case"good":{let i=ie();if(i.active||(console.error(" no active flow draft \u2014 run `sootsim flow start` first"),process.exit(1)),!i.kept){console.log(" no pending action to keep");return}console.log(` kept: ${i.candidate.summary}`),console.log(` steps: ${i.stepCount}`);return}case"end":{let i=t("--output")||(o[1]&&!o[1].startsWith("-")?o[1]:void 0),r=o.includes("--validate")||o.includes("--video"),n=o.includes("--video"),s=ie();s.active&&s.kept&&console.log(` auto-kept trailing action: ${s.candidate.summary}`);let l=be(i||(r?tt():void 0));if(l.active||(console.error(" no active flow draft \u2014 run `sootsim flow start` first"),process.exit(1)),!l.valid){console.error(" flow draft is not valid:");for(let a of l.issues)console.error(` - ${a}`);console.error(" draft preserved \u2014 keep at least one real interaction or run `sootsim flow start` to reset"),process.exit(1)}if(r){let a=it(o,l.outputPath),m=await Oe(a);if(m!==0){console.error(`
|
|
376
376
|
validation failed \u2014 draft preserved so you can keep iterating`),process.exitCode=m;return}te(),console.log(` flow draft validated (${l.stepCount} step${l.stepCount===1?"":"s"})`),l.outputPath&&console.log(` saved: ${l.outputPath}`),n&&console.log(" video: recorded during validation run");return}if(te(),console.log(` flow draft ended (${l.stepCount} step${l.stepCount===1?"":"s"})`),l.outputPath){console.log(` saved: ${l.outputPath}`),console.log(` next: sootsim flow ${l.outputPath} --record`);return}console.log(""),process.stdout.write(l.yaml);return}case"validate":{let i=o[1];(!i||i.startsWith("-"))&&(console.error(" usage: sootsim flow validate <path>"),process.exit(1));let r=ee(i);if(r.length>0){console.error(` x ${i} failed validation:`);for(let n of r)console.error(` - ${n}`);process.exit(1)}console.log(` + ${i} looks valid`);return}}}function et(o){return o[0]==="--sim"&&o.length>=2?[...o.slice(2),"--sim",o[1]]:o}async function Ft(o){let e=et(o),t=e[0];if(t==="start"||t==="keep"||t==="good"||t==="end"||t==="validate")return await Ze(e),0;let i=await Oe(e);return i!==0&&(process.exitCode=i),i}function Ce(o){let e=o.avgMs>0?(1e3/o.avgMs).toFixed(1):"?",t=o.sampleCount>0?(o.jankFrames/o.sampleCount*100).toFixed(1):"0";console.log(`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{a as l}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{a as l}from"./chunk-YII7ZDGB.js";import{E as c,F as m,g as p,i as h,z as w}from"./chunk-VLX4A5H7.js";import{closeSync as v,existsSync as f,openSync as P,readSync as S,statSync as g}from"fs";import{homedir as k}from"os";import{resolve as T}from"path";import{WebSocket as D}from"ws";var E=6e4;async function L(){let t=w();if(t&&f(h(t)))return;console.log(" first run \u2014 installing sootsim engine runtime (~6 MB)...");let{runRuntime:e}=await import("./runtime-N7O7ZZW3.js");await e(["install"],{})}function I(t,e){return x(t)??e??l()}async function $(t=l(),e=E){if(await u(t,250)||await u(t,1500))return;let n=c();if(n&&m(n)){if(n.bootstrapping===!0&&(await b(e),await u(n.bridgePort,500)))return;throw new Error(`sootsim daemon lockfile is fresh (port ${n.bridgePort}) but the bridge is not reachable. run \`sootsim daemon restart\` or \`sootsim daemon uninstall\`.`)}if(p())throw new Error(`sootsim bridge daemon is not running on port ${t}.
|
|
3
3
|
dev checkouts skip the auto-install of the persistent launchd / systemd
|
|
4
4
|
agent. start the daemon manually in another shell with:
|
|
5
5
|
bun sootsim server
|
|
6
|
-
(set SOOTSIM_FORCE_DAEMON_INSTALL=1 to allow auto-install from this repo.)`);console.log(" registering sootsim bridge daemon...");let{daemonInstall:o}=await import("./daemon-
|
|
6
|
+
(set SOOTSIM_FORCE_DAEMON_INSTALL=1 to allow auto-install from this repo.)`);console.log(" registering sootsim bridge daemon...");let{daemonInstall:o}=await import("./daemon-EAT4F6GF.js");try{await o({port:t,force:!0})}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${s}
|
|
7
7
|
if this keeps failing, run \`sootsim daemon uninstall\` and retry, or run \`sootsim server\` in a persistent shell as a workaround.`)}console.log(" waiting for runtime to come online...");let i=process.platform==="darwin"?B():null;try{await b(e);let r=Date.now()+5e3;for(;Date.now()<r;){if(await u(t,500))return;await new Promise(s=>setTimeout(s,200))}throw new Error(`daemon registered but the bridge never bound on port ${t} \u2014 see ${d()} (mac) or \`journalctl --user -u sootsim-server\` (linux).`)}finally{i?.stop()}}async function C(t=l()){await L(),await $(t)}function x(t){for(let e=0;e<t.length;e++){let n=t[e];if((n==="--port"||n==="-p")&&t[e+1]){let o=Number(t[e+1]);return Number.isFinite(o)?o:void 0}if(n.startsWith("--port=")){let o=Number(n.slice(7));return Number.isFinite(o)?o:void 0}}}function u(t,e){return new Promise(n=>{let o=new D(`ws://127.0.0.1:${t}`,{handshakeTimeout:e}),i=!1,r=s=>{if(!i){i=!0;try{o.close()}catch{}n(s)}};o.once("open",()=>r(!0)),o.once("error",()=>r(!1)),setTimeout(()=>r(!1),e)})}async function b(t){let e=Date.now()+t,n;for(;Date.now()<e;){let o=c();if(o&&m(o)){if(o.bootstrapping!==!0)return;o.bootstrapping!==n&&(n=o.bootstrapping)}await new Promise(i=>setTimeout(i,250))}throw new Error(`daemon did not finish bootstrapping within ${Math.round(t/1e3)}s \u2014 check ${d()} (mac) or \`journalctl --user -u sootsim-server\` (linux).`)}function d(){return T(k(),"Library/Logs/sootsim/server.err.log")}function B(){let t=d(),e=0;try{f(t)&&(e=g(t).size)}catch{}let n=!1,o=()=>{if(!n){try{if(f(t)){let i=g(t).size;if(i>e){let r=Buffer.alloc(i-e),s=P(t,"r");try{S(s,r,0,r.length,e)}finally{v(s)}e=i;for(let y of r.toString("utf8").split(/\r?\n/)){let a=y.trim();a&&(a.startsWith("sootsim:")||a.startsWith("sootsim "))&&console.log(` ${a}`)}}else i<e&&(e=i)}}catch{}setTimeout(o,250)}};return o(),{stop:()=>{n=!0}}}export{L as a,I as b,$ as c,C as d};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{a as _,b as z,c as le,e as ce}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{a as _,b as z,c as le,e as ce}from"./chunk-JDKTIGQG.js";import{l as O}from"./chunk-CAJ6QHMM.js";import{j as se,k as ie,m as ae}from"./chunk-QOTYEI7J.js";import{b as re,c as I,d as S,e as x}from"./chunk-YII7ZDGB.js";import{c as k,d as w,e as P}from"./chunk-WV4XAMMB.js";import{g as W}from"./chunk-RKII4C6H.js";import{a as C,b as j}from"./chunk-ZJ7REGNA.js";import{c as de}from"./chunk-7GIE3OPK.js";import{d as ne}from"./chunk-UOADFPJR.js";import{a as oe}from"./chunk-ACDG2MSQ.js";import{E as ee,F as te}from"./chunk-VLX4A5H7.js";import ve from"node:fs";import Re from"node:os";import G from"node:path";function Pe(t){return t.replace(/^\[|\]$/g,"").toLowerCase()}function q(t){let o=Pe(t);return o==="localhost"||o.endsWith(".localhost")||o==="0.0.0.0"||o==="::1"||/^127(?:\.\d{1,3}){3}$/.test(o)}function me(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 Ce(t,o){return t?.includes("/one/metro-entry.bundle")?"one":typeof o=="string"&&o?"expo":"unknown"}function fe(t,o,e){return`${t}//${o}:${e}`}function Be(t){if(typeof window>"u")return!1;try{let o=new URL(t);return q(o.hostname)&&q(window.location.hostname)&&o.origin!==window.location.origin}catch{return!1}}async function ue(t,o){let e={...o,cache:o?.cache??"no-store"};return Be(t)?fetch(`/__fetch-proxy?url=${encodeURIComponent(t)}`,e):fetch(t,e)}function Te(t){return t==="https:"?443:80}function Me(t){let o=t.pathname||"/";return(o==="/"||o==="")&&!t.search&&!t.hash}async function ge(t,o){let e=t.replace(/\/+$/,"");try{let n=await ue(`${e}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),s=r?.extra?.expoClient||r?.extra||{},a=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(a||s.name)return{bundleUrl:le(a||`${e}${z}`),port:o,framework:Ce(a,s.sdkVersion),projectName:s.name}}}catch{}try{let n=await ue(`${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 pe(t){return ge(fe("http:","localhost",t),t)}async function he(t){let o=t.trim();if(/^\d+$/.test(o)){let i=parseInt(o,10),l=await pe(i);if(l)return l;let c=3;for(let d=1;d<=c;d++){let m=await pe(i+d);if(m)return m}throw me(`localhost:${i} (also scanned +1..+${c})`)}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:",s=n.port?parseInt(n.port,10):Te(r),a=fe(r,n.hostname,s);if(Me(n)){let i=await ge(a,s);if(i)return i;throw me(a)}return{bundleUrl:n.toString(),port:s,framework:"unknown"}}function nt(){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 we(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 Ue(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 rt(t,o,e){let n=[];try{n=await t.listSims()}catch{}if(console.error(""),n.length===0){Ue(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 s=[r.isPrimary?"primary":null,r.readyState,r.userVisible===!1?"hidden":r.userVisible===!0?"visible":null,r.userFocused?"focused":null].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 Ee={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 v(t){return new Promise(o=>setTimeout(o,t))}function A(t){return t.trim()}function J(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 It(t){let o=A(t);return(await $e(o)).bundleUrl}function Oe(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 $e(t){let o=A(t),e=/^\d+$/.test(o)?Number(o):Oe(o);if(e&&e>0){let n=await ce(e);if(n)return{bundleUrl:n.bundleUrl,port:n.port,framework:n.framework,projectName:n.projectName}}return he(o)}function Q(t){let o=t.replace(/\/+$/,"")||"/";return o==="/__soot"||o.startsWith("/__soot/")?"/__soot":""}function _e(t,o){let e=A(t),n=new URL(o),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(e)?n.pathname=`${r}/rn/${e}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",e)),n.toString()}function Le(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 De(t,o){let e=await $e(t),n=new URL(o),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",e.bundleUrl),n.toString()}function Ae(t){return t.startsWith("~/")?G.join(Re.homedir(),t.slice(2)):G.isAbsolute(t)?t:G.resolve(process.cwd(),t)}function Ne(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 s=n.slice(0,r).trim(),a=Ae(n.slice(r+1).trim());ve.existsSync(a)||(console.error(` sootsim open: replacement file not found: ${a}`),process.exit(1)),o[s]={file:a},e++}return Object.keys(o).length>0?{modules:o}:void 0}function Ie(){let t=ee();return te(t)&&t.runtimePort>0?`http://localhost:${t.runtimePort}/`:oe}async function D(t,o=Ie()){if(!t)return new URL(o).toString();if(J(t))return new URL(t).toString();let e=Ee[t.toLowerCase()];if(e){let n=new URL(o),r=Q(n.pathname);return n.pathname=`${r}${e}`,n.toString()}return Le(t)?De(t,o):_e(t,o)}function be(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 Fe(t,o,e){let n=new URL(await D(t,o));return n.searchParams.set("inspectOpen",e),n.toString()}async function He(t,o,e,n={}){let r=n.attempts??30,s=n.intervalMs??500,a=n.minNodeCount??10;for(let i=0;i<r;i++){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>a)return{bridge:l,count:c}}catch{}l.close(),await v(s)}return null}function Ke(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 ze(t,o){if(t.length===0){console.log(" no sims connected");return}console.log(` connected sims (${t.length}):
|
|
3
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.userVisible===!1?"hidden":e.userVisible===!0?"visible":"",e.attachedCliCount&&e.attachedCliCount>0?"in use":"",e.userFocused?"focused":"",n].filter(Boolean);console.log(` ${e.id}${r.length?` [${r.join(", ")}]`:""}`);let s=Ke(e.url);if(s)console.log(` loaded: ${s}`);else if(e.url){let a=e.url.length>96?`${e.url.slice(0,93)}\u2026`:e.url;console.log(` url: ${a}`)}else e.origin&&console.log(` origin: ${e.origin}`);e.title&&console.log(` title: ${e.title}`),e.visibilityState&&e.visibilityState!=="visible"&&console.log(` visibility: ${e.visibilityState}`),console.log(` connected: ${ye(Date.now()-e.connectedAt)}`),e.lastActiveAt&&e.lastActiveAt>0&&console.log(` last active: ${ye(Date.now()-e.lastActiveAt)}`)}}function ye(t){let o=Math.max(0,Math.round(t/1e3));return o<60?`${o}s ago`:o<3600?`${Math.round(o/60)}m ago`:o<86400?`${Math.round(o/3600)}h ago`:`${Math.round(o/86400)}d ago`}async function L(t,o,e,n={}){let r=n.attempts??30,s=n.intervalMs??500;for(let a=0;a<r;a++){let i=S(t,{commandTimeoutMs:o});try{let c=(await i.listSims()).find(e);if(c)return c}catch{}finally{i.close()}await v(s)}return null}async function je(t,o,e,n={}){let r=n.attempts??20,s=n.intervalMs??250;for(let a=0;a<r;a++){let i=S(t,{commandTimeoutMs:o});try{let c=(await i.listSims()).find(d=>d.id===e);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{i.close()}await v(s)}return!1}function We(t){let o=t.meta;if(!o||o.sootsimHostDriver!=="playwright")return null;let e=Number(o.sootsimHostPid);return!Number.isInteger(e)||e<=1||e===process.pid?null:e}function qe(t){if(!t.connectAckFile)return!1;try{return ve.writeFileSync(t.connectAckFile,`${JSON.stringify({connectedAt:Date.now(),pid:t.pid??null})}
|
|
4
4
|
`,{flag:"w"}),!0}catch{return!1}}function Se(t){try{return process.kill(t,0),!0}catch(o){return o?.code==="EPERM"}}async function Ge(t,o=2500){let e=Date.now()+o;for(;Date.now()<e;){if(!Se(t))return!0;await v(100)}return!Se(t)}async function V(t,o){let e=new Set(o),n=new Set;for(let r of t){if(!e.has(r.id))continue;let s=We(r);s&&n.add(s)}for(let r of n){try{process.kill(r,"SIGTERM")}catch{}if(await Ge(r)){console.log(` closed playwright host process ${r}`);continue}try{process.kill(r,"SIGKILL"),console.log(` force-closed playwright host process ${r}`)}catch{}}}function N(t,o){if(o){let r=o.trim(),s=t.find(a=>a.id===r);if(!s)throw new Error(`no sim connected with id ${r}`);return s}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 T(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 Ve(t,o,{stableMs:150,maxMs:400});let r=S(t,{commandTimeoutMs:3e3,simId:o,cliLabel:"open --describe",simIdSource:"flag"});try{let s=null;try{s=await r.send({type:"evaluate",code:se})}catch{}if(s&&!(s.flag===!0&&!s.loadingText&&s.nodes>=ie&&ae(s))){let d=s.loadingText?`still showing "${s.loadingText}"`:s.flag!==!0?"guest ready event has not fired":s.targets<=0?"no visible app content is inspectable yet":"app tree is still stabilizing";console.log(` app still loading: ${d} (nodes: ${s.nodes}, targets: ${s.targets})`),console.log(" before interacting, run: sootsim wait ready --max-ms 120000")}let i=`(async () => {
|
|
5
5
|
const t = window.__sootsimTest
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
function k(e,t){let n=["--max-ms","--maxMs","--maxms","--max_ms"];for(let r of n){let s=e.indexOf(r);if(s>=0&&e[s+1]){let a=Number(e[s+1]);if(Number.isFinite(a))return Math.max(100,a)}}return t}async function E(e){let t=await e.send({type:"evaluate",code:"(async () => await window.__sootsimTest.getNodeCount())()"});return{nodes:typeof t=="number"?t:0}}async function P(e,t=5){let n=await e.send({type:"evaluate",code:`(async () => await window.__sootsimTest.dumpTree(${t}))()`});return{depth:t,tree:n}}async function A(e){let t=await e.send({type:"evaluate",code:"window.location.href"});return{url:typeof t=="string"?t:""}}async function L(e,t){let n=`(async () => {
|
|
3
3
|
const t = window.__sootsimTest
|
|
4
4
|
const mainShell = window.SootSim?.bridges?.mainShell
|
|
@@ -276,20 +276,32 @@ ${y}
|
|
|
276
276
|
externalStatus,
|
|
277
277
|
externalError,
|
|
278
278
|
}
|
|
279
|
-
})()`,h=50,x=100,S=750,T=2e3;function
|
|
279
|
+
})()`,h=50,x=100,S=750,T=2e3;function I(e){return e.targets>0||e.nodes>=x}function C(e){return e.externalError?`guest app errored: ${e.externalError}`:e.loadingText?`still showing "${e.loadingText}"`:e.externalReady===!1?"guest app is still loading":e.flag!==!0?"guest app has not emitted sootsim:externalAppReady":e.targets<=0?"ready flag emitted but no visible app content is inspectable yet":"node tree is still changing"}async function M(e,t=2e4,n={}){let r=Date.now(),s=r+t,a=n.progressIntervalMs??T,l=r+a,u=-1,c=r,o={flag:void 0,at:0,nodes:0,targets:0,errors:0,loadingText:"",externalReady:null,externalStatus:"",externalError:""};for(;Date.now()<s;){try{o=await e.send({type:"evaluate",code:w})??o}catch{}let i=Date.now(),d={ready:!1,elapsedMs:i-r,nodes:o.nodes,targets:o.targets,flag:o.flag,loadingText:o.loadingText,externalReady:o.externalReady,externalStatus:o.externalStatus,externalError:o.externalError,errors:o.errors};if(o.nodes!==u&&(u=o.nodes,c=i),o.flag===!0&&o.externalReady!==!1&&!o.externalError&&!o.loadingText&&o.nodes>=h&&I(o)&&i-c>=S)return{...d,ready:!0};if(n.onProgress&&a>0&&i>=l){n.onProgress(d);do l+=a;while(i>=l)}await new Promise(b=>setTimeout(b,150))}return{ready:!1,elapsedMs:Date.now()-r,nodes:o.nodes,targets:o.targets,flag:o.flag,loadingText:o.loadingText,externalReady:o.externalReady,externalStatus:o.externalStatus,externalError:o.externalError,errors:o.errors}}async function $(e,t,n=5e3,r={}){let s=r.gone===!0;return await e.send({type:"evaluate",code:`(async () => {
|
|
280
280
|
const start = Date.now()
|
|
281
281
|
const deadline = start + ${n}
|
|
282
|
-
const
|
|
282
|
+
const gone = ${s}
|
|
283
|
+
const ID = ${JSON.stringify(t)}
|
|
284
|
+
const present = (node) => !!(node && node.layout && node.layout.width > 0 && node.layout.height > 0)
|
|
283
285
|
const find = async () => {
|
|
286
|
+
const t = window.__sootsimTest
|
|
287
|
+
if (!t) return undefined // bridge not ready \u2014 indeterminate, not "gone"
|
|
284
288
|
try {
|
|
285
|
-
return (await t
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
+
return (await t.findByTestId?.(ID)) || (await t.findById?.(ID)) || null
|
|
290
|
+
} catch {
|
|
291
|
+
return undefined
|
|
292
|
+
}
|
|
289
293
|
}
|
|
294
|
+
let goneStreak = 0
|
|
290
295
|
while (Date.now() < deadline) {
|
|
291
296
|
const node = await find()
|
|
292
|
-
if (
|
|
297
|
+
if (gone) {
|
|
298
|
+
if (node === null) {
|
|
299
|
+
goneStreak += 1
|
|
300
|
+
if (goneStreak >= 2) return { found: true, elapsed: Date.now() - start }
|
|
301
|
+
} else {
|
|
302
|
+
goneStreak = 0
|
|
303
|
+
}
|
|
304
|
+
} else if (present(node)) {
|
|
293
305
|
return { found: true, node, elapsed: Date.now() - start }
|
|
294
306
|
}
|
|
295
307
|
await new Promise((r) => setTimeout(r, 80))
|
|
@@ -299,7 +311,7 @@ ${y}
|
|
|
299
311
|
const obs = window.__sootsimObservability;
|
|
300
312
|
if (!obs) return { ok: false };
|
|
301
313
|
return { ok: true, entries: obs.logs.getSnapshot() };
|
|
302
|
-
})()`});if(!t||!t.ok)throw new Error("observability bridge not installed \u2014 is the engine running?");return t.entries??[]}async function V(e){await e.send({type:"evaluate",code:'window.__sootsimObservability?.logs.clear(); "cleared"'})}function
|
|
314
|
+
})()`});if(!t||!t.ok)throw new Error("observability bridge not installed \u2014 is the engine running?");return t.entries??[]}async function V(e){await e.send({type:"evaluate",code:'window.__sootsimObservability?.logs.clear(); "cleared"'})}function v(e,t){if(e.source===t.source||e.level!==t.level||Math.abs(e.ts-t.ts)>1e3||e.args.length!==t.args.length)return!1;let n=new Set([e.source,t.source]);return!n.has("sootsim-worker")||!n.has("render-worker")&&!n.has("forwarded-render-worker")?!1:e.args.every((r,s)=>r===t.args[s])}function j(e,t={}){let n=[];for(let r of e)n.some(s=>v(s,r))||n.push(r);if(t.showInternal||(n=n.filter(r=>{let s=r.args[0];return!(typeof s=="string"&&s.startsWith("[sootsim]"))})),t.level&&(n=n.filter(r=>t.level.has(r.level))),t.filter){let r=t.filter.toLowerCase();n=n.filter(s=>s.args.join(" ").toLowerCase().includes(r))}return n}async function Q(e,t){return await e.send({type:"call",path:"SootSim.bridges.timeline.summary",args:[t]})}async function Y(e,t){return await e.send({type:"call",path:"SootSim.bridges.timeline.recent",args:[t]})}async function q(e,t,n){await e.send({type:"call",path:"SootSim.bridges.timeline.cursorAdvance",args:[t,n]})}async function G(e){return await e.send({type:"evaluate",code:`(() => {
|
|
303
315
|
const kb = window.__sootsimKeyboard
|
|
304
316
|
if (!kb || typeof kb.getLayout !== 'function') {
|
|
305
317
|
return { error: 'keyboard bridge getLayout() not available' }
|
|
@@ -344,4 +356,4 @@ ${y}
|
|
|
344
356
|
workerHeap: stats?.memory?.workerHeap ?? null,
|
|
345
357
|
hostHeap: hostMem,
|
|
346
358
|
}
|
|
347
|
-
})()`})??{imageLoader:null,workerHeap:null,hostHeap:null}}function se(e){if(e.total===0)return"nothing recorded";let t=[],n=["error","warning","console","fetch","toast","alert","actionsheet","picker","notification","screen","route","keyboard","app-launch","shell","scroll","gesture","text-input","react-commit","animation","reanimated"],r=new Set;for(let s of n){let a=e.byKind[s];a&&(t.push(`${a} ${s}${a===1?"":"s"}`),r.add(s))}for(let[s,a]of Object.entries(e.byKind))!r.has(s)&&a&&t.push(`${a} ${s}${a===1?"":"s"}`);return t.join(" \xB7 ")}export{k as a,E as b,P as c,A as d,L as e,D as f,N as g,H as h,B as i,w as j,h as k,S as l,
|
|
359
|
+
})()`})??{imageLoader:null,workerHeap:null,hostHeap:null}}function se(e){if(e.total===0)return"nothing recorded";let t=[],n=["error","warning","console","fetch","toast","alert","actionsheet","picker","notification","screen","route","keyboard","app-launch","shell","scroll","gesture","text-input","react-commit","animation","reanimated"],r=new Set;for(let s of n){let a=e.byKind[s];a&&(t.push(`${a} ${s}${a===1?"":"s"}`),r.add(s))}for(let[s,a]of Object.entries(e.byKind))!r.has(s)&&a&&t.push(`${a} ${s}${a===1?"":"s"}`);return t.join(" \xB7 ")}export{k as a,E as b,P as c,A as d,L as e,D as f,N as g,H as h,B as i,w as j,h as k,S as l,I as m,C as n,M as o,$ as p,O as q,W as r,F as s,z as t,K as u,J as v,V as w,j as x,Q as y,Y as z,q as A,G as B,_ as C,R as D,U as E,X as F,Z as G,ee as H,te as I,ne as J,re as K,se as L};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
function t(_){return`(async () => {
|
|
3
3
|
const __t = window.__sootsimTest
|
|
4
4
|
if (!__t) throw new Error('__sootsimTest not available')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! sootsim v0.1.88 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|