sootsim 0.0.2 → 0.0.3

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 (103) hide show
  1. package/dist-cli/bin.js +3 -3
  2. package/dist-cli/chunks/{agent-3T4BJEZM.js → agent-D5NBV32O.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-WCYNLWHZ.js → agent-wrapper-Y7I5QGHM.js} +2 -2
  4. package/dist-cli/chunks/{assert-FPFJEFF3.js → assert-EJ7DQS2H.js} +2 -2
  5. package/dist-cli/chunks/auto-bootstrap-Q7GNLISM.js +2 -0
  6. package/dist-cli/chunks/{chunk-YVSZHVLU.js → chunk-2FPPPJE5.js} +2 -2
  7. package/dist-cli/chunks/{chunk-5C5I5OFM.js → chunk-3K6VDPVD.js} +2 -2
  8. package/dist-cli/chunks/{chunk-NE62JSI6.js → chunk-3SLEIN6B.js} +1 -1
  9. package/dist-cli/chunks/chunk-3WPAEUOO.js +1 -0
  10. package/dist-cli/chunks/{chunk-KZ2LIDW6.js → chunk-44CBTM22.js} +1 -1
  11. package/dist-cli/chunks/{chunk-B5R4K2DG.js → chunk-46LRF7PH.js} +1 -1
  12. package/dist-cli/chunks/{chunk-FUQ4XA6I.js → chunk-4RYT6AQV.js} +2 -2
  13. package/dist-cli/chunks/{chunk-DW54UPRZ.js → chunk-5AG24UFX.js} +1 -1
  14. package/dist-cli/chunks/{chunk-EWEKADK4.js → chunk-5IPP4HAW.js} +2 -2
  15. package/dist-cli/chunks/{chunk-LOV766MI.js → chunk-AFTHIY3L.js} +1 -1
  16. package/dist-cli/chunks/{chunk-6IPY24VM.js → chunk-BU3TZP4Y.js} +2 -2
  17. package/dist-cli/chunks/{chunk-GQUOQNTP.js → chunk-BYLX2DO4.js} +2 -2
  18. package/dist-cli/chunks/chunk-CPMW2QLM.js +1 -0
  19. package/dist-cli/chunks/{chunk-ISAMAM3I.js → chunk-CQ6PX2EU.js} +1 -1
  20. package/dist-cli/chunks/{chunk-HBNVKYSC.js → chunk-D4JFMCXD.js} +2 -2
  21. package/dist-cli/chunks/{chunk-TSZBQS6W.js → chunk-EEBR5YP5.js} +2 -2
  22. package/dist-cli/chunks/{chunk-CXTA5VGA.js → chunk-EQ7G3UHS.js} +1 -1
  23. package/dist-cli/chunks/{chunk-HORCHQT7.js → chunk-FTRI7SVV.js} +2 -2
  24. package/dist-cli/chunks/{chunk-K6YUSCAC.js → chunk-H3JVJXOC.js} +2 -2
  25. package/dist-cli/chunks/chunk-LV5U7TI4.js +1 -0
  26. package/dist-cli/chunks/{chunk-SLCVEGTW.js → chunk-NKJLTISU.js} +2 -2
  27. package/dist-cli/chunks/{chunk-NHA3G6A3.js → chunk-O2HBPZW5.js} +2 -2
  28. package/dist-cli/chunks/{chunk-ET3NNZAR.js → chunk-OG5CKIPC.js} +2 -2
  29. package/dist-cli/chunks/{chunk-K7LDP7JL.js → chunk-P5C3UASK.js} +1 -1
  30. package/dist-cli/chunks/{chunk-AS4V7TZU.js → chunk-REYWQVAH.js} +1 -1
  31. package/dist-cli/chunks/{chunk-XXUAOYYT.js → chunk-RLS6PHBW.js} +1 -1
  32. package/dist-cli/chunks/{chunk-TGDP3D3V.js → chunk-SUZR2SZZ.js} +1 -1
  33. package/dist-cli/chunks/{chunk-LXCFGKL2.js → chunk-USRNDVQ3.js} +1 -1
  34. package/dist-cli/chunks/{chunk-EWMYTXM2.js → chunk-UZL5ZZ4E.js} +2 -2
  35. package/dist-cli/chunks/{chunk-RJUBGX5M.js → chunk-VI3VW5BL.js} +1 -1
  36. package/dist-cli/chunks/chunk-WUYJFYOW.js +2 -0
  37. package/dist-cli/chunks/{chunk-CZZB4DWG.js → chunk-X2W4IRXK.js} +2 -2
  38. package/dist-cli/chunks/{chunk-4372UQHZ.js → chunk-XJBPH4JR.js} +3 -3
  39. package/dist-cli/chunks/{chunk-NXWCDGWS.js → chunk-ZSRMXBGK.js} +2 -2
  40. package/dist-cli/chunks/{compat-3HMKLGXL.js → compat-5KSMOWLB.js} +2 -2
  41. package/dist-cli/chunks/{config-IJQ3KANN.js → config-NJB6PQHU.js} +2 -2
  42. package/dist-cli/chunks/control-2F3AGZAO.js +2 -0
  43. package/dist-cli/chunks/{daemon-BBEQJLRY.js → daemon-MLG65V4S.js} +2 -2
  44. package/dist-cli/chunks/{debug-SGZ5ZFQI.js → debug-QVOBTTLP.js} +3 -3
  45. package/dist-cli/chunks/demo-app-registry-XRYNJ4GC.js +2 -0
  46. package/dist-cli/chunks/{detox-PK74V2Y7.js → detox-ZZSNZL4T.js} +2 -2
  47. package/dist-cli/chunks/{device-MWNFX54L.js → device-PQB3YGHN.js} +2 -2
  48. package/dist-cli/chunks/drivers-GWDQEGWD.js +2 -0
  49. package/dist-cli/chunks/{electron-3NIHSU2K.js → electron-JB26VHOO.js} +3 -3
  50. package/dist-cli/chunks/flow-7JRQXMFV.js +2 -0
  51. package/dist-cli/chunks/{hints-XZJLBIXW.js → hints-IGYDXXDS.js} +2 -2
  52. package/dist-cli/chunks/{home-paths-BNRMUBJA.js → home-paths-CEGSGQTD.js} +2 -2
  53. package/dist-cli/chunks/{inspect-FGTUAK4C.js → inspect-DSU6ELRM.js} +3 -3
  54. package/dist-cli/chunks/{install-LCXALH26.js → install-K6IJKADG.js} +2 -2
  55. package/dist-cli/chunks/{install-desktop-U3RQ6XUX.js → install-desktop-SC3LNFFF.js} +2 -2
  56. package/dist-cli/chunks/{install-dev-desktop-BLKRFI42.js → install-dev-desktop-4DP3UY2X.js} +2 -2
  57. package/dist-cli/chunks/{keys-N5LBDSD5.js → keys-R5LAPAAL.js} +2 -2
  58. package/dist-cli/chunks/{launch-NIMSJH5I.js → launch-K3WJV4QA.js} +3 -3
  59. package/dist-cli/chunks/{login-CQV2XBRM.js → login-A23PYJAW.js} +2 -2
  60. package/dist-cli/chunks/{logout-R56NWAWQ.js → logout-AJ24PH5O.js} +2 -2
  61. package/dist-cli/chunks/{maestro-ZYUVTM7H.js → maestro-YALWKKGU.js} +2 -2
  62. package/dist-cli/chunks/{preview-AOAWAYEQ.js → preview-D35EEONY.js} +2 -2
  63. package/dist-cli/chunks/{profile-DDADDPRW.js → profile-MAF7NM5Q.js} +2 -2
  64. package/dist-cli/chunks/{record-3OIOTHP6.js → record-ZCPQNGFW.js} +2 -2
  65. package/dist-cli/chunks/{runtime-JTLZYEXK.js → runtime-Z2WIXYUN.js} +3 -3
  66. package/dist-cli/chunks/{screenshot-Q6N2V5LL.js → screenshot-NQVZYC3C.js} +2 -2
  67. package/dist-cli/chunks/{screenshot-mode-WWLWJWQD.js → screenshot-mode-E45D2ZFH.js} +2 -2
  68. package/dist-cli/chunks/{screenshots-2JEPJGZO.js → screenshots-I4SQI4DA.js} +2 -2
  69. package/dist-cli/chunks/{server-VH34RVAX.js → server-ZUXKJRR5.js} +2 -2
  70. package/dist-cli/chunks/{skills-PU4627FY.js → skills-N4U63E5W.js} +2 -2
  71. package/dist-cli/chunks/store-4A6X4GBJ.js +2 -0
  72. package/dist-cli/chunks/{test-AECE56E7.js → test-VBD6N3AR.js} +3 -3
  73. package/dist-cli/chunks/upload-Y6FZ5XF2.js +2 -0
  74. package/dist-cli/chunks/{whoami-NCGRRR7X.js → whoami-4K6JGMWH.js} +2 -2
  75. package/dist-lib/agent-daemon-client.cjs +1 -1
  76. package/dist-lib/agent-events.cjs +1 -1
  77. package/dist-lib/agent-sessions.cjs +1 -1
  78. package/dist-lib/attached-projects.cjs +1 -1
  79. package/dist-lib/auth/shared-session.cjs +1 -1
  80. package/dist-lib/backend-origin.cjs +1 -1
  81. package/dist-lib/bridge-constants.cjs +1 -1
  82. package/dist-lib/cli-constants.cjs +1 -1
  83. package/dist-lib/config.cjs +1 -1
  84. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  85. package/dist-lib/home-paths.cjs +1 -1
  86. package/dist-lib/host/bridge-host.cjs +1 -1
  87. package/dist-lib/index.cjs +1 -1
  88. package/dist-lib/metro.cjs +1 -1
  89. package/dist-lib/render-mode.cjs +1 -1
  90. package/dist-lib/vite-base.cjs +1 -1
  91. package/dist-lib/vite.cjs +1 -1
  92. package/package.json +1 -1
  93. package/dist-cli/chunks/auto-bootstrap-HDW6N77H.js +0 -2
  94. package/dist-cli/chunks/chunk-3HBBSRLE.js +0 -2
  95. package/dist-cli/chunks/chunk-4GWEO5CL.js +0 -1
  96. package/dist-cli/chunks/chunk-EIZCWDRE.js +0 -1
  97. package/dist-cli/chunks/chunk-XKDQEYTE.js +0 -1
  98. package/dist-cli/chunks/control-3RAFI4AW.js +0 -2
  99. package/dist-cli/chunks/demo-app-registry-NCYP3WA6.js +0 -2
  100. package/dist-cli/chunks/drivers-EXUREU4B.js +0 -2
  101. package/dist-cli/chunks/flow-6Y3E6E5P.js +0 -2
  102. package/dist-cli/chunks/store-U2VDD2S4.js +0 -2
  103. package/dist-cli/chunks/upload-KPP7KG6E.js +0 -2
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{g as f,i as u,j as d}from"./chunk-ISAMAM3I.js";var S="sootsim:settings",p=["errorReporting","colorScheme","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","agentProvider"];function y(){try{let e=localStorage.getItem(S);if(!e)return{};let t=JSON.parse(e),n={};for(let o of p)o in t&&(n[o]=t[o]);return n}catch{return{}}}function v(e){try{let t={};for(let n of p)t[n]=e[n];localStorage.setItem(S,JSON.stringify(t))}catch{}}var h=d(),K=typeof localStorage<"u"?y():{},s={...h,...K},a=[],i=null;function g(){for(let e of a)e();typeof localStorage<"u"&&v(s)}var V={get(e){return s[e]},set(e,t){let n=u[e];n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]!==t&&(s={...s,[e]:t},e==="deviceModel"&&(i=null),g())},getAll(){return s},apply(e){let t=!1,n={...s};for(let[o,r]of Object.entries(e)){if(r===void 0)continue;let l=o,c=u[l];c&&(c.validate&&!c.validate(r)||c.options&&!c.options.includes(r)||n[l]!==r&&(n[l]=r,t=!0))}t&&(s=n,i=null,g())},reset(){s=d(),i=null,g()},subscribe(e){return a.push(e),()=>{a=a.filter(t=>t!==e)}},getDeviceSpec(){return i||(i=f(s.deviceModel)),i},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{V as a};
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{g as f,i as u,j as d}from"./chunk-CQ6PX2EU.js";var S="sootsim:settings",p=["errorReporting","colorScheme","a11yMode","a11yDepth","screenshotCanvas","screenshotBackground","screenshotText","screenshotPose","screenshotDynamicSize","agentProvider"];function y(){try{let e=localStorage.getItem(S);if(!e)return{};let t=JSON.parse(e),n={};for(let o of p)o in t&&(n[o]=t[o]);return n}catch{return{}}}function v(e){try{let t={};for(let n of p)t[n]=e[n];localStorage.setItem(S,JSON.stringify(t))}catch{}}var h=d(),K=typeof localStorage<"u"?y():{},s={...h,...K},a=[],i=null;function g(){for(let e of a)e();typeof localStorage<"u"&&v(s)}var V={get(e){return s[e]},set(e,t){let n=u[e];n.validate&&!n.validate(t)||n.options&&!n.options.includes(t)||s[e]!==t&&(s={...s,[e]:t},e==="deviceModel"&&(i=null),g())},getAll(){return s},apply(e){let t=!1,n={...s};for(let[o,r]of Object.entries(e)){if(r===void 0)continue;let l=o,c=u[l];c&&(c.validate&&!c.validate(r)||c.options&&!c.options.includes(r)||n[l]!==r&&(n[l]=r,t=!0))}t&&(s=n,i=null,g())},reset(){s=d(),i=null,g()},subscribe(e){return a.push(e),()=>{a=a.filter(t=>t!==e)}},getDeviceSpec(){return i||(i=f(s.deviceModel)),i},getA11yMode(){return s.a11yMode},setA11yMode(e){this.set("a11yMode",e)},getInspectMode(){return s.inspectMode},setInspectMode(e){this.set("inspectMode",e)}};export{V as a};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as V,e as q}from"./chunk-CZZB4DWG.js";import{a as U}from"./chunk-NE62JSI6.js";import{a as W}from"./chunk-LXCFGKL2.js";import{c as G,e as J,g as m}from"./chunk-FUQ4XA6I.js";import{createHash as Pe}from"crypto";import{readFileSync as ee}from"fs";import{gzipSync as te}from"zlib";function Y(e){let t=(e||"").toLowerCase().split(";")[0].trim();return t?!(t.startsWith("image/")||t.startsWith("video/")||t.startsWith("audio/")||t==="font/woff2"||t==="application/font-woff2"||t==="application/zip"||t==="application/gzip"):!0}async function me(e){let t=await fetch(e.url,{method:"PUT",headers:{"content-type":e.contentType},body:e.bytes});if(!t.ok){let r=await t.text().catch(()=>"");throw new Error(`PUT ${t.status}: ${r.slice(0,200)}`)}}async function be(e,t=8,r){let s=0,o=0,l=e.length;await Promise.all(Array.from({length:Math.min(t,l)},async()=>{for(;s<l;){let a=e[s++];await me(a),o++,r?.(o,l)}}))}function we(e,t,r,s){let o=[];o.push({url:e.bundle.putUrl,contentType:e.bundle.contentType,bytes:t});for(let l of e.files){let a=r.get(l.urlhash);a&&o.push({url:l.putUrl,contentType:l.contentType,bytes:a})}return e.events&&s?.eventsBytes&&o.push({url:e.events.putUrl,contentType:e.events.contentType,bytes:s.eventsBytes}),e.flowVideo&&s?.videoBytes&&o.push({url:e.flowVideo.putUrl,contentType:e.flowVideo.contentType,bytes:s.videoBytes}),e.storage&&s?.storageBytes&&o.push({url:e.storage.putUrl,contentType:e.storage.contentType,bytes:s.storageBytes}),o}function ve(e){return e.replace(/\/+$/,"")}var $=class extends Error{constructor(r,s,o){super(r);this.status=s;this.phase=o;this.name="PresignedUploadError"}};async function Q(e){let t=ve(e.originBase),r={"content-type":"application/json"};e.authHeader&&(r.authorization=e.authHeader);let s=await fetch(`${t}/api/preview/upload/init`,{method:"POST",headers:r,body:JSON.stringify(e.initBody)});if(!s.ok){let h=await s.text().catch(()=>"");throw new $(`init failed: ${s.status} ${h.slice(0,200)}`,s.status,"init")}let o=await s.json(),l=we(o,e.bundleBytes,e.filesByHash,e.extras);await be(l,e.concurrency??8,e.onPutProgress);let a=await fetch(`${t}/api/preview/upload/finalize`,{method:"POST",headers:r,body:JSON.stringify({token:o.token})});if(!a.ok){let h=await a.text().catch(()=>"");throw new $(`finalize failed: ${a.status} ${h.slice(0,200)}`,a.status,"finalize")}let z=await a.json();return{init:o,finalize:z}}function Ie(){let e=process.env.SOOT_POSTHOG_API_KEY||process.env.VITE_POSTHOG_API_KEY||"";if(!e)return null;let t=process.env.SOOT_POSTHOG_HOST||process.env.VITE_POSTHOG_HOST||"https://us.i.posthog.com";return{apiKey:e,host:t.replace(/\/+$/,"")}}function Be(e){return e?e.userId?e.userId:e.installationId!=null?`install:${e.installationId}`:e.repoId?`repo:${e.repoId}`:e.shareId?`share:${e.shareId}`:"anonymous-cli":"anonymous-cli"}function xe(e){let t=e.identity??{},r={$lib:"soot-cli",source:t.source??"cli",...e.properties};return t.userId&&(r.userId=t.userId),t.repoId&&(r.repoId=t.repoId),t.installationId!=null&&(r.installationId=String(t.installationId)),t.shareId&&(r.shareId=t.shareId),t.plan&&(r.plan=t.plan),{event:e.event,distinct_id:Be(t),properties:r,timestamp:new Date().toISOString()}}var I=[],X=!1;async function L(){if(I.length===0)return;let e=Ie();if(!e){I.length=0;return}let t=I.splice(0,I.length).map(xe);try{await fetch(`${e.host}/batch/`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({api_key:e.apiKey,batch:t}),keepalive:!0})}catch{}}function Te(){X||(X=!0,process.on("beforeExit",()=>{L()}),process.on("exit",()=>{L()}))}function Z(e){Te();let t=null;try{t=U()?.user?.id??null}catch{t=null}I.push({...e,identity:{source:"cli",userId:t,...e.identity}})}async function b(){await L()}var oe=process.env.SOOTSIM_UPLOAD_ORIGIN||"https://sootbean.com",F="http://localhost:3000";async function Se(e){if(e)return e;if(process.env.SOOTSIM_UPLOAD_ORIGIN)return process.env.SOOTSIM_UPLOAD_ORIGIN;try{let t=await fetch(`${F}/api/preview/upload/init`,{method:"OPTIONS"});if(t.ok||t.status===204||t.status===405)return F}catch{}return oe}function Ue(){console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as V,e as q}from"./chunk-X2W4IRXK.js";import{a as U}from"./chunk-3SLEIN6B.js";import{a as W}from"./chunk-USRNDVQ3.js";import{c as G,e as J,g as m}from"./chunk-4RYT6AQV.js";import{createHash as Pe}from"crypto";import{readFileSync as ee}from"fs";import{gzipSync as te}from"zlib";function Y(e){let t=(e||"").toLowerCase().split(";")[0].trim();return t?!(t.startsWith("image/")||t.startsWith("video/")||t.startsWith("audio/")||t==="font/woff2"||t==="application/font-woff2"||t==="application/zip"||t==="application/gzip"):!0}async function me(e){let t=await fetch(e.url,{method:"PUT",headers:{"content-type":e.contentType},body:e.bytes});if(!t.ok){let r=await t.text().catch(()=>"");throw new Error(`PUT ${t.status}: ${r.slice(0,200)}`)}}async function be(e,t=8,r){let s=0,o=0,l=e.length;await Promise.all(Array.from({length:Math.min(t,l)},async()=>{for(;s<l;){let a=e[s++];await me(a),o++,r?.(o,l)}}))}function we(e,t,r,s){let o=[];o.push({url:e.bundle.putUrl,contentType:e.bundle.contentType,bytes:t});for(let l of e.files){let a=r.get(l.urlhash);a&&o.push({url:l.putUrl,contentType:l.contentType,bytes:a})}return e.events&&s?.eventsBytes&&o.push({url:e.events.putUrl,contentType:e.events.contentType,bytes:s.eventsBytes}),e.flowVideo&&s?.videoBytes&&o.push({url:e.flowVideo.putUrl,contentType:e.flowVideo.contentType,bytes:s.videoBytes}),e.storage&&s?.storageBytes&&o.push({url:e.storage.putUrl,contentType:e.storage.contentType,bytes:s.storageBytes}),o}function ve(e){return e.replace(/\/+$/,"")}var $=class extends Error{constructor(r,s,o){super(r);this.status=s;this.phase=o;this.name="PresignedUploadError"}};async function Q(e){let t=ve(e.originBase),r={"content-type":"application/json"};e.authHeader&&(r.authorization=e.authHeader);let s=await fetch(`${t}/api/preview/upload/init`,{method:"POST",headers:r,body:JSON.stringify(e.initBody)});if(!s.ok){let h=await s.text().catch(()=>"");throw new $(`init failed: ${s.status} ${h.slice(0,200)}`,s.status,"init")}let o=await s.json(),l=we(o,e.bundleBytes,e.filesByHash,e.extras);await be(l,e.concurrency??8,e.onPutProgress);let a=await fetch(`${t}/api/preview/upload/finalize`,{method:"POST",headers:r,body:JSON.stringify({token:o.token})});if(!a.ok){let h=await a.text().catch(()=>"");throw new $(`finalize failed: ${a.status} ${h.slice(0,200)}`,a.status,"finalize")}let z=await a.json();return{init:o,finalize:z}}function Ie(){let e=process.env.SOOT_POSTHOG_API_KEY||process.env.VITE_POSTHOG_API_KEY||"";if(!e)return null;let t=process.env.SOOT_POSTHOG_HOST||process.env.VITE_POSTHOG_HOST||"https://us.i.posthog.com";return{apiKey:e,host:t.replace(/\/+$/,"")}}function Be(e){return e?e.userId?e.userId:e.installationId!=null?`install:${e.installationId}`:e.repoId?`repo:${e.repoId}`:e.shareId?`share:${e.shareId}`:"anonymous-cli":"anonymous-cli"}function xe(e){let t=e.identity??{},r={$lib:"soot-cli",source:t.source??"cli",...e.properties};return t.userId&&(r.userId=t.userId),t.repoId&&(r.repoId=t.repoId),t.installationId!=null&&(r.installationId=String(t.installationId)),t.shareId&&(r.shareId=t.shareId),t.plan&&(r.plan=t.plan),{event:e.event,distinct_id:Be(t),properties:r,timestamp:new Date().toISOString()}}var I=[],X=!1;async function L(){if(I.length===0)return;let e=Ie();if(!e){I.length=0;return}let t=I.splice(0,I.length).map(xe);try{await fetch(`${e.host}/batch/`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({api_key:e.apiKey,batch:t}),keepalive:!0})}catch{}}function Te(){X||(X=!0,process.on("beforeExit",()=>{L()}),process.on("exit",()=>{L()}))}function Z(e){Te();let t=null;try{t=U()?.user?.id??null}catch{t=null}I.push({...e,identity:{source:"cli",userId:t,...e.identity}})}async function b(){await L()}var oe=process.env.SOOTSIM_UPLOAD_ORIGIN||"https://sootbean.com",F="http://localhost:3000";async function Se(e){if(e)return e;if(process.env.SOOTSIM_UPLOAD_ORIGIN)return process.env.SOOTSIM_UPLOAD_ORIGIN;try{let t=await fetch(`${F}/api/preview/upload/init`,{method:"OPTIONS"});if(t.ok||t.status===204||t.status===405)return F}catch{}return oe}function Ue(){console.log(`
3
3
  sootsim upload \u2014 publish the current bundle as a /preview/<id> link
4
4
 
5
5
  usage:
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import r from"fs";import{homedir as h}from"os";import o from"path";var L="SOOTSIM_HOME",v="active",k="daemon.json",E="config.json",I=3e4;function u(){let t=process.env[L];return t&&t.length>0?o.resolve(t):o.join(h(),".sootsim")}function s(){return o.join(u(),"runtimes")}function O(t){return o.join(s(),t)}function S(){return o.join(s(),v)}function A(){return o.join(u(),"electron")}function H(t){return o.join(A(),t)}function _(){return o.join(u(),"cache")}function m(){return o.join(u(),k)}function C(){return o.join(u(),E)}function b(){r.mkdirSync(u(),{recursive:!0}),r.mkdirSync(s(),{recursive:!0}),r.mkdirSync(_(),{recursive:!0})}function F(){try{let t=r.readFileSync(S(),"utf8").trim();return t.length>0?t:null}catch{return null}}function V(t){r.mkdirSync(s(),{recursive:!0}),r.writeFileSync(S(),`${t}
3
3
  `,"utf8")}function B(){try{return r.readdirSync(s(),{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name).sort(N)}catch{return[]}}function N(t,e){let a=i=>{let c=i.indexOf("-"),f=c>=0?i.slice(0,c):i,D=c>=0?i.slice(c+1):"",g=f.split(".").map(y=>Number.parseInt(y,10));return g.some(y=>!Number.isFinite(y))?[[Number.POSITIVE_INFINITY],i]:[g,D]},[l,n]=a(t),[d,p]=a(e);for(let i=0;i<Math.max(l.length,d.length);i++){let c=l[i]??0,f=d[i]??0;if(c!==f)return c-f}return n===p?0:n?p?n<p?-1:1:-1:1}function J(){let t=F();if(!t)return null;let e=O(t);try{if(r.statSync(e).isDirectory())return e}catch{}return null}var x=16*1024;function j(){try{let t=r.openSync(m(),"r");try{let e=Buffer.alloc(x),a=r.readSync(t,e,0,x,0),l=e.subarray(0,a).toString("utf8"),n=JSON.parse(l);return n&&n.schema===1&&typeof n.pid=="number"&&typeof n.bridgePort=="number"&&typeof n.runtimePort=="number"&&typeof n.startedAt=="number"&&typeof n.heartbeatAt=="number"?n:null}finally{r.closeSync(t)}}catch{return null}}function M(t,e=Date.now()){if(!t||e-t.heartbeatAt>I)return!1;try{return process.kill(t.pid,0),!0}catch{return!1}}function T(t){b();let e=`${m()}.tmp`;r.writeFileSync(e,`${JSON.stringify(t,null,2)}
4
4
  `,"utf8"),r.renameSync(e,m())}function $(t){b();let e=j();return e&&M(e)&&e.pid!==t.pid?!1:(T(t),!0)}function K(){try{r.unlinkSync(m())}catch{}}export{L as a,v as b,k as c,E as d,I as e,u as f,s as g,O as h,S as i,A as j,H as k,_ as l,m,C as n,b as o,F as p,V as q,B as r,N as s,J as t,j as u,M as v,T as w,$ as x,K as y};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as c,h as m,i as w}from"./chunk-FUQ4XA6I.js";var y={timeoutMs:1800,settleMs:48,startWindowMs:64};function i(e){return new Promise(t=>setTimeout(t,e))}function M(e){return e.includes("--json")}function S(e){process.stdout.write(`${JSON.stringify(e??null,null,2)}
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as c,h as m,i as w}from"./chunk-4RYT6AQV.js";var y={timeoutMs:1800,settleMs:48,startWindowMs:64};function i(e){return new Promise(t=>setTimeout(t,e))}function M(e){return e.includes("--json")}function S(e){process.stdout.write(`${JSON.stringify(e??null,null,2)}
3
3
  `)}async function g(e,t,...r){return m(e,`__sootsimTest.${t}`,...r)}async function f(e,t,...r){return w(e,`SootSim.bridges.mainShell.${t}`,...r)}async function h(e,t={}){try{let r=await g(e,"waitForScreenTransitions",y);if(!t.verbose||!r?.started)return;if(r.timedOut){console.log(` screen transition still active after ${r.waitedMs}ms; continuing`);return}r.waitedMs>0&&console.log(` waited ${r.waitedMs}ms for screen transition settle`)}catch{}}function p(e){let t=e instanceof Error?e.message:String(e);return t.includes("call target not found: SootSim.bridges.mainShell")||t.includes("test bridge unavailable before app-in-worker boot")}async function R(e,t=0){let r=Date.now()+Math.max(0,t);for(;;)try{return await m(e,"SootSim.bridges.mainShell.getState")}catch(n){if(!p(n)||Date.now()>=r)throw n;await i(50)}}async function v(e,t,r,...n){let o=Date.now()+Math.max(0,r);for(;;)try{return await f(e,t,...n)}catch(s){if(!p(s)||Date.now()>=o)throw s;await i(50)}}async function x(e,t,r,n={}){let o=n.attempts??30,s=n.intervalMs??500,l=n.minNodeCount??10;for(let a=0;a<o;a++){let d=c(e,{commandTimeoutMs:t,browserId:r});try{let u=await d.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof u=="number"&&u>l)return{bridge:d,count:u}}catch{}d.close(),await i(s)}return null}async function T(e,t,r,n={}){let o=n.timeoutMs??8e3,s=n.intervalMs??250,l=Date.now()+o;for(;Date.now()<l;){let a=c(e,{commandTimeoutMs:t,browserId:r});try{return await a.send({type:"evaluate",code:"1"}),a}catch{a.close()}await i(s)}return null}async function _(e,t={}){let r=t.timeoutMs??1e4,n=t.errorGraceMs??3e3,o=t.pollIntervalMs??200;return await e.send({type:"evaluate",code:`(async () => {
4
4
  const start = Date.now()
5
5
  const deadline = start + ${r}
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{c as m}from"./chunk-XXUAOYYT.js";import{existsSync as S,mkdirSync as h,readFileSync as b,writeFileSync as H,rmSync as w}from"fs";import{tmpdir as d}from"os";import{dirname as v,join as p}from"path";var y=new Map;function i(e,r){y.set(e,r)}var a=1;function s(){return p(d(),`sootsim-cli-hints-${m()}.json`)}function l(){return p(d(),"sootsim-cli-hints-global.json")}function u(e){if(!S(e))return{version:a,shown:{}};try{let r=JSON.parse(b(e,"utf8"));return r?.version!==a||!r?.shown?{version:a,shown:{}}:r}catch{return{version:a,shown:{}}}}function f(e,r){try{h(v(e),{recursive:!0}),H(e,JSON.stringify(r)+`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{c as m}from"./chunk-RLS6PHBW.js";import{existsSync as S,mkdirSync as h,readFileSync as b,writeFileSync as H,rmSync as w}from"fs";import{tmpdir as d}from"os";import{dirname as v,join as p}from"path";var y=new Map;function i(e,r){y.set(e,r)}var a=1;function s(){return p(d(),`sootsim-cli-hints-${m()}.json`)}function l(){return p(d(),"sootsim-cli-hints-global.json")}function u(e){if(!S(e))return{version:a,shown:{}};try{let r=JSON.parse(b(e,"utf8"));return r?.version!==a||!r?.shown?{version:a,shown:{}}:r}catch{return{version:a,shown:{}}}}function f(e,r){try{h(v(e),{recursive:!0}),H(e,JSON.stringify(r)+`
3
3
  `)}catch{}}function F(){let e=(process.env.SOOTSIM_HINTS||"").toLowerCase();return e==="off"||e==="0"||e==="false"?"off":e==="always"||e==="verbose"?"always":"normal"}function x(e,r){let o=F();if(o==="off")return!1;if(o==="always"||r==="always")return!0;let t=Date.now();if(r==="once-per-session"){let n=u(s());return n.shown[e]?!1:(n.shown[e]=t,f(s(),n),!0)}if(r==="once-ever"){let n=u(l());return n.shown[e]?!1:(n.shown[e]=t,f(l(),n),!0)}if(typeof r=="object"&&"cooldownMs"in r){let n=u(s()),c=n.shown[e]??0;return t-c<r.cooldownMs?!1:(n.shown[e]=t,f(s(),n),!0)}return!0}function M(e,...r){let o=y.get(e);if(!o)return process.env.SOOTSIM_HINTS_DEBUG&&console.error(` [hints] no hint registered for id "${e}"`),!1;if(!x(e,o.frequency))return!1;let t=o.render(...r);if(t==null)return!1;let n=Array.isArray(t)?t:[t],c=o.stream==="error"?console.error:console.log;for(let g of n)c(` hint: ${g}`);return!0}function O(){w(s(),{force:!0})}function k(){w(l(),{force:!0})}function T(){return Array.from(y.entries()).map(([e,r])=>({id:e,frequency:r.frequency}))}i("app-still-loading",{frequency:{cooldownMs:6e4},render:e=>`app may still be loading (${e} nodes). run \`sootsim wait ready\` first.`});i("wait-selector-for-missing-testid",{frequency:"once-per-session",render:e=>`sootsim wait selector ${e}`,stream:"error"});i("prefer-cli-over-eval",{frequency:"once-per-session",render:e=>e.length?["try the CLI shortcut instead:",...e.map(r=>` ${r}`)]:null,stream:"error"});i("describe-use-filters",{frequency:"once-per-session",render:()=>["describe output is long. narrow it with:"," sootsim describe --only '*Bottom Sheet*'"," sootsim describe --testid-like 'swap-*'"," sootsim describe --subtree <testID>"]});i("subtree-root-not-found",{frequency:"always",render:e=>`no node with testID/id "${e}" \u2014 try \`sootsim find --testid ${e}\` to discover available ids.`,stream:"error"});export{M as a,O as b,k as c,T as d};
@@ -0,0 +1 @@
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as T}from"./chunk-KZ2LIDW6.js";import{a as I}from"./chunk-K7LDP7JL.js";function G(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.type=="string"&&typeof t.ts=="number"}function O(e){let t=e.trim();if(!t)return null;try{let r=JSON.parse(t);return G(r)?r:null}catch{return null}}import{randomBytes as H,createHash as Y}from"node:crypto";import f from"node:fs";import q from"node:os";import p from"node:path";var R=null;function _(){if(R)return R;let e=process.env.SOOTSIM_USER_DATA_DIR;if(e)return e;try{let t=I("electron");if(t.app?.getPath)return t.app.getPath("userData")}catch{}return X()}function X(){let e=q.homedir();if(process.platform==="darwin")return p.join(e,"Library","Application Support","sootsim");if(process.platform==="win32")return p.join(process.env.APPDATA||e,"sootsim");let t=process.env.XDG_CONFIG_HOME||p.join(e,".config");return p.join(t,"sootsim")}function h(){return _()}function $(){return p.join(_(),"attached-projects.json")}function N(){return{version:1,attachedProjects:[],previewAttachments:[],agentSessions:[]}}function S(){let e=$(),t;try{t=f.readFileSync(e,"utf8")}catch(r){if(r.code==="ENOENT")return N();throw r}try{let r=JSON.parse(t);if(!r||typeof r!="object")throw new Error("not an object");return{version:1,attachedProjects:Array.isArray(r.attachedProjects)?r.attachedProjects:[],previewAttachments:Array.isArray(r.previewAttachments)?r.previewAttachments:[],agentSessions:Array.isArray(r.agentSessions)?r.agentSessions:[]}}catch(r){let n=`${e}.corrupt-${Date.now()}`;try{f.renameSync(e,n),console.warn(`[sootsim] attached-projects.json was unparseable; quarantined to ${n}. original error: ${r.message}`)}catch{}return N()}}function K(e){let t=$();f.mkdirSync(p.dirname(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Date.now()}`,n=f.openSync(r,"w",384);try{f.writeFileSync(n,JSON.stringify(e,null,2)),f.fsyncSync(n)}finally{f.closeSync(n)}f.renameSync(r,t)}function w(e){let t=S();return e(t),K(t),t}function F(e){return Y("sha256").update(p.resolve(e)).digest("hex").slice(0,16)}function Q(){return`s_${H(10).toString("hex")}`}function ye(e){let t=p.resolve(e.cwd),r=F(t),n;return w(o=>{let s=o.attachedProjects.find(c=>c.id===r);if(s){let c={...s,...e,id:r,cwd:t,sourceRoots:e.sourceRoots??s.sourceRoots,knownBundleUrls:e.knownBundleUrls??s.knownBundleUrls,pinnedSourceResolutions:e.pinnedSourceResolutions??s.pinnedSourceResolutions,telemetry:e.telemetry??s.telemetry,updatedAt:Date.now(),createdAt:s.createdAt},y=o.attachedProjects.indexOf(s);o.attachedProjects[y]=c,n=c;return}let a=Date.now(),d={id:r,name:e.name??p.basename(t),cwd:t,repoRoot:e.repoRoot,sourceRoots:e.sourceRoots??[t],framework:e.framework??"unknown",bundleId:e.bundleId,knownBundleUrls:e.knownBundleUrls??[],preferredProvider:e.preferredProvider??"codex",preferredTransport:e.preferredTransport??"tmux",editorOpenCommand:e.editorOpenCommand,moshiWebhookToken:e.moshiWebhookToken,pinnedSourceResolutions:e.pinnedSourceResolutions??{},isolateDiscovery:e.isolateDiscovery,git:e.git,telemetry:e.telemetry??{lastOpened:0,runsCompleted:0},createdAt:a,updatedAt:a};o.attachedProjects.push(d),n=d}),n}function U(e){return S().attachedProjects.find(t=>t.id===e)??null}function he(){return S().attachedProjects}var V=336*60*60*1e3;function Se(e,t={}){w(r=>{let n=r.attachedProjects.find(s=>s.id===e);if(!n)return;let o=t.ts??Date.now();if(n.telemetry.runsCompleted=(n.telemetry.runsCompleted??0)+1,typeof t.usd=="number"&&Number.isFinite(t.usd)&&t.usd>=0){let s=n.telemetry.costHistory??[],a=o-V,d=s.filter(c=>c.ts>=a);d.push({ts:o,usd:t.usd}),n.telemetry.costHistory=d}n.updatedAt=o})}function we(e,t=Date.now()){let r=t-6048e5,n=e.telemetry.costHistory??[],o=0;for(let s of n)s.ts>=r&&(o+=s.usd);return o}function ve(e){w(t=>{t.attachedProjects=t.attachedProjects.filter(r=>r.id!==e),t.agentSessions=t.agentSessions.filter(r=>r.projectId!==e),t.previewAttachments=t.previewAttachments.filter(r=>r.projectId!==e)})}function B(e){let t;return w(r=>{if(e.id){let a=r.agentSessions.find(d=>d.id===e.id);if(a){let d={...a,...e,lastSeenAt:Date.now()},c=r.agentSessions.indexOf(a);r.agentSessions[c]=d,t=d;return}}let n=r.attachedProjects.find(a=>a.id===e.projectId);if(!n)throw new Error(`upsertSession: no AttachedProject with id=${e.projectId}`);let o=Date.now(),s={id:e.id??Q(),projectId:e.projectId,provider:e.provider,transport:e.transport??n.preferredTransport,cwd:e.cwd??n.cwd,claudeSessionUuid:e.claudeSessionUuid,tmuxSessionName:e.tmuxSessionName,wrapperPid:e.wrapperPid,status:e.status??"idle",needsAttention:e.needsAttention??!1,lastPrompt:e.lastPrompt,lastSummary:e.lastSummary,lastTurnFiles:e.lastTurnFiles,currentlyEditing:e.currentlyEditing,lastSeenAt:o,createdAt:o};r.agentSessions.push(s),t=s}),t}function k(e){return S().agentSessions.find(t=>t.id===e)??null}function M(e){let t=S().agentSessions;return e?t.filter(r=>r.projectId===e):t}function v(e,t){w(r=>{let n=r.agentSessions.find(s=>s.id===e);if(!n)return;let o=r.agentSessions.indexOf(n);r.agentSessions[o]={...n,...t,id:n.id,projectId:n.projectId,createdAt:n.createdAt,lastSeenAt:Date.now()}})}async function Ae(){if(S().attachedProjects.length>0)return;let t;try{t=(await import("./demo-app-registry-NCYP3WA6.js")).APPS}catch(n){console.warn("[sootsim] seedFromDemoAppRegistry: could not load demo registry:",n.message);return}if(!Array.isArray(t))return;let r=t;w(n=>{for(let o of r){if(!f.existsSync(o.dir))continue;let s=p.resolve(o.dir),a=F(s);if(n.attachedProjects.some(c=>c.id===a))continue;let d=Date.now();n.attachedProjects.push({id:a,name:o.label,cwd:s,sourceRoots:[s],framework:o.framework,knownBundleUrls:[`http://localhost:${o.preferredPort}/index.bundle`],preferredProvider:"codex",preferredTransport:"tmux",pinnedSourceResolutions:{},telemetry:{lastOpened:0,runsCompleted:0},createdAt:d,updatedAt:d})}})}import{spawn as z,spawnSync as Z}from"node:child_process";import{randomUUID as ee}from"node:crypto";import i,{constants as g}from"node:fs";import u from"node:path";import te from"node:readline";function b(e){return u.join(h(),"sessions",e)}function L(e){return u.join(b(e),"prompt.in")}function W(e){return u.join(b(e),"events.out")}function re(e){return u.join(h(),"transcripts",`${e}.log`)}function E(e,t){if(!e)return!1;try{process.kill(e,0)}catch{return!1}return!(t&&!i.existsSync(b(t)))}function ne(){if(process.env.SOOTSIM_BIN)return{cmd:process.env.SOOTSIM_BIN,prefixArgs:[]};if(process.versions.electron){let n=process.resourcesPath;if(n){let o=[u.join(n,"bin","sootsim"),u.join(n,"bin",`sootsim-${process.platform}-${process.arch}`)];for(let s of o)if(i.existsSync(s))return{cmd:s,prefixArgs:[]}}}let e=se();if(e)return e;let t=process.argv[0],r=process.argv[1];if(r&&/\.(ts|tsx|mjs|cjs|js)$/.test(r))return{cmd:t,prefixArgs:[r]};if(!r||r.includes("/.bin/"))throw new Error("sootsim CLI not found. set SOOTSIM_BIN to the path of the sootsim binary, or build the workspace CLI via `bun run --cwd packages/sootsim build:cli`.");return{cmd:t,prefixArgs:[]}}function se(){try{let e=oe();if(!e)return null;let t=`sootsim-${process.platform}-${process.arch}`,r=u.join(e,"dist-bin",t);if(i.existsSync(r))return{cmd:r,prefixArgs:[]};let n=u.join(e,"dist-cli","bin.js");if(i.existsSync(n)){try{let o=u.join(e,"cli","commands","agent-wrapper.ts");if(i.existsSync(o)){let s=i.statSync(o).mtimeMs;i.statSync(n).mtimeMs<s&&console.warn("[sootsim] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with `bun run --cwd packages/sootsim build:cli` (watch:cli:binary builds dist-bin/ instead).")}}catch{}return{cmd:process.execPath,prefixArgs:[n]}}return null}catch{return null}}function oe(){try{let r=I.resolve("sootsim/package.json");return u.dirname(r)}catch{}let e=ie();if(!e)return null;let t=u.dirname(e);for(let r=0;r<8;r++){let n=u.join(t,"package.json");try{if(i.existsSync(n)&&JSON.parse(i.readFileSync(n,"utf8")).name==="sootsim")return t}catch{}let o=u.dirname(t);if(o===t)break;t=o}return null}function ie(){try{let e=import.meta.url;return!e||!e.startsWith("file://")?null:decodeURIComponent(e.slice(7))}catch{return null}}async function ce(e,t,r){let n=u.join(h(),"locks");i.mkdirSync(n,{recursive:!0});try{i.chmodSync(n,448)}catch{}let o=u.join(n,`start-${e}-${t}.lock`),s=Date.now()+4e3,a=null;for(;a===null;)try{a=i.openSync(o,g.O_WRONLY|g.O_CREAT|g.O_EXCL,384)}catch(d){if(d.code!=="EEXIST")throw d;try{let c=Number(i.readFileSync(o,"utf8").trim());if(c&&!ae(c)){i.unlinkSync(o);continue}}catch{}if(Date.now()>s)throw new Error(`another start is in progress for project=${e} provider=${t} (lock: ${o})`);await new Promise(c=>setTimeout(c,50))}try{return i.writeFileSync(a,String(process.pid)),await r()}finally{try{i.closeSync(a)}catch{}try{i.unlinkSync(o)}catch{}}}function ae(e){try{return process.kill(e,0),!0}catch{return!1}}function C(e){let t=u.dirname(e);i.mkdirSync(t,{recursive:!0});try{i.chmodSync(t,448)}catch{}if(i.existsSync(e))try{if(i.statSync(e).isFIFO()){try{i.chmodSync(e,384)}catch{}return}i.unlinkSync(e)}catch{i.unlinkSync(e)}let r=Z("mkfifo",["-m","600",e]);if(r.status!==0)throw new Error(`mkfifo(${e}) failed: ${r.stderr?.toString().trim()||"unknown error"}`)}var l=class extends Error{code;constructor(t,r){super(r),this.code=t}};async function Te(e){let t=U(e.projectId);if(!t)throw new l("NO_PROJECT",`no project with id=${e.projectId}`);let r=e.provider||t.preferredProvider||"codex";return ce(t.id,r,async()=>{let n=M(t.id).find(m=>m.provider===r&&m.status!=="ended"&&E(m.wrapperPid,m.id));if(n)throw new l("ALREADY_RUNNING",`session already running for project=${t.id} provider=${r} (session ${n.id}, pid ${n.wrapperPid}). end it first with \`sootsim agent end <sessionId>\`.`);let o=r==="claude"?ee():void 0,s=B({projectId:t.id,provider:r,transport:"pty",cwd:t.cwd,status:"idle",claudeSessionUuid:o}),a=L(s.id),d=W(s.id),c=re(s.id);C(a),C(d);let y=u.dirname(c);i.mkdirSync(y,{recursive:!0});try{i.chmodSync(y,448)}catch{}let{cmd:A,prefixArgs:J}=ne(),j=[...J,"agent-wrapper","--session-id",s.id,"--project-id",t.id,"--provider",r,"--cwd",t.cwd,"--prompt-in",a,"--events-out",d,"--transcript",c];e.codexBin&&j.push("--codex-bin",e.codexBin),e.claudeBin&&j.push("--claude-bin",e.claudeBin),o&&j.push("--claude-session-uuid",o);let P=z(A,j,{detached:!0,stdio:"ignore",env:{...process.env,SOOTSIM_USER_DATA_DIR:h()}});P.unref();let D=e.readyTimeoutMs??6e3,x=await de(d,m=>m.type==="ready"||m.type==="error",D);if(!x||x.type==="error"){if(P.pid)try{process.kill(P.pid,"SIGTERM")}catch{}try{i.rmSync(b(s.id),{recursive:!0,force:!0})}catch{}v(s.id,{status:"ended"});let m=x&&x.type==="error"?x.message:`no ready event within ${D}ms`;throw new l("WRAPPER_FAILED",m)}return v(s.id,{wrapperPid:P.pid,status:"idle"}),{session:k(s.id),wrapperPid:P.pid}})}async function Re(e,t){let r=k(e);if(!r)throw new l("NO_SESSION",`no session with id=${e}`);if(!E(r.wrapperPid,e))throw v(e,{status:"ended"}),new l("NOT_ALIVE",`session wrapper is not alive (pid=${r.wrapperPid}). start a new session.`);let n=L(e);if(!i.existsSync(n))throw new l("NO_FIFO",`prompt FIFO missing: ${n}`);let o=i.openSync(n,g.O_WRONLY);try{let s=T(t);if(!s)throw new l("EMPTY_PROMPT","prompt text is empty");i.writeSync(o,s+`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as T}from"./chunk-44CBTM22.js";import{a as I}from"./chunk-P5C3UASK.js";function G(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.type=="string"&&typeof t.ts=="number"}function O(e){let t=e.trim();if(!t)return null;try{let r=JSON.parse(t);return G(r)?r:null}catch{return null}}import{randomBytes as H,createHash as Y}from"node:crypto";import f from"node:fs";import q from"node:os";import p from"node:path";var R=null;function _(){if(R)return R;let e=process.env.SOOTSIM_USER_DATA_DIR;if(e)return e;try{let t=I("electron");if(t.app?.getPath)return t.app.getPath("userData")}catch{}return X()}function X(){let e=q.homedir();if(process.platform==="darwin")return p.join(e,"Library","Application Support","sootsim");if(process.platform==="win32")return p.join(process.env.APPDATA||e,"sootsim");let t=process.env.XDG_CONFIG_HOME||p.join(e,".config");return p.join(t,"sootsim")}function h(){return _()}function $(){return p.join(_(),"attached-projects.json")}function N(){return{version:1,attachedProjects:[],previewAttachments:[],agentSessions:[]}}function S(){let e=$(),t;try{t=f.readFileSync(e,"utf8")}catch(r){if(r.code==="ENOENT")return N();throw r}try{let r=JSON.parse(t);if(!r||typeof r!="object")throw new Error("not an object");return{version:1,attachedProjects:Array.isArray(r.attachedProjects)?r.attachedProjects:[],previewAttachments:Array.isArray(r.previewAttachments)?r.previewAttachments:[],agentSessions:Array.isArray(r.agentSessions)?r.agentSessions:[]}}catch(r){let n=`${e}.corrupt-${Date.now()}`;try{f.renameSync(e,n),console.warn(`[sootsim] attached-projects.json was unparseable; quarantined to ${n}. original error: ${r.message}`)}catch{}return N()}}function K(e){let t=$();f.mkdirSync(p.dirname(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Date.now()}`,n=f.openSync(r,"w",384);try{f.writeFileSync(n,JSON.stringify(e,null,2)),f.fsyncSync(n)}finally{f.closeSync(n)}f.renameSync(r,t)}function w(e){let t=S();return e(t),K(t),t}function F(e){return Y("sha256").update(p.resolve(e)).digest("hex").slice(0,16)}function Q(){return`s_${H(10).toString("hex")}`}function ye(e){let t=p.resolve(e.cwd),r=F(t),n;return w(o=>{let s=o.attachedProjects.find(c=>c.id===r);if(s){let c={...s,...e,id:r,cwd:t,sourceRoots:e.sourceRoots??s.sourceRoots,knownBundleUrls:e.knownBundleUrls??s.knownBundleUrls,pinnedSourceResolutions:e.pinnedSourceResolutions??s.pinnedSourceResolutions,telemetry:e.telemetry??s.telemetry,updatedAt:Date.now(),createdAt:s.createdAt},y=o.attachedProjects.indexOf(s);o.attachedProjects[y]=c,n=c;return}let a=Date.now(),d={id:r,name:e.name??p.basename(t),cwd:t,repoRoot:e.repoRoot,sourceRoots:e.sourceRoots??[t],framework:e.framework??"unknown",bundleId:e.bundleId,knownBundleUrls:e.knownBundleUrls??[],preferredProvider:e.preferredProvider??"codex",preferredTransport:e.preferredTransport??"tmux",editorOpenCommand:e.editorOpenCommand,moshiWebhookToken:e.moshiWebhookToken,pinnedSourceResolutions:e.pinnedSourceResolutions??{},isolateDiscovery:e.isolateDiscovery,git:e.git,telemetry:e.telemetry??{lastOpened:0,runsCompleted:0},createdAt:a,updatedAt:a};o.attachedProjects.push(d),n=d}),n}function U(e){return S().attachedProjects.find(t=>t.id===e)??null}function he(){return S().attachedProjects}var V=336*60*60*1e3;function Se(e,t={}){w(r=>{let n=r.attachedProjects.find(s=>s.id===e);if(!n)return;let o=t.ts??Date.now();if(n.telemetry.runsCompleted=(n.telemetry.runsCompleted??0)+1,typeof t.usd=="number"&&Number.isFinite(t.usd)&&t.usd>=0){let s=n.telemetry.costHistory??[],a=o-V,d=s.filter(c=>c.ts>=a);d.push({ts:o,usd:t.usd}),n.telemetry.costHistory=d}n.updatedAt=o})}function we(e,t=Date.now()){let r=t-6048e5,n=e.telemetry.costHistory??[],o=0;for(let s of n)s.ts>=r&&(o+=s.usd);return o}function ve(e){w(t=>{t.attachedProjects=t.attachedProjects.filter(r=>r.id!==e),t.agentSessions=t.agentSessions.filter(r=>r.projectId!==e),t.previewAttachments=t.previewAttachments.filter(r=>r.projectId!==e)})}function B(e){let t;return w(r=>{if(e.id){let a=r.agentSessions.find(d=>d.id===e.id);if(a){let d={...a,...e,lastSeenAt:Date.now()},c=r.agentSessions.indexOf(a);r.agentSessions[c]=d,t=d;return}}let n=r.attachedProjects.find(a=>a.id===e.projectId);if(!n)throw new Error(`upsertSession: no AttachedProject with id=${e.projectId}`);let o=Date.now(),s={id:e.id??Q(),projectId:e.projectId,provider:e.provider,transport:e.transport??n.preferredTransport,cwd:e.cwd??n.cwd,claudeSessionUuid:e.claudeSessionUuid,tmuxSessionName:e.tmuxSessionName,wrapperPid:e.wrapperPid,status:e.status??"idle",needsAttention:e.needsAttention??!1,lastPrompt:e.lastPrompt,lastSummary:e.lastSummary,lastTurnFiles:e.lastTurnFiles,currentlyEditing:e.currentlyEditing,lastSeenAt:o,createdAt:o};r.agentSessions.push(s),t=s}),t}function k(e){return S().agentSessions.find(t=>t.id===e)??null}function M(e){let t=S().agentSessions;return e?t.filter(r=>r.projectId===e):t}function v(e,t){w(r=>{let n=r.agentSessions.find(s=>s.id===e);if(!n)return;let o=r.agentSessions.indexOf(n);r.agentSessions[o]={...n,...t,id:n.id,projectId:n.projectId,createdAt:n.createdAt,lastSeenAt:Date.now()}})}async function Ae(){if(S().attachedProjects.length>0)return;let t;try{t=(await import("./demo-app-registry-XRYNJ4GC.js")).APPS}catch(n){console.warn("[sootsim] seedFromDemoAppRegistry: could not load demo registry:",n.message);return}if(!Array.isArray(t))return;let r=t;w(n=>{for(let o of r){if(!f.existsSync(o.dir))continue;let s=p.resolve(o.dir),a=F(s);if(n.attachedProjects.some(c=>c.id===a))continue;let d=Date.now();n.attachedProjects.push({id:a,name:o.label,cwd:s,sourceRoots:[s],framework:o.framework,knownBundleUrls:[`http://localhost:${o.preferredPort}/index.bundle`],preferredProvider:"codex",preferredTransport:"tmux",pinnedSourceResolutions:{},telemetry:{lastOpened:0,runsCompleted:0},createdAt:d,updatedAt:d})}})}import{spawn as z,spawnSync as Z}from"node:child_process";import{randomUUID as ee}from"node:crypto";import i,{constants as g}from"node:fs";import u from"node:path";import te from"node:readline";function b(e){return u.join(h(),"sessions",e)}function L(e){return u.join(b(e),"prompt.in")}function W(e){return u.join(b(e),"events.out")}function re(e){return u.join(h(),"transcripts",`${e}.log`)}function E(e,t){if(!e)return!1;try{process.kill(e,0)}catch{return!1}return!(t&&!i.existsSync(b(t)))}function ne(){if(process.env.SOOTSIM_BIN)return{cmd:process.env.SOOTSIM_BIN,prefixArgs:[]};if(process.versions.electron){let n=process.resourcesPath;if(n){let o=[u.join(n,"bin","sootsim"),u.join(n,"bin",`sootsim-${process.platform}-${process.arch}`)];for(let s of o)if(i.existsSync(s))return{cmd:s,prefixArgs:[]}}}let e=se();if(e)return e;let t=process.argv[0],r=process.argv[1];if(r&&/\.(ts|tsx|mjs|cjs|js)$/.test(r))return{cmd:t,prefixArgs:[r]};if(!r||r.includes("/.bin/"))throw new Error("sootsim CLI not found. set SOOTSIM_BIN to the path of the sootsim binary, or build the workspace CLI via `bun run --cwd packages/sootsim build:cli`.");return{cmd:t,prefixArgs:[]}}function se(){try{let e=oe();if(!e)return null;let t=`sootsim-${process.platform}-${process.arch}`,r=u.join(e,"dist-bin",t);if(i.existsSync(r))return{cmd:r,prefixArgs:[]};let n=u.join(e,"dist-cli","bin.js");if(i.existsSync(n)){try{let o=u.join(e,"cli","commands","agent-wrapper.ts");if(i.existsSync(o)){let s=i.statSync(o).mtimeMs;i.statSync(n).mtimeMs<s&&console.warn("[sootsim] dist-cli/bin.js is older than agent-wrapper.ts \u2014 rebuild with `bun run --cwd packages/sootsim build:cli` (watch:cli:binary builds dist-bin/ instead).")}}catch{}return{cmd:process.execPath,prefixArgs:[n]}}return null}catch{return null}}function oe(){try{let r=I.resolve("sootsim/package.json");return u.dirname(r)}catch{}let e=ie();if(!e)return null;let t=u.dirname(e);for(let r=0;r<8;r++){let n=u.join(t,"package.json");try{if(i.existsSync(n)&&JSON.parse(i.readFileSync(n,"utf8")).name==="sootsim")return t}catch{}let o=u.dirname(t);if(o===t)break;t=o}return null}function ie(){try{let e=import.meta.url;return!e||!e.startsWith("file://")?null:decodeURIComponent(e.slice(7))}catch{return null}}async function ce(e,t,r){let n=u.join(h(),"locks");i.mkdirSync(n,{recursive:!0});try{i.chmodSync(n,448)}catch{}let o=u.join(n,`start-${e}-${t}.lock`),s=Date.now()+4e3,a=null;for(;a===null;)try{a=i.openSync(o,g.O_WRONLY|g.O_CREAT|g.O_EXCL,384)}catch(d){if(d.code!=="EEXIST")throw d;try{let c=Number(i.readFileSync(o,"utf8").trim());if(c&&!ae(c)){i.unlinkSync(o);continue}}catch{}if(Date.now()>s)throw new Error(`another start is in progress for project=${e} provider=${t} (lock: ${o})`);await new Promise(c=>setTimeout(c,50))}try{return i.writeFileSync(a,String(process.pid)),await r()}finally{try{i.closeSync(a)}catch{}try{i.unlinkSync(o)}catch{}}}function ae(e){try{return process.kill(e,0),!0}catch{return!1}}function C(e){let t=u.dirname(e);i.mkdirSync(t,{recursive:!0});try{i.chmodSync(t,448)}catch{}if(i.existsSync(e))try{if(i.statSync(e).isFIFO()){try{i.chmodSync(e,384)}catch{}return}i.unlinkSync(e)}catch{i.unlinkSync(e)}let r=Z("mkfifo",["-m","600",e]);if(r.status!==0)throw new Error(`mkfifo(${e}) failed: ${r.stderr?.toString().trim()||"unknown error"}`)}var l=class extends Error{code;constructor(t,r){super(r),this.code=t}};async function Te(e){let t=U(e.projectId);if(!t)throw new l("NO_PROJECT",`no project with id=${e.projectId}`);let r=e.provider||t.preferredProvider||"codex";return ce(t.id,r,async()=>{let n=M(t.id).find(m=>m.provider===r&&m.status!=="ended"&&E(m.wrapperPid,m.id));if(n)throw new l("ALREADY_RUNNING",`session already running for project=${t.id} provider=${r} (session ${n.id}, pid ${n.wrapperPid}). end it first with \`sootsim agent end <sessionId>\`.`);let o=r==="claude"?ee():void 0,s=B({projectId:t.id,provider:r,transport:"pty",cwd:t.cwd,status:"idle",claudeSessionUuid:o}),a=L(s.id),d=W(s.id),c=re(s.id);C(a),C(d);let y=u.dirname(c);i.mkdirSync(y,{recursive:!0});try{i.chmodSync(y,448)}catch{}let{cmd:A,prefixArgs:J}=ne(),j=[...J,"agent-wrapper","--session-id",s.id,"--project-id",t.id,"--provider",r,"--cwd",t.cwd,"--prompt-in",a,"--events-out",d,"--transcript",c];e.codexBin&&j.push("--codex-bin",e.codexBin),e.claudeBin&&j.push("--claude-bin",e.claudeBin),o&&j.push("--claude-session-uuid",o);let P=z(A,j,{detached:!0,stdio:"ignore",env:{...process.env,SOOTSIM_USER_DATA_DIR:h()}});P.unref();let D=e.readyTimeoutMs??6e3,x=await de(d,m=>m.type==="ready"||m.type==="error",D);if(!x||x.type==="error"){if(P.pid)try{process.kill(P.pid,"SIGTERM")}catch{}try{i.rmSync(b(s.id),{recursive:!0,force:!0})}catch{}v(s.id,{status:"ended"});let m=x&&x.type==="error"?x.message:`no ready event within ${D}ms`;throw new l("WRAPPER_FAILED",m)}return v(s.id,{wrapperPid:P.pid,status:"idle"}),{session:k(s.id),wrapperPid:P.pid}})}async function Re(e,t){let r=k(e);if(!r)throw new l("NO_SESSION",`no session with id=${e}`);if(!E(r.wrapperPid,e))throw v(e,{status:"ended"}),new l("NOT_ALIVE",`session wrapper is not alive (pid=${r.wrapperPid}). start a new session.`);let n=L(e);if(!i.existsSync(n))throw new l("NO_FIFO",`prompt FIFO missing: ${n}`);let o=i.openSync(n,g.O_WRONLY);try{let s=T(t);if(!s)throw new l("EMPTY_PROMPT","prompt text is empty");i.writeSync(o,s+`
3
3
  `)}finally{i.closeSync(o)}v(e,{lastPrompt:t.displayText??t.text,status:"working"})}async function Ne(e){let t=k(e);if(!t)throw new l("NO_SESSION",`no session with id=${e}`);if(E(t.wrapperPid,e))try{process.kill(t.wrapperPid,"SIGTERM")}catch{}let r=b(e),n=h();if(r.startsWith(n))try{i.rmSync(r,{recursive:!0,force:!0})}catch{}v(e,{status:"ended",wrapperPid:void 0})}function _e(e,t){let r=W(e);if(!i.existsSync(r))throw new l("NO_FIFO",`events FIFO missing: ${r}`);let n=i.openSync(r,g.O_RDWR),o=i.createReadStream("",{fd:n,autoClose:!0}),s=te.createInterface({input:o,crlfDelay:1/0});s.on("line",d=>{let c=O(d);c&&t(c)});let a=!1;return()=>{if(!a){a=!0;try{s.close()}catch{}try{o.destroy()}catch{}}}}async function de(e,t,r){let n=i.openSync(e,g.O_RDWR|g.O_NONBLOCK),o=Buffer.alloc(8192),s="",a=Date.now()+r;try{for(;Date.now()<a;){let d=0;try{d=i.readSync(n,o,0,o.length,null)}catch(c){if(c.code!=="EAGAIN")throw c;d=0}if(d>0){s+=o.subarray(0,d).toString("utf8");let c;for(;(c=s.indexOf(`
4
4
  `))>=0;){let y=s.slice(0,c);s=s.slice(c+1);let A=O(y);if(A&&t(A))return A}}else await new Promise(c=>setTimeout(c,30))}return null}finally{i.closeSync(n)}}export{O as a,h as b,ye as c,U as d,he as e,Se as f,we as g,ve as h,k as i,M as j,v as k,Ae as l,b as m,L as n,W as o,re as p,E as q,ne as r,l as s,Te as t,Re as u,Ne as v,_e as w};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as C}from"./chunk-K7LDP7JL.js";import{existsSync as i,readFileSync as _,writeFileSync as E}from"node:fs";import{homedir as D}from"node:os";import{dirname as L,join as s,resolve as R}from"node:path";var f=D();function b(e){let n=e;for(;;){if(i(s(n,"pnpm-workspace.yaml"))||i(s(n,"turbo.json"))||i(s(n,"nx.json"))||i(s(n,"lerna.json")))return n;let t=s(n,"package.json");if(i(t))try{if(JSON.parse(_(t,"utf8")).workspaces)return n}catch{}let r=L(n);if(r===n)return null;n=r}}function k(e,n){let t=b(process.cwd()),r=[t?R(t,e):null,R(process.cwd(),e),R(process.cwd(),n)].filter(o=>!!o);for(let o of r)if(i(o))return o;return r[0]??R(process.cwd(),e)}var x=()=>k("packages/sootsim-engine/scripts/expensify-web-proxy.ts","scripts/expensify-web-proxy.ts"),S={USE_NGROK:"true",NGROK_URL:"http://localhost:9000/",SECURE_NGROK_URL:"http://localhost:9000/"},A=s(f,"github/uniswap-interface"),K=s(A,"apps/mobile"),m=s(A,".env.defaults.local"),W="stored-in-.env.local",T="# sootsim demo env overrides",Y=s(A,"packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"),M=s(A,"apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"),N="SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";function y(e){if(!i(e))return{};let n={},t=_(e,"utf8");for(let r of t.split(/\r?\n/)){let o=r.trim();if(!o||o.startsWith("#"))continue;let d=o.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!d)continue;let c=d[2].trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),n[d[1]]=c}return n}function O(e){if(!e)return!1;let n=e.trim();return!(!n||n.includes(W)||n==="TRADING_API_KEY"||n==="UNISWAP_API_KEY")}function v(e,n){for(let t of e)for(let r of n){let o=t[r];if(O(o))return o.trim()}}function U(){let e=y(m),n=y(s(A,"apps/web/.env")),t=[process.env,e,n],r={},o=[["AMPLITUDE_PROXY_URL_OVERRIDE",["REACT_APP_AMPLITUDE_PROXY_URL"]],["QUICKNODE_ENDPOINT_NAME",["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],["QUICKNODE_ENDPOINT_TOKEN",["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],["INFURA_KEY",["REACT_APP_INFURA_KEY"]],["STATSIG_API_KEY",["REACT_APP_STATSIG_API_KEY"]],["STATSIG_PROXY_URL_OVERRIDE",["REACT_APP_STATSIG_PROXY_URL"]],["WALLETCONNECT_PROJECT_ID",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_BETA",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_DEV",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["TRADING_API_KEY",["REACT_APP_TRADING_API_KEY"]],["UNISWAP_API_KEY",[]]];for(let[c,u]of o){let p=v(t,[c,...u]);if(p){r[c]=p;for(let g of u)r[g]=p}}if(!(O(r.TRADING_API_KEY)&&O(r.UNISWAP_API_KEY))){let c=v(t,["GRAPHQL_URL_OVERRIDE","REACT_APP_AWS_API_ENDPOINT"])||"https://interface.gateway.uniswap.org/v1/graphql";r.API_BASE_URL_OVERRIDE="https://interface.gateway.uniswap.org",r.API_BASE_URL_V2_OVERRIDE="https://interface.gateway.uniswap.org/v2",r.GRAPHQL_URL_OVERRIDE=c,r.TRADING_API_URL_OVERRIDE="https://trading-api-labs.interface.gateway.uniswap.org",r.FOR_API_URL_OVERRIDE="https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService"}return r}function F(){let e=i(m)?_(m,"utf8"):"";if(e&&!e.includes(T))return;let n=U(),t=[T];for(let[r,o]of Object.entries(n).sort(([d],[c])=>d.localeCompare(c)))t.push(`${r}=${JSON.stringify(o)}`);t.push(""),E(m,`${t.join(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as C}from"./chunk-P5C3UASK.js";import{existsSync as i,readFileSync as _,writeFileSync as E}from"node:fs";import{homedir as D}from"node:os";import{dirname as L,join as s,resolve as R}from"node:path";var f=D();function b(e){let n=e;for(;;){if(i(s(n,"pnpm-workspace.yaml"))||i(s(n,"turbo.json"))||i(s(n,"nx.json"))||i(s(n,"lerna.json")))return n;let t=s(n,"package.json");if(i(t))try{if(JSON.parse(_(t,"utf8")).workspaces)return n}catch{}let r=L(n);if(r===n)return null;n=r}}function k(e,n){let t=b(process.cwd()),r=[t?R(t,e):null,R(process.cwd(),e),R(process.cwd(),n)].filter(o=>!!o);for(let o of r)if(i(o))return o;return r[0]??R(process.cwd(),e)}var x=()=>k("packages/sootsim-engine/scripts/expensify-web-proxy.ts","scripts/expensify-web-proxy.ts"),S={USE_NGROK:"true",NGROK_URL:"http://localhost:9000/",SECURE_NGROK_URL:"http://localhost:9000/"},A=s(f,"github/uniswap-interface"),K=s(A,"apps/mobile"),m=s(A,".env.defaults.local"),W="stored-in-.env.local",T="# sootsim demo env overrides",Y=s(A,"packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"),M=s(A,"apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"),N="SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";function y(e){if(!i(e))return{};let n={},t=_(e,"utf8");for(let r of t.split(/\r?\n/)){let o=r.trim();if(!o||o.startsWith("#"))continue;let d=o.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);if(!d)continue;let c=d[2].trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),n[d[1]]=c}return n}function O(e){if(!e)return!1;let n=e.trim();return!(!n||n.includes(W)||n==="TRADING_API_KEY"||n==="UNISWAP_API_KEY")}function v(e,n){for(let t of e)for(let r of n){let o=t[r];if(O(o))return o.trim()}}function U(){let e=y(m),n=y(s(A,"apps/web/.env")),t=[process.env,e,n],r={},o=[["AMPLITUDE_PROXY_URL_OVERRIDE",["REACT_APP_AMPLITUDE_PROXY_URL"]],["QUICKNODE_ENDPOINT_NAME",["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],["QUICKNODE_ENDPOINT_TOKEN",["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],["INFURA_KEY",["REACT_APP_INFURA_KEY"]],["STATSIG_API_KEY",["REACT_APP_STATSIG_API_KEY"]],["STATSIG_PROXY_URL_OVERRIDE",["REACT_APP_STATSIG_PROXY_URL"]],["WALLETCONNECT_PROJECT_ID",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_BETA",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["WALLETCONNECT_PROJECT_ID_DEV",["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],["TRADING_API_KEY",["REACT_APP_TRADING_API_KEY"]],["UNISWAP_API_KEY",[]]];for(let[c,u]of o){let p=v(t,[c,...u]);if(p){r[c]=p;for(let g of u)r[g]=p}}if(!(O(r.TRADING_API_KEY)&&O(r.UNISWAP_API_KEY))){let c=v(t,["GRAPHQL_URL_OVERRIDE","REACT_APP_AWS_API_ENDPOINT"])||"https://interface.gateway.uniswap.org/v1/graphql";r.API_BASE_URL_OVERRIDE="https://interface.gateway.uniswap.org",r.API_BASE_URL_V2_OVERRIDE="https://interface.gateway.uniswap.org/v2",r.GRAPHQL_URL_OVERRIDE=c,r.TRADING_API_URL_OVERRIDE="https://trading-api-labs.interface.gateway.uniswap.org",r.FOR_API_URL_OVERRIDE="https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService"}return r}function F(){let e=i(m)?_(m,"utf8"):"";if(e&&!e.includes(T))return;let n=U(),t=[T];for(let[r,o]of Object.entries(n).sort(([d],[c])=>d.localeCompare(c)))t.push(`${r}=${JSON.stringify(o)}`);t.push(""),E(m,`${t.join(`
3
3
  `)}
4
4
  `)}function G(){let e=`export function useForceUpgradeStatus(): ForceUpgradeStatus {
5
5
  `,n=` // sootsim demo: bypass the force-upgrade gate during local engine demos.
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{i as n}from"./chunk-ISAMAM3I.js";var i=[];for(let[t,e]of Object.entries(n))e.cliFlag&&i.push({name:`--${e.cliFlag}`,short:e.cliFlagShort?`-${e.cliFlagShort}`:void 0,key:t,type:e.type==="enum"?"string":e.type,description:e.description,options:e.options,default:e.default});var a=i;function g(){let t=[];for(let e of a){let s=e.short?`${e.short}, ${e.name}`:` ${e.name}`,o=e.options?` [${e.options.join("|")}]`:"",r=e.default!==void 0?` (default: ${e.default})`:"";t.push(` ${s.padEnd(24)}${e.description}${o}${r}`)}return t.join(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{i as n}from"./chunk-CQ6PX2EU.js";var i=[];for(let[t,e]of Object.entries(n))e.cliFlag&&i.push({name:`--${e.cliFlag}`,short:e.cliFlagShort?`-${e.cliFlagShort}`:void 0,key:t,type:e.type==="enum"?"string":e.type,description:e.description,options:e.options,default:e.default});var a=i;function g(){let t=[];for(let e of a){let s=e.short?`${e.short}, ${e.name}`:` ${e.name}`,o=e.options?` [${e.options.join("|")}]`:"",r=e.default!==void 0?` (default: ${e.default})`:"";t.push(` ${s.padEnd(24)}${e.description}${o}${r}`)}return t.join(`
3
3
  `)}export{g as a};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var d=Object.defineProperty;var e=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var f=(a,b)=>{for(var c in b)d(a,c,{get:b[c],enumerable:!0})};export{e as a,f as b};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var o="sootsimConfig";function e(n){return!!n&&Object.keys(n).length>0}function s(n){return n?e(n.modules)||e(n.turboModules)||e(n.env)||e(n.settings)||e(n.initialState):!1}function u(n,i){let t=new URL(n);return s(i)?t.searchParams.set(o,JSON.stringify(i)):t.searchParams.delete(o),t.toString()}var d="/node_modules/one/metro-entry.bundle?platform=ios&dev=true&minify=false",S="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function r(n){return/^https?:\/\//i.test(n)}function a(n){return n.endsWith(".bundle")}function f(n){try{let i=r(n),t=new URL(n,"http://soot.local");return a(t.pathname)?(t.searchParams.has("dev")||t.searchParams.set("dev","true"),t.searchParams.has("minify")||t.searchParams.set("minify","false"),i?t.toString():`${t.pathname}${t.search}${t.hash}`):n}catch{return n}}export{u as a,d as b,S as c,f as d};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import{existsSync as m,mkdirSync as A,readFileSync as w,readdirSync as x,rmSync as o,writeFileSync as _}from"fs";import{tmpdir as l}from"os";import{dirname as L,join as p,resolve as h}from"path";import{execFileSync as y}from"child_process";import{readFileSync as N}from"fs";import{createRequire as E}from"module";var s=null;function u(r){s||(s=O());try{return s(r)}catch{return null}}function O(){let r=Number(process.env.PPID);if(Number.isFinite(r)&&r>1&&r!==process.ppid)return()=>r;if(process.platform==="linux")return g();if(process.platform==="darwin"){let t=T();return t||P()}return()=>null}function g(){return r=>{try{let t=N(`/proc/${r}/stat`,"utf8"),e=t.lastIndexOf(")");if(e<0)return null;let i=t.slice(e+1).trim().split(/\s+/),n=Number(i[1]);return Number.isFinite(n)&&n>0?n:null}catch{return null}}}var C=3,a=216,D=16;function T(){if(!process.versions?.bun)return null;try{let r=E(import.meta.url),{dlopen:t,FFIType:e}=r("bun:ffi"),i=t("/usr/lib/libproc.dylib",{proc_pidinfo:{args:[e.i32,e.i32,e.u64,e.ptr,e.i32],returns:e.i32}}),n=Buffer.alloc(a);return b=>{if(Number(i.symbols.proc_pidinfo(b,C,0n,n,a))<=0)return null;let d=n.readUInt32LE(D);return d>0?d:null}}catch{return null}}function P(){return r=>{try{let e=y("lsof",["-R","-p",String(r),"-d","cwd","-a"],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).split(`
3
3
  `)[1];if(!e)return null;let i=e.trim().split(/\s+/),n=Number(i[2]);return Number.isFinite(n)&&n>1?n:null}catch{return null}}}var c=1,S="SOOTSIM_CLI_SESSION_PATH",v=["SOOTSIM_SESSION_ID","CLAUDE_CODE_SESSION_ID","CODEX_THREAD_ID","TERM_SESSION_ID","ITERM_SESSION_ID","TMUX_PANE","STY","KITTY_WINDOW_ID","WEZTERM_PANE","ALACRITTY_WINDOW_ID","WINDOWID","VSCODE_INJECTION"];function F(r,t=20){let e=u(r);if(!e||e<=1)return null;for(let i=0;i<t;i++){let n=u(e);if(!n||n<=1)return e;e=n}return e}function R(){for(let t of v){let e=process.env[t];if(e&&e.trim())return{key:`${t}:${e.trim()}`,source:t,stable:!0}}let r=F(process.ppid);return r&&r>1?{key:`gppid-${r}`,source:"grand-ppid",stable:!0}:{key:`pid-${process.ppid}`,source:"ppid",stable:!1}}var I=p(l(),"sootsim-legacy-gc-done");function j(){if(!m(I)){try{_(I,String(Date.now()))}catch{return}try{let r=l();for(let t of x(r))if(t.startsWith("sootsim-gppid-"))try{o(p(r,t),{force:!0})}catch{}}catch{}}}function k(){return R().key}function f(){if(process.env[S])return h(process.env[S]);let r=k();return p(l(),`sootsim-cli-session-${r}.json`)}function W(){let r=f();if(!m(r))return null;try{let t=JSON.parse(w(r,"utf8"));return t.version!==c||typeof t.browserId!="string"||!t.browserId.trim()||typeof t.updatedAt!="string"?(o(r,{force:!0}),null):{version:c,browserId:t.browserId.trim(),updatedAt:t.updatedAt}}catch{return o(r,{force:!0}),null}}function G(){return W()?.browserId||null}function X(r){let t=r.trim();if(!t)return;let e=f();A(L(e),{recursive:!0}),_(e,JSON.stringify({version:c,browserId:t,updatedAt:new Date().toISOString()},null,2)+`
4
4
  `)}function Z(){o(f(),{force:!0})}export{R as a,j as b,k as c,G as d,X as e,Z as f};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  function d(t){let e=t.displayUrl||t.url;return t.status!=null?`${t.method} ${e} -> ${t.status}${t.statusText?` ${t.statusText}`:""}`:t.error?`${t.method} ${e} -> ${t.error}`:`${t.method} ${e}`}async function u(t,e,...o){return t.send({type:"call",path:`__sootsimTest.${e}`,args:o})}async function g(t,e={}){let o=await t.send({type:"evaluate",code:"window.__sootsimConsole?.count?.() || { errors: 0, warnings: 0, total: 0 }"});if(!o||typeof o!="object")return;let n=Math.max(0,Number(o.errors)||0),s=Math.max(0,Number(o.warnings)||0);if(n===0&&s===0)return;let r=[];if(n>0&&r.push(`${n} console error${n===1?"":"s"}`),s>0&&r.push(`${s} console warning${s===1?"":"s"}`),console.log(`
3
3
  console: ${r.join(", ")}`),e.errorsCommand&&console.log(` inspect: ${e.errorsCommand}`),s>0&&e.warningsCommand&&console.log(` inspect: ${e.warningsCommand}`),!e.includeTail||n===0)return;let i=await t.send({type:"evaluate",code:"window.__sootsimConsole?.getErrors?.(5) || []"});if(!(!Array.isArray(i)||i.length===0)){console.log(`
4
4
  recent console errors:
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  async function o(e){let{spawn:t}=await import("child_process");if(process.platform==="darwin"){t("open",["-g",e],{detached:!0,stdio:"ignore"}).unref();return}if(process.platform==="win32"){t("cmd",["/c","start","",e],{detached:!0,stdio:"ignore"}).unref();return}t("xdg-open",[e],{detached:!0,stdio:"ignore"}).unref()}export{o as a};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{b as bs}from"./chunk-K7LDP7JL.js";var oi=`(async () => {
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{b as bs}from"./chunk-P5C3UASK.js";var oi=`(async () => {
3
3
  try { localStorage.clear() } catch {}
4
4
  try { sessionStorage.clear() } catch {}
5
5
  try {
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import{createInterface as i}from"readline";var c=()=>i({input:process.stdin,output:process.stdout});function s(r){return new Promise(n=>{let e=c();e.question(r,t=>{e.close(),n(t.trim())})})}async function a(r,n=!0){let t=await s(` ${r} ${n?"[Y/n]":"[y/N]"} `);return t===""?n:t.toLowerCase().startsWith("y")}async function l(r,n){console.log(`
3
3
  ${r}
4
4
  `);for(let o=0;o<n.length;o++)console.log(` ${o+1}. ${n[o]}`);console.log();let e=await s(` choose [1-${n.length}]: `),t=parseInt(e,10);return t>=1&&t<=n.length?t-1:0}export{a,l as b};
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ var t="http://localhost:5173/";export{t as a};
@@ -1,3 +1,3 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as s}from"./chunk-NE62JSI6.js";import{chmodSync as a,existsSync as l,mkdirSync as p,readFileSync as d,rmSync as h,writeFileSync as m}from"node:fs";import{homedir as f,platform as u}from"node:os";import{dirname as g,join as r,resolve as _}from"node:path";function o(){let t=f();if(!t)throw new Error("could not determine home directory");let e=u()==="darwin"?r(t,"Library","Application Support","sootsim"):u()==="win32"?r(process.env.APPDATA||r(t,"AppData","Roaming"),"sootsim"):r(process.env.XDG_CONFIG_HOME||r(t,".config"),"sootsim");return r(e,"credentials.json")}function k(){let t=o();if(!l(t))return null;try{let e=JSON.parse(d(t,"utf8"));return e.version!==1||typeof e.apiKey!="string"||!e.apiKey.startsWith("sk_sootsim_")?null:e.apiKey}catch{return null}}function K(t){if(!t.startsWith("sk_sootsim_"))throw new Error("api key must start with sk_sootsim_");let e=o();p(g(_(e)),{recursive:!0}),m(e,JSON.stringify({version:1,apiKey:t,savedAt:new Date().toISOString()},null,2)+`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as s}from"./chunk-3SLEIN6B.js";import{chmodSync as a,existsSync as l,mkdirSync as p,readFileSync as d,rmSync as h,writeFileSync as m}from"node:fs";import{homedir as f,platform as u}from"node:os";import{dirname as g,join as r,resolve as _}from"node:path";function o(){let t=f();if(!t)throw new Error("could not determine home directory");let e=u()==="darwin"?r(t,"Library","Application Support","sootsim"):u()==="win32"?r(process.env.APPDATA||r(t,"AppData","Roaming"),"sootsim"):r(process.env.XDG_CONFIG_HOME||r(t,".config"),"sootsim");return r(e,"credentials.json")}function k(){let t=o();if(!l(t))return null;try{let e=JSON.parse(d(t,"utf8"));return e.version!==1||typeof e.apiKey!="string"||!e.apiKey.startsWith("sk_sootsim_")?null:e.apiKey}catch{return null}}function K(t){if(!t.startsWith("sk_sootsim_"))throw new Error("api key must start with sk_sootsim_");let e=o();p(g(_(e)),{recursive:!0}),m(e,JSON.stringify({version:1,apiKey:t,savedAt:new Date().toISOString()},null,2)+`
3
3
  `);try{a(e,384)}catch{}}function b(){h(o(),{force:!0})}var y=["ghs_","ghp_","gho_","ghu_","github_pat_"];function A(t){return!!(t&&t.length>=20&&t.length<=256&&y.some(e=>t.startsWith(e)))}function S(){let t=process.env.SOOT_INSTALLATION_TOKEN?.trim(),e=process.env.GITHUB_TOKEN?.trim(),i=t||e;if(!A(i))return null;let n=(process.env.SOOT_REPO||process.env.GITHUB_REPOSITORY||"").trim();if(!n)return null;let c=(process.env.SOOT_INSTALLATION_ID||process.env.GITHUB_APP_INSTALLATION_ID||"").trim();return{kind:"github",token:i,repoId:n,installationId:c||null,source:t?"soot-runner":"github-actions"}}function E(){let t=process.env.SOOTSIM_API_KEY?.trim();if(t&&t.startsWith("sk_sootsim_"))return{kind:"api-key",secret:t,source:"env"};let e=S();if(e)return e;let i=k();if(i)return{kind:"api-key",secret:i,source:"file"};let n=s();return n?.token?{kind:"session",token:n.token,origin:n.origin}:null}function w(t){return t.kind==="api-key"?`Bearer ${t.secret}`:`Bearer ${t.token}`}export{k as a,K as b,b as c,E as d,w as e};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as he}from"./chunk-EWEKADK4.js";import{a as be}from"./chunk-GQUOQNTP.js";import{a as ge}from"./chunk-5C5I5OFM.js";import{a as ye,b as q,c as ve}from"./chunk-TSZBQS6W.js";import{f as ne}from"./chunk-ISAMAM3I.js";import{a as B,b as A,c as de,d as H,f as ue,g as fe}from"./chunk-EWMYTXM2.js";import{d as we,j as me}from"./chunk-6IPY24VM.js";import{b as ce}from"./chunk-TGDP3D3V.js";import{c as z,d as ae,e as le}from"./chunk-FUQ4XA6I.js";import{d as ie}from"./chunk-XXUAOYYT.js";import{a as pe}from"./chunk-B5R4K2DG.js";import*as $ from"fs";import{tmpdir as Te}from"os";import*as g from"path";import*as m from"fs";import*as w from"path";var V=1e4,U=393,E=852,Se="__sootsimCliPerf",Ce="maestroCopiedText",X=new Map;function f(s){return new Promise(e=>setTimeout(e,s))}function Oe(s){return s?w.basename(s)===".maestro"?w.dirname(s):s:process.cwd()}function De(s,e,t){let r=e.endsWith(".png")?e:`${e}.png`;if(w.isAbsolute(r))return r;if(t.mode==="flow"&&/[\\/]/.test(r)){let o=r.startsWith("./")||r.startsWith("../")?t.flowDir??process.cwd():Oe(t.flowDir);return w.resolve(o,r)}return w.join(s,r)}function Ne(s){if(typeof s=="string")return{path:s,withFrame:!1};let e=s.path?.trim()||s.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:s.withFrame===!0}}function Y(s){let[e,t]=s.split(",").map(o=>o.trim()),r=(o,i)=>o.endsWith("%")?Number.parseFloat(o)/100*i:Number.parseFloat(o);return{x:r(e,U),y:r(t,E)}}function G(s){return typeof s=="string"?s.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(e,t)=>{if(X.has(t))return X.get(t);let r=process.env[t];if(r===void 0)throw new Error(`missing environment variable for flow placeholder: ${t}`);return r}):Array.isArray(s)?s.map(e=>G(e)):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([e,t])=>[e,G(t)])):s}function Re(s){let e=s.split(/^---$/m),t=e.length>1?e[e.length-1]:s,r=G(A.parse(t));return Array.isArray(r)?r:[]}var W=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingDurationMs=null;browserRouteHint=null;lastFailedStep=null;get browserId(){return this.opts.browserId}setBrowserRouteHint(e){this.browserRouteHint=this.normalizeBrowserRoute(e)}normalizeBrowserRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let r=t.searchParams.toString();return`${t.origin}${t.pathname}${r?`?${r}`:""}`}catch{return e}}async refreshBrowserId(){if(this.opts.browserId)try{let e=await this.bridge.listBrowsers(),t=e.find(a=>a.id===this.opts.browserId);if(t&&(this.browserRouteHint=this.normalizeBrowserRoute(t.url||t.origin)),e.find(a=>a.id===this.opts.browserId&&a.readyState==="open")||!this.browserRouteHint)return;let o=this.browserRouteHint&&e.find(a=>a.readyState==="open"&&this.normalizeBrowserRoute(a.url||a.origin)===this.browserRouteHint);if(!o)return;let i=e.find(a=>a.isPrimary&&a.readyState==="open"),n=e.find(a=>a.readyState==="open"),l=o??i??n;l&&(this.opts.browserId=l.id,console.log(` [flow] session rotated to ${l.id}`))}catch{}}async evaluate(e){return this.bridge.send({type:"evaluate",browserId:this.opts.browserId,code:e})}async callTest(e,...t){return this.bridge.send({type:"call",browserId:this.opts.browserId,path:`__sootsimTest.${e}`,args:t})}async waitForTree(e=V){let t=Date.now()+e,r=null;for(;Date.now()<t;){try{let o=await this.evaluate(`(async () => {
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as he}from"./chunk-5IPP4HAW.js";import{a as be}from"./chunk-BYLX2DO4.js";import{a as ge}from"./chunk-3K6VDPVD.js";import{a as ye,b as q,c as ve}from"./chunk-EEBR5YP5.js";import{f as ne}from"./chunk-CQ6PX2EU.js";import{a as B,b as A,c as de,d as H,f as ue,g as fe}from"./chunk-UZL5ZZ4E.js";import{d as we,j as me}from"./chunk-BU3TZP4Y.js";import{b as ce}from"./chunk-SUZR2SZZ.js";import{c as z,d as ae,e as le}from"./chunk-4RYT6AQV.js";import{d as ie}from"./chunk-RLS6PHBW.js";import{a as pe}from"./chunk-46LRF7PH.js";import*as $ from"fs";import{tmpdir as Te}from"os";import*as g from"path";import*as m from"fs";import*as w from"path";var V=1e4,U=393,E=852,Se="__sootsimCliPerf",Ce="maestroCopiedText",X=new Map;function f(s){return new Promise(e=>setTimeout(e,s))}function Oe(s){return s?w.basename(s)===".maestro"?w.dirname(s):s:process.cwd()}function De(s,e,t){let r=e.endsWith(".png")?e:`${e}.png`;if(w.isAbsolute(r))return r;if(t.mode==="flow"&&/[\\/]/.test(r)){let o=r.startsWith("./")||r.startsWith("../")?t.flowDir??process.cwd():Oe(t.flowDir);return w.resolve(o,r)}return w.join(s,r)}function Ne(s){if(typeof s=="string")return{path:s,withFrame:!1};let e=s.path?.trim()||s.name?.trim();if(!e)throw new Error("takeScreenshot object form requires path or name");return{path:e,withFrame:s.withFrame===!0}}function Y(s){let[e,t]=s.split(",").map(o=>o.trim()),r=(o,i)=>o.endsWith("%")?Number.parseFloat(o)/100*i:Number.parseFloat(o);return{x:r(e,U),y:r(t,E)}}function G(s){return typeof s=="string"?s.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(e,t)=>{if(X.has(t))return X.get(t);let r=process.env[t];if(r===void 0)throw new Error(`missing environment variable for flow placeholder: ${t}`);return r}):Array.isArray(s)?s.map(e=>G(e)):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([e,t])=>[e,G(t)])):s}function Re(s){let e=s.split(/^---$/m),t=e.length>1?e[e.length-1]:s,r=G(A.parse(t));return Array.isArray(r)?r:[]}var W=class{constructor(e,t){this.bridge=e;this.opts=t}stepDelay=0;firstLaunchDone=!1;profilingEnabled=!1;recordingEnabled=!1;recordingAccessChecked=!1;recordingStartedAtMs=null;lastRecordingDurationMs=null;browserRouteHint=null;lastFailedStep=null;get browserId(){return this.opts.browserId}setBrowserRouteHint(e){this.browserRouteHint=this.normalizeBrowserRoute(e)}normalizeBrowserRoute(e){if(!e)return null;try{let t=new URL(e);t.searchParams.delete("inspectOpen");let r=t.searchParams.toString();return`${t.origin}${t.pathname}${r?`?${r}`:""}`}catch{return e}}async refreshBrowserId(){if(this.opts.browserId)try{let e=await this.bridge.listBrowsers(),t=e.find(a=>a.id===this.opts.browserId);if(t&&(this.browserRouteHint=this.normalizeBrowserRoute(t.url||t.origin)),e.find(a=>a.id===this.opts.browserId&&a.readyState==="open")||!this.browserRouteHint)return;let o=this.browserRouteHint&&e.find(a=>a.readyState==="open"&&this.normalizeBrowserRoute(a.url||a.origin)===this.browserRouteHint);if(!o)return;let i=e.find(a=>a.isPrimary&&a.readyState==="open"),n=e.find(a=>a.readyState==="open"),l=o??i??n;l&&(this.opts.browserId=l.id,console.log(` [flow] session rotated to ${l.id}`))}catch{}}async evaluate(e){return this.bridge.send({type:"evaluate",browserId:this.opts.browserId,code:e})}async callTest(e,...t){return this.bridge.send({type:"call",browserId:this.opts.browserId,path:`__sootsimTest.${e}`,args:t})}async waitForTree(e=V){let t=Date.now()+e,r=null;for(;Date.now()<t;){try{let o=await this.evaluate(`(async () => {
3
3
  const test = window.__sootsimTest
4
4
  if (!test) return { count: 0, loading: true }
5
5
  const count = (await test.getNodeCount?.()) || 0
@@ -300,7 +300,7 @@ flow extension:
300
300
  + completed (${P.length} steps)`),M&&xe(M),y&&console.log(` video: ${y}`),console.log()}catch(d){if(r&&!M)try{M=await u.stopProfile()}catch{}if(F&&!y)try{y=await u.stopRecording(),C=u.getLastRecordingDurationMs()}catch(c){console.warn(` recording stop failed: ${c?.message||String(c)}`)}console.error(`
301
301
  x failed: ${d.message}
302
302
  `),M&&(console.log(" partial profile:"),xe(M)),y&&console.log(` partial video: ${y}`);try{let c=u.lastFailedStep,v=c?`step-${String(c.index+1).padStart(2,"0")}-${c.kind}`:"unstaged",N=g.join(n,v);await u.captureFailureBundle(N,{error:d,stepIndex:c?.index,stepKind:c?.kind,stepTarget:c?.target}),console.log(` failure bundle: ${N}`),console.log(" (contents: screenshot.png, describe.json, a11y.txt, tree.txt, console.json, error.json)")}catch(c){try{let v=g.join(n,"error.png");await u.captureFailureScreenshot(v),console.log(` error screenshot: ${v}`)}catch{}console.log(` (failure bundle capture failed: ${c instanceof Error?c.message:String(c)})`)}await ce(T,{errorsCommand:`sootsim get errors 5${u.browserId?` --session ${u.browserId}`:""}`,warningsCommand:`sootsim get warnings 5${u.browserId?` --session ${u.browserId}`:""}`,requestsCommand:`sootsim get requests 5${u.browserId?` --session ${u.browserId}`:""}`}),D=1}finally{T.close()}if(D===0&&b)try{let d=await Ve(J??[]),c=["--origin",j,"--events",d];y&&c.push("--video",y),y&&C&&Number.isFinite(C)&&c.push("--video-duration-ms",String(Math.round(C))),u.browserId&&c.push("--session",u.browserId),Me&&c.push("--open"),console.log(`
303
- preparing preview upload\u2026`);let{runUpload:v}=await import("./upload-KPP7KG6E.js");await v(c,{})}catch(d){console.error(` preview upload failed: ${d?.message||d}`),D=1}return await q(),D}async function Ve(s){let{gzipSync:e}=await import("zlib"),t=s.map(i=>JSON.stringify(i)).join(`
303
+ preparing preview upload\u2026`);let{runUpload:v}=await import("./upload-Y6FZ5XF2.js");await v(c,{})}catch(d){console.error(` preview upload failed: ${d?.message||d}`),D=1}return await q(),D}async function Ve(s){let{gzipSync:e}=await import("zlib"),t=s.map(i=>JSON.stringify(i)).join(`
304
304
  `)+(s.length?`
305
305
  `:""),r=e(Buffer.from(t,"utf8")),o=g.join(Te(),`sootsim-events-${Date.now()}.jsonl.gz`);return $.writeFileSync(o,r),console.log(` events: ${s.length} written to ${o} (${r.length} bytes gz)`),o}async function Ue(s){let e=s[0],t=r=>s.find((o,i)=>s[i-1]===r);switch(e){case"start":{let{path:r,state:o}=de();console.log(" flow draft started"),console.log(` session: ${r}`),console.log(` steps: ${o.steps.length}`);return}case"keep":case"good":{let r=ue();if(r.active||(console.error(" no active flow draft \u2014 run `sootsim flow start` first"),process.exit(1)),!r.kept){console.log(" no pending action to keep");return}console.log(` kept: ${r.candidate.summary}`),console.log(` steps: ${r.stepCount}`);return}case"end":{let r=t("--output")||(s[1]&&!s[1].startsWith("-")?s[1]:void 0),o=s.includes("--validate")||s.includes("--video"),i=s.includes("--video"),n=fe(r||(o?je():void 0));if(n.active||(console.error(" no active flow draft \u2014 run `sootsim flow start` first"),process.exit(1)),o){let l=Le(s,n.outputPath),a=await ke(l);if(a!==0){console.error(`
306
306
  validation failed \u2014 draft preserved so you can keep iterating`),process.exitCode=a;return}H(),console.log(` flow draft validated (${n.stepCount} step${n.stepCount===1?"":"s"})`),n.outputPath&&console.log(` saved: ${n.outputPath}`),i&&console.log(" video: recorded during validation run");return}if(H(),console.log(` flow draft ended (${n.stepCount} step${n.stepCount===1?"":"s"})`),n.outputPath){console.log(` saved: ${n.outputPath}`),console.log(` next: sootsim flow ${n.outputPath} --record`);return}console.log(""),process.stdout.write(n.yaml);return}case"validate":{let r=s[1];(!r||r.startsWith("-"))&&(console.error(" usage: sootsim flow validate <path>"),process.exit(1));let o=We(r);if(o.length>0){console.error(` x ${r} failed validation:`);for(let i of o)console.error(` - ${i}`);process.exit(1)}console.log(` + ${r} looks valid`);return}}}var Fe=new Set(["tapOn","inputText","pressKey","dispatchKey","hideKeyboard","swipe","pinch","scroll","scrollUntilVisible"]);function We(s){let e=[];if(!$.existsSync(s))return[`file not found: ${s}`];let t;try{t=$.readFileSync(s,"utf8")}catch(i){return[`cannot read file: ${i.message}`]}if(t.trim().length===0)return["file is empty"];let r;try{r=$e(t)}catch(i){return[`yaml parse error: ${i.message}`]}if(!Array.isArray(r.steps)||r.steps.length===0)return e.push("flow body must be a non-empty YAML array of steps"),e;let o=0;for(let i=0;i<r.steps.length;i++){let n=r.steps[i];n&&typeof n=="object"?Object.keys(n).some(a=>Fe.has(a))&&(o+=1):typeof n=="string"&&Fe.has(n)&&(o+=1)}return o===0&&e.push("no interaction steps found (expected at least one tapOn / inputText / pressKey / swipe / scroll)"),e}async function lt(s){let e=s[0];if(e==="start"||e==="keep"||e==="good"||e==="end"||e==="validate")return await Ue(s),0;let t=await ke(s);return t!==0&&(process.exitCode=t),t}function xe(s){let e=s.avgMs>0?(1e3/s.avgMs).toFixed(1):"?",t=s.sampleCount>0?(s.jankFrames/s.sampleCount*100).toFixed(1):"0";console.log(`
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{h as s,p as a}from"./chunk-CXTA5VGA.js";import{spawn as l}from"child_process";import{existsSync as f}from"fs";import{WebSocket as d}from"ws";async function w(){let e=a();if(e&&f(s(e)))return;console.log(" first run \u2014 installing sootsim engine runtime (~6 MB)...");let{runRuntime:o}=await import("./runtime-JTLZYEXK.js");await o(["install"],{})}async function p(e=7668,o=5e3){if(await m(e,250))return;console.log(" starting sootsim bridge..."),l(process.execPath,[process.argv[1],"server","--quiet"],{detached:!0,stdio:"ignore"}).unref();let n=Date.now()+o;for(;Date.now()<n;){if(await m(e,200))return;await new Promise(t=>setTimeout(t,100))}throw new Error(`sootsim bridge failed to come up within ${o}ms \u2014 try \`sootsim server\` to debug`)}async function y(e=7668){await w(),await p(e)}function m(e,o){return new Promise(i=>{let n=new d(`ws://127.0.0.1:${e}`,{handshakeTimeout:o}),t=!1,r=u=>{if(!t){t=!0;try{n.close()}catch{}i(u)}};n.once("open",()=>r(!0)),n.once("error",()=>r(!1)),setTimeout(()=>r(!1),o)})}export{w as a,p as b,y as c};
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{h as s,p as a}from"./chunk-EQ7G3UHS.js";import{spawn as l}from"child_process";import{existsSync as f}from"fs";import{WebSocket as d}from"ws";async function w(){let e=a();if(e&&f(s(e)))return;console.log(" first run \u2014 installing sootsim engine runtime (~6 MB)...");let{runRuntime:o}=await import("./runtime-Z2WIXYUN.js");await o(["install"],{})}async function p(e=7668,o=5e3){if(await m(e,250))return;console.log(" starting sootsim bridge..."),l(process.execPath,[process.argv[1],"server","--quiet"],{detached:!0,stdio:"ignore"}).unref();let n=Date.now()+o;for(;Date.now()<n;){if(await m(e,200))return;await new Promise(t=>setTimeout(t,100))}throw new Error(`sootsim bridge failed to come up within ${o}ms \u2014 try \`sootsim server\` to debug`)}async function y(e=7668){await w(),await p(e)}function m(e,o){return new Promise(i=>{let n=new d(`ws://127.0.0.1:${e}`,{handshakeTimeout:o}),t=!1,r=u=>{if(!t){t=!0;try{n.close()}catch{}i(u)}};n.once("open",()=>r(!0)),n.once("error",()=>r(!1)),setTimeout(()=>r(!1),o)})}export{w as a,p as b,y as c};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-K7LDP7JL.js";import{existsSync as x,readFileSync as j}from"fs";import{resolve as g}from"path";async function P(s){(s.includes("--help")||s.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import"./chunk-P5C3UASK.js";import{existsSync as x,readFileSync as j}from"fs";import{resolve as g}from"path";async function P(s){(s.includes("--help")||s.includes("-h"))&&(console.log(`
3
3
  sootsim compat \u2014 check package compatibility
4
4
 
5
5
  usage:
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-K7LDP7JL.js";import{existsSync as i,writeFileSync as n,readFileSync as c}from"fs";import{resolve as t}from"path";async function a(s){let e=s[0];switch((!e||s.includes("--help")||s.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import"./chunk-P5C3UASK.js";import{existsSync as i,writeFileSync as n,readFileSync as c}from"fs";import{resolve as t}from"path";async function a(s){let e=s[0];switch((!e||s.includes("--help")||s.includes("-h"))&&(console.log(`
3
3
  sootsim config \u2014 manage sootsim configuration
4
4
 
5
5
  usage:
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m}from"./chunk-BU3TZP4Y.js";import"./chunk-REYWQVAH.js";import"./chunk-SUZR2SZZ.js";import"./chunk-USRNDVQ3.js";import"./chunk-WUYJFYOW.js";import"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-2FPPPJE5.js";import"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.js";export{d as buildOpenUrl,c as buildShellUrl,f as printConnectedBrowsers,a as resolveBundleTarget,b as resolveDefaultShellBaseUrl,l as runClaimCommand,m as runCloseCommand,k as runFocusCommand,h as runListCommand,i as runOpenCommand,j as runUseCommand,e as summarizeBrowserUrl,g as waitForBrowserMatch};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-EIZCWDRE.js";import"./chunk-K7LDP7JL.js";import{execFileSync as k,spawnSync as o}from"child_process";import{existsSync as i,mkdirSync as d,readFileSync as v,rmSync as f,writeFileSync as y}from"fs";import{homedir as p}from"os";import{dirname as $,resolve as c}from"path";var l="dev.sootsim.server",a="sootsim-server",u=c(p(),"Library/Logs/sootsim"),b=c(p(),".local/state/sootsim");async function F(t,s={}){let[r,...e]=t,n=s.port??7668;if(!r||r==="--help"||r==="-h"){h();return}switch(r){case"install":return P({port:n,force:e.includes("--force")});case"uninstall":return D();case"status":return E();case"restart":return I();case"start":return A();case"stop":return R();default:console.error(` unknown daemon subcommand: ${r}`),h(),process.exit(1)}}function h(){console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import"./chunk-LV5U7TI4.js";import"./chunk-P5C3UASK.js";import{execFileSync as k,spawnSync as o}from"child_process";import{existsSync as i,mkdirSync as d,readFileSync as v,rmSync as f,writeFileSync as y}from"fs";import{homedir as p}from"os";import{dirname as $,resolve as c}from"path";var l="dev.sootsim.server",a="sootsim-server",u=c(p(),"Library/Logs/sootsim"),b=c(p(),".local/state/sootsim");async function F(t,s={}){let[r,...e]=t,n=s.port??7668;if(!r||r==="--help"||r==="-h"){h();return}switch(r){case"install":return P({port:n,force:e.includes("--force")});case"uninstall":return D();case"status":return E();case"restart":return I();case"start":return A();case"stop":return R();default:console.error(` unknown daemon subcommand: ${r}`),h(),process.exit(1)}}function h(){console.log(`
3
3
  sootsim daemon \u2014 manage the sootsim bridge as a login agent
4
4
 
5
5
  usage:
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{d as f}from"./chunk-HORCHQT7.js";import{b as N}from"./chunk-TGDP3D3V.js";import{c as v,e as $,g as S}from"./chunk-FUQ4XA6I.js";import"./chunk-XXUAOYYT.js";import"./chunk-EIZCWDRE.js";import"./chunk-CXTA5VGA.js";import"./chunk-K7LDP7JL.js";var A=["portals","sheets","layout","onlayout","animated","render","touch","yoga","all"],x="__sootsimShellAnimationTrace",R="__sootsimDebugAnimation";function D(){console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{d as f}from"./chunk-FTRI7SVV.js";import{b as N}from"./chunk-SUZR2SZZ.js";import{c as v,e as $,g as S}from"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-P5C3UASK.js";var A=["portals","sheets","layout","onlayout","animated","render","touch","yoga","all"],x="__sootsimShellAnimationTrace",R="__sootsimDebugAnimation";function D(){console.log(`
3
3
  sootsim debug \u2014 drive __sootsimDebug from the terminal
4
4
 
5
5
  usage:
@@ -167,7 +167,7 @@ examples:
167
167
  } : null,
168
168
  samples,
169
169
  }
170
- })()`}async function l(i,c){return S(i,c)}async function z(i,c){let g=v(i,{port:c.port,stripBooleanFlags:["--pretty","--json","--help","-h"]}),m=g.positional;(!m[0]||i.includes("--help")||i.includes("-h"))&&(D(),process.exit(0));let C=g.wsPort,k=g.browserId,n=!i.includes("--json"),y=k?` --session ${k}`:"",_=m[0],a=m.slice(1);if(new Set(["state","js","eval","perf","sample-color"]).has(_)){let{runInspect:e}=await import("./inspect-FGTUAK4C.js");await e(["debug",...i],{port:c.port,verbose:c.verbose});return}let o=$(g);try{switch(_){case"enable":{let e=O(a[0]);e.length===0&&(console.error(` usage: sootsim debug enable <channel[,channel,...]>
170
+ })()`}async function l(i,c){return S(i,c)}async function z(i,c){let g=v(i,{port:c.port,stripBooleanFlags:["--pretty","--json","--help","-h"]}),m=g.positional;(!m[0]||i.includes("--help")||i.includes("-h"))&&(D(),process.exit(0));let C=g.wsPort,k=g.browserId,n=!i.includes("--json"),y=k?` --session ${k}`:"",_=m[0],a=m.slice(1);if(new Set(["state","js","eval","perf","sample-color"]).has(_)){let{runInspect:e}=await import("./inspect-DSU6ELRM.js");await e(["debug",...i],{port:c.port,verbose:c.verbose});return}let o=$(g);try{switch(_){case"enable":{let e=O(a[0]);e.length===0&&(console.error(` usage: sootsim debug enable <channel[,channel,...]>
171
171
  known: ${A.join(", ")}`),process.exit(1));let t=e.map(u=>JSON.stringify(u)).join(", "),s=await l(o,`window.__sootsimDebug.enable(${t})`);console.log(r({active:s},n));break}case"disable":{let e=O(a[0]),t=e.length>0?e.map(u=>JSON.stringify(u)).join(", "):"'all'",s=await l(o,`window.__sootsimDebug.disable(${t})`);console.log(r({active:s},n));break}case"toggle":{let e=a[0];e||(console.error(" usage: sootsim debug toggle <channel>"),process.exit(1));let t=await l(o,`window.__sootsimDebug.toggle(${JSON.stringify(e)})`);console.log(r({[e]:t},n));break}case"status":{let e=await l(o,"window.__sootsimDebug.status()");console.log(r(e,n));break}case"channels":{let e=await l(o,"window.__sootsimDebug.channels()");console.log(r(e,n));break}case"flags":{let e=await l(o,"window.__sootsimDebug.flags()");console.log(r(e,n));break}case"snapshot":{let e=a[0],t=e?`window.__sootsimDebug.snapshot(${JSON.stringify(e)})`:"window.__sootsimDebug.snapshot()",s=await l(o,`(() => { const s = ${t}; if (!s) return null; return { label: s.label, at: s.at, size: s.nodes.size }; })()`);console.log(r(s,n));break}case"snapshots":{let e=await l(o,"window.__sootsimDebug.snapshots()");console.log(r(e,n));break}case"diff":{let e=a[0],t=a[1];(!e||!t)&&(console.error(" usage: sootsim debug diff <labelA> <labelB>"),process.exit(1));let s=`(() => {
172
172
  const d = window.__sootsimDebug.diff(${JSON.stringify(e)}, ${JSON.stringify(t)});
173
173
  if (!d) return null;
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a}from"./chunk-O2HBPZW5.js";import"./chunk-P5C3UASK.js";export{a as APPS};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{b as S}from"./chunk-4372UQHZ.js";import"./chunk-EWEKADK4.js";import"./chunk-GQUOQNTP.js";import"./chunk-5C5I5OFM.js";import"./chunk-4GWEO5CL.js";import"./chunk-NHA3G6A3.js";import"./chunk-TSZBQS6W.js";import"./chunk-CZZB4DWG.js";import"./chunk-NE62JSI6.js";import"./chunk-ET3NNZAR.js";import"./chunk-HBNVKYSC.js";import"./chunk-ISAMAM3I.js";import"./chunk-EWMYTXM2.js";import"./chunk-6IPY24VM.js";import"./chunk-AS4V7TZU.js";import"./chunk-TGDP3D3V.js";import"./chunk-LXCFGKL2.js";import"./chunk-3HBBSRLE.js";import"./chunk-FUQ4XA6I.js";import"./chunk-XXUAOYYT.js";import"./chunk-EIZCWDRE.js";import"./chunk-CXTA5VGA.js";import"./chunk-YVSZHVLU.js";import"./chunk-B5R4K2DG.js";import"./chunk-K7LDP7JL.js";import{spawn as b}from"child_process";import{existsSync as u,mkdirSync as D,writeFileSync as f,unlinkSync as _}from"fs";import{tmpdir as I}from"os";import{dirname as P,resolve as i,join as $}from"path";function M(){try{let e=import.meta.resolve("sootsim/detox");return P(e.startsWith("file://")?e.slice(7):e)}catch{return i(import.meta.dirname,"..","..","detox")}}var E=`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{b as S}from"./chunk-XJBPH4JR.js";import"./chunk-5IPP4HAW.js";import"./chunk-BYLX2DO4.js";import"./chunk-3K6VDPVD.js";import"./chunk-3WPAEUOO.js";import"./chunk-O2HBPZW5.js";import"./chunk-EEBR5YP5.js";import"./chunk-X2W4IRXK.js";import"./chunk-3SLEIN6B.js";import"./chunk-OG5CKIPC.js";import"./chunk-D4JFMCXD.js";import"./chunk-CQ6PX2EU.js";import"./chunk-UZL5ZZ4E.js";import"./chunk-BU3TZP4Y.js";import"./chunk-REYWQVAH.js";import"./chunk-SUZR2SZZ.js";import"./chunk-USRNDVQ3.js";import"./chunk-WUYJFYOW.js";import"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-2FPPPJE5.js";import"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.js";import{spawn as b}from"child_process";import{existsSync as u,mkdirSync as D,writeFileSync as f,unlinkSync as _}from"fs";import{tmpdir as I}from"os";import{dirname as P,resolve as i,join as $}from"path";function M(){try{let e=import.meta.resolve("sootsim/detox");return P(e.startsWith("file://")?e.slice(7):e)}catch{return i(import.meta.dirname,"..","..","detox")}}var E=`
3
3
  sootsim detox \u2014 run detox-style tests against a sootsim shell
4
4
 
5
5
  usage:
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import"./chunk-4GWEO5CL.js";import"./chunk-ET3NNZAR.js";import"./chunk-HBNVKYSC.js";import{f as c,g as r,h as g}from"./chunk-ISAMAM3I.js";import{c as d,e as l,h as a}from"./chunk-FUQ4XA6I.js";import"./chunk-XXUAOYYT.js";import"./chunk-EIZCWDRE.js";import"./chunk-CXTA5VGA.js";import"./chunk-K7LDP7JL.js";function h(){console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import"./chunk-3WPAEUOO.js";import"./chunk-OG5CKIPC.js";import"./chunk-D4JFMCXD.js";import{f as c,g as r,h as g}from"./chunk-CQ6PX2EU.js";import{c as d,e as l,h as a}from"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-P5C3UASK.js";function h(){console.log(`
3
3
  sootsim device \u2014 inspect or change the live device preset for a session
4
4
 
5
5
  usage:
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import"./chunk-CPMW2QLM.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-2FPPPJE5.js";import"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.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,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as m}from"./chunk-RJUBGX5M.js";import"./chunk-XKDQEYTE.js";import{a as u,d as a}from"./chunk-6IPY24VM.js";import"./chunk-AS4V7TZU.js";import"./chunk-TGDP3D3V.js";import"./chunk-LXCFGKL2.js";import"./chunk-3HBBSRLE.js";import"./chunk-FUQ4XA6I.js";import"./chunk-XXUAOYYT.js";import"./chunk-EIZCWDRE.js";import"./chunk-CXTA5VGA.js";import{b as d,g as p}from"./chunk-YVSZHVLU.js";import{a as l}from"./chunk-B5R4K2DG.js";import"./chunk-K7LDP7JL.js";function g(e){let n=e.indexOf("--port");if(n<0)return;let r=e[n+1],i=r?Number(r):Number.NaN;return(!Number.isInteger(i)||i<=0)&&(console.error(` invalid --port value: ${r||"(missing)"}`),process.exit(1)),i}async function h(e,n){let r=g(e)??n.port;return r?a(String(r)):void 0}async function P(e,n){(e.includes("--help")||e.includes("-h"))&&(console.log(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as m}from"./chunk-VI3VW5BL.js";import"./chunk-CPMW2QLM.js";import{a as u,d as a}from"./chunk-BU3TZP4Y.js";import"./chunk-REYWQVAH.js";import"./chunk-SUZR2SZZ.js";import"./chunk-USRNDVQ3.js";import"./chunk-WUYJFYOW.js";import"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import{b as d,g as p}from"./chunk-2FPPPJE5.js";import{a as l}from"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.js";function g(e){let n=e.indexOf("--port");if(n<0)return;let r=e[n+1],i=r?Number(r):Number.NaN;return(!Number.isInteger(i)||i<=0)&&(console.error(` invalid --port value: ${r||"(missing)"}`),process.exit(1)),i}async function h(e,n){let r=g(e)??n.port;return r?a(String(r)):void 0}async function P(e,n){(e.includes("--help")||e.includes("-h"))&&(console.log(`
3
3
  sootsim electron \u2014 launch the desktop companion
4
4
 
5
5
  usage:
@@ -12,4 +12,4 @@ options:
12
12
  examples:
13
13
  sootsim electron
14
14
  sootsim electron --port 5173
15
- `),process.exit(0));let r=e.indexOf("--driver"),t=(r>=0?e[r+1]:void 0)||n.driver,s=d;if(t){let o=p(t);o||(console.error(` unknown driver "${t}" \u2014 run \`sootsim list --drivers\``),process.exit(1)),s=o}if(s.id==="electron"){let o=l();if(!o){if(u(),process.stdin.isTTY&&process.env.CI!=="1"&&process.env.SOOTSIM_NO_PROMPT!=="1"&&await m("run sootsim install-desktop now?",!0)){console.log();let{runInstallDesktop:v}=await import("./install-desktop-U3RQ6XUX.js");await v(["--yes"]),o=l()}o||process.exit(1)}console.log(` launching ${o.path}`)}let f=await h(e,n),c=await s.launch({url:f,device:n.device});c.launched||(console.error(` ${c.message}`),process.exit(1)),console.log(` ${c.message}`)}export{h as resolveElectronLaunchUrl,P as runElectron};
15
+ `),process.exit(0));let r=e.indexOf("--driver"),t=(r>=0?e[r+1]:void 0)||n.driver,s=d;if(t){let o=p(t);o||(console.error(` unknown driver "${t}" \u2014 run \`sootsim list --drivers\``),process.exit(1)),s=o}if(s.id==="electron"){let o=l();if(!o){if(u(),process.stdin.isTTY&&process.env.CI!=="1"&&process.env.SOOTSIM_NO_PROMPT!=="1"&&await m("run sootsim install-desktop now?",!0)){console.log();let{runInstallDesktop:v}=await import("./install-desktop-SC3LNFFF.js");await v(["--yes"]),o=l()}o||process.exit(1)}console.log(` launching ${o.path}`)}let f=await h(e,n),c=await s.launch({url:f,device:n.device});c.launched||(console.error(` ${c.message}`),process.exit(1)),console.log(` ${c.message}`)}export{h as resolveElectronLaunchUrl,P as runElectron};
@@ -0,0 +1,2 @@
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a,b,c,d}from"./chunk-XJBPH4JR.js";import"./chunk-5IPP4HAW.js";import"./chunk-BYLX2DO4.js";import"./chunk-3K6VDPVD.js";import"./chunk-3WPAEUOO.js";import"./chunk-O2HBPZW5.js";import"./chunk-EEBR5YP5.js";import"./chunk-X2W4IRXK.js";import"./chunk-3SLEIN6B.js";import"./chunk-OG5CKIPC.js";import"./chunk-D4JFMCXD.js";import"./chunk-CQ6PX2EU.js";import"./chunk-UZL5ZZ4E.js";import"./chunk-BU3TZP4Y.js";import"./chunk-REYWQVAH.js";import"./chunk-SUZR2SZZ.js";import"./chunk-USRNDVQ3.js";import"./chunk-WUYJFYOW.js";import"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-2FPPPJE5.js";import"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.js";export{b as discoverSootsimUrl,a as parseFlowFile,d as runFlow,c as runFlowPlayback};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{b as t,c as r,d as l}from"./chunk-K6YUSCAC.js";import"./chunk-XXUAOYYT.js";import"./chunk-K7LDP7JL.js";function a(n){let s=n[0]??"list";if(s==="reset"){n[1]==="global"?(r(),console.log(" cleared global hint state")):(t(),console.log(" cleared hint state for this session"));return}if(s==="list"){let e=l();if(!e.length){console.log(" no hints registered");return}let i=Math.max(...e.map(o=>o.id.length));console.log(" registered hints:");for(let o of e){let c=typeof o.frequency=="string"?o.frequency:`cooldown ${o.frequency.cooldownMs}ms`;console.log(` ${o.id.padEnd(i)} ${c}`)}console.log(""),console.log(" env overrides:"),console.log(" SOOTSIM_HINTS=off suppress all hints"),console.log(" SOOTSIM_HINTS=always show every hint every time");return}console.error(` unknown subcommand: ${s}`),console.error(" usage:"),console.error(" sootsim hints list show registered hints"),console.error(" sootsim hints reset [global] clear shown-state"),process.exit(1)}export{a as runHints};
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{b as t,c as r,d as l}from"./chunk-H3JVJXOC.js";import"./chunk-RLS6PHBW.js";import"./chunk-P5C3UASK.js";function a(n){let s=n[0]??"list";if(s==="reset"){n[1]==="global"?(r(),console.log(" cleared global hint state")):(t(),console.log(" cleared hint state for this session"));return}if(s==="list"){let e=l();if(!e.length){console.log(" no hints registered");return}let i=Math.max(...e.map(o=>o.id.length));console.log(" registered hints:");for(let o of e){let c=typeof o.frequency=="string"?o.frequency:`cooldown ${o.frequency.cooldownMs}ms`;console.log(` ${o.id.padEnd(i)} ${c}`)}console.log(""),console.log(" env overrides:"),console.log(" SOOTSIM_HINTS=off suppress all hints"),console.log(" SOOTSIM_HINTS=always show every hint every time");return}console.error(` unknown subcommand: ${s}`),console.error(" usage:"),console.error(" sootsim hints list show registered hints"),console.error(" sootsim hints reset [global] clear shown-state"),process.exit(1)}export{a as runHints};
@@ -1,2 +1,2 @@
1
- /*! sootsim v0.0.2 | (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,s,t,u,v,w,x,y}from"./chunk-CXTA5VGA.js";import"./chunk-K7LDP7JL.js";export{b as ACTIVE_RUNTIME_FILE,d as CONFIG_FILE,e as DAEMON_HEARTBEAT_STALE_MS,c as DAEMON_LOCKFILE,a as SOOTSIM_HOME_ENV,t as activeRuntimeDir,i as activeRuntimeFile,l as cacheDir,x as claimDaemonLockfile,s as compareSemver,n as configFilePath,m as daemonLockfilePath,j as electronDir,k as electronVersionDir,o as ensureSootsimHome,v as isDaemonLockfileFresh,r as listInstalledRuntimes,p as readActiveRuntime,u as readDaemonLockfile,y as removeDaemonLockfile,h as runtimeDir,g as runtimesDir,f as sootsimHomeDir,q as writeActiveRuntime,w as writeDaemonLockfile};
1
+ /*! sootsim v0.0.3 | (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,s,t,u,v,w,x,y}from"./chunk-EQ7G3UHS.js";import"./chunk-P5C3UASK.js";export{b as ACTIVE_RUNTIME_FILE,d as CONFIG_FILE,e as DAEMON_HEARTBEAT_STALE_MS,c as DAEMON_LOCKFILE,a as SOOTSIM_HOME_ENV,t as activeRuntimeDir,i as activeRuntimeFile,l as cacheDir,x as claimDaemonLockfile,s as compareSemver,n as configFilePath,m as daemonLockfilePath,j as electronDir,k as electronVersionDir,o as ensureSootsimHome,v as isDaemonLockfileFresh,r as listInstalledRuntimes,p as readActiveRuntime,u as readDaemonLockfile,y as removeDaemonLockfile,h as runtimeDir,g as runtimesDir,f as sootsimHomeDir,q as writeActiveRuntime,w as writeDaemonLockfile};
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as U}from"./chunk-K6YUSCAC.js";import{a as Ne,b as _e}from"./chunk-LOV766MI.js";import{a as Y,b as E,c as C,d as z,e as ie,f as V,g as te,h as Ie,i as Fe,j as fe}from"./chunk-HORCHQT7.js";import{a as Te,e as ae}from"./chunk-EWMYTXM2.js";import{a as me,c as pe,d as xe}from"./chunk-DW54UPRZ.js";import{g as Ae}from"./chunk-6IPY24VM.js";import"./chunk-AS4V7TZU.js";import{a as Me}from"./chunk-TGDP3D3V.js";import"./chunk-LXCFGKL2.js";import{a as we}from"./chunk-3HBBSRLE.js";import{c as $e,e as Se,f as ke,h as ve}from"./chunk-FUQ4XA6I.js";import"./chunk-XXUAOYYT.js";import"./chunk-EIZCWDRE.js";import"./chunk-CXTA5VGA.js";import"./chunk-YVSZHVLU.js";import"./chunk-B5R4K2DG.js";import"./chunk-K7LDP7JL.js";import{existsSync as ut,mkdirSync as mt,readFileSync as pt,rmSync as Pe,writeFileSync as ft}from"fs";import{tmpdir as gt}from"os";import{dirname as yt,join as bt,resolve as ht}from"path";var oe=1,wt="SOOTSIM_INSPECT_NOTICE_PATH",xt=300*1e3,$t=15e3;function Oe(){return ht(process.env[wt]||bt(gt(),"sootsim-inspect-notice-state.json"))}function St(o,c){return Object.fromEntries(Object.entries(o).filter(([,i])=>typeof i?.signature=="string"&&Number.isFinite(i?.updatedAt)&&c-i.updatedAt<=xt))}function kt(o){let c=Oe();if(!ut(c))return{version:oe,entries:{}};try{let i=JSON.parse(pt(c,"utf8"));return i.version!==oe||!i.entries||typeof i.entries!="object"?(Pe(c,{force:!0}),{version:oe,entries:{}}):{version:oe,entries:St(i.entries,o)}}catch{return Pe(c,{force:!0}),{version:oe,entries:{}}}}function vt(o){let c=Oe();mt(yt(c),{recursive:!0}),ft(c,JSON.stringify(o,null,2)+`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as U}from"./chunk-H3JVJXOC.js";import{a as Ne,b as _e}from"./chunk-AFTHIY3L.js";import{a as Y,b as E,c as C,d as z,e as ie,f as V,g as te,h as Ie,i as Fe,j as fe}from"./chunk-FTRI7SVV.js";import{a as Te,e as ae}from"./chunk-UZL5ZZ4E.js";import{a as me,c as pe,d as xe}from"./chunk-5AG24UFX.js";import{g as Ae}from"./chunk-BU3TZP4Y.js";import"./chunk-REYWQVAH.js";import{a as Me}from"./chunk-SUZR2SZZ.js";import"./chunk-USRNDVQ3.js";import{a as we}from"./chunk-WUYJFYOW.js";import{c as $e,e as Se,f as ke,h as ve}from"./chunk-4RYT6AQV.js";import"./chunk-RLS6PHBW.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-2FPPPJE5.js";import"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.js";import{existsSync as ut,mkdirSync as mt,readFileSync as pt,rmSync as Pe,writeFileSync as ft}from"fs";import{tmpdir as gt}from"os";import{dirname as yt,join as bt,resolve as ht}from"path";var oe=1,wt="SOOTSIM_INSPECT_NOTICE_PATH",xt=300*1e3,$t=15e3;function Oe(){return ht(process.env[wt]||bt(gt(),"sootsim-inspect-notice-state.json"))}function St(o,c){return Object.fromEntries(Object.entries(o).filter(([,i])=>typeof i?.signature=="string"&&Number.isFinite(i?.updatedAt)&&c-i.updatedAt<=xt))}function kt(o){let c=Oe();if(!ut(c))return{version:oe,entries:{}};try{let i=JSON.parse(pt(c,"utf8"));return i.version!==oe||!i.entries||typeof i.entries!="object"?(Pe(c,{force:!0}),{version:oe,entries:{}}):{version:oe,entries:St(i.entries,o)}}catch{return Pe(c,{force:!0}),{version:oe,entries:{}}}}function vt(o){let c=Oe();mt(yt(c),{recursive:!0}),ft(c,JSON.stringify(o,null,2)+`
3
3
  `)}function Tt(o,c){let i=c.trim()||"default";return`${o}:${i}`}function ge(o,c,i,d={}){let u=d.nowMs??Date.now(),a=d.cooldownMs??$t,b=kt(u),k=Tt(o,c),$=b.entries[k];return $&&$.signature===i&&u-$.updatedAt<a?!1:(b.entries[k]={signature:i,updatedAt:u},vt(b),!0)}async function Ee(o,c={args:[]}){let i=await o.send({type:"evaluate",code:"(async () => await window.__sootsimTest.getNodeCount())()"}),d=typeof i=="number"?i:0;if(E(c.args)){C({nodes:d});return}console.log(` nodes: ${d}`)}function ye(o,c){let i=o.indexOf(c);return i>=0&&i+1<o.length?o[i+1]:null}async function Re(o){let{bridge:c,args:i,positional:d}=o,u=i.includes("--verbose")||i.includes("-v"),a=E(i),b=u&&!a,k=i.includes("--watch")||i.includes("-w"),$=1e3,I=i.includes("--compact"),y=i.includes("--no-xy"),S=ye(i,"--testid-like"),A=ye(i,"--only"),v=ye(i,"--subtree"),j=d[1],l=j?/[*?]/.test(j):!1,R=!l&&!A?j:void 0,D=A??(l?j:void 0),q=async()=>{await ie(c,{verbose:b});let Z=`(async () => {
4
4
  const t = window.__sootsimTest
5
5
  const mainShell = window.SootSim?.bridges?.mainShell
@@ -227,7 +227,7 @@ import{a as U}from"./chunk-K6YUSCAC.js";import{a as Ne,b as _e}from"./chunk-LOV7
227
227
  `);console.log(`${t??""}
228
228
 
229
229
  ${s}
230
- `),process.exit(0)}let A=u.wsPort,v=u.browserId,j=u.commandTimeoutMs;if(b==="list"&&d.some(e=>e==="--drivers"||e==="-D")){let{buildDriverListRows:e}=await import("./drivers-EXUREU4B.js"),t=e();console.log(` available drivers (${t.length}):
230
+ `),process.exit(0)}let A=u.wsPort,v=u.browserId,j=u.commandTimeoutMs;if(b==="list"&&d.some(e=>e==="--drivers"||e==="-D")){let{buildDriverListRows:e}=await import("./drivers-GWDQEGWD.js"),t=e();console.log(` available drivers (${t.length}):
231
231
  `);let s=Math.max(...t.map(n=>n.id.length),6),r=Math.max(...t.map(n=>n.kind.length),4);for(let n of t){let m=n.available?"\u2713":"\u2717",p=n.id.padEnd(s),h=n.kind.padEnd(r);console.log(` ${m} ${p} ${h} ${n.description}`),n.available&&n.detail?console.log(` ${n.detail}`):!n.available&&n.reason&&console.log(` unavailable: ${n.reason}`)}return}let l=Se(u),R=v||"default",D=new Set(["errors","warnings","requests","js","eval","reload","globals","perf","list","wait","sleep"]);function q(e){let t=e.displayUrl||e.url;return e.status!=null?`${e.method} ${t} -> ${e.status}${e.statusText?` ${e.statusText}`:""}`:e.error?`${e.method} ${t} -> ${e.error}`:`${e.method} ${t}`}async function ne(e){let t=Ce()?1200:350;try{let{settled:s,elapsed:r}=await ee({bridge:e,maxMs:t,pollMs:32,stablePolls:2});s||process.stderr.write(` \u26A0 auto-wait timed out after ${r??t}ms \u2014 next command may see mid-animation state. use \`sootsim do settle\` for a longer wait.
232
232
  `)}catch{}}async function Z(){try{return await l.send({type:"evaluate",code:`(() => ({
233
233
  console: window.__sootsimConsole?.count?.() || null,
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as j,b as P}from"./chunk-RJUBGX5M.js";import{c as b}from"./chunk-NXWCDGWS.js";import"./chunk-EIZCWDRE.js";import"./chunk-CXTA5VGA.js";import"./chunk-K7LDP7JL.js";import{execSync as V}from"child_process";import{existsSync as w,readFileSync as C,writeFileSync as x}from"fs";import{relative as A,resolve as u}from"path";import{existsSync as a,readFileSync as d,readdirSync as O,statSync as L}from"fs";import{basename as R,dirname as T,join as c}from"path";function S(e){let n=e;for(;;){if(a(c(n,"turbo.json"))||a(c(n,"nx.json"))||a(c(n,"lerna.json"))||a(c(n,"pnpm-workspace.yaml")))return n;let s=c(n,"package.json");if(a(s))try{if(JSON.parse(d(s,"utf8")).workspaces)return n}catch{}let i=T(n);if(i===n)break;n=i}return e}function W(e){return a(c(e,"bun.lock"))||a(c(e,"bun.lockb"))?"bun":a(c(e,"pnpm-lock.yaml"))?"pnpm":a(c(e,"yarn.lock"))?"yarn":"npm"}function _(e){if(a(c(e,"turbo.json")))return"turbo";if(a(c(e,"nx.json")))return"nx";if(a(c(e,"pnpm-workspace.yaml")))return"pnpm";let n=c(e,"package.json");if(a(n))try{if(JSON.parse(d(n,"utf8")).workspaces)return"npm-workspaces"}catch{}return"single"}function J(e){return e.one?"one":e.expo?"expo":e["react-native"]?"bare":"unknown"}function y(e){let n=c(e,"package.json");if(!a(n))return null;let s;try{s=JSON.parse(d(n,"utf8"))}catch{return null}let i={...s.dependencies,...s.devDependencies},r=J(i);return r==="unknown"?null:{dir:e,name:s.name||R(e),framework:r,hasViteConfig:a(c(e,"vite.config.ts"))||a(c(e,"vite.config.js")),hasMetroConfig:a(c(e,"metro.config.js"))||a(c(e,"metro.config.ts")),hasSootsimDependency:!!i.sootsim,devCommand:s.scripts?.dev||null}}function N(e){let n=[],s=c(e,"pnpm-workspace.yaml");if(a(s)){let o=d(s,"utf8").match(/packages:\s*\n((?:\s+-\s+.+\n?)+)/);if(o){let t=o[1].split(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as j,b as P}from"./chunk-VI3VW5BL.js";import{c as b}from"./chunk-ZSRMXBGK.js";import"./chunk-LV5U7TI4.js";import"./chunk-EQ7G3UHS.js";import"./chunk-P5C3UASK.js";import{execSync as V}from"child_process";import{existsSync as w,readFileSync as C,writeFileSync as x}from"fs";import{relative as A,resolve as u}from"path";import{existsSync as a,readFileSync as d,readdirSync as O,statSync as L}from"fs";import{basename as R,dirname as T,join as c}from"path";function S(e){let n=e;for(;;){if(a(c(n,"turbo.json"))||a(c(n,"nx.json"))||a(c(n,"lerna.json"))||a(c(n,"pnpm-workspace.yaml")))return n;let s=c(n,"package.json");if(a(s))try{if(JSON.parse(d(s,"utf8")).workspaces)return n}catch{}let i=T(n);if(i===n)break;n=i}return e}function W(e){return a(c(e,"bun.lock"))||a(c(e,"bun.lockb"))?"bun":a(c(e,"pnpm-lock.yaml"))?"pnpm":a(c(e,"yarn.lock"))?"yarn":"npm"}function _(e){if(a(c(e,"turbo.json")))return"turbo";if(a(c(e,"nx.json")))return"nx";if(a(c(e,"pnpm-workspace.yaml")))return"pnpm";let n=c(e,"package.json");if(a(n))try{if(JSON.parse(d(n,"utf8")).workspaces)return"npm-workspaces"}catch{}return"single"}function J(e){return e.one?"one":e.expo?"expo":e["react-native"]?"bare":"unknown"}function y(e){let n=c(e,"package.json");if(!a(n))return null;let s;try{s=JSON.parse(d(n,"utf8"))}catch{return null}let i={...s.dependencies,...s.devDependencies},r=J(i);return r==="unknown"?null:{dir:e,name:s.name||R(e),framework:r,hasViteConfig:a(c(e,"vite.config.ts"))||a(c(e,"vite.config.js")),hasMetroConfig:a(c(e,"metro.config.js"))||a(c(e,"metro.config.ts")),hasSootsimDependency:!!i.sootsim,devCommand:s.scripts?.dev||null}}function N(e){let n=[],s=c(e,"pnpm-workspace.yaml");if(a(s)){let o=d(s,"utf8").match(/packages:\s*\n((?:\s+-\s+.+\n?)+)/);if(o){let t=o[1].split(`
3
3
  `).filter(Boolean);for(let g of t){let l=g.replace(/^\s*-\s*['"]?/,"").replace(/['"]?\s*$/,"");l&&n.push(...v(e,l))}}return n}let i=c(e,"package.json");if(a(i))try{let r=JSON.parse(d(i,"utf8")),o=Array.isArray(r.workspaces)?r.workspaces:r.workspaces?.packages||[];for(let t of o)n.push(...v(e,t))}catch{}return n}function v(e,n){let s=n.replace(/\/\*\*?$/,"").replace(/\*$/,""),i=c(e,s);if(!a(i))return[];try{return O(i).map(o=>c(i,o)).filter(o=>{try{return L(o).isDirectory()&&a(c(o,"package.json"))}catch{return!1}})}catch{return[]}}function D(e){let n=_(e),s=W(e);if(n==="single"){let t=y(e);return{root:e,type:n,packageManager:s,apps:t?[t]:[]}}let i=N(e),r=[],o=y(e);o&&r.push(o);for(let t of i){if(t===e)continue;let g=y(t);g&&r.push(g)}return{root:e,type:n,packageManager:s,apps:r}}function M(e){switch(e){case"bun":return"bun add -d sootsim";case"pnpm":return"pnpm add -D sootsim";case"yarn":return"yarn add -D sootsim";case"npm":return"npm install -D sootsim"}}async function re(e){(e.includes("--help")||e.includes("-h"))&&(console.log(`
4
4
  sootsim install \u2014 set up sootsim in your project
5
5
 
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as x}from"./chunk-RJUBGX5M.js";import{a as $}from"./chunk-B5R4K2DG.js";import"./chunk-K7LDP7JL.js";import{spawn as v,spawnSync as u}from"child_process";import{chmodSync as k,createWriteStream as S,existsSync as f,mkdirSync as y,renameSync as P,rmSync as w,statSync as T}from"fs";import{tmpdir as E}from"os";import{dirname as D,join as m,resolve as b}from"path";var h="https://sootbean.com/api/electron-release";function M(){let r=process.arch;if(process.platform==="darwin"){let o=r==="arm64"?"mac-arm64":"mac-x64",n=`sootsim-latest-${o}.dmg`;return{platform:o,filename:n,url:`${h}/${n}`,install:I}}if(process.platform==="linux"){let o="sootsim-latest-linux-x64.AppImage";return{platform:"linux-x64",filename:o,url:`${h}/${o}`,install:L}}if(process.platform==="win32"){let o="sootsim-latest-win-x64.exe";return{platform:"win-x64",filename:o,url:`${h}/${o}`,install:B}}return null}async function A({url:r,dest:o,onProgress:n}){let s=await fetch(r,{redirect:"follow"});if(!s.ok)throw new Error(`download failed: ${s.status} ${s.statusText} (${r})`);let e=s.headers.get("content-length"),l=e?Number(e):null;if(!s.body)throw new Error("download failed: empty response body");y(D(o),{recursive:!0});let i=S(o),d=s.body.getReader(),a=0;try{for(;;){let{done:t,value:c}=await d.read();if(t)break;i.write(Buffer.from(c)),a+=c.byteLength,n?.(a,l)}}finally{await new Promise((t,c)=>{i.end(p=>p?c(p):t())})}}function O(r,o){let n=(r/1048576).toFixed(1);if(!o)return` ${n} MB`;let s=Math.min(100,Math.round(r/o*100)),e=(o/(1024*1024)).toFixed(1),l=24,i=Math.round(s/100*l);return` ${"\u2588".repeat(i)+"\u2591".repeat(l-i)} ${s}% ${n} / ${e} MB`}async function I(r){let o=u("hdiutil",["attach","-nobrowse","-readonly",r],{encoding:"utf8"});if(o.status!==0)throw new Error(`hdiutil attach failed: ${o.stderr||o.stdout}`.trim());let n=o.stdout.trim().split(`
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as x}from"./chunk-VI3VW5BL.js";import{a as $}from"./chunk-46LRF7PH.js";import"./chunk-P5C3UASK.js";import{spawn as v,spawnSync as u}from"child_process";import{chmodSync as k,createWriteStream as S,existsSync as f,mkdirSync as y,renameSync as P,rmSync as w,statSync as T}from"fs";import{tmpdir as E}from"os";import{dirname as D,join as m,resolve as b}from"path";var h="https://sootbean.com/api/electron-release";function M(){let r=process.arch;if(process.platform==="darwin"){let o=r==="arm64"?"mac-arm64":"mac-x64",n=`sootsim-latest-${o}.dmg`;return{platform:o,filename:n,url:`${h}/${n}`,install:I}}if(process.platform==="linux"){let o="sootsim-latest-linux-x64.AppImage";return{platform:"linux-x64",filename:o,url:`${h}/${o}`,install:L}}if(process.platform==="win32"){let o="sootsim-latest-win-x64.exe";return{platform:"win-x64",filename:o,url:`${h}/${o}`,install:B}}return null}async function A({url:r,dest:o,onProgress:n}){let s=await fetch(r,{redirect:"follow"});if(!s.ok)throw new Error(`download failed: ${s.status} ${s.statusText} (${r})`);let e=s.headers.get("content-length"),l=e?Number(e):null;if(!s.body)throw new Error("download failed: empty response body");y(D(o),{recursive:!0});let i=S(o),d=s.body.getReader(),a=0;try{for(;;){let{done:t,value:c}=await d.read();if(t)break;i.write(Buffer.from(c)),a+=c.byteLength,n?.(a,l)}}finally{await new Promise((t,c)=>{i.end(p=>p?c(p):t())})}}function O(r,o){let n=(r/1048576).toFixed(1);if(!o)return` ${n} MB`;let s=Math.min(100,Math.round(r/o*100)),e=(o/(1024*1024)).toFixed(1),l=24,i=Math.round(s/100*l);return` ${"\u2588".repeat(i)+"\u2591".repeat(l-i)} ${s}% ${n} / ${e} MB`}async function I(r){let o=u("hdiutil",["attach","-nobrowse","-readonly",r],{encoding:"utf8"});if(o.status!==0)throw new Error(`hdiutil attach failed: ${o.stderr||o.stdout}`.trim());let n=o.stdout.trim().split(`
3
3
  `),e=n[n.length-1].split(" ").pop()?.trim();if(!e||!f(e))throw new Error(`could not determine dmg mount point (output: ${o.stdout})`);let l=m(e,"sootsim.app");if(!f(l))throw u("hdiutil",["detach","-force",e]),new Error(`sootsim.app not found inside ${e}`);let i="/Applications",d=b(process.env.HOME||"","Applications"),a=i;try{let g=m(i,`.sootsim-write-probe-${process.pid}`);u("touch",[g]),f(g)?w(g,{force:!0}):a=d}catch{a=d}a===d&&y(a,{recursive:!0});let t=m(a,"sootsim.app");f(t)&&w(t,{recursive:!0,force:!0});let c=u("cp",["-R",l,t]),p=u("hdiutil",["detach","-force",e]);if(c.status!==0)throw new Error(`copy to ${t} failed: ${c.stderr?.toString()||""}`.trim());return p.status!==0&&console.warn(` warning: failed to unmount ${e} (${p.stderr?.toString().trim()||"unknown error"})`),u("xattr",["-dr","com.apple.quarantine",t]),t}async function L(r){let o=b(process.env.HOME||"","Applications");y(o,{recursive:!0});let n=m(o,"sootsim.AppImage");return f(n)&&w(n,{force:!0}),P(r,n),k(n,493),n}async function B(r){return await new Promise((o,n)=>{let s=v("cmd",["/c","start",'""',"/wait",r],{stdio:"inherit"});s.once("error",n),s.once("exit",e=>{e===0?o():n(new Error(`installer exited with code ${e}`))})}),r}async function _(r){(r.includes("--help")||r.includes("-h"))&&(console.log(`
4
4
  sootsim install-desktop \u2014 download and install the optional desktop GUI
5
5
 
@@ -1,5 +1,5 @@
1
- /*! sootsim v0.0.2 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import{a as b}from"./chunk-RJUBGX5M.js";import"./chunk-K7LDP7JL.js";import{spawnSync as m}from"child_process";import{chmodSync as $,existsSync as u,mkdirSync as y,rmSync as N,writeFileSync as g,cpSync as B}from"fs";import{dirname as p,join as s,resolve as k}from"path";import{fileURLToPath as S}from"url";var C=p(S(import.meta.resolve("sootsim-engine/package.json"))),I="sootsim-dev",E="dev.sootsim.simulator.dev";function w(e){let n={yes:e.includes("--yes")||e.includes("-y")||process.env.SOOTSIM_NO_PROMPT==="1"||process.env.CI==="1"||!process.stdin.isTTY,force:e.includes("--force"),appName:I,bundleId:E};for(let o=0;o<e.length;o++){let t=e[o];t==="--name"&&e[o+1]?n.appName=e[++o]:t==="--bundle-id"&&e[o+1]?n.bundleId=e[++o]:t==="--path"&&e[o+1]&&(n.installRoot=e[++o])}return n}function T(e){let r=process.platform==="darwin"?"electron/dist/Electron.app/Contents/MacOS/Electron":process.platform==="win32"?"electron/dist/electron.exe":"electron/dist/electron",c=e;for(let l=0;l<6;l++){let d=s(c,"node_modules",r);if(u(d))return d;let i=p(c);if(i===c)break;c=i}return null}function D(e){if(e)return k(e);let n="/Applications",o=k(process.env.HOME||"","Applications");try{let t=s(n,`.sootsim-dev-write-probe-${process.pid}`);if(m("touch",[t]).status===0&&u(t))return N(t,{force:!0}),n}catch{}return y(o,{recursive:!0}),o}function L(e){return`<?xml version="1.0" encoding="UTF-8"?>
1
+ /*! sootsim v0.0.3 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import{a as b}from"./chunk-VI3VW5BL.js";import"./chunk-P5C3UASK.js";import{spawnSync as m}from"child_process";import{chmodSync as $,existsSync as u,mkdirSync as y,rmSync as N,writeFileSync as g,cpSync as B}from"fs";import{dirname as p,join as s,resolve as k}from"path";import{fileURLToPath as S}from"url";var C=p(S(import.meta.resolve("sootsim-engine/package.json"))),I="sootsim-dev",E="dev.sootsim.simulator.dev";function w(e){let n={yes:e.includes("--yes")||e.includes("-y")||process.env.SOOTSIM_NO_PROMPT==="1"||process.env.CI==="1"||!process.stdin.isTTY,force:e.includes("--force"),appName:I,bundleId:E};for(let o=0;o<e.length;o++){let t=e[o];t==="--name"&&e[o+1]?n.appName=e[++o]:t==="--bundle-id"&&e[o+1]?n.bundleId=e[++o]:t==="--path"&&e[o+1]&&(n.installRoot=e[++o])}return n}function T(e){let r=process.platform==="darwin"?"electron/dist/Electron.app/Contents/MacOS/Electron":process.platform==="win32"?"electron/dist/electron.exe":"electron/dist/electron",c=e;for(let l=0;l<6;l++){let d=s(c,"node_modules",r);if(u(d))return d;let i=p(c);if(i===c)break;c=i}return null}function D(e){if(e)return k(e);let n="/Applications",o=k(process.env.HOME||"","Applications");try{let t=s(n,`.sootsim-dev-write-probe-${process.pid}`);if(m("touch",[t]).status===0&&u(t))return N(t,{force:!0}),n}catch{}return y(o,{recursive:!0}),o}function L(e){return`<?xml version="1.0" encoding="UTF-8"?>
3
3
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
4
  <plist version="1.0">
5
5
  <dict>