sootsim 0.1.200 → 0.1.202
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 +5 -4
- package/dist-cli/chunks/{agent-RJBLYNGF.js → agent-SP6EE5XV.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-E6WLI6L3.js → agent-wrapper-PWZVJ3OK.js} +2 -2
- package/dist-cli/chunks/{app-fonts-O3VYBYQW.js → app-fonts-EMJB6QLM.js} +2 -2
- package/dist-cli/chunks/{assert-VFBTT2JB.js → assert-H2B6TDXT.js} +2 -2
- package/dist-cli/chunks/{auth-DQ6AJU2X.js → auth-SOHXBYLQ.js} +2 -2
- package/dist-cli/chunks/beta-CCNQQ73A.js +2 -0
- package/dist-cli/chunks/{camera-C2OFA3JA.js → camera-ULLCBM5H.js} +2 -2
- package/dist-cli/chunks/{chunk-UGJFYNMX.js → chunk-2CID4LNK.js} +3 -3
- package/dist-cli/chunks/chunk-2V43M57C.js +2 -0
- package/dist-cli/chunks/{chunk-GKXPIE6X.js → chunk-3ZENZOIX.js} +2 -2
- package/dist-cli/chunks/{chunk-6RHOWIGL.js → chunk-4KT2BGQE.js} +1 -1
- package/dist-cli/chunks/{chunk-P4PCUR4Y.js → chunk-4KVSVFRF.js} +1 -1
- package/dist-cli/chunks/{chunk-VACKEJ3E.js → chunk-4NM6JBYH.js} +1 -1
- package/dist-cli/chunks/chunk-5J63S2NM.js +1 -0
- package/dist-cli/chunks/{chunk-7BS4AKZT.js → chunk-5SKKMM7E.js} +1 -1
- package/dist-cli/chunks/chunk-6FZ6SNVP.js +4 -0
- package/dist-cli/chunks/{chunk-3BEGOL5T.js → chunk-6QFVYLX6.js} +2 -2
- package/dist-cli/chunks/{chunk-IJ6DRL7N.js → chunk-AAQVPSIV.js} +2 -2
- package/dist-cli/chunks/{chunk-XF3JBBPU.js → chunk-B6JB4THC.js} +2 -2
- package/dist-cli/chunks/{chunk-JJOS6L5H.js → chunk-BZ7AW7ZB.js} +2 -2
- package/dist-cli/chunks/{chunk-OCA5CK4S.js → chunk-CB7LDZKJ.js} +3 -3
- package/dist-cli/chunks/{chunk-6JKBWHIO.js → chunk-CGJ2U6ST.js} +1 -1
- package/dist-cli/chunks/chunk-DKBKU55D.js +2 -0
- package/dist-cli/chunks/{chunk-QSWT3OVG.js → chunk-DRJ4YWUG.js} +1 -1
- package/dist-cli/chunks/{chunk-XAIDHR55.js → chunk-EMOZJ773.js} +2 -2
- package/dist-cli/chunks/{chunk-KFGBNAV3.js → chunk-ENXHZGSL.js} +1 -1
- package/dist-cli/chunks/{chunk-I6DJFJQ6.js → chunk-F2LLN4U7.js} +2 -2
- package/dist-cli/chunks/{chunk-3PAUJH34.js → chunk-GUYKLSTX.js} +1 -1
- package/dist-cli/chunks/chunk-GZKT53SA.js +7 -0
- package/dist-cli/chunks/{chunk-DWFS6IIT.js → chunk-HZYHSLNH.js} +2 -2
- package/dist-cli/chunks/chunk-I6O7NBPZ.js +1 -0
- package/dist-cli/chunks/{chunk-U5O3F3NB.js → chunk-JP7J325R.js} +2 -2
- package/dist-cli/chunks/{chunk-5SB3N45C.js → chunk-K3UBHPVP.js} +1 -1
- package/dist-cli/chunks/{chunk-VFSOKG53.js → chunk-KRGHRSKY.js} +2 -2
- package/dist-cli/chunks/{chunk-VP4Y767U.js → chunk-KYGUR727.js} +2 -2
- package/dist-cli/chunks/{chunk-2E4DUZEV.js → chunk-LNDRRZP3.js} +2 -2
- package/dist-cli/chunks/{chunk-NEQRFWA3.js → chunk-OG6TFGYF.js} +2 -2
- package/dist-cli/chunks/{chunk-PJAKGC4A.js → chunk-PL4GXELT.js} +1 -1
- package/dist-cli/chunks/{chunk-MZLG4WVE.js → chunk-RJVIUQK4.js} +1 -1
- package/dist-cli/chunks/{chunk-4RUK2YSF.js → chunk-ROYBEBG2.js} +1 -1
- package/dist-cli/chunks/{chunk-42G5ZRQR.js → chunk-RS7QLHEH.js} +2 -2
- package/dist-cli/chunks/{chunk-LSDJTPOY.js → chunk-RWXCSRNE.js} +2 -2
- package/dist-cli/chunks/{chunk-NX4VSQD5.js → chunk-RZQO4Q7E.js} +1 -1
- package/dist-cli/chunks/{chunk-SFUQJU5Q.js → chunk-SQBX2HS7.js} +6 -6
- package/dist-cli/chunks/{chunk-NK4FF37S.js → chunk-TANTCV45.js} +2 -2
- package/dist-cli/chunks/chunk-W4Y3JJX6.js +29 -0
- package/dist-cli/chunks/chunk-WILIVPUU.js +567 -0
- package/dist-cli/chunks/{chunk-GMBG6JLV.js → chunk-WVDWIXPH.js} +2 -2
- package/dist-cli/chunks/{chunk-HGBMGQGP.js → chunk-Z5VMWFCY.js} +1 -1
- package/dist-cli/chunks/cli-version-Z4NGLJLH.js +2 -0
- package/dist-cli/chunks/{compat-L2E3OQW3.js → compat-YW3OJ7RX.js} +3 -3
- package/dist-cli/chunks/{config-K4IMJRHG.js → config-ZGOXFEX4.js} +2 -2
- package/dist-cli/chunks/{control-OXJ7S7UG.js → control-75JRFOYV.js} +2 -2
- package/dist-cli/chunks/daemon-SHFBQRHD.js +2 -0
- package/dist-cli/chunks/{debug-ZPKRTLGX.js → debug-4APEP64L.js} +3 -3
- package/dist-cli/chunks/{desktop-YA2UL7Q4.js → desktop-CS7S4CXK.js} +3 -3
- package/dist-cli/chunks/detox-7R7DOKQM.js +50 -0
- package/dist-cli/chunks/{device-M6YG7TKY.js → device-EIDKLBEK.js} +2 -2
- package/dist-cli/chunks/{diagnose-3OUFTELV.js → diagnose-J2F7MJAJ.js} +2 -2
- package/dist-cli/chunks/drivers-55L7BHDF.js +2 -0
- package/dist-cli/chunks/flow-AHWVTHJP.js +2 -0
- package/dist-cli/chunks/help-C4BTMPEE.js +2 -0
- package/dist-cli/chunks/home-paths-WVCREWI7.js +2 -0
- package/dist-cli/chunks/inspect-M4Z4SSSB.js +2 -0
- package/dist-cli/chunks/install-desktop-PVRUAEMA.js +2 -0
- package/dist-cli/chunks/{login-RNYBOMNF.js → login-EOBJ7CZ4.js} +4 -4
- package/dist-cli/chunks/{logout-XBW3BXL4.js → logout-RL7D66VQ.js} +2 -2
- package/dist-cli/chunks/maestro-F66ZIJKA.js +96 -0
- package/dist-cli/chunks/{mode-E353E6HN.js → mode-R2VIW66U.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-ILX5YV34.js +2 -0
- package/dist-cli/chunks/{perf-CIOBGFHU.js → perf-PGYO5BBR.js} +2 -2
- package/dist-cli/chunks/{record-I626AYJ5.js → record-IGDVHC67.js} +3 -3
- package/dist-cli/chunks/runtime-43RJGUGS.js +2 -0
- package/dist-cli/chunks/{screenshot-command-TTB5OOL2.js → screenshot-command-HX4GVUJM.js} +2 -2
- package/dist-cli/chunks/{serve-AEBEXTTW.js → serve-3TFVHYLY.js} +18 -18
- package/dist-cli/chunks/{setup-7QCI53ZK.js → setup-JSPPRVET.js} +3 -3
- package/dist-cli/chunks/{skills-7LHL5KHW.js → skills-LK3B76W7.js} +2 -2
- package/dist-cli/chunks/{storage-BVWLYY23.js → storage-NC5RNBUA.js} +2 -2
- package/dist-cli/chunks/store-3XMEKA6H.js +2 -0
- package/dist-cli/chunks/telemetry-CVJ5YZNS.js +2 -0
- package/dist-cli/chunks/test-2CXPLH5N.js +69 -0
- package/dist-cli/chunks/{timeline-BVR4E6PY.js → timeline-WDTEVELN.js} +2 -2
- package/dist-cli/chunks/upgrade-TT2IJSNJ.js +4 -0
- package/dist-cli/chunks/upload-4HMNB4HA.js +2 -0
- package/dist-cli/chunks/version-JUNH4FOR.js +4 -0
- package/dist-cli/chunks/{web-HYLNFAXS.js → web-BWCW26ZA.js} +2 -2
- package/dist-cli/chunks/{what-happened-YGRE2NFG.js → what-happened-L6EEB6MB.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.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 +32 -1
- package/dist-lib/host/bridge-host.cjs +51 -2
- 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/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +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/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +115 -36
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/src/home-paths.ts +48 -1
- package/src/host/bridge-host.ts +12 -0
- package/src/runtime-delivery.ts +59 -9
- package/src/screenshots/frame-compose.ts +21 -13
- package/dist-cli/chunks/beta-ZXPAAXGE.js +0 -2
- package/dist-cli/chunks/chunk-CB3I3VQT.js +0 -6
- package/dist-cli/chunks/chunk-EY2OMKPT.js +0 -1
- package/dist-cli/chunks/chunk-M3AUV33V.js +0 -4
- package/dist-cli/chunks/chunk-RJ6WD7XJ.js +0 -567
- package/dist-cli/chunks/chunk-TMXLUWD2.js +0 -27
- package/dist-cli/chunks/chunk-USDJA22M.js +0 -1
- package/dist-cli/chunks/chunk-VXBWUAYL.js +0 -2
- package/dist-cli/chunks/cli-version-E3OGD447.js +0 -2
- package/dist-cli/chunks/daemon-G5GBYBJ4.js +0 -2
- package/dist-cli/chunks/detox-LKEZBGH5.js +0 -49
- package/dist-cli/chunks/drivers-CTSUKCFK.js +0 -2
- package/dist-cli/chunks/flow-R5GJJLLW.js +0 -2
- package/dist-cli/chunks/help-CSSCFOBR.js +0 -2
- package/dist-cli/chunks/home-paths-4V6CGISP.js +0 -2
- package/dist-cli/chunks/inspect-NIBEAJND.js +0 -2
- package/dist-cli/chunks/install-desktop-7TYE6TTP.js +0 -2
- package/dist-cli/chunks/maestro-3EBOG357.js +0 -96
- package/dist-cli/chunks/optional-demo-registry-BEUP6OEZ.js +0 -2
- package/dist-cli/chunks/runtime-254BNZHB.js +0 -2
- package/dist-cli/chunks/store-6KAKNNCL.js +0 -2
- package/dist-cli/chunks/telemetry-EZ42CD35.js +0 -2
- package/dist-cli/chunks/test-BK4GZZR2.js +0 -69
- package/dist-cli/chunks/upgrade-AY5XC5QI.js +0 -4
- package/dist-cli/chunks/upload-HOF4XBAG.js +0 -2
- package/dist-cli/chunks/version-WQM34S4E.js +0 -4
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as p,b as $,c as w,e as y,f as R}from"./chunk-M3AUV33V.js";import{d}from"./chunk-VFSOKG53.js";import{D as m,E as a,F as h,G as f,l as v}from"./chunk-CB3I3VQT.js";import b from"fs";import{WebSocket as A}from"ws";async function P(n,e={}){let[o,...t]=n;if(!o||o==="--help"||o==="-h"){O();return}switch(o){case"install":return D(t,e);case"list":case"ls":return N(t);case"use":return T(t);case"remove":case"rm":return L(t);case"which":case"active":return _();case"notes":case"changelog":return C(t);default:console.error(` unknown runtime subcommand: ${o}`),O(),process.exit(1)}}function O(){console.log(`
|
|
3
|
-
sootsim runtime \u2014 manage engine runtimes under ~/.sootsim/runtimes/
|
|
4
|
-
|
|
5
|
-
usage:
|
|
6
|
-
sootsim runtime install [version] install a version (default: channel latest)
|
|
7
|
-
sootsim runtime list show installed + available versions
|
|
8
|
-
sootsim runtime use <version> switch active runtime
|
|
9
|
-
sootsim runtime remove <version> delete an installed runtime
|
|
10
|
-
sootsim runtime which print active runtime version
|
|
11
|
-
sootsim runtime notes print hosted release notes URL
|
|
12
|
-
|
|
13
|
-
flags:
|
|
14
|
-
--channel <name> channel to resolve 'latest' from (default: stable)
|
|
15
|
-
--force reinstall even if the version is already on disk
|
|
16
|
-
--set-active=false do not switch active runtime after install
|
|
17
|
-
|
|
18
|
-
environment:
|
|
19
|
-
SOOTSIM_CDN_ORIGIN override the CDN base URL (default: ${p})
|
|
20
|
-
|
|
21
|
-
examples:
|
|
22
|
-
sootsim runtime install
|
|
23
|
-
sootsim runtime install 1.2.3
|
|
24
|
-
sootsim runtime install --channel beta
|
|
25
|
-
sootsim runtime use 1.2.3
|
|
26
|
-
sootsim runtime notes
|
|
27
|
-
`)}async function D(n,e){let{version:o,flags:t}=E(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 R({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 I(i.version)}catch(i){console.error(` ${k(i)}`),process.exit(1)}}async function I(n){h(n),console.log(` active: ${n}`),await S(n)||console.log(` (no daemon running \u2014 next sootsim/electron launch will pick up ${n})`)}async function S(n){let{isDaemonLockfileFresh:e,readDaemonLockfile:o}=await import("./home-paths-4V6CGISP.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 A(`ws://127.0.0.1:${s}`,{handshakeTimeout:800}),g=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(g),u(i)}),r.on("error",()=>{clearTimeout(g),u(!1)})})}async function N(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 y();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: ${k(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 I(e)}async function L(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=v(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 _(){let n=a();if(!n){console.log(" no active runtime");return}console.log(n)}async function C(n){n.length>0&&(console.error(" usage: sootsim runtime notes"),process.exit(1));let e=a();e&&console.log(` active runtime: v${e}`),console.log(` release notes: ${$}`)}function E(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 k(n){return n instanceof Error?n.message:String(n)}export{P as a};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
var o={width:3,lock:{top:253,height:103},ringToggle:{top:152,height:32},volumeUp:{top:214,height:61},volumeDown:{top:290,height:61}},b={width:2.5,lock:{top:130,height:78},ringToggle:{top:94,height:22},volumeUp:{top:126,height:48},volumeDown:{top:188,height:48}},d={width:3,lock:{top:238,height:78},ringToggle:{top:-1e3,height:0},volumeUp:{top:336,height:62},volumeDown:{top:408,height:62}},g={width:3,lock:{top:248,height:72},ringToggle:{top:-1e3,height:0},volumeUp:{top:144,height:62},volumeDown:{top:216,height:62}},n=48;function t(e){return{...e,platform:"ios",navigationBarHeight:0,navigationBarMode:e.homeIndicatorHeight>0?"gesture":"none",displayCutout:{top:e.dynamicIsland?e.statusBarHeight:0,bottom:0,left:0,right:0},cameraCutout:null,osVersion:e.iosVersion,androidApiLevel:null,systemName:"iOS",manufacturer:"Apple",brand:"Apple",modelName:e.name}}var p={"canvas-workspace":t({name:"Canvas Workspace",width:1440,height:900,scale:1,statusBarHeight:0,homeIndicatorHeight:0,cornerRadius:0,dynamicIsland:null,safeAreaInsets:{top:0,bottom:0,left:0,right:0},iosVersion:"26.4",physicalPPI:110,hardwareButtons:o,experimental:!0}),"iphone-se":t({name:"iPhone SE",width:375,height:667,scale:2,statusBarHeight:20,homeIndicatorHeight:0,cornerRadius:0,dynamicIsland:null,safeAreaInsets:{top:20,bottom:0,left:0,right:0},iosVersion:"15.8",physicalPPI:326,hardwareButtons:b}),"iphone-14":t({name:"iPhone 14",width:390,height:844,scale:3,statusBarHeight:47,homeIndicatorHeight:34,cornerRadius:55,dynamicIsland:null,safeAreaInsets:{top:47,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15":t({name:"iPhone 15",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15-plus":t({name:"iPhone 15 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"17.6",physicalPPI:460,hardwareButtons:o}),"iphone-15-pro":t({name:"iPhone 15 Pro",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o}),"iphone-15-pro-max":t({name:"iPhone 15 Pro Max",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"18.2",physicalPPI:460,hardwareButtons:o}),"iphone-16":t({name:"iPhone 16",width:393,height:852,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-plus":t({name:"iPhone 16 Plus",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-pro":t({name:"iPhone 16 Pro",width:402,height:874,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-16-pro-max":t({name:"iPhone 16 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17":t({name:"iPhone 17",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:37.3},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-air":t({name:"iPhone 17 Air",width:430,height:932,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-pro":t({name:"iPhone 17 Pro",width:402,height:874,scale:3,statusBarHeight:59,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:59,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"iphone-17-pro-max":t({name:"iPhone 17 Pro Max",width:440,height:956,scale:3,statusBarHeight:62,homeIndicatorHeight:34,cornerRadius:58,dynamicIsland:{width:126,height:38},safeAreaInsets:{top:62,bottom:34,left:0,right:0},iosVersion:"26.4",physicalPPI:460,hardwareButtons:o}),"pixel-8":{platform:"android",name:"Pixel 8",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:n,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:n,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-8-three-button":{platform:"android",name:"Pixel 8 (3-button)",width:412,height:915,scale:2.625,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:48,navigationBarMode:"three-button",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:39,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:48,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 8",physicalPPI:428,hardwareButtons:d},"pixel-9-pro-xl":{platform:"android",name:"Pixel 9 Pro XL",width:448,height:997,scale:3,statusBarHeight:40,homeIndicatorHeight:0,navigationBarHeight:n,navigationBarMode:"gesture",displayCutout:{top:40,bottom:0,left:0,right:0},cornerRadius:41,dynamicIsland:null,cameraCutout:{diameter:24},safeAreaInsets:{top:40,bottom:n,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Google",brand:"google",modelName:"Pixel 9 Pro XL",physicalPPI:486,hardwareButtons:d},"galaxy-s24":{platform:"android",name:"Galaxy S24",width:360,height:780,scale:3,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:n,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:36,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:n,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S921B",physicalPPI:416,hardwareButtons:g},"galaxy-s24-ultra":{platform:"android",name:"Galaxy S24 Ultra",width:384,height:824,scale:3.75,statusBarHeight:36,homeIndicatorHeight:0,navigationBarHeight:n,navigationBarMode:"gesture",displayCutout:{top:36,bottom:0,left:0,right:0},cornerRadius:24,dynamicIsland:null,cameraCutout:{diameter:18},safeAreaInsets:{top:36,bottom:n,left:0,right:0},osVersion:"15",iosVersion:"",androidApiLevel:35,systemName:"Android",manufacturer:"Samsung",brand:"samsung",modelName:"SM-S928B",physicalPPI:505,hardwareButtons:g}},m="iphone-17-pro";function v(e){return p[e]}function u(){return Object.keys(p)}function P(){return u().filter(e=>!p[e].experimental)}var s={"iphone-6-9":{name:"iphone-6-9",label:'iPhone 6.7"',width:1284,height:2778,store:"apple"},"iphone-6-1":{name:"iphone-6-1",label:'iPhone 6.5"',width:1242,height:2688,store:"apple"},"android-phone":{name:"android-phone",label:"Google Play phone",width:1080,height:1920,store:"google"},"android-tablet-7":{name:"android-tablet-7",label:'Google Play 7" tablet',width:1200,height:1920,store:"google"},"android-tablet-10":{name:"android-tablet-10",label:'Google Play 10" tablet',width:1600,height:2560,store:"google"}},l={dark:{type:"gradient",direction:180,glow:"#4caeff",stops:[{offset:0,color:"#111827"},{offset:40,color:"#101725"},{offset:100,color:"#06080d"}]},cyan:{type:"gradient",direction:180,glow:"#25c3ec",stops:[{offset:0,color:"#1b465c"},{offset:32,color:"#122336"},{offset:100,color:"#05070b"}]},gold:{type:"gradient",direction:180,glow:"#ffc25a",stops:[{offset:0,color:"#3b2f1a"},{offset:34,color:"#18140d"},{offset:100,color:"#050505"}]},red:{type:"gradient",direction:180,glow:"#ff6178",stops:[{offset:0,color:"#3e1018"},{offset:35,color:"#17080c"},{offset:100,color:"#050405"}]}},B={color:"#25c3ec",blur:120,spread:52,opacity:.34},I="iphone-17-pro";var y=[{name:"white",value:"#ffffff"},{name:"gray-light",value:"#d1d5db"},{name:"gray",value:"#6b7280"},{name:"gray-dark",value:"#3b4350"},{name:"slate",value:"#2a3644"},{name:"black",value:"#000000"},{name:"cyan",value:"#25c3ec"},{name:"blue",value:"#3f7cff"},{name:"teal",value:"#1fc7b4"},{name:"green",value:"#42c95d"},{name:"lime",value:"#92d21b"},{name:"gold",value:"#f5c518"},{name:"orange",value:"#ff912e"},{name:"coral",value:"#ff6f5b"},{name:"red",value:"#ff4f6f"},{name:"berry",value:"#d054ff"},{name:"magenta",value:"#ff4eb8"}],f=Object.fromEntries(y.map(e=>[e.name,e.value]));function T(e){return f[e]??f.gray}function R(e){return Object.prototype.hasOwnProperty.call(s,e)?s[e]:null}function S(e){return{type:e.type,color:e.color,direction:e.direction,glow:e.glow,stops:e.stops?.map(r=>({...r}))}}function A(e){return Object.prototype.hasOwnProperty.call(l,e)?S(l[e]):null}var h={deviceModel:{type:"enum",default:m,description:"device model to simulate",cliFlag:"device",cliFlagShort:"d",options:u(),group:"device"},orientation:{type:"enum",default:"portrait",description:"screen orientation",cliFlag:"orientation",options:["portrait","landscape"],group:"device"},colorScheme:{type:"enum",default:"auto",description:"color scheme (auto follows system preference)",cliFlag:"theme",cliFlagShort:"t",options:["light","dark","auto"],group:"appearance"},reduceMotion:{type:"boolean",default:!1,description:"reduce motion",group:"appearance"},boldText:{type:"boolean",default:!1,description:"bold text",group:"appearance"},fontSize:{type:"number",default:1,description:"font size multiplier (1.0 = default)",group:"appearance",validate:e=>e>=.5&&e<=2},networkCondition:{type:"enum",default:"wifi",description:"simulated network condition",cliFlag:"network",options:["wifi","lte","fast-3g","slow-3g","offline"],group:"network"},language:{type:"string",default:"en",description:"language code (ISO 639-1)",cliFlag:"language",group:"locale"},region:{type:"string",default:"US",description:"region code (ISO 3166-1)",cliFlag:"region",group:"locale"},showTouches:{type:"boolean",default:!1,description:"show touch indicators",group:"simulator"},showFrame:{type:"boolean",default:!0,description:"show device frame",cliFlag:"frame",group:"simulator"},showTopBar:{type:"boolean",default:!0,description:"show simulator top bar",group:"simulator"},screenshotMode:{type:"boolean",default:!1,description:"show screenshot composition mode in the browser shell",group:"simulator"},threeMode:{type:"boolean",default:!1,description:"show the experimental 3d device stage in the browser shell",group:"simulator"},threeRecordingEditor:{type:"boolean",default:!1,description:"dock the 3d recording editor in the 3d stage (toggled from its rail)",group:"simulator"},screenshotCanvas:{type:"enum",default:"iphone-6-9",description:"target app-store canvas preset for screenshot mode",options:Object.keys(s),group:"simulator"},screenshotBackground:{type:"enum",default:"dark",description:"background preset rendered inside the screenshot canvas",options:Object.keys(l),group:"simulator"},screenshotText:{type:"enum",default:"bold-top",description:"text layout preset for the screenshot canvas",options:["bold-top","editorial-left","minimal-bottom","none"],group:"simulator"},screenshotPose:{type:"enum",default:"straight",description:"device pose preset inside the screenshot canvas",options:["straight","tilted-left","tilted-right","cut-bottom","cut-top"],group:"simulator"},screenshotDynamicSize:{type:"boolean",default:!1,description:"let the screenshot canvas rect fit available space (off = pin to exact preset pixels)",group:"simulator"},showStatusBar:{type:"boolean",default:!0,description:"show status bar",group:"simulator"},showHomeIndicator:{type:"boolean",default:!0,description:"show home indicator",group:"simulator"},alwaysShowLiveWebViews:{type:"boolean",default:!1,description:"always render WebViews as live browser views",group:"simulator"},a11yMode:{type:"enum",default:"delayed",description:"accessibility tree sync mode (off, delayed=100ms, active=30ms)",options:["off","delayed","active"],group:"simulator"},a11yDepth:{type:"enum",default:"deep",description:"accessibility tree structure depth (shallow or deep)",options:["shallow","deep"],group:"simulator"},inspectMode:{type:"boolean",default:!1,description:"inspect mode",group:"simulator"},errorReporting:{type:"boolean",default:!1,description:"send anonymous crash reports",group:"privacy"},agentProvider:{type:"enum",default:"codex",description:"ai agent used by the sootsim agent prompt bar",options:["codex","claude"],group:"agent"},onboardingComplete:{type:"boolean",default:!1,description:"first-run onboarding completed",group:"beta"},betaConsentVersion:{type:"number",default:0,description:"last accepted beta telemetry policy version",group:"beta"},detailedTelemetry:{type:"boolean",default:!0,description:"send detailed usage telemetry (sessions, perf samples)",group:"beta"}};function w(){if(typeof window>"u")return{};let e={};try{let r=new URLSearchParams(window.location.search),a=r.get("device");a&&h.deviceModel.options?.includes(a)&&(e.deviceModel=a);let c=r.get("colorScheme")??r.get("theme");c&&h.colorScheme.options?.includes(c)&&(e.colorScheme=c);let i=r.get("alwaysShowLiveWebViews");i==="1"||i==="true"?e.alwaysShowLiveWebViews=!0:(i==="0"||i==="false")&&(e.alwaysShowLiveWebViews=!1)}catch{}return e}function H(){let e={};for(let[r,a]of Object.entries(h))e[r]=a.default;return Object.assign(e,w()),e}export{B as a,I as b,T as c,R as d,S as e,A as f,p as g,v as h,P as i,h as j,w as k,H as l};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c,d,e}from"./chunk-GKXPIE6X.js";import"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-42G5ZRQR.js";import"./chunk-2E4DUZEV.js";import"./chunk-SFUQJU5Q.js";import"./chunk-I6DJFJQ6.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-5SB3N45C.js";import"./chunk-7BS4AKZT.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";export{c as daemonInstall,b as getDaemonServiceStatus,a as runDaemon,d as teardownDaemonService,e as teardownSootsimHome};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{d as S}from"./chunk-RJ6WD7XJ.js";import"./chunk-UGJFYNMX.js";import"./chunk-IJ6DRL7N.js";import"./chunk-3BEGOL5T.js";import"./chunk-JJOS6L5H.js";import"./chunk-NK4FF37S.js";import"./chunk-XF3JBBPU.js";import"./chunk-GMBG6JLV.js";import"./chunk-EY2OMKPT.js";import"./chunk-6JKBWHIO.js";import"./chunk-MZLG4WVE.js";import"./chunk-VACKEJ3E.js";import"./chunk-XAIDHR55.js";import"./chunk-4RUK2YSF.js";import"./chunk-VFSOKG53.js";import"./chunk-DWFS6IIT.js";import"./chunk-KFGBNAV3.js";import"./chunk-QSWT3OVG.js";import"./chunk-P4PCUR4Y.js";import"./chunk-NEQRFWA3.js";import"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-SFUQJU5Q.js";import"./chunk-I6DJFJQ6.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";import{spawn as D}from"child_process";import{existsSync as u,mkdirSync as _,writeFileSync as f,unlinkSync as I}from"fs";import{tmpdir as P}from"os";import{dirname as $,resolve as n,join as M}from"path";function E(){try{let e=import.meta.resolve("sootsim/detox");return $(e.startsWith("file://")?e.slice(7):e)}catch{return n(import.meta.dirname,"..","..","detox")}}var F=`
|
|
3
|
-
sootsim detox \u2014 run detox-style tests against a sootsim shell
|
|
4
|
-
|
|
5
|
-
usage:
|
|
6
|
-
sootsim detox [testFiles...] run all tests under e2e/, test/e2e/, or detox/
|
|
7
|
-
sootsim detox --config <path> use a specific jest config
|
|
8
|
-
sootsim detox init scaffold sootsim-detox.config.cjs + sample test
|
|
9
|
-
sootsim detox --watch jest watch mode
|
|
10
|
-
sootsim detox --headed keep the sootsim shell window visible
|
|
11
|
-
sootsim detox -t <pattern> pass a jest --testNamePattern
|
|
12
|
-
sootsim detox --no-launch skip auto-launching a sootsim shell
|
|
13
|
-
|
|
14
|
-
sootsim detox auto-launches a sootsim shell if none is running on the
|
|
15
|
-
expected port. disable with --no-launch if you're managing the shell yourself.
|
|
16
|
-
`;async function B(e,s={}){if((e.includes("--help")||e.includes("-h"))&&(console.log(F),process.exit(0)),e[0]==="init")return U();let c=t=>{let o=e.indexOf(t);return o>=0?e[o+1]:void 0},r=t=>e.includes(t),w=r("--watch"),h=r("--headed"),O=r("--no-launch"),y=c("--config"),d=s.port||Number(process.env.SOOTSIM_PORT)||5173,j=e.filter((t,o)=>{if(t.startsWith("--")||t==="-t"||t==="-h")return!1;let m=e[o-1];return!(m==="--config"||m==="-t"||m==="--testNamePattern"||m==="--grep")}),T=e.filter(t=>t==="--runInBand"||t.startsWith("--maxWorkers=")),x=["e2e","test/e2e","detox"],l=process.env.SOOTSIM_TEST_DIR?n(process.cwd(),process.env.SOOTSIM_TEST_DIR):null;if(!l)for(let t of x){let o=n(process.cwd(),t);if(u(o)){l=o;break}}l||(console.error(` error: no detox tests found. expected one of: ${x.join(", ")}
|
|
17
|
-
run 'sootsim detox init' to scaffold a starter suite.`),process.exit(1)),O||await k(d);let i=["jest"],p=y||R(["sootsim-detox.config.cjs","jest.config.cjs","jest.config.js"]),a=null;if(p)i.push("--config",n(process.cwd(),p));else{let t=n(E(),"jest-preset.cjs");a=M(P(),`sootsim-detox-${process.pid}.config.cjs`);let o={rootDir:l,roots:["<rootDir>"],testMatch:["<rootDir>/**/*.test.ts","<rootDir>/**/*.test.js"]};f(a,`module.exports = { ...require(${JSON.stringify(t)}), ...${JSON.stringify(o)} }
|
|
18
|
-
`),i.push("--config",a)}w&&i.push("--watch");let g=c("-t")||c("--testNamePattern")||c("--grep");g&&i.push("-t",g),process.env.SOOTSIM_JEST_JSON==="1"&&i.push("--json"),process.env.SOOTSIM_JEST_OUTPUT_FILE&&i.push("--outputFile",process.env.SOOTSIM_JEST_OUTPUT_FILE),i.push(...T),i.push(...j),console.log(" sootsim detox"),console.log(` test dir: ${l}`),console.log(` port: ${d}${h?" (headed)":""}`),p&&console.log(` config: ${p}`);let v=D("npx",i,{cwd:process.cwd(),stdio:"inherit",env:{...process.env,SOOTSIM_TEST_DIR:l,SOOTSIM_PORT:String(d),SOOTSIM_HEADED:h?"1":"",SOOTSIM_URL:process.env.SOOTSIM_URL||`http://localhost:${d}`}}),b=await new Promise(t=>v.on("exit",o=>t(o||0)));if(a)try{I(a)}catch{}process.exit(b)}function R(e){for(let s of e)if(u(n(process.cwd(),s)))return s;return null}async function k(e){await S()||console.warn(` warn: no sootsim shell reachable on :${e}. start one with \`bun run dev:sootsim:shell\`
|
|
19
|
-
or pass --no-launch if you're managing the shell yourself.`)}function U(){let e=process.cwd(),s=n(e,"sootsim-detox.config.cjs");u(s)?console.log(` skip: ${s} already exists`):(f(s,`// sootsim detox jest config.
|
|
20
|
-
// extends the sootsim preset, which rewrites \`import ... from 'detox'\`
|
|
21
|
-
// to the sootsim driver and keeps your jest transforms intact.
|
|
22
|
-
|
|
23
|
-
/** @type {import('@jest/types').Config.InitialOptions} */
|
|
24
|
-
module.exports = {
|
|
25
|
-
preset: 'sootsim/detox/jest-preset',
|
|
26
|
-
rootDir: __dirname,
|
|
27
|
-
testMatch: ['<rootDir>/e2e/**/*.test.ts', '<rootDir>/e2e/**/*.test.js'],
|
|
28
|
-
}
|
|
29
|
-
`),console.log(` created ${s}`));let c=n(e,"e2e"),r=n(c,"example.test.ts");u(r)?console.log(` skip: ${r} already exists`):(_(c,{recursive:!0}),f(r,`// sample sootsim detox test. resolve \`detox\` via the jest preset in
|
|
30
|
-
// sootsim-detox.config.cjs \u2014 no extra imports required.
|
|
31
|
-
|
|
32
|
-
import { by, device, element, expect, waitFor } from 'detox'
|
|
33
|
-
|
|
34
|
-
describe('example', () => {
|
|
35
|
-
beforeAll(async () => {
|
|
36
|
-
await device.launchApp()
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('shows the welcome text', async () => {
|
|
40
|
-
await waitFor(element(by.text('Welcome'))).toBeVisible().withTimeout(5000)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('taps a button by id', async () => {
|
|
44
|
-
await element(by.id('start-button')).tap()
|
|
45
|
-
await expect(element(by.id('home-screen'))).toBeVisible()
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
`),console.log(` created ${r}`)),console.log(`
|
|
49
|
-
next:`),console.log(" sootsim detox # run the sample"),console.log(" sootsim detox --watch"),process.exit(0)}export{B as runDetox};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import"./chunk-USDJA22M.js";import{f as a,g as b,h as c,i as d,j as e,k as f,l as g,m as h,n as i}from"./chunk-DWFS6IIT.js";import"./chunk-KFGBNAV3.js";import"./chunk-QSWT3OVG.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-6RHOWIGL.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.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{c,d,e,f,g}from"./chunk-RJ6WD7XJ.js";import{c as a,d as b}from"./chunk-UGJFYNMX.js";import"./chunk-IJ6DRL7N.js";import"./chunk-3BEGOL5T.js";import"./chunk-JJOS6L5H.js";import"./chunk-NK4FF37S.js";import"./chunk-XF3JBBPU.js";import"./chunk-GMBG6JLV.js";import"./chunk-EY2OMKPT.js";import"./chunk-6JKBWHIO.js";import"./chunk-MZLG4WVE.js";import"./chunk-VACKEJ3E.js";import"./chunk-XAIDHR55.js";import"./chunk-4RUK2YSF.js";import"./chunk-VFSOKG53.js";import"./chunk-DWFS6IIT.js";import"./chunk-KFGBNAV3.js";import"./chunk-QSWT3OVG.js";import"./chunk-P4PCUR4Y.js";import"./chunk-NEQRFWA3.js";import"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-SFUQJU5Q.js";import"./chunk-I6DJFJQ6.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";export{d as discoverSootsimUrl,c as getLastFlowPreviewUploadResult,f as hoistLeadingSimFlag,a as parseFlowFile,g as runFlow,e as runFlowPlayback,b as validateFlowFile};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-42G5ZRQR.js";import"./chunk-2E4DUZEV.js";import"./chunk-SFUQJU5Q.js";import"./chunk-I6DJFJQ6.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-5SB3N45C.js";import"./chunk-7BS4AKZT.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"./chunk-CB3I3VQT.js";import"./chunk-6RHOWIGL.js";export{b as ACTIVE_RUNTIME_FILE,e as CONFIG_FILE,f as DAEMON_HEARTBEAT_STALE_MS,c as DAEMON_LOCKFILE,d as DEV_BRIDGE_LOCKFILE,a as SOOTSIM_HOME_ENV,I as activeRuntimeDir,m as activeRuntimeFile,u as cacheDir,P as claimDaemonLockfile,H as compareSemver,x as configFilePath,s as daemonAppBundlePath,r as daemonAppDir,t as daemonAppLauncherPath,v as daemonLockfilePath,w as devBridgeLockfilePath,n as electronDir,o as electronUserDataDir,p as electronVersionDir,D as ensureSootsimHome,L as isDaemonLockfileFresh,M as isDevBridgeLockfileFresh,i as isDevWorkstation,h as isSootsimDevCheckout,G as listInstalledRuntimes,q as profilesDir,E as readActiveRuntime,J as readDaemonLockfile,K as readDevBridgeLockfile,B as readOrCreateAnonymousId,y as readSharedConfig,A as readTelemetryEnabled,Q as removeDaemonLockfile,R as removeDevBridgeLockfile,l as runtimeDir,k as runtimesDir,j as shouldSkipPersistentDaemon,g as sootsimHomeDir,F as writeActiveRuntime,N as writeDaemonLockfile,O as writeDevBridgeLockfile,z as writeSharedConfig,C as writeTelemetryEnabled};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{j as a,k as b}from"./chunk-UGJFYNMX.js";import"./chunk-IJ6DRL7N.js";import"./chunk-XF3JBBPU.js";import"./chunk-GMBG6JLV.js";import"./chunk-EY2OMKPT.js";import"./chunk-6JKBWHIO.js";import"./chunk-MZLG4WVE.js";import"./chunk-VACKEJ3E.js";import"./chunk-XAIDHR55.js";import"./chunk-4RUK2YSF.js";import"./chunk-VFSOKG53.js";import"./chunk-DWFS6IIT.js";import"./chunk-KFGBNAV3.js";import"./chunk-QSWT3OVG.js";import"./chunk-P4PCUR4Y.js";import"./chunk-NEQRFWA3.js";import"./chunk-SFUQJU5Q.js";import"./chunk-I6DJFJQ6.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";export{a as printShellPerfReport,b as runInspect};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{e as w,f as v}from"./chunk-RJ6WD7XJ.js";import{c as y}from"./chunk-UGJFYNMX.js";import{a as h}from"./chunk-IJ6DRL7N.js";import"./chunk-3BEGOL5T.js";import"./chunk-JJOS6L5H.js";import"./chunk-NK4FF37S.js";import"./chunk-XF3JBBPU.js";import"./chunk-GMBG6JLV.js";import"./chunk-EY2OMKPT.js";import"./chunk-6JKBWHIO.js";import"./chunk-MZLG4WVE.js";import"./chunk-VACKEJ3E.js";import"./chunk-XAIDHR55.js";import"./chunk-4RUK2YSF.js";import"./chunk-VFSOKG53.js";import"./chunk-DWFS6IIT.js";import"./chunk-KFGBNAV3.js";import"./chunk-QSWT3OVG.js";import"./chunk-P4PCUR4Y.js";import"./chunk-NEQRFWA3.js";import"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-SFUQJU5Q.js";import"./chunk-I6DJFJQ6.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";import*as n from"fs";import*as a from"path";var S=[".maestro","maestro"];function k(){console.log(`
|
|
3
|
-
sootsim maestro \u2014 run maestro YAML flows against sootsim (drop-in)
|
|
4
|
-
|
|
5
|
-
usage:
|
|
6
|
-
sootsim maestro # discover .maestro/ or maestro/ in cwd, run all
|
|
7
|
-
sootsim maestro test <flow-or-dir> # mirrors "maestro test"
|
|
8
|
-
sootsim maestro test .maestro/ # every *.yaml / *.yml in a directory
|
|
9
|
-
sootsim maestro init # scaffold .maestro/login.yaml
|
|
10
|
-
sootsim maestro --list-compat # print supported/unsupported verbs
|
|
11
|
-
|
|
12
|
-
options:
|
|
13
|
-
--env KEY=VALUE set env vars for \${KEY} interpolation (repeatable)
|
|
14
|
-
--continuous re-run the flow on file changes (alias for --watch)
|
|
15
|
-
--format <fmt> accepted for maestro cli compat (not used)
|
|
16
|
-
--new force a fresh browser window for this run
|
|
17
|
-
--headed force a fresh, VISIBLE window (implies --new,
|
|
18
|
-
overrides --headless) \u2014 watch the flow run live
|
|
19
|
-
--record record a webm while the flow runs
|
|
20
|
-
--preview record events+video, upload, and print /preview/<id>
|
|
21
|
-
--preview-open open the uploaded preview link after a successful run
|
|
22
|
-
--preview-origin <url> upload target for --preview
|
|
23
|
-
--preview-public-origin <url>
|
|
24
|
-
public link origin for --preview
|
|
25
|
-
--slow <ms> delay between steps for natural pacing
|
|
26
|
-
|
|
27
|
-
examples:
|
|
28
|
-
sootsim maestro test .maestro/login.yaml
|
|
29
|
-
sootsim maestro test .maestro/
|
|
30
|
-
sootsim maestro --env USERNAME=alice test .maestro/login.yaml
|
|
31
|
-
sootsim maestro init
|
|
32
|
-
`)}function A(){console.log(`
|
|
33
|
-
sootsim maestro \u2014 compatibility matrix
|
|
34
|
-
|
|
35
|
-
supported verbs:
|
|
36
|
-
launchApp, stopApp, clearState, clearKeychain (warn-only),
|
|
37
|
-
tapOn, tapAtCoords, longPressOn,
|
|
38
|
-
inputText, pressKey, dispatchKey, hideKeyboard, eraseText,
|
|
39
|
-
assertVisible, assertNotVisible, assertTreeContains,
|
|
40
|
-
waitFor, extendedWaitUntil, waitForAnimationToEnd,
|
|
41
|
-
scroll, scrollUntilVisible, scrollTo, swipe, pinch,
|
|
42
|
-
takeScreenshot, dumpTree, back,
|
|
43
|
-
repeat (times), runFlow (file / inline commands / env / when),
|
|
44
|
-
runScript (maestro JS: http, json(), output, env vars, console.log),
|
|
45
|
-
evalScript, copyTextFrom (\${maestro.copiedText}), openLink,
|
|
46
|
-
when: (visible / notVisible / platform / true),
|
|
47
|
-
optional:, label:, onFlowStart, onFlowComplete,
|
|
48
|
-
\${...} JS-expression interpolation at step execution time
|
|
49
|
-
(env vars as globals, output.*, maestro.*, \${EXPR || 'default'}).
|
|
50
|
-
|
|
51
|
-
workspace mode (directory runs):
|
|
52
|
-
config.yaml / config.yml discovery, flows: inclusion globs,
|
|
53
|
-
includeTags / excludeTags against flow frontmatter tags.
|
|
54
|
-
|
|
55
|
-
partial:
|
|
56
|
-
clearKeychain \u2014 warn-only, sootsim has no keychain surface.
|
|
57
|
-
when.platform \u2014 sootsim reports iOS.
|
|
58
|
-
openLink \u2014 dispatched into the app via the Linking emulation
|
|
59
|
-
(react-navigation deep links work); no OS-level Safari fallback.
|
|
60
|
-
launchApp.arguments \u2014 ignored; sootsim has no native process.
|
|
61
|
-
launchApp.resetRuntime \u2014 sootsim-only extension for recorded benchmarks:
|
|
62
|
-
keep tenant storage/auth, but soft-reload the guest app inside launchApp.
|
|
63
|
-
takeScreenshot \u2014 maestro string form works unchanged; sootsim also accepts
|
|
64
|
-
{ path, withFrame } for framed export.
|
|
65
|
-
env \u2014 sootsim seeds the JS env from the full shell environment, not just
|
|
66
|
-
MAESTRO_* (so \${SOOTSIM_*} credentials resolve); a bare \${NAME} that is
|
|
67
|
-
undefined fails the step loudly instead of typing "undefined".
|
|
68
|
-
|
|
69
|
-
not yet implemented (will throw "unsupported maestro verb"):
|
|
70
|
-
travel, setLocation, setAirplaneMode, killApp, faker,
|
|
71
|
-
addMedia, startRecording, stopRecording (use --record flag),
|
|
72
|
-
repeat.while (only repeat.times is supported).
|
|
73
|
-
`)}function b(o){return o.startsWith("-")}function $(o){let i=[];for(let e=0;e<o.length;e++){if(o[e]==="--env"||o[e]==="-e"){let s=o[e+1];if(!s||!s.includes("="))throw new Error(`--env expects KEY=VALUE (got ${JSON.stringify(s??"")})`);let p=s.indexOf("="),l=s.slice(0,p),f=s.slice(p+1);process.env[l]=f,e+=1;continue}i.push(o[e])}return i}function T(o){let i=[];for(let e=0;e<o.length;e++){let s=o[e];if(s==="--format"||s==="--output"||s==="--device"||s==="-d"){e+=1;continue}if(s==="--continuous"){console.warn(" warn: --continuous is not yet implemented in sootsim \u2014 running once");continue}i.push(s)}return i}function x(o){for(let i of S){let e=a.join(o,i);if(n.existsSync(e)&&n.statSync(e).isDirectory())return e}return null}function F(o){let i=n.statSync(o);if(i.isFile())return[o];if(!i.isDirectory())throw new Error(`not a file or directory: ${o}`);let e={},s=["config.yaml","config.yml"].map(t=>a.join(o,t)).find(t=>n.existsSync(t));if(s){let t=h.parse(n.readFileSync(s,"utf8"));t&&typeof t=="object"&&(e=t)}let p=Array.isArray(e.flows)&&e.flows.length>0?e.flows:["*"],l=t=>{let r=a.basename(t);return!(r.startsWith(".")||!r.endsWith(".yaml")&&!r.endsWith(".yml")||r==="config.yaml"||r==="config.yml")},f=new Set;for(let t of p)for(let r of n.globSync(t,{cwd:o})){if(!l(r))continue;let c=a.join(o,r);n.existsSync(c)&&n.statSync(c).isFile()&&f.add(c)}let m=[...f].sort(),u=Array.isArray(e.includeTags)?e.includeTags:[],d=Array.isArray(e.excludeTags)?e.excludeTags:[];return(u.length>0||d.length>0)&&(m=m.filter(t=>{let{frontmatter:r}=y(n.readFileSync(t,"utf8")),c=Array.isArray(r.tags)?r.tags:[];return!(u.length>0&&!c.some(g=>u.includes(g))||c.some(g=>d.includes(g)))})),m}async function E(o){let i=a.join(o,".maestro");n.mkdirSync(i,{recursive:!0});let e=a.join(i,"login.yaml");return n.existsSync(e)?(console.error(` error: ${e} already exists`),1):(n.writeFileSync(e,`# sootsim maestro starter flow \u2014 drop-in compatible with the maestro cli.
|
|
74
|
-
# run: sootsim maestro test .maestro/login.yaml
|
|
75
|
-
appId: com.example.app
|
|
76
|
-
---
|
|
77
|
-
- launchApp
|
|
78
|
-
- tapOn:
|
|
79
|
-
id: "email"
|
|
80
|
-
- inputText: "user@example.com"
|
|
81
|
-
- tapOn:
|
|
82
|
-
id: "password"
|
|
83
|
-
- inputText: "secret123"
|
|
84
|
-
- tapOn: "Sign in"
|
|
85
|
-
- assertVisible: "Welcome"
|
|
86
|
-
`,"utf8"),console.log(` + wrote ${e}`),console.log(" next: sootsim maestro test .maestro/login.yaml"),0)}async function R(o,i={}){if(o.includes("--help")||o.includes("-h"))return k(),0;if(o.includes("--list-compat"))return A(),0;let e;try{e=$(o)}catch(t){return console.error(` error: ${t.message}`),1}e=T(e),e=v(e);let s=process.cwd(),p=e[0];if(p==="init")return E(s);let l=null,f;if(p==="test"){let t=e.slice(1).find(r=>!b(r));t?(l=a.resolve(s,t),f=e.slice(1).filter(r=>r!==t)):(l=x(s),f=e.slice(1))}else p&&!b(p)?(l=a.resolve(s,p),f=e.slice(1)):(l=x(s),f=e);if(!l)return console.error(`
|
|
87
|
-
error: no maestro flows found.
|
|
88
|
-
expected one of: ${S.map(t=>`./${t}/`).join(", ")}
|
|
89
|
-
or pass a flow explicitly: sootsim maestro test path/to/flow.yaml
|
|
90
|
-
or scaffold a starter flow: sootsim maestro init
|
|
91
|
-
`),1;if(!n.existsSync(l))return console.error(` error: ${l} not found`),1;let m;try{m=F(l)}catch(t){return console.error(` error: ${t.message}`),1}if(m.length===0)return console.error(` error: no *.yaml or *.yml files found in ${l}`),1;console.log(`
|
|
92
|
-
sootsim maestro \u2014 ${m.length} flow${m.length===1?"":"s"}
|
|
93
|
-
root: ${a.relative(s,l)||"."}
|
|
94
|
-
`);let u=0,d=[];for(let t of m){console.log(`
|
|
95
|
-
\u25B6 ${a.relative(s,t)}`);let r=[t,...f];i.port&&!f.includes("--url")&&r.push("--url",String(i.port));let c=0;try{c=await w(r)}catch(g){console.error(` x ${g.message}`),c=1}d.push({file:t,exit:c}),c!==0&&u===0&&(u=c)}if(m.length>1){console.log(`
|
|
96
|
-
maestro summary:`);for(let r of d){let c=r.exit===0?"pass":"fail";console.log(` ${c} ${a.relative(s,r.file)}`)}let t=d.filter(r=>r.exit===0).length;console.log(` ${t}/${d.length} passed`)}return u}export{F as collectFlowFiles,R as runMaestro};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a}from"./chunk-TMXLUWD2.js";import"./chunk-M3AUV33V.js";import"./chunk-VFSOKG53.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-6RHOWIGL.js";export{a as runRuntime};
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as T}from"./chunk-IJ6DRL7N.js";import{a as P}from"./chunk-JJOS6L5H.js";import{a as O,b as k}from"./chunk-NK4FF37S.js";import"./chunk-6JKBWHIO.js";import"./chunk-MZLG4WVE.js";import{f as x}from"./chunk-4RUK2YSF.js";import{g as S,i as v}from"./chunk-VFSOKG53.js";import"./chunk-QSWT3OVG.js";import"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-6RHOWIGL.js";import{spawn as B}from"child_process";import{existsSync as g,mkdtempSync as R,readdirSync as $,writeFileSync as C}from"fs";import{tmpdir as J}from"os";import{resolve as d,dirname as Y,join as _}from"path";import{fileURLToPath as V}from"url";var h=Y(V(import.meta.resolve("sootsim-engine/package.json"))),H=process.env.SOOTSIM_TEST_MODEL||"deepseek-v4-flash",A=18e3,W=18e4;async function he(e,t){let n=e.includes("--flows"),c=e.includes("--detox"),a=e.includes("--parallel"),i=e.includes("--watch"),u=e.find((l,o)=>e[o-1]==="--reporter")||"console",r=G(e);if((e.includes("--help")||e.includes("-h"))&&(console.log(`
|
|
3
|
-
sootsim test \u2014 run tests against sootsim
|
|
4
|
-
|
|
5
|
-
usage:
|
|
6
|
-
sootsim test [options]
|
|
7
|
-
sootsim test "natural language goal" [--owner <org> --repo <repo>]
|
|
8
|
-
|
|
9
|
-
modes:
|
|
10
|
-
(default) run package-local playwright tests
|
|
11
|
-
"<prompt>" generate, run, upload, and register a replayable flow
|
|
12
|
-
--flows run YAML flows
|
|
13
|
-
--detox run shared Detox-style conformance suites
|
|
14
|
-
|
|
15
|
-
options:
|
|
16
|
-
--parallel run tests in parallel
|
|
17
|
-
--watch re-run on changes
|
|
18
|
-
--reporter output format (console|json|junit)
|
|
19
|
-
--origin sootbean upload / LLM origin (default: auto)
|
|
20
|
-
--owner org account to attach the uploaded run to
|
|
21
|
-
--repo repo name for --owner
|
|
22
|
-
-t, --testNamePattern <pat>
|
|
23
|
-
filter tests by name
|
|
24
|
-
|
|
25
|
-
examples:
|
|
26
|
-
sootsim test
|
|
27
|
-
sootsim test "tap the login button and verify the welcome screen"
|
|
28
|
-
sootsim test --flows
|
|
29
|
-
sootsim test --detox --watch
|
|
30
|
-
sootsim test -t "login"
|
|
31
|
-
|
|
32
|
-
notes:
|
|
33
|
-
playwright is best for smoke and package-local debugging
|
|
34
|
-
--detox is the preferred parity lane for behavior that should match real RN
|
|
35
|
-
`),process.exit(0)),r&&!n&&!c)await oe(r.prompt,r.index,e,t);else if(n)await ie(e,t,a,u);else if(c){let{runDetox:l}=await import("./detox-LKEZBGH5.js");await l(e.filter(o=>o!=="--detox"),t)}else await se(e,t)}function y(e,t){let n=e.indexOf(t);return n>=0?e[n+1]:void 0}function z(e,t){for(let n of t){let c=y(e,n);if(c)return c}}var F=new Set(["--reporter","-t","--testNamePattern","--grep","--origin","--preview-origin","--public-origin","--preview-public-origin","--owner","--repo","--url","--driver","--sim","--device","--slow","--tail-wait","--remap","--replace"]);function G(e){for(let t=0;t<e.length;t++){let n=e[t];if(n){if(F.has(n)){t+=1;continue}if(!n.startsWith("-"))return g(n)||/\.(?:[cm]?[jt]sx?|ya?ml|json)$/i.test(n)||!/\s/.test(n)&&n.length<16?null:{prompt:n,index:t}}}return null}function K(e,t){return e.filter((n,c)=>c!==t)}async function X(e,t){let n=K(e,t),c=S(n,{stripBooleanFlags:["--parallel","--watch","--flows","--detox","--new","--headless","--headed","--electron","--preview-open"],stripValueFlags:[...F]}),a=v(c);try{let i=await x(a,{describe:!0,verbose:!1,filter:"",compact:!0,hideXy:!0}),r=[i.shell?`shell: ${JSON.stringify(i.shell)}`:"",i.keyboard?`keyboard: ${JSON.stringify(i.keyboard)}`:"",typeof i.nodeCount=="number"?`nodes: ${i.nodeCount}`:"",i.tree||""].filter(Boolean).join(`
|
|
36
|
-
`);return r.length>A?r.slice(0,A)+`
|
|
37
|
-
[tree truncated]`:r}finally{a.close()}}var q=`
|
|
38
|
-
You write SootSim YAML flows from a user's natural-language test goal.
|
|
39
|
-
Return only JSON, no markdown, with this exact shape:
|
|
40
|
-
{"summary":"short human-readable result goal","steps":[{"waitFor":{"text":"...","timeout":10000}}]}
|
|
41
|
-
|
|
42
|
-
Use only these flow commands:
|
|
43
|
-
- waitFor: { "text"?: string, "id"?: string, "timeout"?: number }
|
|
44
|
-
- assertVisible: string or { "text"?: string, "id"?: string }
|
|
45
|
-
- assertNotVisible: string or { "text"?: string, "id"?: string }
|
|
46
|
-
- tapOn: string or { "text"?: string, "id"?: string, "index"?: number }
|
|
47
|
-
- inputText: string
|
|
48
|
-
- pressKey: string
|
|
49
|
-
- hideKeyboard: true
|
|
50
|
-
- swipe: { "direction": "UP" | "DOWN" | "LEFT" | "RIGHT", "duration"?: number }
|
|
51
|
-
- waitForAnimationToEnd: true
|
|
52
|
-
- takeScreenshot: "label"
|
|
53
|
-
|
|
54
|
-
Prefer ids/testIDs from the tree. Prefer visible text when no id exists.
|
|
55
|
-
Do not invent app-specific data that is not visible. Keep the flow short.
|
|
56
|
-
End with an assertion or wait that proves the user's goal.
|
|
57
|
-
`.trim();function Q(e,t){return`
|
|
58
|
-
User goal:
|
|
59
|
-
${e}
|
|
60
|
-
|
|
61
|
-
Current SootSim visible tree:
|
|
62
|
-
${t||"[no tree available]"}
|
|
63
|
-
|
|
64
|
-
Generate the shortest replayable flow that verifies the goal from this current state.
|
|
65
|
-
`.trim()}function M(e){return typeof e=="string"?e:Array.isArray(e)?e.map(t=>t&&typeof t=="object"&&t.type==="text"?String(t.text??""):"").join(""):""}async function Z(e){let t=await fetch(`${e.origin.replace(/\/$/,"")}/api/llm`,{method:"POST",headers:{"content-type":"application/json",authorization:e.authHeader},body:JSON.stringify({modelId:H,context:{systemPrompt:q,messages:[{role:"user",content:Q(e.prompt,e.describe),timestamp:Date.now()}]},options:{maxTokens:1800,temperature:.2},threadId:null}),signal:AbortSignal.timeout(W)});if(!t.ok||!t.body){let o=await t.text().catch(()=>"");throw new Error(`/api/llm ${t.status}${o?`: ${o}`:""}`)}let n=t.body.getReader(),c=new TextDecoder,a=[],i="",u="",r=o=>{let p=o.trim();if(!p)return;let s=JSON.parse(p);if(s.type==="text_delta"&&s.delta)a.push(s.delta);else if(s.type==="text_end"&&s.content)i=s.content;else if(s.type==="done")i=M(s.message?.content);else if(s.type==="error")throw new Error(s.error?.errorMessage||M(s.error?.content)||"llm error")};for(;;){let{value:o,done:p}=await n.read();if(p)break;u+=c.decode(o,{stream:!0});let s;for(;(s=u.indexOf(`
|
|
66
|
-
`))>=0;)r(u.slice(0,s)),u=u.slice(s+1)}u+=c.decode(),u.trim()&&r(u);let l=(i||a.join("")).trim();if(!l)throw new Error("llm returned an empty test flow");return l}function ee(e){let t=e.match(/```(?:json)?\s*([\s\S]*?)```/i),n=t?t[1]:e.slice(e.indexOf("{"),e.lastIndexOf("}")+1);return JSON.parse(n)}function E(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function te(e){let t=ee(e);if(!E(t))throw new Error("llm did not return a JSON object");let n=typeof t.summary=="string"&&t.summary.trim()?t.summary.trim().slice(0,500):"SootSim generated test",c=t.steps;if(!Array.isArray(c)||c.length===0)throw new Error("llm returned no flow steps");let a=c.map((i,u)=>{if(!E(i))throw new Error(`flow step ${u+1} is not an object`);return i});return{summary:n,steps:a,yamlText:T.stringify(a)}}function ne(e,t,n,c){let a=[n,"--preview","--preview-origin",c,"--billing-kind","test_run"],i=new Set(["--public-origin","--preview-public-origin","--owner","--repo","--url","--driver","--sim","--device","--slow","--tail-wait","--remap","--replace"]),u=new Set(["--new","--headless","--headed","--electron","--preview-open","--no-shell","--shell-only"]);for(let r=0;r<e.length;r++){if(r===t)continue;let l=e[r];if(l==="--origin"||l==="--preview-origin"){r+=1;continue}if(l==="--public-origin"){let o=e[r+1];o&&a.push("--preview-public-origin",o),r+=1;continue}if(i.has(l)){let o=e[r+1];o&&a.push(l,o),r+=1;continue}u.has(l)&&a.push(l)}return a}async function re(e){let t=await fetch(`${e.origin.replace(/\/$/,"")}/api/sootsim/test-runs`,{method:"POST",headers:{"content-type":"application/json",authorization:e.authHeader},body:JSON.stringify({prompt:e.prompt,summary:e.summary,status:e.status,failureMessage:e.failureMessage,previewShareId:e.previewShareId,owner:e.owner,repo:e.repo,durationMs:e.durationMs,flowYamlSizeBytes:e.flowYamlSizeBytes})});if(!t.ok){let a=await t.text().catch(()=>"");throw new Error(`/api/sootsim/test-runs ${t.status}${a?`: ${a}`:""}`)}let n=await t.json(),c=n.run?.id;if(!c)throw new Error("test run registration returned no id");return{id:c,traceUrl:n.run?.traceUrl??null,previewUrl:n.run?.previewUrl??null}}async function oe(e,t,n,c){let a=O();(!a||a.kind==="github")&&(console.error(' sootsim test "<prompt>" needs a login or SOOTSIM_API_KEY.'),console.error(" API keys must include preview_upload and llm scopes."),process.exit(1));let i=k(a),u=await P(z(n,["--origin","--preview-origin"]));console.log(" inspecting current sim\u2026");let r=await X(n,t);console.log(" generating flow\u2026");let l=await Z({prompt:e,describe:r,origin:u,authHeader:i}),o=te(l),p=R(_(J(),"sootsim-test-")),s=_(p,"flow.yaml");C(s,o.yamlText),console.log(` flow: ${s}`);let U=Date.now(),{runFlowPlayback:D,getLastFlowPreviewUploadResult:N}=await import("./flow-R5GJJLLW.js"),I=ne(n,t,s,u),b=await D(I),f=N(),m=b===0?"passed":"failed",L=y(n,"--owner"),j=y(n,"--repo"),w=await re({origin:u,authHeader:i,prompt:e,summary:o.summary,status:m,failureMessage:m==="failed"?"flow playback failed":void 0,previewShareId:f?.shareId??null,owner:L,repo:j,durationMs:Date.now()-U,flowYamlSizeBytes:Buffer.byteLength(o.yamlText,"utf8")});console.log(`
|
|
67
|
-
result: ${m}`),console.log(` run: ${w.id}`),f?.previewUrl&&console.log(` preview: ${f.previewUrl}`),w.traceUrl&&console.log(` replay: ${w.traceUrl}`),process.exit(b)}async function se(e,t){let n=["playwright","test"],c=e.find((r,l)=>e[l-1]==="-t")||e.find((r,l)=>e[l-1]==="--testNamePattern")||e.find((r,l)=>e[l-1]==="--grep");c&&n.push("-g",c),e.includes("--watch")&&n.push("--ui");let a=new Set(["--flows","--detox","--parallel","--watch","--reporter","-t","--testNamePattern","--grep"]);for(let r=0;r<e.length;r++){if(a.has(e[r])){(e[r]==="-t"||e[r]==="--testNamePattern"||e[r]==="--grep"||e[r]==="--reporter")&&r++;continue}n.push(e[r])}console.log(` running: npx ${n.join(" ")}`);let i=B("npx",n,{cwd:h,stdio:"inherit",env:{...process.env}}),u=await new Promise(r=>{i.on("exit",l=>r(l||0))});process.exit(u)}async function ie(e,t,n,c){let a=["flows","test/flows","e2e/flows",".maestro","maestro"],i=[];for(let l of a){let o=d(h,l);if(g(o)){let p=$(o).filter(s=>s.endsWith(".yaml")||s.endsWith(".yml"));for(let s of p)i.push(d(o,s))}}for(let l of a){let o=d(process.cwd(),l);if(!o.startsWith(h)&&g(o)){let p=$(o).filter(s=>s.endsWith(".yaml")||s.endsWith(".yml"));for(let s of p)i.push(d(o,s))}}i.length===0&&(console.log(" no flow files found in flows/, test/flows/, or e2e/flows/"),process.exit(0)),console.log(` found ${i.length} flow(s)`);let u=0,r=0;for(let l of i)try{let{runFlowPlayback:o}=await import("./flow-R5GJJLLW.js"),p=t.port?`http://localhost:${t.port}`:"http://localhost:5173";if(await o([l,"--url",p,"--new"])!==0){r++;continue}u++}catch{r++}console.log(`
|
|
68
|
-
results: ${u} passed, ${r} failed (${i.length} total)
|
|
69
|
-
`),process.exit(r>0?1:0)}export{he as runTest};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as i}from"./chunk-TMXLUWD2.js";import"./chunk-M3AUV33V.js";import"./chunk-VFSOKG53.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import{H as e}from"./chunk-CB3I3VQT.js";import{a as s}from"./chunk-5SB3N45C.js";import"./chunk-6RHOWIGL.js";var r="https://registry.npmjs.org/sootsim/latest";async function g(n){let o=n.indexOf("--channel"),t=o>=0&&n[o+1]?n[o+1]:void 0;console.log(`sootsim upgrade
|
|
3
|
-
`),await l(),console.log(`
|
|
4
|
-
runtime:`),await i(["install",...t?["--channel",t]:[]],{})}async function l(){let n=s(),o=await c();if(!o){console.log(` cli: v${n} \u2014 couldn't reach the npm registry, skipped`);return}if(e(o,n)<=0){console.log(` cli: v${n} (latest)`);return}console.log(` cli: v${n} \u2192 v${o}`),console.log(" cli: use the latest CLI with:"),console.log(" sootsim@latest")}async function c(){try{let n=await fetch(r,{headers:{accept:"application/json"},signal:AbortSignal.timeout(8e3)});if(!n.ok)return null;let o=await n.json();return typeof o.version=="string"&&o.version?o.version:null}catch{return null}}export{g as runUpgrade};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-JJOS6L5H.js";import"./chunk-NK4FF37S.js";import"./chunk-6JKBWHIO.js";import"./chunk-MZLG4WVE.js";import"./chunk-VFSOKG53.js";import"./chunk-QSWT3OVG.js";import"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-PJAKGC4A.js";import"./chunk-NX4VSQD5.js";import"./chunk-CB3I3VQT.js";import"./chunk-6RHOWIGL.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{b as s,d as l,h as r}from"./chunk-M3AUV33V.js";import{a as i}from"./chunk-2E4DUZEV.js";import"./chunk-CB3I3VQT.js";import{a as t}from"./chunk-5SB3N45C.js";import"./chunk-6RHOWIGL.js";async function d(u){let{IS_BETA:a,BETA_LABEL:m}=await import("./beta-ZXPAAXGE.js"),c=a?` \xB7 ${m}`:"";console.log(`sootsim v${t()}${c}`);let o=i(),e=l();o.isDevBridge?(console.log(o.primary),o.installedRuntime&&console.log(`${o.installedRuntime} \xB7 ${e}`)):o.primary==="runtime not installed"?console.log("runtime not installed \u2014 run `sootsim runtime install`"):console.log(`${o.primary} \xB7 ${e}`);let n=await r({channel:e});n.outdated&&n.latest&&console.log(`
|
|
3
|
-
\u2191 runtime v${n.latest} available \u2014 run \`sootsim upgrade\``),console.log(`
|
|
4
|
-
what's new: ${s}`)}export{d as runVersion};
|