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.
Files changed (151) hide show
  1. package/dist-cli/bin.js +5 -4
  2. package/dist-cli/chunks/{agent-RJBLYNGF.js → agent-SP6EE5XV.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-E6WLI6L3.js → agent-wrapper-PWZVJ3OK.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-O3VYBYQW.js → app-fonts-EMJB6QLM.js} +2 -2
  5. package/dist-cli/chunks/{assert-VFBTT2JB.js → assert-H2B6TDXT.js} +2 -2
  6. package/dist-cli/chunks/{auth-DQ6AJU2X.js → auth-SOHXBYLQ.js} +2 -2
  7. package/dist-cli/chunks/beta-CCNQQ73A.js +2 -0
  8. package/dist-cli/chunks/{camera-C2OFA3JA.js → camera-ULLCBM5H.js} +2 -2
  9. package/dist-cli/chunks/{chunk-UGJFYNMX.js → chunk-2CID4LNK.js} +3 -3
  10. package/dist-cli/chunks/chunk-2V43M57C.js +2 -0
  11. package/dist-cli/chunks/{chunk-GKXPIE6X.js → chunk-3ZENZOIX.js} +2 -2
  12. package/dist-cli/chunks/{chunk-6RHOWIGL.js → chunk-4KT2BGQE.js} +1 -1
  13. package/dist-cli/chunks/{chunk-P4PCUR4Y.js → chunk-4KVSVFRF.js} +1 -1
  14. package/dist-cli/chunks/{chunk-VACKEJ3E.js → chunk-4NM6JBYH.js} +1 -1
  15. package/dist-cli/chunks/chunk-5J63S2NM.js +1 -0
  16. package/dist-cli/chunks/{chunk-7BS4AKZT.js → chunk-5SKKMM7E.js} +1 -1
  17. package/dist-cli/chunks/chunk-6FZ6SNVP.js +4 -0
  18. package/dist-cli/chunks/{chunk-3BEGOL5T.js → chunk-6QFVYLX6.js} +2 -2
  19. package/dist-cli/chunks/{chunk-IJ6DRL7N.js → chunk-AAQVPSIV.js} +2 -2
  20. package/dist-cli/chunks/{chunk-XF3JBBPU.js → chunk-B6JB4THC.js} +2 -2
  21. package/dist-cli/chunks/{chunk-JJOS6L5H.js → chunk-BZ7AW7ZB.js} +2 -2
  22. package/dist-cli/chunks/{chunk-OCA5CK4S.js → chunk-CB7LDZKJ.js} +3 -3
  23. package/dist-cli/chunks/{chunk-6JKBWHIO.js → chunk-CGJ2U6ST.js} +1 -1
  24. package/dist-cli/chunks/chunk-DKBKU55D.js +2 -0
  25. package/dist-cli/chunks/{chunk-QSWT3OVG.js → chunk-DRJ4YWUG.js} +1 -1
  26. package/dist-cli/chunks/{chunk-XAIDHR55.js → chunk-EMOZJ773.js} +2 -2
  27. package/dist-cli/chunks/{chunk-KFGBNAV3.js → chunk-ENXHZGSL.js} +1 -1
  28. package/dist-cli/chunks/{chunk-I6DJFJQ6.js → chunk-F2LLN4U7.js} +2 -2
  29. package/dist-cli/chunks/{chunk-3PAUJH34.js → chunk-GUYKLSTX.js} +1 -1
  30. package/dist-cli/chunks/chunk-GZKT53SA.js +7 -0
  31. package/dist-cli/chunks/{chunk-DWFS6IIT.js → chunk-HZYHSLNH.js} +2 -2
  32. package/dist-cli/chunks/chunk-I6O7NBPZ.js +1 -0
  33. package/dist-cli/chunks/{chunk-U5O3F3NB.js → chunk-JP7J325R.js} +2 -2
  34. package/dist-cli/chunks/{chunk-5SB3N45C.js → chunk-K3UBHPVP.js} +1 -1
  35. package/dist-cli/chunks/{chunk-VFSOKG53.js → chunk-KRGHRSKY.js} +2 -2
  36. package/dist-cli/chunks/{chunk-VP4Y767U.js → chunk-KYGUR727.js} +2 -2
  37. package/dist-cli/chunks/{chunk-2E4DUZEV.js → chunk-LNDRRZP3.js} +2 -2
  38. package/dist-cli/chunks/{chunk-NEQRFWA3.js → chunk-OG6TFGYF.js} +2 -2
  39. package/dist-cli/chunks/{chunk-PJAKGC4A.js → chunk-PL4GXELT.js} +1 -1
  40. package/dist-cli/chunks/{chunk-MZLG4WVE.js → chunk-RJVIUQK4.js} +1 -1
  41. package/dist-cli/chunks/{chunk-4RUK2YSF.js → chunk-ROYBEBG2.js} +1 -1
  42. package/dist-cli/chunks/{chunk-42G5ZRQR.js → chunk-RS7QLHEH.js} +2 -2
  43. package/dist-cli/chunks/{chunk-LSDJTPOY.js → chunk-RWXCSRNE.js} +2 -2
  44. package/dist-cli/chunks/{chunk-NX4VSQD5.js → chunk-RZQO4Q7E.js} +1 -1
  45. package/dist-cli/chunks/{chunk-SFUQJU5Q.js → chunk-SQBX2HS7.js} +6 -6
  46. package/dist-cli/chunks/{chunk-NK4FF37S.js → chunk-TANTCV45.js} +2 -2
  47. package/dist-cli/chunks/chunk-W4Y3JJX6.js +29 -0
  48. package/dist-cli/chunks/chunk-WILIVPUU.js +567 -0
  49. package/dist-cli/chunks/{chunk-GMBG6JLV.js → chunk-WVDWIXPH.js} +2 -2
  50. package/dist-cli/chunks/{chunk-HGBMGQGP.js → chunk-Z5VMWFCY.js} +1 -1
  51. package/dist-cli/chunks/cli-version-Z4NGLJLH.js +2 -0
  52. package/dist-cli/chunks/{compat-L2E3OQW3.js → compat-YW3OJ7RX.js} +3 -3
  53. package/dist-cli/chunks/{config-K4IMJRHG.js → config-ZGOXFEX4.js} +2 -2
  54. package/dist-cli/chunks/{control-OXJ7S7UG.js → control-75JRFOYV.js} +2 -2
  55. package/dist-cli/chunks/daemon-SHFBQRHD.js +2 -0
  56. package/dist-cli/chunks/{debug-ZPKRTLGX.js → debug-4APEP64L.js} +3 -3
  57. package/dist-cli/chunks/{desktop-YA2UL7Q4.js → desktop-CS7S4CXK.js} +3 -3
  58. package/dist-cli/chunks/detox-7R7DOKQM.js +50 -0
  59. package/dist-cli/chunks/{device-M6YG7TKY.js → device-EIDKLBEK.js} +2 -2
  60. package/dist-cli/chunks/{diagnose-3OUFTELV.js → diagnose-J2F7MJAJ.js} +2 -2
  61. package/dist-cli/chunks/drivers-55L7BHDF.js +2 -0
  62. package/dist-cli/chunks/flow-AHWVTHJP.js +2 -0
  63. package/dist-cli/chunks/help-C4BTMPEE.js +2 -0
  64. package/dist-cli/chunks/home-paths-WVCREWI7.js +2 -0
  65. package/dist-cli/chunks/inspect-M4Z4SSSB.js +2 -0
  66. package/dist-cli/chunks/install-desktop-PVRUAEMA.js +2 -0
  67. package/dist-cli/chunks/{login-RNYBOMNF.js → login-EOBJ7CZ4.js} +4 -4
  68. package/dist-cli/chunks/{logout-XBW3BXL4.js → logout-RL7D66VQ.js} +2 -2
  69. package/dist-cli/chunks/maestro-F66ZIJKA.js +96 -0
  70. package/dist-cli/chunks/{mode-E353E6HN.js → mode-R2VIW66U.js} +2 -2
  71. package/dist-cli/chunks/optional-demo-registry-ILX5YV34.js +2 -0
  72. package/dist-cli/chunks/{perf-CIOBGFHU.js → perf-PGYO5BBR.js} +2 -2
  73. package/dist-cli/chunks/{record-I626AYJ5.js → record-IGDVHC67.js} +3 -3
  74. package/dist-cli/chunks/runtime-43RJGUGS.js +2 -0
  75. package/dist-cli/chunks/{screenshot-command-TTB5OOL2.js → screenshot-command-HX4GVUJM.js} +2 -2
  76. package/dist-cli/chunks/{serve-AEBEXTTW.js → serve-3TFVHYLY.js} +18 -18
  77. package/dist-cli/chunks/{setup-7QCI53ZK.js → setup-JSPPRVET.js} +3 -3
  78. package/dist-cli/chunks/{skills-7LHL5KHW.js → skills-LK3B76W7.js} +2 -2
  79. package/dist-cli/chunks/{storage-BVWLYY23.js → storage-NC5RNBUA.js} +2 -2
  80. package/dist-cli/chunks/store-3XMEKA6H.js +2 -0
  81. package/dist-cli/chunks/telemetry-CVJ5YZNS.js +2 -0
  82. package/dist-cli/chunks/test-2CXPLH5N.js +69 -0
  83. package/dist-cli/chunks/{timeline-BVR4E6PY.js → timeline-WDTEVELN.js} +2 -2
  84. package/dist-cli/chunks/upgrade-TT2IJSNJ.js +4 -0
  85. package/dist-cli/chunks/upload-4HMNB4HA.js +2 -0
  86. package/dist-cli/chunks/version-JUNH4FOR.js +4 -0
  87. package/dist-cli/chunks/{web-HYLNFAXS.js → web-BWCW26ZA.js} +2 -2
  88. package/dist-cli/chunks/{what-happened-YGRE2NFG.js → what-happened-L6EEB6MB.js} +2 -2
  89. package/dist-lib/agent-daemon-client.cjs +1 -1
  90. package/dist-lib/agent-events.cjs +1 -1
  91. package/dist-lib/agent-identity.cjs +1 -1
  92. package/dist-lib/agent-sessions.cjs +1 -1
  93. package/dist-lib/attached-projects.cjs +1 -1
  94. package/dist-lib/auth/shared-session.cjs +1 -1
  95. package/dist-lib/backend-origin.cjs +1 -1
  96. package/dist-lib/beta.cjs +1 -1
  97. package/dist-lib/beta.mjs +1 -1
  98. package/dist-lib/bridge-constants.cjs +1 -1
  99. package/dist-lib/cli-constants.cjs +1 -1
  100. package/dist-lib/config.cjs +1 -1
  101. package/dist-lib/detox/index.cjs +1 -1
  102. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  103. package/dist-lib/home-paths.cjs +32 -1
  104. package/dist-lib/host/bridge-host.cjs +51 -2
  105. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  106. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  107. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  108. package/dist-lib/host/websocket-proxy.cjs +1 -1
  109. package/dist-lib/index.cjs +1 -1
  110. package/dist-lib/jump-to-source-babel.cjs +1 -1
  111. package/dist-lib/menu.cjs +1 -1
  112. package/dist-lib/menu.mjs +1 -1
  113. package/dist-lib/metro.cjs +1 -1
  114. package/dist-lib/profiles.cjs +1 -1
  115. package/dist-lib/render-mode.cjs +1 -1
  116. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  117. package/dist-lib/sdk.cjs +1 -1
  118. package/dist-lib/sdk.mjs +1 -1
  119. package/dist-lib/skills.cjs +115 -36
  120. package/dist-lib/vite.cjs +1 -1
  121. package/package.json +1 -1
  122. package/src/home-paths.ts +48 -1
  123. package/src/host/bridge-host.ts +12 -0
  124. package/src/runtime-delivery.ts +59 -9
  125. package/src/screenshots/frame-compose.ts +21 -13
  126. package/dist-cli/chunks/beta-ZXPAAXGE.js +0 -2
  127. package/dist-cli/chunks/chunk-CB3I3VQT.js +0 -6
  128. package/dist-cli/chunks/chunk-EY2OMKPT.js +0 -1
  129. package/dist-cli/chunks/chunk-M3AUV33V.js +0 -4
  130. package/dist-cli/chunks/chunk-RJ6WD7XJ.js +0 -567
  131. package/dist-cli/chunks/chunk-TMXLUWD2.js +0 -27
  132. package/dist-cli/chunks/chunk-USDJA22M.js +0 -1
  133. package/dist-cli/chunks/chunk-VXBWUAYL.js +0 -2
  134. package/dist-cli/chunks/cli-version-E3OGD447.js +0 -2
  135. package/dist-cli/chunks/daemon-G5GBYBJ4.js +0 -2
  136. package/dist-cli/chunks/detox-LKEZBGH5.js +0 -49
  137. package/dist-cli/chunks/drivers-CTSUKCFK.js +0 -2
  138. package/dist-cli/chunks/flow-R5GJJLLW.js +0 -2
  139. package/dist-cli/chunks/help-CSSCFOBR.js +0 -2
  140. package/dist-cli/chunks/home-paths-4V6CGISP.js +0 -2
  141. package/dist-cli/chunks/inspect-NIBEAJND.js +0 -2
  142. package/dist-cli/chunks/install-desktop-7TYE6TTP.js +0 -2
  143. package/dist-cli/chunks/maestro-3EBOG357.js +0 -96
  144. package/dist-cli/chunks/optional-demo-registry-BEUP6OEZ.js +0 -2
  145. package/dist-cli/chunks/runtime-254BNZHB.js +0 -2
  146. package/dist-cli/chunks/store-6KAKNNCL.js +0 -2
  147. package/dist-cli/chunks/telemetry-EZ42CD35.js +0 -2
  148. package/dist-cli/chunks/test-BK4GZZR2.js +0 -69
  149. package/dist-cli/chunks/upgrade-AY5XC5QI.js +0 -4
  150. package/dist-cli/chunks/upload-HOF4XBAG.js +0 -2
  151. 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}from"./chunk-5SB3N45C.js";import"./chunk-6RHOWIGL.js";export{a as getCliVersion};
@@ -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,2 +0,0 @@
1
- /*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-OCA5CK4S.js";import"./chunk-3PAUJH34.js";import"./chunk-KFGBNAV3.js";import"./chunk-6RHOWIGL.js";export{a as runInstallDesktop};
@@ -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,b}from"./chunk-VACKEJ3E.js";import"./chunk-6RHOWIGL.js";export{a as loadOptionalDemoApps,b as optionalDemoAppsSync};
@@ -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,2 +0,0 @@
1
- /*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a}from"./chunk-NEQRFWA3.js";import"./chunk-VXBWUAYL.js";import"./chunk-6RHOWIGL.js";export{a as settingsStore};
@@ -1,2 +0,0 @@
1
- /*! sootsim v0.1.200 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a,b}from"./chunk-VP4Y767U.js";import"./chunk-LSDJTPOY.js";import"./chunk-CB3I3VQT.js";import"./chunk-6RHOWIGL.js";export{b as flushCliTelemetry,a as trackCliEvent};
@@ -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};