sootsim 0.1.294 → 0.1.295

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 (149) hide show
  1. package/dist-cli/bin.js +5 -5
  2. package/dist-cli/chunks/{agent-GDFF6G7N.js → agent-ASAYE5YY.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-ZUKQUOD2.js → agent-wrapper-K2D4Q5AA.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-IMYBO6AQ.js → app-fonts-36N7AVQ3.js} +2 -2
  5. package/dist-cli/chunks/{assert-GXOGZUKO.js → assert-4FKHHDY7.js} +2 -2
  6. package/dist-cli/chunks/{auth-P7FAKLHQ.js → auth-BQPOPEFK.js} +2 -2
  7. package/dist-cli/chunks/{beta-RXT5RU3A.js → beta-3LNYONDF.js} +2 -2
  8. package/dist-cli/chunks/{camera-RNVAC4IO.js → camera-Y5MZ5V4L.js} +2 -2
  9. package/dist-cli/chunks/{chunk-7HVMAGDK.js → chunk-2RI6RC6I.js} +2 -2
  10. package/dist-cli/chunks/{chunk-D2R7PDN5.js → chunk-3WQISFAK.js} +1 -1
  11. package/dist-cli/chunks/{chunk-ZUX5PIGI.js → chunk-4NJIXTVJ.js} +1 -1
  12. package/dist-cli/chunks/{chunk-3F2GAJ4Z.js → chunk-4ODQVUBH.js} +1 -1
  13. package/dist-cli/chunks/{chunk-W44PDEQH.js → chunk-4V2KYK5T.js} +2 -2
  14. package/dist-cli/chunks/chunk-6VF477QO.js +4 -0
  15. package/dist-cli/chunks/{chunk-24BJFJFB.js → chunk-7FYIMLU4.js} +18 -18
  16. package/dist-cli/chunks/{chunk-WQL3BLFD.js → chunk-7GVBNEQ3.js} +1 -1
  17. package/dist-cli/chunks/{chunk-PZTKQG6H.js → chunk-7GZ6XF2B.js} +5 -5
  18. package/dist-cli/chunks/{chunk-O6I5ZGMY.js → chunk-BX2NUJGR.js} +1 -1
  19. package/dist-cli/chunks/{chunk-ZFMJFX27.js → chunk-COEKUTWV.js} +2 -2
  20. package/dist-cli/chunks/chunk-CVDC2ER2.js +10 -0
  21. package/dist-cli/chunks/{chunk-CTMPC5DN.js → chunk-D2DU3ROC.js} +2 -2
  22. package/dist-cli/chunks/{chunk-FSRRJGYC.js → chunk-DKS75M2I.js} +2 -2
  23. package/dist-cli/chunks/{chunk-XYFP466E.js → chunk-DXCQP3VE.js} +2 -2
  24. package/dist-cli/chunks/{chunk-FNCSUHUR.js → chunk-E6DZD6JD.js} +1 -1
  25. package/dist-cli/chunks/{chunk-VXGCZUX4.js → chunk-ETDZQUGI.js} +2 -2
  26. package/dist-cli/chunks/{chunk-4Z4URZOG.js → chunk-FH7DQ2HB.js} +2 -2
  27. package/dist-cli/chunks/{chunk-5S3GPTX7.js → chunk-HT6WYHQL.js} +2 -2
  28. package/dist-cli/chunks/{chunk-AMKQUZA2.js → chunk-I4QJVACX.js} +1 -1
  29. package/dist-cli/chunks/chunk-I7AWRAXM.js +125 -0
  30. package/dist-cli/chunks/{chunk-WYRLRNIP.js → chunk-JPPGM6RZ.js} +2 -2
  31. package/dist-cli/chunks/{chunk-JUOQ4ZPA.js → chunk-K7LQB4IF.js} +1 -1
  32. package/dist-cli/chunks/{chunk-OYYQQBKP.js → chunk-L7V46673.js} +1 -1
  33. package/dist-cli/chunks/{chunk-EXTV6NWM.js → chunk-MEYVMDZR.js} +2 -2
  34. package/dist-cli/chunks/{chunk-6YN3IAWJ.js → chunk-OQ7SSRYK.js} +1 -1
  35. package/dist-cli/chunks/{chunk-BBVBMGTT.js → chunk-QKZVANQG.js} +3 -3
  36. package/dist-cli/chunks/{chunk-ISJ4ACWL.js → chunk-QPA44BZC.js} +3 -3
  37. package/dist-cli/chunks/{chunk-BXO2PTNM.js → chunk-RNW36VM5.js} +2 -2
  38. package/dist-cli/chunks/{chunk-I233T2T4.js → chunk-RV67EC7L.js} +2 -2
  39. package/dist-cli/chunks/{chunk-AFLGWOX3.js → chunk-S6BEA6OC.js} +1 -1
  40. package/dist-cli/chunks/{chunk-DUHBRW7J.js → chunk-SU5WQ4SQ.js} +1 -1
  41. package/dist-cli/chunks/{chunk-KWIURH7N.js → chunk-T2DHHOWE.js} +2 -2
  42. package/dist-cli/chunks/{chunk-7Q77LTPT.js → chunk-TGYZYSDB.js} +2 -2
  43. package/dist-cli/chunks/{chunk-VVVORIQI.js → chunk-TNKZWHD2.js} +1 -1
  44. package/dist-cli/chunks/{chunk-37ZXWXM3.js → chunk-TXURXDZN.js} +1 -1
  45. package/dist-cli/chunks/{chunk-V2MYTL4C.js → chunk-U2QPKFOY.js} +2 -2
  46. package/dist-cli/chunks/{chunk-2M7OZ6Y4.js → chunk-UAZ3NVKO.js} +2 -2
  47. package/dist-cli/chunks/{chunk-RWUNC66S.js → chunk-UBIGBHUM.js} +2 -2
  48. package/dist-cli/chunks/{chunk-SLMUW2WU.js → chunk-UWFAWMPE.js} +2 -2
  49. package/dist-cli/chunks/{chunk-N4MT5KEB.js → chunk-WFYQNZTT.js} +3 -3
  50. package/dist-cli/chunks/{chunk-PSOUSJSZ.js → chunk-X5FTDIHQ.js} +1 -1
  51. package/dist-cli/chunks/{chunk-K53YCAQM.js → chunk-XCCDO6I2.js} +1 -1
  52. package/dist-cli/chunks/{chunk-DI55E6CS.js → chunk-XQRUWC3F.js} +2 -2
  53. package/dist-cli/chunks/{chunk-AO65WEF7.js → chunk-Y6FJ5FCY.js} +1 -1
  54. package/dist-cli/chunks/{chunk-SPQKJDIK.js → chunk-ZJZYGLJ2.js} +1 -1
  55. package/dist-cli/chunks/{cleanup-74SKOD2P.js → cleanup-SMCA44QC.js} +2 -2
  56. package/dist-cli/chunks/{cli-version-2JGMYL4O.js → cli-version-I6BOBK57.js} +2 -2
  57. package/dist-cli/chunks/{compat-ME6HXEEU.js → compat-FCM2ZQLV.js} +3 -3
  58. package/dist-cli/chunks/{config-PM67EWT3.js → config-PZSANSAI.js} +2 -2
  59. package/dist-cli/chunks/{control-HV7GZXAH.js → control-PM554MHE.js} +2 -2
  60. package/dist-cli/chunks/daemon-5KXEZZLJ.js +4 -0
  61. package/dist-cli/chunks/{debug-XUGWZLIW.js → debug-VG2JOF6H.js} +3 -3
  62. package/dist-cli/chunks/{desktop-IO5HPX5Z.js → desktop-GH2POW6X.js} +3 -3
  63. package/dist-cli/chunks/{detox-E42OEJJZ.js → detox-X6T265L5.js} +2 -2
  64. package/dist-cli/chunks/{device-XA67L2EB.js → device-VDOOSAXO.js} +2 -2
  65. package/dist-cli/chunks/{diagnose-36FD6ECF.js → diagnose-6D6WNAGL.js} +2 -2
  66. package/dist-cli/chunks/disk-cleanup-HTOIDDKK.js +4 -0
  67. package/dist-cli/chunks/drivers-CKLBQDXG.js +4 -0
  68. package/dist-cli/chunks/{film-XARTGFIZ.js → film-UZWYISAB.js} +3 -3
  69. package/dist-cli/chunks/flow-VOS3RKB3.js +4 -0
  70. package/dist-cli/chunks/help-LVMDERFQ.js +4 -0
  71. package/dist-cli/chunks/{hidden-runtime-alias-T4ZALBE2.js → hidden-runtime-alias-UGMJ4LJX.js} +2 -2
  72. package/dist-cli/chunks/{home-paths-5L7N2FLS.js → home-paths-3LYT47SY.js} +2 -2
  73. package/dist-cli/chunks/inspect-FHCSOWGQ.js +4 -0
  74. package/dist-cli/chunks/install-desktop-KLMCVDGZ.js +4 -0
  75. package/dist-cli/chunks/{login-GF6WVVER.js → login-K43TRKUC.js} +4 -4
  76. package/dist-cli/chunks/{logout-6F6UKUNI.js → logout-L43CR6M2.js} +2 -2
  77. package/dist-cli/chunks/{maestro-FMPKHEMX.js → maestro-7VZFYLNS.js} +3 -3
  78. package/dist-cli/chunks/{maestro-generate-QGPGNXI6.js → maestro-generate-PMYHUVH4.js} +3 -3
  79. package/dist-cli/chunks/{mode-JSNMAHDZ.js → mode-QQS5XFFX.js} +2 -2
  80. package/dist-cli/chunks/{optional-demo-registry-K4VERLJV.js → optional-demo-registry-2V327HDG.js} +2 -2
  81. package/dist-cli/chunks/{perf-PO7ARUTG.js → perf-CL5P3JVP.js} +2 -2
  82. package/dist-cli/chunks/{permissions-XI2QUAEZ.js → permissions-RGVCEC2B.js} +2 -2
  83. package/dist-cli/chunks/{record-4CJCJAFD.js → record-ASW6UFQT.js} +3 -3
  84. package/dist-cli/chunks/runtime-GB3ZE27C.js +4 -0
  85. package/dist-cli/chunks/{screenshot-command-NDVULWMZ.js → screenshot-command-FEJGQMQF.js} +3 -3
  86. package/dist-cli/chunks/{screenshots-capture-Q7UTXF3V.js → screenshots-capture-3JPZ5WMX.js} +2 -2
  87. package/dist-cli/chunks/{serve-UEUIBHCK.js → serve-SYXRHRQO.js} +2 -2
  88. package/dist-cli/chunks/{setup-ZEEWYK4B.js → setup-QLGL6MC6.js} +3 -3
  89. package/dist-cli/chunks/{skills-NFG6VAO5.js → skills-T6EEX5P6.js} +2 -2
  90. package/dist-cli/chunks/{storage-POWCOUCQ.js → storage-ZFUK4EQA.js} +2 -2
  91. package/dist-cli/chunks/store-WCDTSWJC.js +4 -0
  92. package/dist-cli/chunks/telemetry-D7SL4WW7.js +4 -0
  93. package/dist-cli/chunks/{timeline-MNHZCVAL.js → timeline-EIURYQVC.js} +2 -2
  94. package/dist-cli/chunks/{upgrade-X57SIG7L.js → upgrade-Q7ZGWMCJ.js} +2 -2
  95. package/dist-cli/chunks/upload-7XEICYJX.js +4 -0
  96. package/dist-cli/chunks/{version-V4IKIDX7.js → version-PDG4V26R.js} +2 -2
  97. package/dist-cli/chunks/web-AMW2TRWB.js +4 -0
  98. package/dist-cli/chunks/{what-happened-H74HHGRK.js → what-happened-L5ZN7S5G.js} +2 -2
  99. package/dist-lib/agent-daemon-client.cjs +2 -1
  100. package/dist-lib/agent-events.cjs +1 -1
  101. package/dist-lib/agent-identity.cjs +1 -1
  102. package/dist-lib/agent-sessions.cjs +1 -1
  103. package/dist-lib/attached-projects.cjs +1 -1
  104. package/dist-lib/auth/shared-session.cjs +1 -1
  105. package/dist-lib/backend-origin.cjs +1 -1
  106. package/dist-lib/beta.cjs +1 -1
  107. package/dist-lib/beta.mjs +1 -1
  108. package/dist-lib/bridge-constants.cjs +4 -1
  109. package/dist-lib/cli-constants.cjs +1 -1
  110. package/dist-lib/config.cjs +1 -1
  111. package/dist-lib/detox/index.cjs +1 -1
  112. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  113. package/dist-lib/home-paths.cjs +1 -1
  114. package/dist-lib/host/bridge-host.cjs +2 -1
  115. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  116. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  117. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  118. package/dist-lib/host/websocket-proxy.cjs +1 -1
  119. package/dist-lib/index.cjs +4 -1
  120. package/dist-lib/jump-to-source-babel.cjs +1 -1
  121. package/dist-lib/menu.cjs +1 -1
  122. package/dist-lib/menu.mjs +1 -1
  123. package/dist-lib/metro.cjs +1 -1
  124. package/dist-lib/profiles.cjs +1 -1
  125. package/dist-lib/render-mode.cjs +1 -1
  126. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  127. package/dist-lib/sdk.cjs +1 -1
  128. package/dist-lib/sdk.mjs +1 -1
  129. package/dist-lib/skills.cjs +8 -6
  130. package/dist-lib/vite.cjs +2 -1
  131. package/package.json +1 -1
  132. package/skills/contrast/SKILL.md +2 -2
  133. package/src/bridge-constants.ts +1 -0
  134. package/src/index.ts +4 -1
  135. package/dist-cli/chunks/chunk-JFWEDISV.js +0 -120
  136. package/dist-cli/chunks/chunk-JGGXQHXH.js +0 -10
  137. package/dist-cli/chunks/chunk-OKSGM6IG.js +0 -4
  138. package/dist-cli/chunks/daemon-LKRHF5OK.js +0 -4
  139. package/dist-cli/chunks/disk-cleanup-DDCFGFWK.js +0 -4
  140. package/dist-cli/chunks/drivers-C2SH3DWS.js +0 -4
  141. package/dist-cli/chunks/flow-E64G5LF3.js +0 -4
  142. package/dist-cli/chunks/help-4ZSRG4F4.js +0 -4
  143. package/dist-cli/chunks/inspect-U2SV25ER.js +0 -4
  144. package/dist-cli/chunks/install-desktop-LTGVT7ID.js +0 -4
  145. package/dist-cli/chunks/runtime-SN2RWDES.js +0 -4
  146. package/dist-cli/chunks/store-BJK7V7FL.js +0 -4
  147. package/dist-cli/chunks/telemetry-EJP5EW7K.js +0 -4
  148. package/dist-cli/chunks/upload-JABM3ITZ.js +0 -4
  149. package/dist-cli/chunks/web-F5CLF34I.js +0 -4
@@ -1,15 +1,15 @@
1
- /*! sootsim v0.1.294 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.295 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{c as b}from"./chunk-OKSGM6IG.js";import{b as L,e as T,g as E}from"./chunk-JUOQ4ZPA.js";import{K as S,L as I,M as B,N as P,g as A}from"./chunk-WQL3BLFD.js";import{WebSocket as $}from"ws";var W=null;function O(){let i=A();if(W?.homeDir===i)return W.world;let r=U();return W={homeDir:i,world:r},r}function U(){let i=I();if(i&&P(i))return{source:"dev-bridge",bridgePort:i.bridgePort,shellBaseUrl:i.shellPort?`http://localhost:${i.shellPort}/`:b};let r=S();return r&&B(r)?{source:"daemon",bridgePort:r.bridgePort,shellBaseUrl:r.runtimePort>0?`http://localhost:${r.runtimePort}/`:b}:{source:"default",bridgePort:7668,shellBaseUrl:b}}function _(i){let r=I();if(r&&P(r)&&r.bridgePort===i)return{source:"dev-bridge",shellBaseUrl:r.shellPort?`http://localhost:${r.shellPort}/`:b};let e=S();return e&&B(e)&&e.bridgePort===i?{source:"daemon",shellBaseUrl:e.runtimePort>0?`http://localhost:${e.runtimePort}/`:b}:null}function K(i){let r;try{let l=new URL(i);r=l.port?Number(l.port):l.protocol==="https:"?443:80}catch{return null}if(!Number.isFinite(r)||r<=0)return null;let e=I();if(e&&P(e)&&(e.shellPort===r||e.runtimePort===r||e.bridgePort===r))return e.bridgePort;let d=S();return d&&B(d)&&(d.runtimePort===r||d.bridgePort===r)?d.bridgePort:null}function D(){return O().bridgePort}function Q(i,r){let e=_(i),d=e?.source==="dev-bridge"?"dev bridge":e?.source==="daemon"?"daemon bridge":"bridge",l=e?`${e.source}.json`:"no lockfile",t=r??e?.shellBaseUrl;process.stderr.write(` \u2192 ${d} :${i} (${t?`shell ${t}, `:""}${l})
5
- `)}var C=class extends Error{lock;constructor(r,e){super(r),this.name="BridgeSimLockedError",this.lock=e}};function N(i){return i==="flag"?"via --sim":i==="saved"?"saved via `sootsim use`":"primary fallback \u2014 no sim pinned"}function z(i,r={}){let e=new Set,d=r.port??D(),l=r.commandTimeoutMs??15e3,t,u="none",v=new Set(r.stripBooleanFlags??[]),y=new Set(r.stripValueFlags??[]);for(let n=0;n<i.length;n++){let a=i[n];if(a==="--port"||a==="-p"){e.add(n),n+1<i.length&&(e.add(n+1),d=Number(i[n+1])),n++;continue}if(a.startsWith("--port=")){e.add(n),d=Number(a.slice(7));continue}if(a==="--timeout"){e.add(n),n+1<i.length&&(e.add(n+1),l=Number(i[n+1])),n++;continue}if(a==="--sim"||a==="--session"||a==="--tab"){e.add(n),n+1<i.length&&(e.add(n+1),t=i[n+1]?.trim()||void 0,u="flag"),n++;continue}let s=a.startsWith("--sim=")?a.slice(6):a.startsWith("--session=")?a.slice(10):a.startsWith("--tab=")?a.slice(6):void 0;if(s!==void 0){e.add(n),t=s.trim()||void 0,u="flag";continue}if(v.has(a)){e.add(n);continue}y.has(a)&&(e.add(n),n+1<i.length&&e.add(n+1),n++)}if(!t){let n=T();n&&(t=n.trim()||void 0,u="saved")}return{positional:i.filter((n,a)=>!e.has(a)),wsPort:d,simId:t,simIdSource:u,commandTimeoutMs:l}}function R(i,r={}){let e=1,d=r.commandTimeoutMs??15e3,l=new Map,t=new $(`ws://localhost:${i}`),u=L(),v=new Promise((s,o)=>{t.on("open",()=>{try{t.send(JSON.stringify({type:"bridge:hello",id:0,cliIdentityKey:u.key,cliIdentitySource:u.source,cliLabel:r.cliLabel}))}catch{}s()}),t.on("error",c=>{let m=c.message?`: ${c.message}`:"";o(new Error(`could not connect to ws://localhost:${i}${m}`))})}),y=!1,n=!1;function a(s,o){if(n||process.env.SOOTSIM_QUIET_TARGET_NOTICE==="1"||s.startsWith("bridge:")||s==="focus"||s==="close")return;n=!0;let c=o??"primary",m=N(o?r.simIdSource:"none");process.stderr.write(` \u2192 ${c} (${m})
4
+ import{b as A,e as T,g as E}from"./chunk-K7LQB4IF.js";import{K as S,L as I,M as B,N as P,g as F}from"./chunk-7GVBNEQ3.js";var b="http://localhost:5173/";import{WebSocket as $}from"ws";var W=null;function M(){let i=F();if(W?.homeDir===i)return W.world;let r=_();return W={homeDir:i,world:r},r}function _(){let i=I();if(i&&P(i))return{source:"dev-bridge",bridgePort:i.bridgePort,shellBaseUrl:i.shellPort?`http://localhost:${i.shellPort}/`:b};let r=S();return r&&B(r)?{source:"daemon",bridgePort:r.bridgePort,shellBaseUrl:r.runtimePort>0?`http://localhost:${r.runtimePort}/`:b}:{source:"default",bridgePort:7668,shellBaseUrl:b}}function U(i){let r=I();if(r&&P(r)&&r.bridgePort===i)return{source:"dev-bridge",shellBaseUrl:r.shellPort?`http://localhost:${r.shellPort}/`:b};let e=S();return e&&B(e)&&e.bridgePort===i?{source:"daemon",shellBaseUrl:e.runtimePort>0?`http://localhost:${e.runtimePort}/`:b}:null}function Q(i){let r;try{let l=new URL(i);r=l.port?Number(l.port):l.protocol==="https:"?443:80}catch{return null}if(!Number.isFinite(r)||r<=0)return null;let e=I();if(e&&P(e)&&(e.shellPort===r||e.runtimePort===r||e.bridgePort===r))return e.bridgePort;let d=S();return d&&B(d)&&(d.runtimePort===r||d.bridgePort===r)?d.bridgePort:null}function D(){return M().bridgePort}function z(i,r){let e=U(i),d=e?.source==="dev-bridge"?"dev bridge":e?.source==="daemon"?"daemon bridge":"bridge",l=e?`${e.source}.json`:"no lockfile",t=r??e?.shellBaseUrl;process.stderr.write(` \u2192 ${d} :${i} (${t?`shell ${t}, `:""}${l})
5
+ `)}var C=class extends Error{lock;constructor(r,e){super(r),this.name="BridgeSimLockedError",this.lock=e}};function N(i){return i==="flag"?"via --sim":i==="saved"?"saved via `sootsim use`":"primary fallback \u2014 no sim pinned"}function X(i,r={}){let e=new Set,d=r.port??D(),l=r.commandTimeoutMs??15e3,t,u="none",v=new Set(r.stripBooleanFlags??[]),y=new Set(r.stripValueFlags??[]);for(let n=0;n<i.length;n++){let a=i[n];if(a==="--port"||a==="-p"){e.add(n),n+1<i.length&&(e.add(n+1),d=Number(i[n+1])),n++;continue}if(a.startsWith("--port=")){e.add(n),d=Number(a.slice(7));continue}if(a==="--timeout"){e.add(n),n+1<i.length&&(e.add(n+1),l=Number(i[n+1])),n++;continue}if(a==="--sim"||a==="--session"||a==="--tab"){e.add(n),n+1<i.length&&(e.add(n+1),t=i[n+1]?.trim()||void 0,u="flag"),n++;continue}let s=a.startsWith("--sim=")?a.slice(6):a.startsWith("--session=")?a.slice(10):a.startsWith("--tab=")?a.slice(6):void 0;if(s!==void 0){e.add(n),t=s.trim()||void 0,u="flag";continue}if(v.has(a)){e.add(n);continue}y.has(a)&&(e.add(n),n+1<i.length&&e.add(n+1),n++)}if(!t){let n=T();n&&(t=n.trim()||void 0,u="saved")}return{positional:i.filter((n,a)=>!e.has(a)),wsPort:d,simId:t,simIdSource:u,commandTimeoutMs:l}}function R(i,r={}){let e=1,d=r.commandTimeoutMs??15e3,l=new Map,t=new $(`ws://localhost:${i}`),u=A(),v=new Promise((s,o)=>{t.on("open",()=>{try{t.send(JSON.stringify({type:"bridge:hello",id:0,cliIdentityKey:u.key,cliIdentitySource:u.source,cliLabel:r.cliLabel}))}catch{}s()}),t.on("error",c=>{let m=c.message?`: ${c.message}`:"";o(new Error(`could not connect to ws://localhost:${i}${m}`))})}),y=!1,n=!1;function a(s,o){if(n||process.env.SOOTSIM_QUIET_TARGET_NOTICE==="1"||s.startsWith("bridge:")||s==="focus"||s==="close")return;n=!0;let c=o??"primary",m=N(o?r.simIdSource:"none");process.stderr.write(` \u2192 ${c} (${m})
6
6
  `)}return t.on("message",s=>{let o;try{o=JSON.parse(s.toString())}catch{return}if(o.id===0)return;let c=l.get(o.id);c&&(l.delete(o.id),o._otherCliCount>0&&!y&&(y=!0,process.stderr.write(`
7
7
  \u26A0 ${o._otherCliCount} other CLI identity/identities are driving this sim
8
8
  taps, scrolls, and keyboard input from multiple agents will collide on
9
9
  the same screen state (this is not a bridge throughput limit).
10
10
  use \`sootsim open --new\` for an isolated sim per agent.
11
11
 
12
- `)),o.error?o._locked?c.reject(new C(o.error,o._locked)):c.reject(new Error(o.error)):c.resolve(o.result))}),t.on("close",(s,o)=>{let c=o?.toString()||"connection closed";for(let[m,h]of l)l.delete(m),h.reject(new Error(`sim disconnected: ${c} (code ${s})`))}),{async send(s,o){let c=o?.timeoutMs??d,m=async g=>{await v;let f=e++;return new Promise((p,x)=>{let F=setTimeout(()=>{l.delete(f),x(new Error(`command timed out after ${Math.round(c/1e3)}s`))},c);l.set(f,{resolve:k=>{clearTimeout(F),p(k)},reject:k=>{clearTimeout(F),x(k)}});let w={...s,id:f};w.simId===void 0&&g&&(w.simId=g),a(s.type??"",w.simId),t.send(JSON.stringify(w))})},h=r.simIdSource==="flag"?r.simId:T()??r.simId;try{return await m(h)}catch(g){let f=g instanceof Error?g.message:String(g),p=`no sim connected with id ${h}`;throw r.simIdSource!=="flag"&&h&&s.simId===void 0&&(f===p||f.startsWith(`${p};`))?(E(),new Error(`saved sim ${h} is gone${f.slice(p.length)}; run \`sootsim list\` and \`sootsim use <sim>\`, or open a fresh sim`)):g}},async listSims(){let s=await this.send({type:"bridge:list-sims"});return Array.isArray(s)?s:[]},async openUrl(s,o={}){return this.send({type:"bridge:open",url:s,newWindow:o.newWindow===!0})},async focusSim(s){return this.send({type:"focus",simId:s})},async closeSim(s){return this.send({type:"close",simId:s})},async claim(s,o={}){return await this.send({type:"bridge:claim",simId:s,force:o.force===!0})},close(){try{t.readyState===$.OPEN&&t.send(JSON.stringify({type:"bridge:bye",id:0}))}catch{}t.close();let s=setTimeout(()=>{t.readyState!==$.CLOSED&&t.terminate()},250)}}}function X(i){return R(i.wsPort,{commandTimeoutMs:i.commandTimeoutMs,simId:i.simId,simIdSource:i.simIdSource})}function V(i,r){let e=i.filter(t=>t.readyState==="open"&&t.id!==r),d=e.find(t=>t.userFocused)??e.find(t=>t.userVisible===!0&&t.isPrimary)??e.find(t=>t.userVisible===!0)??e.find(t=>t.isPrimary);if(!d)return null;let l=[d.isPrimary?"primary":null,d.userVisible===!1?"hidden":d.userVisible===!0?"visible":null,d.userFocused?"focused":null].filter(Boolean);return`${d.id}${l.length?` [${l.join(", ")}]`:""}`}async function Y(i){try{let r=await i.send({type:"evaluate",code:`(() => ({
12
+ `)),o.error?o._locked?c.reject(new C(o.error,o._locked)):c.reject(new Error(o.error)):c.resolve(o.result))}),t.on("close",(s,o)=>{let c=o?.toString()||"connection closed";for(let[m,h]of l)l.delete(m),h.reject(new Error(`sim disconnected: ${c} (code ${s})`))}),{async send(s,o){let c=o?.timeoutMs??d,m=async g=>{await v;let f=e++;return new Promise((p,L)=>{let x=setTimeout(()=>{l.delete(f),L(new Error(`command timed out after ${Math.round(c/1e3)}s`))},c);l.set(f,{resolve:k=>{clearTimeout(x),p(k)},reject:k=>{clearTimeout(x),L(k)}});let w={...s,id:f};w.simId===void 0&&g&&(w.simId=g),a(s.type??"",w.simId),t.send(JSON.stringify(w))})},h=r.simIdSource==="flag"?r.simId:T()??r.simId;try{return await m(h)}catch(g){let f=g instanceof Error?g.message:String(g),p=`no sim connected with id ${h}`;throw r.simIdSource!=="flag"&&h&&s.simId===void 0&&(f===p||f.startsWith(`${p};`))?(E(),new Error(`saved sim ${h} is gone${f.slice(p.length)}; run \`sootsim list\` and \`sootsim use <sim>\`, or open a fresh sim`)):g}},async listSims(){let s=await this.send({type:"bridge:list-sims"});return Array.isArray(s)?s:[]},async openUrl(s,o={}){return this.send({type:"bridge:open",url:s,newWindow:o.newWindow===!0})},async focusSim(s){return this.send({type:"focus",simId:s})},async closeSim(s){return this.send({type:"close",simId:s})},async claim(s,o={}){return await this.send({type:"bridge:claim",simId:s,force:o.force===!0})},close(){try{t.readyState===$.OPEN&&t.send(JSON.stringify({type:"bridge:bye",id:0}))}catch{}t.close();let s=setTimeout(()=>{t.readyState!==$.CLOSED&&t.terminate()},250)}}}function Y(i){return R(i.wsPort,{commandTimeoutMs:i.commandTimeoutMs,simId:i.simId,simIdSource:i.simIdSource})}function V(i,r){let e=i.filter(t=>t.readyState==="open"&&t.id!==r),d=e.find(t=>t.userFocused)??e.find(t=>t.userVisible===!0&&t.isPrimary)??e.find(t=>t.userVisible===!0)??e.find(t=>t.isPrimary);if(!d)return null;let l=[d.isPrimary?"primary":null,d.userVisible===!1?"hidden":d.userVisible===!0?"visible":null,d.userFocused?"focused":null].filter(Boolean);return`${d.id}${l.length?` [${l.join(", ")}]`:""}`}async function Z(i){try{let r=await i.send({type:"evaluate",code:`(() => ({
13
13
  hidden: document.hidden,
14
14
  visibilityState: document.visibilityState,
15
15
  hasFocus: typeof document.hasFocus === 'function' ? document.hasFocus() : null,
@@ -23,4 +23,4 @@ import{c as b}from"./chunk-OKSGM6IG.js";import{b as L,e as T,g as E}from"./chunk
23
23
  `+(l?` another open sim looks usable: ${l}; target it with --sim.
24
24
  `:" run `sootsim list` to find the visible sim and target it with --sim.\n")+` page-level window.focus() cannot unhide a browser tab.
25
25
 
26
- `),{hidden:!0,warned:!0,simId:e.simId}}return{hidden:!1,warned:!1,simId:e.simId}}catch{return{hidden:!1,warned:!1}}}async function Z(i,r,e={}){let d={type:"evaluate",code:r};return e.acquireLock&&(d.acquireLock=!0),i.send(d)}async function ee(i,r,...e){return i.send({type:"call",path:r,args:e})}async function re(i,r,...e){return i.send({type:"call",path:r,args:e,acquireLock:!0})}export{O as a,_ as b,K as c,D as d,Q as e,C as f,z as g,R as h,X as i,Y as j,Z as k,ee as l,re as m};
26
+ `),{hidden:!0,warned:!0,simId:e.simId}}return{hidden:!1,warned:!1,simId:e.simId}}catch{return{hidden:!1,warned:!1}}}async function ee(i,r,e={}){let d={type:"evaluate",code:r};return e.acquireLock&&(d.acquireLock=!0),i.send(d)}async function re(i,r,...e){return i.send({type:"call",path:r,args:e})}async function ie(i,r,...e){return i.send({type:"call",path:r,args:e,acquireLock:!0})}export{b as a,M as b,U as c,Q as d,D as e,z as f,C as g,X as h,R as i,Y as j,Z as k,ee as l,re as m,ie as n};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.294 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.295 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
4
  var c="sootsim-agent-prompt-v1";function r(n){return typeof n=="string"?n.trim():""}function m(n){let e=r(n.text);if(!e)return"";let t=r(n.displayText),s=r(n.inspectSummary),o=r(n.inspectTrace);return!!s||!!o||/[\r\n]/.test(e)||!!t&&t!==e?JSON.stringify({__sootsimAgentPrompt:c,text:e,displayText:t,inspectSummary:s,inspectTrace:o}):e}function u(n){let e=r(n);if(!e)return null;try{let t=JSON.parse(e);if(t.__sootsimAgentPrompt!==c)return{text:e};let s=r(typeof t.text=="string"?t.text:void 0);if(!s)return null;let o=r(typeof t.displayText=="string"?t.displayText:void 0),i=r(typeof t.inspectSummary=="string"?t.inspectSummary:void 0),p=r(typeof t.inspectTrace=="string"?t.inspectTrace:void 0);return{text:s,...o?{displayText:o}:{},...i?{inspectSummary:i}:{},...p?{inspectTrace:p}:{}}}catch{return{text:e}}}export{m as a,u as b};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.294 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.295 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{a}from"./chunk-SLMUW2WU.js";import{A as l,B as u}from"./chunk-WQL3BLFD.js";var c=/^[A-Za-z0-9._:-]{1,160}$/;function T(e){if(!e?.startsWith("TM_SESSION:"))return null;let n=e.slice(11).trim();return c.test(n)?n:null}function p(e){return c.test(e)}function f(){let e=process.env.DO_NOT_TRACK;return e==="1"||e==="true"||!l()}function m(){if(f())return null;let e=process.env.VITE_POSTHOG_API_KEY||"";if(!e)return null;let n=process.env.CONTRAST_POSTHOG_HOST||process.env.VITE_POSTHOG_HOST||"https://us.i.posthog.com";return{apiKey:e,host:n.replace(/\/+$/,"")}}function d(){try{return u()}catch{return"anonymous-cli"}}function S(e){return e?e.userId?e.userId:e.installationId!=null?`install:${e.installationId}`:e.repoId?`repo:${e.repoId}`:e.shareId?`share:${e.shareId}`:d():d()}function h(e){let n=e.identity??{},i=process.env.TM_SESSION,s=i&&p(i)?"team-machine":process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"?"ci":null,t={$lib:"sootsim-cli",source:n.source??"cli",...e.properties,traffic_type:s?"automated":"human",is_automated:s!==null,...s?{automation_source:s}:{}};return n.userId&&(t.userId=n.userId),n.repoId&&(t.repoId=n.repoId),n.installationId!=null&&(t.installationId=String(n.installationId)),n.shareId&&(t.shareId=n.shareId),n.plan&&(t.plan=n.plan),{event:e.event,distinct_id:S(n),properties:t,timestamp:new Date().toISOString()}}var r=[],I=!1;async function o(){if(r.length===0)return;let e=m();if(!e){r.length=0;return}let n=r.splice(0,r.length).map(h);try{await fetch(`${e.host}/batch/`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({api_key:e.apiKey,batch:n}),signal:AbortSignal.timeout(2e3)})}catch{}}function g(){I||(I=!0,process.on("beforeExit",()=>void o()),process.on("exit",()=>void o()))}function C(e){if(f())return;g();let n=null;try{n=a()?.user?.id??null}catch{n=null}r.push({...e,identity:{source:"cli",userId:n,...e.identity}})}async function E(){await o()}export{T as a,p as b,C as c,E as d};
4
+ import{a}from"./chunk-UWFAWMPE.js";import{A as l,B as u}from"./chunk-7GVBNEQ3.js";var c=/^[A-Za-z0-9._:-]{1,160}$/;function T(e){if(!e?.startsWith("TM_SESSION:"))return null;let n=e.slice(11).trim();return c.test(n)?n:null}function p(e){return c.test(e)}function f(){let e=process.env.DO_NOT_TRACK;return e==="1"||e==="true"||!l()}function m(){if(f())return null;let e=process.env.VITE_POSTHOG_API_KEY||"";if(!e)return null;let n=process.env.CONTRAST_POSTHOG_HOST||process.env.VITE_POSTHOG_HOST||"https://us.i.posthog.com";return{apiKey:e,host:n.replace(/\/+$/,"")}}function d(){try{return u()}catch{return"anonymous-cli"}}function S(e){return e?e.userId?e.userId:e.installationId!=null?`install:${e.installationId}`:e.repoId?`repo:${e.repoId}`:e.shareId?`share:${e.shareId}`:d():d()}function h(e){let n=e.identity??{},i=process.env.TM_SESSION,s=i&&p(i)?"team-machine":process.env.CI==="1"||process.env.CI==="true"||process.env.GITHUB_ACTIONS==="true"?"ci":null,t={$lib:"sootsim-cli",source:n.source??"cli",...e.properties,traffic_type:s?"automated":"human",is_automated:s!==null,...s?{automation_source:s}:{}};return n.userId&&(t.userId=n.userId),n.repoId&&(t.repoId=n.repoId),n.installationId!=null&&(t.installationId=String(n.installationId)),n.shareId&&(t.shareId=n.shareId),n.plan&&(t.plan=n.plan),{event:e.event,distinct_id:S(n),properties:t,timestamp:new Date().toISOString()}}var r=[],I=!1;async function o(){if(r.length===0)return;let e=m();if(!e){r.length=0;return}let n=r.splice(0,r.length).map(h);try{await fetch(`${e.host}/batch/`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({api_key:e.apiKey,batch:n}),signal:AbortSignal.timeout(2e3)})}catch{}}function g(){I||(I=!0,process.on("beforeExit",()=>void o()),process.on("exit",()=>void o()))}function C(e){if(f())return;g();let n=null;try{n=a()?.user?.id??null}catch{n=null}r.push({...e,identity:{source:"cli",userId:n,...e.identity}})}async function E(){await o()}export{T as a,p as b,C as c,E as d};
@@ -0,0 +1,10 @@
1
+ /*! sootsim v0.1.295 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import { createRequire as __sootsimCreateRequire } from 'node:module'
3
+ var require = __sootsimCreateRequire(import.meta.url)
4
+ import{a as c}from"./chunk-RV67EC7L.js";import{a}from"./chunk-FH7DQ2HB.js";import{a as e}from"./chunk-XQRUWC3F.js";import{a as n}from"./chunk-6VF477QO.js";import{c as i,d as m,e as p}from"./chunk-I7AWRAXM.js";import{a as u}from"./chunk-X5FTDIHQ.js";import{a as f,c as s}from"./chunk-SU5WQ4SQ.js";function g(){return`sootsim CLI v${u()} \xB7 ${c().primary}`}function _(){let r=m({bridgePort:7668,defaultShellUrl:n},e()),o=`
5
+ ${s}
6
+ `;console.log(`${g()}
7
+ ${o}${r}
8
+ `),a("clean-uninstall")}function C(r){let o=i(r,{bridgePort:7668,defaultShellUrl:n},e());return o?(console.log(`${o}
9
+ `),!0):!1}function E(r,o={}){let l=p(r,{bridgePort:7668,defaultShellUrl:n},o);if(!l){console.log(`unknown command: ${r}`);return}console.log(`${l}
10
+ `)}export{_ as a,C as b,E as c};
@@ -1,6 +1,6 @@
1
- /*! sootsim v0.1.294 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.295 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{G as _,H as E,I as F,k as N,l as U,u as L,x as A}from"./chunk-WQL3BLFD.js";import W from"node:fs";import z from"node:path";function T(e){try{return W.readdirSync(e.runtimesDir(),{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort(k)}catch{return[]}}function D(e,a){return z.posix.basename(e.tarballPath(a))}function k(e,a){let o=f=>{let p=f.indexOf("-"),P=p>=0?f.slice(0,p):f,C=p>=0?f.slice(p+1):"",M=P.split(".").map(b=>Number.parseInt(b,10));return M.some(b=>!Number.isFinite(b))?[[Number.POSITIVE_INFINITY],f]:[M,C]},[m,u]=o(e),[R,S]=o(a);for(let f=0;f<Math.max(m.length,R.length);f++){let p=m[f]??0,P=R[f]??0;if(p!==P)return p-P}return u===S?0:u?S?u<S?-1:1:-1:1}import{spawn as G}from"node:child_process";import J from"node:crypto";import l from"node:fs";import w from"node:path";import{Readable as Y}from"node:stream";import{pipeline as q}from"node:stream/promises";var B=2;function j(e){function a(){try{let t=JSON.parse(l.readFileSync(e.configFile(),"utf8"));return t&&typeof t=="object"?t:{}}catch{return{}}}function o(t){let n=a();return(t||process.env[e.env.cdnOrigin]||n.cdnOrigin||e.defaultCdnOrigin).replace(/\/+$/,"")}function m(t){let n=a();return t||process.env[e.env.channel]||n.runtimeChannel||"stable"}function u(){let t=process.env[e.env.pin];if(t&&t.trim())return t.trim();let n=a();return typeof n.runtimeVersion=="string"&&n.runtimeVersion.trim()?n.runtimeVersion.trim():null}function R(t){let n=new URL(`${o(t)}${e.manifestPath}`);return n.searchParams.set("t",String(Date.now())),n.toString()}function S(t,n){return`${o(n)}${e.tarballPath(t)}`}async function f(t){let n=R(t),r=await fetch(n,{headers:{Accept:"application/json"}});if(!r.ok)throw new Error(`manifest fetch failed: ${r.status} ${r.statusText} (${n})`);return await r.json()}function p(t,n={}){let r=m(n.channel),i=n.version||u()||t.channels[r]?.latest;if(!i)throw new Error(`no version specified and channel '${r}' has no latest entry in the manifest`);let h=t.versions[i];if(!h)throw new Error(`version ${i} not found in manifest; available: ${Object.keys(t.versions).slice(-10).join(", ")||"(none)"}`);return{version:i,channel:r,entry:h}}async function P(t={}){e.ensureHome();let n=o(t.cdnOrigin),r=await f(n),{version:i,channel:h,entry:s}=p(r,t),d=e.runtimeDir(i),g=t.setActive!==!1;if(x({protectVersions:[i]}),!t.force&&l.existsSync(w.join(d,e.installedMarker)))return g&&e.writeActiveRuntime(i),x({protectVersions:[i]}),{version:i,channel:h,cdnOrigin:n,runtimeDir:d,installed:!1,activated:g,manifest:r};let I=s.tarball||S(i,n),v=w.join(e.cacheDir(),D(e,i));process.stderr.write(`${e.id}: downloading runtime ${i}\u2026
4
+ import{G as _,H as E,I as F,k as N,l as U,u as L,x as A}from"./chunk-7GVBNEQ3.js";import W from"node:fs";import z from"node:path";function T(e){try{return W.readdirSync(e.runtimesDir(),{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort(k)}catch{return[]}}function D(e,a){return z.posix.basename(e.tarballPath(a))}function k(e,a){let o=f=>{let p=f.indexOf("-"),P=p>=0?f.slice(0,p):f,C=p>=0?f.slice(p+1):"",M=P.split(".").map(b=>Number.parseInt(b,10));return M.some(b=>!Number.isFinite(b))?[[Number.POSITIVE_INFINITY],f]:[M,C]},[m,u]=o(e),[R,S]=o(a);for(let f=0;f<Math.max(m.length,R.length);f++){let p=m[f]??0,P=R[f]??0;if(p!==P)return p-P}return u===S?0:u?S?u<S?-1:1:-1:1}import{spawn as G}from"node:child_process";import J from"node:crypto";import l from"node:fs";import w from"node:path";import{Readable as Y}from"node:stream";import{pipeline as q}from"node:stream/promises";var B=2;function j(e){function a(){try{let t=JSON.parse(l.readFileSync(e.configFile(),"utf8"));return t&&typeof t=="object"?t:{}}catch{return{}}}function o(t){let n=a();return(t||process.env[e.env.cdnOrigin]||n.cdnOrigin||e.defaultCdnOrigin).replace(/\/+$/,"")}function m(t){let n=a();return t||process.env[e.env.channel]||n.runtimeChannel||"stable"}function u(){let t=process.env[e.env.pin];if(t&&t.trim())return t.trim();let n=a();return typeof n.runtimeVersion=="string"&&n.runtimeVersion.trim()?n.runtimeVersion.trim():null}function R(t){let n=new URL(`${o(t)}${e.manifestPath}`);return n.searchParams.set("t",String(Date.now())),n.toString()}function S(t,n){return`${o(n)}${e.tarballPath(t)}`}async function f(t){let n=R(t),r=await fetch(n,{headers:{Accept:"application/json"}});if(!r.ok)throw new Error(`manifest fetch failed: ${r.status} ${r.statusText} (${n})`);return await r.json()}function p(t,n={}){let r=m(n.channel),i=n.version||u()||t.channels[r]?.latest;if(!i)throw new Error(`no version specified and channel '${r}' has no latest entry in the manifest`);let h=t.versions[i];if(!h)throw new Error(`version ${i} not found in manifest; available: ${Object.keys(t.versions).slice(-10).join(", ")||"(none)"}`);return{version:i,channel:r,entry:h}}async function P(t={}){e.ensureHome();let n=o(t.cdnOrigin),r=await f(n),{version:i,channel:h,entry:s}=p(r,t),d=e.runtimeDir(i),g=t.setActive!==!1;if(x({protectVersions:[i]}),!t.force&&l.existsSync(w.join(d,e.installedMarker)))return g&&e.writeActiveRuntime(i),x({protectVersions:[i]}),{version:i,channel:h,cdnOrigin:n,runtimeDir:d,installed:!1,activated:g,manifest:r};let I=s.tarball||S(i,n),v=w.join(e.cacheDir(),D(e,i));process.stderr.write(`${e.id}: downloading runtime ${i}\u2026
5
5
  `),await K(I,v),process.stderr.write(`${e.id}: extracting runtime ${i}\u2026
6
6
  `);let O=w.join(w.dirname(d),`.installing-${i}-${process.pid}`);l.rmSync(O,{recursive:!0,force:!0});try{let y=await Q(v);if(y!==s.sha256)throw new Error(`sha256 mismatch for runtime ${i}: expected ${s.sha256}, actual ${y}`);if(l.mkdirSync(O,{recursive:!0}),await X(v,O),!l.existsSync(w.join(O,e.installedMarker)))throw new Error(`extracted tarball for runtime ${i} is missing ${e.installedMarker}`);l.rmSync(d,{recursive:!0,force:!0}),l.renameSync(O,d)}catch(y){throw l.rmSync(O,{recursive:!0,force:!0}),y}finally{l.rmSync(v,{force:!0})}return g&&e.writeActiveRuntime(i),x({protectVersions:[i]}),{version:i,channel:h,cdnOrigin:n,runtimeDir:d,installed:!0,activated:g,manifest:r}}async function C(t={}){e.ensureHome(),x();let n=o(t.cdnOrigin),r=m(t.channel),i=u();if(i){let V=e.readActiveRuntime(),c=l.existsSync(w.join(e.runtimeDir(i),e.installedMarker));if(V===i&&c)return{checked:!0,updated:!1,reason:`runtime is pinned to ${i}`,activeVersion:V,latestVersion:i};let $=await P({version:i,channel:r,cdnOrigin:n,setActive:!1});return{checked:!0,updated:!0,reason:`runtime is pinned to ${i}`,activeVersion:i,latestVersion:i,install:$}}let h=await f(n),s=h.channels[r]?.latest;if(!s)return{checked:!0,updated:!1,reason:`channel '${r}' has no latest runtime`,activeVersion:e.readActiveRuntime()};if(!h.versions[s])return{checked:!0,updated:!1,reason:`manifest is missing version ${s}`,activeVersion:e.readActiveRuntime(),latestVersion:s};let g=e.readActiveRuntime(),I=g?e.runtimeDir(g):null,v=I?l.existsSync(w.join(I,e.installedMarker)):!1;if(!(!g||!v||k(s,g)>0))return{checked:!0,updated:!1,reason:"active runtime is current",activeVersion:g,latestVersion:s};let y=await P({version:s,channel:r,cdnOrigin:n,setActive:!1});return{checked:!0,updated:!0,activeVersion:s,latestVersion:s,install:y}}async function M(t={}){let n=e.readActiveRuntime(),r=u();if(r)return{active:n,latest:r,pinned:r,outdated:n!==r};try{let i=await f(o(t.cdnOrigin)),h=m(t.channel),s=i.channels[h]?.latest??null,d=!!(s&&(!n||k(s,n)>0));return{active:n,latest:s,pinned:null,outdated:d}}catch{return{active:n,latest:null,pinned:null,outdated:!1}}}function b(t={}){e.ensureHome();let n=Math.max(1,Math.floor(t.retainVersions??B)),r=T(e),i=new Set(r),h=e.readActiveRuntime(),s=u(),d=new Set;for(let c of[h,s,...t.protectVersions??[]])c&&i.has(c)&&d.add(c);for(let c of[...r].reverse()){if(d.size>=n)break;d.add(c)}let g="__RUNTIME_VERSION__",I=D(e,g),v=I.indexOf(g),O=I.slice(0,v),y=I.slice(v+g.length),V=[];if(v>=0)try{V=l.readdirSync(e.cacheDir(),{withFileTypes:!0}).filter(c=>{if(!c.isFile())return!1;let $=c.name.startsWith(O)&&c.name.endsWith(y),H=c.name.startsWith(O)&&c.name.endsWith(`${y}.partial`);return $||H}).map(c=>w.join(e.cacheDir(),c.name)).sort()}catch{}return{activeVersion:h,pinnedVersion:s,keepVersions:r.filter(c=>d.has(c)),removeVersions:r.filter(c=>!d.has(c)),removeCacheFiles:V}}function x(t={}){let n=b(t);for(let r of n.removeVersions)l.rmSync(e.runtimeDir(r),{recursive:!0,force:!0});for(let r of n.removeCacheFiles)l.rmSync(r,{force:!0});return n}return{product:e,resolveCdnOrigin:o,resolveChannel:m,resolvePin:u,manifestUrl:R,tarballUrl:S,fetchManifest:f,resolveVersion:p,install:P,updateToLatest:C,checkUpToDate:M,planLocalRetention:b,pruneLocalRetention:x,listInstalled:()=>T(e)}}async function K(e,a){let o=await fetch(e);if(!o.ok||!o.body)throw new Error(`download failed: ${o.status} ${o.statusText} (${e})`);l.mkdirSync(w.dirname(a),{recursive:!0});let m=`${a}.partial`;try{await q(Y.fromWeb(o.body),l.createWriteStream(m)),l.renameSync(m,a)}catch(u){try{l.unlinkSync(m)}catch{}throw u}}function Q(e){return new Promise((a,o)=>{let m=J.createHash("sha256"),u=l.createReadStream(e);u.on("data",R=>m.update(R)),u.on("error",o),u.on("end",()=>a(m.digest("hex")))})}function X(e,a){return new Promise((o,m)=>{let u=G("tar",["-xzf",e,"-C",a],{stdio:["ignore","inherit","inherit"]});u.on("error",m),u.on("exit",R=>{R===0?o():m(new Error(`tar exited with code ${R}`))})})}var Z="https://contrast.dev",he="https://sootsim.com/changelog",ee={id:"sootsim",defaultCdnOrigin:Z,manifestPath:"/runtimes/manifest.json",tarballPath:e=>`/runtimes/sootsim-runtime-${e}.tar.gz`,installedMarker:"index.html",env:{cdnOrigin:"SOOTSIM_CDN_ORIGIN",channel:"SOOTSIM_RUNTIME_CHANNEL",pin:"SOOTSIM_RUNTIME_VERSION"},ensureHome:_,configFile:A,runtimesDir:N,runtimeDir:U,cacheDir:L,readActiveRuntime:E,writeActiveRuntime:F},Re=j(ee);export{k as a,Z as b,he as c,Re as d};
@@ -1,4 +1,4 @@
1
- /*! sootsim v0.1.294 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! sootsim v0.1.295 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  import { createRequire as __sootsimCreateRequire } from 'node:module'
3
3
  var require = __sootsimCreateRequire(import.meta.url)
4
- import{a as o}from"./chunk-SLMUW2WU.js";var c=["ghs_","ghp_","gho_","ghu_","github_pat_"];function d(n){return!!(n&&n.length>=20&&c.some(t=>n.startsWith(t)))}function p(){let n=process.env.CONTRAST_INSTALLATION_TOKEN?.trim(),t=process.env.GITHUB_TOKEN?.trim(),e=n||t;if(!d(e))return null;let r=(process.env.CONTRAST_REPO||process.env.GITHUB_REPOSITORY||"").trim();if(!r)return null;let[i,s]=r.includes("/")?r.split("/",2):[null,null],u=(process.env.CONTRAST_REPO_ID||process.env.GITHUB_REPOSITORY_ID||"").trim(),l=(process.env.CONTRAST_INSTALLATION_ID||process.env.GITHUB_APP_INSTALLATION_ID||"").trim();return{kind:"github",token:e,repoId:r,repositoryId:u||null,owner:i||null,repo:s||null,installationId:l||null,source:n?"contrast-runner":"github-actions"}}function a(){let n=process.env.SOOTSIM_API_KEY?.trim();if(n&&n.startsWith("sk_sootsim_"))return{kind:"api-key",secret:n,source:"env"};let t=p();if(t)return t;let e=o();return e?.token?{kind:"session",token:e.token,origin:e.origin}:null}function g(n){return n.kind==="api-key"?`Bearer ${n.secret}`:`Bearer ${n.token}`}function _(n){return!n||n.kind!=="github"?null:{repoId:n.repoId,owner:n.owner??void 0,repo:n.repo??void 0,installationId:n.installationId}}export{a,g as b,_ as c};
4
+ import{a as o}from"./chunk-UWFAWMPE.js";var c=["ghs_","ghp_","gho_","ghu_","github_pat_"];function d(n){return!!(n&&n.length>=20&&c.some(t=>n.startsWith(t)))}function p(){let n=process.env.CONTRAST_INSTALLATION_TOKEN?.trim(),t=process.env.GITHUB_TOKEN?.trim(),e=n||t;if(!d(e))return null;let r=(process.env.CONTRAST_REPO||process.env.GITHUB_REPOSITORY||"").trim();if(!r)return null;let[i,s]=r.includes("/")?r.split("/",2):[null,null],u=(process.env.CONTRAST_REPO_ID||process.env.GITHUB_REPOSITORY_ID||"").trim(),l=(process.env.CONTRAST_INSTALLATION_ID||process.env.GITHUB_APP_INSTALLATION_ID||"").trim();return{kind:"github",token:e,repoId:r,repositoryId:u||null,owner:i||null,repo:s||null,installationId:l||null,source:n?"contrast-runner":"github-actions"}}function a(){let n=process.env.SOOTSIM_API_KEY?.trim();if(n&&n.startsWith("sk_sootsim_"))return{kind:"api-key",secret:n,source:"env"};let t=p();if(t)return t;let e=o();return e?.token?{kind:"session",token:e.token,origin:e.origin}:null}function g(n){return n.kind==="api-key"?`Bearer ${n.secret}`:`Bearer ${n.token}`}function _(n){return!n||n.kind!=="github"?null:{repoId:n.repoId,owner:n.owner??void 0,repo:n.repo??void 0,installationId:n.installationId}}export{a,g as b,_ as c};