sootsim 0.1.146 → 0.1.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cli/bin.js +3 -3
- package/dist-cli/chunks/{agent-PNNXV6F3.js → agent-COSQ2VSX.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-JTYAONCG.js → agent-wrapper-J6LA36AT.js} +2 -2
- package/dist-cli/chunks/{app-fonts-YGTRUUJT.js → app-fonts-H4CXDIF6.js} +2 -2
- package/dist-cli/chunks/{assert-HDFDQLHK.js → assert-THSUXYWU.js} +2 -2
- package/dist-cli/chunks/auto-bootstrap-SPALBOGS.js +2 -0
- package/dist-cli/chunks/beta-U3V7RSRI.js +2 -0
- package/dist-cli/chunks/{camera-4B7OAHRD.js → camera-4NINTJSC.js} +2 -2
- package/dist-cli/chunks/{chunk-FK2YXBKR.js → chunk-4CLJIXM3.js} +1 -1
- package/dist-cli/chunks/{chunk-2FYSNCRJ.js → chunk-54R6LIOF.js} +2 -2
- package/dist-cli/chunks/{chunk-BE2ZDRIJ.js → chunk-5CTOWZY4.js} +2 -2
- package/dist-cli/chunks/{chunk-TZXKFPBJ.js → chunk-5MX2B2EO.js} +2 -2
- package/dist-cli/chunks/{chunk-G7JMTSF6.js → chunk-5PKIU2SG.js} +1 -1
- package/dist-cli/chunks/{chunk-AOPFT3S4.js → chunk-B46RT5KY.js} +1 -1
- package/dist-cli/chunks/{chunk-2PYDOYIS.js → chunk-BDLFGAKU.js} +1 -1
- package/dist-cli/chunks/{chunk-VKKWYLIZ.js → chunk-BOU5OTEA.js} +1 -1
- package/dist-cli/chunks/{chunk-MSQUL5BU.js → chunk-DO2Z5CNM.js} +3 -3
- package/dist-cli/chunks/{chunk-UD4SYXDQ.js → chunk-DXL23RFP.js} +2 -2
- package/dist-cli/chunks/{chunk-XO4VQYFP.js → chunk-EJIK4ANI.js} +2 -2
- package/dist-cli/chunks/chunk-EWAA5DKR.js +1 -0
- package/dist-cli/chunks/{chunk-RTD4RNZV.js → chunk-FOLNNKZG.js} +1 -1
- package/dist-cli/chunks/{chunk-4KNMAGC4.js → chunk-FY4TSSMQ.js} +1 -1
- package/dist-cli/chunks/{chunk-HWB7DPXH.js → chunk-HENMFGLU.js} +1 -1
- package/dist-cli/chunks/{chunk-MIIAYBFL.js → chunk-HN2Q2ZWT.js} +1 -1
- package/dist-cli/chunks/{chunk-C44OZFHJ.js → chunk-HYVQAUD4.js} +2 -2
- package/dist-cli/chunks/{chunk-XRQDMB2J.js → chunk-KAAYKAUG.js} +2 -2
- package/dist-cli/chunks/chunk-KTCY7WJ2.js +2 -0
- package/dist-cli/chunks/{chunk-VZSXOG4N.js → chunk-L7SG7TDU.js} +1 -1
- package/dist-cli/chunks/{chunk-PCW4TKI2.js → chunk-LWC2FLTG.js} +2 -2
- package/dist-cli/chunks/{chunk-IADMCPLZ.js → chunk-MCQIOGWG.js} +1 -1
- package/dist-cli/chunks/{chunk-A7JX3OQC.js → chunk-OL7HTJVC.js} +1 -1
- package/dist-cli/chunks/{chunk-Q6BHESL2.js → chunk-PWGYVHEW.js} +2 -2
- package/dist-cli/chunks/{chunk-H2EIYIRP.js → chunk-PZL2H5SD.js} +1 -1
- package/dist-cli/chunks/{chunk-IAO27BWC.js → chunk-QCPYYZGR.js} +2 -2
- package/dist-cli/chunks/{chunk-R7CMXY5T.js → chunk-QEC2WZAU.js} +2 -2
- package/dist-cli/chunks/{chunk-GD473DHN.js → chunk-QGQRB6D2.js} +2 -2
- package/dist-cli/chunks/chunk-QGWWRXSG.js +1 -0
- package/dist-cli/chunks/{chunk-35QJJ4MM.js → chunk-SAV6NL5J.js} +3 -3
- package/dist-cli/chunks/{chunk-WFXLVOUA.js → chunk-SIGAKBUY.js} +2 -2
- package/dist-cli/chunks/{chunk-YBSNSFBX.js → chunk-SK3UIUQL.js} +1 -1
- package/dist-cli/chunks/{chunk-H6LFGGJW.js → chunk-SQBPTIVB.js} +2 -2
- package/dist-cli/chunks/{chunk-DP5FSZHW.js → chunk-T7ERR3Y2.js} +1 -1
- package/dist-cli/chunks/{chunk-HZHZY7N5.js → chunk-TM6NU7CC.js} +2 -2
- package/dist-cli/chunks/{chunk-K6X7LUFG.js → chunk-TNCYQFCC.js} +1 -1
- package/dist-cli/chunks/{chunk-MVLNHZMU.js → chunk-UODOGO3P.js} +2 -2
- package/dist-cli/chunks/{chunk-ERAE4LJT.js → chunk-UPDZS7GX.js} +3 -3
- package/dist-cli/chunks/{chunk-JFQXWAWN.js → chunk-UQGDJNV2.js} +2 -2
- package/dist-cli/chunks/{chunk-SZNVNYEP.js → chunk-V5TDYT4H.js} +2 -2
- package/dist-cli/chunks/{chunk-BBIN2U26.js → chunk-VC7MRZW7.js} +2 -2
- package/dist-cli/chunks/{chunk-JZW2R5D7.js → chunk-VZ7VB7HX.js} +2 -2
- package/dist-cli/chunks/{chunk-TLFNO2L4.js → chunk-ZO7E7WE5.js} +1 -1
- package/dist-cli/chunks/chunk-ZPDQ3S7P.js +1 -0
- package/dist-cli/chunks/{chunk-ATJRNMNA.js → chunk-ZU5S3Z7A.js} +2 -2
- package/dist-cli/chunks/cli-version-TJZ4JXUC.js +2 -0
- package/dist-cli/chunks/{compat-F4WAO62Y.js → compat-E5CN4JWN.js} +3 -3
- package/dist-cli/chunks/{config-WAIORJNJ.js → config-H75A6KBX.js} +2 -2
- package/dist-cli/chunks/{control-M54456XG.js → control-CYDNB7NS.js} +2 -2
- package/dist-cli/chunks/{cpu-profile-NNMDXCWI.js → cpu-profile-QUFYSFW2.js} +2 -2
- package/dist-cli/chunks/{daemon-UXSN6QDY.js → daemon-7GPY5B63.js} +2 -2
- package/dist-cli/chunks/{debug-JAQVYKQG.js → debug-5WWA5QA3.js} +3 -3
- package/dist-cli/chunks/{detox-QOL7PD62.js → detox-O55BWRH7.js} +2 -2
- package/dist-cli/chunks/{device-WPAQY2ZH.js → device-AQRY7VKI.js} +2 -2
- package/dist-cli/chunks/{diagnose-FKN4ALSH.js → diagnose-FDKSEQJ5.js} +2 -2
- package/dist-cli/chunks/drivers-QDHVKRYQ.js +2 -0
- package/dist-cli/chunks/{electron-YQKH55P6.js → electron-ZQBTU3QE.js} +3 -3
- package/dist-cli/chunks/flow-H6MLEX2L.js +2 -0
- package/dist-cli/chunks/help-THQ2V5SE.js +2 -0
- package/dist-cli/chunks/{hints-GIJN25JB.js → hints-7UYBREXC.js} +2 -2
- package/dist-cli/chunks/{home-paths-KIR4SAL4.js → home-paths-2FGC73RX.js} +2 -2
- package/dist-cli/chunks/{inspect-YRP3UFG4.js → inspect-DIBHPUVR.js} +3 -3
- package/dist-cli/chunks/install-R63X4FZO.js +2 -0
- package/dist-cli/chunks/{install-desktop-INHP4VUQ.js → install-desktop-JGMQYTE4.js} +3 -3
- package/dist-cli/chunks/{keys-CBKA6IB7.js → keys-76ZYEU3L.js} +2 -2
- package/dist-cli/chunks/{launch-JZ463USO.js → launch-73NGQKXM.js} +3 -3
- package/dist-cli/chunks/{login-VHP4DNC2.js → login-6EFONAEU.js} +4 -4
- package/dist-cli/chunks/{logout-NRG4U6Z7.js → logout-C3W5XSSV.js} +2 -2
- package/dist-cli/chunks/{maestro-KPNXHCFR.js → maestro-HVAORFSN.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-AJQV4MPG.js +2 -0
- package/dist-cli/chunks/{preview-O44G7W2U.js → preview-EC3BTC6H.js} +2 -2
- package/dist-cli/chunks/{profile-RMYP6I2J.js → profile-UAZ2OUJ4.js} +2 -2
- package/dist-cli/chunks/{react-CFUB2U76.js → react-XQCVY4U2.js} +2 -2
- package/dist-cli/chunks/{record-YSLIYV2X.js → record-IGGTUUYU.js} +2 -2
- package/dist-cli/chunks/runtime-ATNAKUCZ.js +2 -0
- package/dist-cli/chunks/{runtime-delivery-DDUSKKTU.js → runtime-delivery-NXMBF4CK.js} +2 -2
- package/dist-cli/chunks/{screenshot-MH7JQVO7.js → screenshot-JTZJZCCX.js} +2 -2
- package/dist-cli/chunks/{screenshot-mode-JRRQPP37.js → screenshot-mode-WZ6ZO5CD.js} +2 -2
- package/dist-cli/chunks/{screenshots-32GEAUAF.js → screenshots-P5VB65PJ.js} +2 -2
- package/dist-cli/chunks/{server-ROXPXSIK.js → server-2BYQFJUM.js} +12 -12
- package/dist-cli/chunks/setup-repo-7BUMPQZM.js +2 -0
- package/dist-cli/chunks/{skills-T74U4JC7.js → skills-A2I5K4UQ.js} +2 -2
- package/dist-cli/chunks/{slides-OM25OBW3.js → slides-O25XV2IB.js} +2 -2
- package/dist-cli/chunks/{start-NLHWSRC7.js → start-HY4ZGAE2.js} +4 -4
- package/dist-cli/chunks/store-VXGE7SLD.js +2 -0
- package/dist-cli/chunks/telemetry-HGRYUILN.js +2 -0
- package/dist-cli/chunks/{test-RYMENNXC.js → test-IVVOPKT5.js} +3 -3
- package/dist-cli/chunks/{three-mode-MK242N4J.js → three-mode-TYAB3FVD.js} +2 -2
- package/dist-cli/chunks/{timeline-ANKR37NA.js → timeline-R6M6EJQA.js} +2 -2
- package/dist-cli/chunks/{upgrade-ZANSK5HX.js → upgrade-CZQ6GK7Y.js} +2 -2
- package/dist-cli/chunks/upload-NR4J3LM2.js +2 -0
- package/dist-cli/chunks/{version-DYXEOGY7.js → version-XVAS3GOH.js} +2 -2
- package/dist-cli/chunks/{web-LUMZCTLY.js → web-35EQF7J6.js} +2 -2
- package/dist-cli/chunks/{what-happened-SIQGZLHO.js → what-happened-MYXKT7EW.js} +2 -2
- package/dist-cli/chunks/{whoami-YI5RAQBT.js → whoami-J7EHW2UD.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +47 -3
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +47 -3
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/src/host/bridge-host.ts +70 -4
- package/dist-cli/chunks/auto-bootstrap-S7SSJMD3.js +0 -2
- package/dist-cli/chunks/beta-E3MSUPWU.js +0 -2
- package/dist-cli/chunks/chunk-3RPHEE3K.js +0 -2
- package/dist-cli/chunks/chunk-DRCRPS2N.js +0 -1
- package/dist-cli/chunks/chunk-OU42HTKN.js +0 -1
- package/dist-cli/chunks/chunk-Y76W7GZV.js +0 -1
- package/dist-cli/chunks/cli-version-AJWPSNS4.js +0 -2
- package/dist-cli/chunks/drivers-FTOUKVJ5.js +0 -2
- package/dist-cli/chunks/flow-EJXOH72E.js +0 -2
- package/dist-cli/chunks/help-ID6MSA6T.js +0 -2
- package/dist-cli/chunks/install-S4YF4O3O.js +0 -2
- package/dist-cli/chunks/optional-demo-registry-VXBG2NEH.js +0 -2
- package/dist-cli/chunks/runtime-YVV2FMMD.js +0 -2
- package/dist-cli/chunks/setup-repo-E2IJJBCE.js +0 -2
- package/dist-cli/chunks/store-EISWHA6H.js +0 -2
- package/dist-cli/chunks/telemetry-7AXVZMQT.js +0 -2
- package/dist-cli/chunks/upload-DWWZQMVH.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{C as T,D as A,E as y,P as _,Q as b,R as S}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{C as T,D as A,E as y,P as _,Q as b,R as S}from"./chunk-T7ERR3Y2.js";import{c as N,e as F}from"./chunk-VC7MRZW7.js";import{b as k}from"./chunk-SK3UIUQL.js";import"./chunk-4CLJIXM3.js";import"./chunk-MCQIOGWG.js";import"./chunk-ZO7E7WE5.js";function O(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--since"&&e+1<n.length){t.push(e,e+1);let s=n[e+1].trim(),l=/^(\d+(?:\.\d+)?)(ms|s|m)?$/.exec(s);if(l){let r=Number(l[1]),u=l[2]??"ms",v=u==="s"?r*1e3:u==="m"?r*6e4:r;return{since:Date.now()-v,consumed:t}}let i=Number(s);if(Number.isFinite(i)&&i>1e12)return{since:i,consumed:t}}return{consumed:t}}function B(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--kinds"&&e+1<n.length)return t.push(e,e+1),{kinds:n[e+1].split(",").map(s=>s.trim()).filter(Boolean),consumed:t};return{consumed:t}}function D(n){let t=[];for(let e=0;e<n.length;e++)if(n[e]==="--limit"&&e+1<n.length){t.push(e,e+1);let s=Number(n[e+1]);if(Number.isFinite(s)&&s>0)return{limit:s,consumed:t}}return{consumed:t}}function x(n){let t=[],e={label:"initial state",events:[],startedAt:n[0]?.t??null};t.push(e);for(let s of n)if(e.events.push(s),s.kind==="screen"||s.kind==="route"){let l=s.data,i=l?.phase;if(!i||i==="enter"||i==="appear"||i==="active"){let r=l?.name||l?.activeName||l?.path||l?.pathname||s.kind;t.length===1&&e.events.length===1?e.label=`${s.kind}: ${r}`:(e={label:`${s.kind}: ${r}`,events:[],startedAt:s.t},t.push(e))}}return t}async function J(n,t){let e=N(n,{port:t.port,stripBooleanFlags:["--summary","--all","--json","--no-advance","--help","-h","--flow","--noisy"],stripValueFlags:["--since","--kinds","--limit"]});(n.includes("--help")||n.includes("-h"))&&(console.log(`
|
|
3
3
|
sootsim what-happened \u2014 show recent events from the semantic timeline
|
|
4
4
|
|
|
5
5
|
usage:
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
2
|
-
import{d as i}from"./chunk-
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{d as i}from"./chunk-TM6NU7CC.js";import{d as n}from"./chunk-QEC2WZAU.js";import"./chunk-MCQIOGWG.js";import"./chunk-ZO7E7WE5.js";async function u(){let o=i();if(o||(console.log(" not signed in"),console.log(" set SOOTSIM_API_KEY=sk_sootsim_\u2026 or run `sootsim login`"),process.exit(1)),o.kind==="api-key"){let r=`${o.secret.slice(0,14)}\u2026`,t=o.source==="env"?"SOOTSIM_API_KEY env var":"saved key (~/.config/sootsim/credentials.json)";console.log(` api key ${r}`),console.log(` source: ${t}`);return}if(o.kind==="github"){console.log(` github token (${o.source})`),console.log(` repo: ${o.repoId}`);return}let e=await n(),s=e?.user;console.log(` ${s?.email||s?.name||s?.id||"signed in"}`),console.log(` origin: ${e?.origin??o.origin}`),e?.updatedAt&&console.log(` updated: ${e.updatedAt}`)}export{u as runWhoami};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/detox/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/home-paths.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -2784,9 +2784,24 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
|
|
|
2784
2784
|
// terminal 4001 code, so the client closes the abandoned window instead
|
|
2785
2785
|
// of reconnecting the zombie straight back in.
|
|
2786
2786
|
static SIM_IDLE_REAP_TTL_MS = 30 * 6e4;
|
|
2787
|
+
// automation sims (spawned by the playwright driver: `sootsim open --driver
|
|
2788
|
+
// playwright`, the factory/screenshot capture path — `meta.sootsimHostDriver
|
|
2789
|
+
// === 'playwright'`) are unattended one-shot browsers, never a human's tab. a
|
|
2790
|
+
// capture run opens one per slide/app/retry and the 30-min human/dev TTL lets
|
|
2791
|
+
// hundreds pile up inside the window — orphaned ms-playwright chromiums that
|
|
2792
|
+
// drove the box to swap-thrash (load hit 157 in one incident). give them a far
|
|
2793
|
+
// shorter idle TTL, and cap how many can sit concurrently: reap the most-idle
|
|
2794
|
+
// overflow, but never a sim active within ACTIVE_GRACE (an agent composing
|
|
2795
|
+
// between captures), nor primary / cli-attached / leased sims.
|
|
2796
|
+
static AUTOMATION_SIM_IDLE_REAP_TTL_MS = 10 * 6e4;
|
|
2797
|
+
static MAX_CONCURRENT_AUTOMATION_SIMS = 6;
|
|
2798
|
+
static AUTOMATION_SIM_ACTIVE_GRACE_MS = 6e4;
|
|
2787
2799
|
preferredPort;
|
|
2788
2800
|
portFallbackCount;
|
|
2789
2801
|
simIdleReapTtlMs;
|
|
2802
|
+
automationSimIdleReapTtlMs;
|
|
2803
|
+
maxConcurrentAutomationSims;
|
|
2804
|
+
automationSimActiveGraceMs;
|
|
2790
2805
|
shouldWriteLockfile;
|
|
2791
2806
|
sootbeanOrigin = null;
|
|
2792
2807
|
effectivePort = 0;
|
|
@@ -2823,6 +2838,9 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
|
|
|
2823
2838
|
this.agentHost = new AgentHost({ getExcludePorts: opts.agentScanExcludes });
|
|
2824
2839
|
this.sootbeanOrigin = opts.sootbeanOrigin?.replace(/\/$/, "") || null;
|
|
2825
2840
|
this.simIdleReapTtlMs = opts.simIdleReapTtlMs ?? _SootSimBridgeHost.SIM_IDLE_REAP_TTL_MS;
|
|
2841
|
+
this.automationSimIdleReapTtlMs = opts.automationSimIdleReapTtlMs ?? _SootSimBridgeHost.AUTOMATION_SIM_IDLE_REAP_TTL_MS;
|
|
2842
|
+
this.maxConcurrentAutomationSims = opts.maxConcurrentAutomationSims ?? _SootSimBridgeHost.MAX_CONCURRENT_AUTOMATION_SIMS;
|
|
2843
|
+
this.automationSimActiveGraceMs = opts.automationSimActiveGraceMs ?? _SootSimBridgeHost.AUTOMATION_SIM_ACTIVE_GRACE_MS;
|
|
2826
2844
|
}
|
|
2827
2845
|
/** expose the agent host so tests and embedders can inspect state or
|
|
2828
2846
|
* inject behavior. not part of the public WS protocol. */
|
|
@@ -3819,15 +3837,41 @@ var SootSimBridgeHost = class _SootSimBridgeHost {
|
|
|
3819
3837
|
// using is the primary and/or holds a fresh user-active lease; one that is
|
|
3820
3838
|
// none of those and idle past the TTL is abandoned regardless of a stale
|
|
3821
3839
|
// focus flag.
|
|
3840
|
+
// automation sims are spawned by the playwright driver (`sootsim open
|
|
3841
|
+
// --driver playwright`, the factory/screenshot capture path), which tags them
|
|
3842
|
+
// with `meta.sootsimHostDriver === 'playwright'` via the host's addInitScript.
|
|
3843
|
+
// they are unattended one-shot browsers, never a human's tab, so they get a
|
|
3844
|
+
// shorter idle TTL and a concurrent cap.
|
|
3845
|
+
isAutomationSim(sim) {
|
|
3846
|
+
return sim.meta?.sootsimHostDriver === "playwright";
|
|
3847
|
+
}
|
|
3822
3848
|
reapIdleSims(now = Date.now()) {
|
|
3823
3849
|
const attachedSimIds = new Set(this.cliSimBySocket.values());
|
|
3850
|
+
const automationLive = [];
|
|
3824
3851
|
for (const sim of this.sims.values()) {
|
|
3825
3852
|
if (sim.id === this.primarySimId) continue;
|
|
3826
3853
|
if (attachedSimIds.has(sim.id)) continue;
|
|
3827
3854
|
if (this.getActiveLease(sim)) continue;
|
|
3828
3855
|
const lastTouched = Math.max(sim.lastActiveAt, sim.connectedAt);
|
|
3829
|
-
|
|
3830
|
-
this.
|
|
3856
|
+
const idleMs = now - lastTouched;
|
|
3857
|
+
const automation = this.isAutomationSim(sim);
|
|
3858
|
+
const ttl = automation ? this.automationSimIdleReapTtlMs : this.simIdleReapTtlMs;
|
|
3859
|
+
if (idleMs >= ttl) {
|
|
3860
|
+
this.closeSimSocketFromHost(sim.ws);
|
|
3861
|
+
continue;
|
|
3862
|
+
}
|
|
3863
|
+
if (automation) automationLive.push({ sim, idleMs });
|
|
3864
|
+
}
|
|
3865
|
+
const cap = this.maxConcurrentAutomationSims;
|
|
3866
|
+
if (automationLive.length > cap) {
|
|
3867
|
+
automationLive.sort((a, b) => b.idleMs - a.idleMs);
|
|
3868
|
+
for (const { sim, idleMs } of automationLive.slice(
|
|
3869
|
+
0,
|
|
3870
|
+
automationLive.length - cap
|
|
3871
|
+
)) {
|
|
3872
|
+
if (idleMs < this.automationSimActiveGraceMs) continue;
|
|
3873
|
+
this.closeSimSocketFromHost(sim.ws);
|
|
3874
|
+
}
|
|
3831
3875
|
}
|
|
3832
3876
|
}
|
|
3833
3877
|
// ping every connected ws; if the previous round's ping went unanswered,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/host/fetch-proxy-overrides.ts
|
|
4
4
|
var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/render-mode.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/sdk.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/sdk.mjs
CHANGED
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -12824,9 +12824,24 @@ var init_bridge_host = __esm({
|
|
|
12824
12824
|
// terminal 4001 code, so the client closes the abandoned window instead
|
|
12825
12825
|
// of reconnecting the zombie straight back in.
|
|
12826
12826
|
static SIM_IDLE_REAP_TTL_MS = 30 * 6e4;
|
|
12827
|
+
// automation sims (spawned by the playwright driver: `sootsim open --driver
|
|
12828
|
+
// playwright`, the factory/screenshot capture path — `meta.sootsimHostDriver
|
|
12829
|
+
// === 'playwright'`) are unattended one-shot browsers, never a human's tab. a
|
|
12830
|
+
// capture run opens one per slide/app/retry and the 30-min human/dev TTL lets
|
|
12831
|
+
// hundreds pile up inside the window — orphaned ms-playwright chromiums that
|
|
12832
|
+
// drove the box to swap-thrash (load hit 157 in one incident). give them a far
|
|
12833
|
+
// shorter idle TTL, and cap how many can sit concurrently: reap the most-idle
|
|
12834
|
+
// overflow, but never a sim active within ACTIVE_GRACE (an agent composing
|
|
12835
|
+
// between captures), nor primary / cli-attached / leased sims.
|
|
12836
|
+
static AUTOMATION_SIM_IDLE_REAP_TTL_MS = 10 * 6e4;
|
|
12837
|
+
static MAX_CONCURRENT_AUTOMATION_SIMS = 6;
|
|
12838
|
+
static AUTOMATION_SIM_ACTIVE_GRACE_MS = 6e4;
|
|
12827
12839
|
preferredPort;
|
|
12828
12840
|
portFallbackCount;
|
|
12829
12841
|
simIdleReapTtlMs;
|
|
12842
|
+
automationSimIdleReapTtlMs;
|
|
12843
|
+
maxConcurrentAutomationSims;
|
|
12844
|
+
automationSimActiveGraceMs;
|
|
12830
12845
|
shouldWriteLockfile;
|
|
12831
12846
|
sootbeanOrigin = null;
|
|
12832
12847
|
effectivePort = 0;
|
|
@@ -12863,6 +12878,9 @@ var init_bridge_host = __esm({
|
|
|
12863
12878
|
this.agentHost = new AgentHost({ getExcludePorts: opts.agentScanExcludes });
|
|
12864
12879
|
this.sootbeanOrigin = opts.sootbeanOrigin?.replace(/\/$/, "") || null;
|
|
12865
12880
|
this.simIdleReapTtlMs = opts.simIdleReapTtlMs ?? _SootSimBridgeHost.SIM_IDLE_REAP_TTL_MS;
|
|
12881
|
+
this.automationSimIdleReapTtlMs = opts.automationSimIdleReapTtlMs ?? _SootSimBridgeHost.AUTOMATION_SIM_IDLE_REAP_TTL_MS;
|
|
12882
|
+
this.maxConcurrentAutomationSims = opts.maxConcurrentAutomationSims ?? _SootSimBridgeHost.MAX_CONCURRENT_AUTOMATION_SIMS;
|
|
12883
|
+
this.automationSimActiveGraceMs = opts.automationSimActiveGraceMs ?? _SootSimBridgeHost.AUTOMATION_SIM_ACTIVE_GRACE_MS;
|
|
12866
12884
|
}
|
|
12867
12885
|
/** expose the agent host so tests and embedders can inspect state or
|
|
12868
12886
|
* inject behavior. not part of the public WS protocol. */
|
|
@@ -13859,15 +13877,41 @@ var init_bridge_host = __esm({
|
|
|
13859
13877
|
// using is the primary and/or holds a fresh user-active lease; one that is
|
|
13860
13878
|
// none of those and idle past the TTL is abandoned regardless of a stale
|
|
13861
13879
|
// focus flag.
|
|
13880
|
+
// automation sims are spawned by the playwright driver (`sootsim open
|
|
13881
|
+
// --driver playwright`, the factory/screenshot capture path), which tags them
|
|
13882
|
+
// with `meta.sootsimHostDriver === 'playwright'` via the host's addInitScript.
|
|
13883
|
+
// they are unattended one-shot browsers, never a human's tab, so they get a
|
|
13884
|
+
// shorter idle TTL and a concurrent cap.
|
|
13885
|
+
isAutomationSim(sim) {
|
|
13886
|
+
return sim.meta?.sootsimHostDriver === "playwright";
|
|
13887
|
+
}
|
|
13862
13888
|
reapIdleSims(now = Date.now()) {
|
|
13863
13889
|
const attachedSimIds = new Set(this.cliSimBySocket.values());
|
|
13890
|
+
const automationLive = [];
|
|
13864
13891
|
for (const sim of this.sims.values()) {
|
|
13865
13892
|
if (sim.id === this.primarySimId) continue;
|
|
13866
13893
|
if (attachedSimIds.has(sim.id)) continue;
|
|
13867
13894
|
if (this.getActiveLease(sim)) continue;
|
|
13868
13895
|
const lastTouched = Math.max(sim.lastActiveAt, sim.connectedAt);
|
|
13869
|
-
|
|
13870
|
-
this.
|
|
13896
|
+
const idleMs = now - lastTouched;
|
|
13897
|
+
const automation = this.isAutomationSim(sim);
|
|
13898
|
+
const ttl = automation ? this.automationSimIdleReapTtlMs : this.simIdleReapTtlMs;
|
|
13899
|
+
if (idleMs >= ttl) {
|
|
13900
|
+
this.closeSimSocketFromHost(sim.ws);
|
|
13901
|
+
continue;
|
|
13902
|
+
}
|
|
13903
|
+
if (automation) automationLive.push({ sim, idleMs });
|
|
13904
|
+
}
|
|
13905
|
+
const cap = this.maxConcurrentAutomationSims;
|
|
13906
|
+
if (automationLive.length > cap) {
|
|
13907
|
+
automationLive.sort((a, b) => b.idleMs - a.idleMs);
|
|
13908
|
+
for (const { sim, idleMs } of automationLive.slice(
|
|
13909
|
+
0,
|
|
13910
|
+
automationLive.length - cap
|
|
13911
|
+
)) {
|
|
13912
|
+
if (idleMs < this.automationSimActiveGraceMs) continue;
|
|
13913
|
+
this.closeSimSocketFromHost(sim.ws);
|
|
13914
|
+
}
|
|
13871
13915
|
}
|
|
13872
13916
|
}
|
|
13873
13917
|
// ping every connected ws; if the previous round's ping went unanswered,
|
package/dist-lib/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.147 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/package.json
CHANGED
package/src/host/bridge-host.ts
CHANGED
|
@@ -228,6 +228,18 @@ export interface BridgeHostOptions {
|
|
|
228
228
|
* can drive the real timer path deterministically instead of mocking
|
|
229
229
|
* time. production callers should never set this. */
|
|
230
230
|
simIdleReapTtlMs?: number
|
|
231
|
+
/** override the idle GC TTL (ms) for automation sims (playwright-driver,
|
|
232
|
+
* capture/factory). defaults to AUTOMATION_SIM_IDLE_REAP_TTL_MS (10 min).
|
|
233
|
+
* test-only, like simIdleReapTtlMs. */
|
|
234
|
+
automationSimIdleReapTtlMs?: number
|
|
235
|
+
/** cap on concurrent non-primary automation sims before the reaper drops
|
|
236
|
+
* the most-idle overflow. defaults to MAX_CONCURRENT_AUTOMATION_SIMS (6).
|
|
237
|
+
* test-only. */
|
|
238
|
+
maxConcurrentAutomationSims?: number
|
|
239
|
+
/** grace (ms) below which an automation sim is never reaped by the cap,
|
|
240
|
+
* even when over it. defaults to AUTOMATION_SIM_ACTIVE_GRACE_MS (60 s).
|
|
241
|
+
* test-only. */
|
|
242
|
+
automationSimActiveGraceMs?: number
|
|
231
243
|
}
|
|
232
244
|
|
|
233
245
|
const DAEMON_HEARTBEAT_INTERVAL_MS = 5_000
|
|
@@ -354,10 +366,25 @@ export class SootSimBridgeHost {
|
|
|
354
366
|
// terminal 4001 code, so the client closes the abandoned window instead
|
|
355
367
|
// of reconnecting the zombie straight back in.
|
|
356
368
|
private static SIM_IDLE_REAP_TTL_MS = 30 * 60_000
|
|
369
|
+
// automation sims (spawned by the playwright driver: `sootsim open --driver
|
|
370
|
+
// playwright`, the factory/screenshot capture path — `meta.sootsimHostDriver
|
|
371
|
+
// === 'playwright'`) are unattended one-shot browsers, never a human's tab. a
|
|
372
|
+
// capture run opens one per slide/app/retry and the 30-min human/dev TTL lets
|
|
373
|
+
// hundreds pile up inside the window — orphaned ms-playwright chromiums that
|
|
374
|
+
// drove the box to swap-thrash (load hit 157 in one incident). give them a far
|
|
375
|
+
// shorter idle TTL, and cap how many can sit concurrently: reap the most-idle
|
|
376
|
+
// overflow, but never a sim active within ACTIVE_GRACE (an agent composing
|
|
377
|
+
// between captures), nor primary / cli-attached / leased sims.
|
|
378
|
+
private static AUTOMATION_SIM_IDLE_REAP_TTL_MS = 10 * 60_000
|
|
379
|
+
private static MAX_CONCURRENT_AUTOMATION_SIMS = 6
|
|
380
|
+
private static AUTOMATION_SIM_ACTIVE_GRACE_MS = 60_000
|
|
357
381
|
|
|
358
382
|
private preferredPort: number
|
|
359
383
|
private portFallbackCount: number
|
|
360
384
|
private simIdleReapTtlMs: number
|
|
385
|
+
private automationSimIdleReapTtlMs: number
|
|
386
|
+
private maxConcurrentAutomationSims: number
|
|
387
|
+
private automationSimActiveGraceMs: number
|
|
361
388
|
private shouldWriteLockfile: boolean
|
|
362
389
|
private sootbeanOrigin: string | null = null
|
|
363
390
|
private effectivePort = 0
|
|
@@ -403,6 +430,12 @@ export class SootSimBridgeHost {
|
|
|
403
430
|
this.sootbeanOrigin = opts.sootbeanOrigin?.replace(/\/$/, '') || null
|
|
404
431
|
this.simIdleReapTtlMs =
|
|
405
432
|
opts.simIdleReapTtlMs ?? SootSimBridgeHost.SIM_IDLE_REAP_TTL_MS
|
|
433
|
+
this.automationSimIdleReapTtlMs =
|
|
434
|
+
opts.automationSimIdleReapTtlMs ?? SootSimBridgeHost.AUTOMATION_SIM_IDLE_REAP_TTL_MS
|
|
435
|
+
this.maxConcurrentAutomationSims =
|
|
436
|
+
opts.maxConcurrentAutomationSims ?? SootSimBridgeHost.MAX_CONCURRENT_AUTOMATION_SIMS
|
|
437
|
+
this.automationSimActiveGraceMs =
|
|
438
|
+
opts.automationSimActiveGraceMs ?? SootSimBridgeHost.AUTOMATION_SIM_ACTIVE_GRACE_MS
|
|
406
439
|
}
|
|
407
440
|
|
|
408
441
|
/** expose the agent host so tests and embedders can inspect state or
|
|
@@ -1624,8 +1657,20 @@ export class SootSimBridgeHost {
|
|
|
1624
1657
|
// using is the primary and/or holds a fresh user-active lease; one that is
|
|
1625
1658
|
// none of those and idle past the TTL is abandoned regardless of a stale
|
|
1626
1659
|
// focus flag.
|
|
1660
|
+
// automation sims are spawned by the playwright driver (`sootsim open
|
|
1661
|
+
// --driver playwright`, the factory/screenshot capture path), which tags them
|
|
1662
|
+
// with `meta.sootsimHostDriver === 'playwright'` via the host's addInitScript.
|
|
1663
|
+
// they are unattended one-shot browsers, never a human's tab, so they get a
|
|
1664
|
+
// shorter idle TTL and a concurrent cap.
|
|
1665
|
+
private isAutomationSim(sim: BridgeSimConnection): boolean {
|
|
1666
|
+
return sim.meta?.sootsimHostDriver === 'playwright'
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1627
1669
|
private reapIdleSims(now = Date.now()) {
|
|
1628
1670
|
const attachedSimIds = new Set(this.cliSimBySocket.values())
|
|
1671
|
+
// automation sims that pass every "someone cares" gate but are still under
|
|
1672
|
+
// their TTL — candidates for the concurrent-cap pass below.
|
|
1673
|
+
const automationLive: { sim: BridgeSimConnection; idleMs: number }[] = []
|
|
1629
1674
|
for (const sim of this.sims.values()) {
|
|
1630
1675
|
if (sim.id === this.primarySimId) continue
|
|
1631
1676
|
if (attachedSimIds.has(sim.id)) continue
|
|
@@ -1633,10 +1678,31 @@ export class SootSimBridgeHost {
|
|
|
1633
1678
|
// never-CLI-driven sims have lastActiveAt 0 — fall back to connectedAt
|
|
1634
1679
|
// so a freshly opened, not-yet-primary tab isn't reaped on the spot.
|
|
1635
1680
|
const lastTouched = Math.max(sim.lastActiveAt, sim.connectedAt)
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1681
|
+
const idleMs = now - lastTouched
|
|
1682
|
+
const automation = this.isAutomationSim(sim)
|
|
1683
|
+
const ttl = automation ? this.automationSimIdleReapTtlMs : this.simIdleReapTtlMs
|
|
1684
|
+
if (idleMs >= ttl) {
|
|
1685
|
+
// terminal close → client closes the window, does not reconnect; the
|
|
1686
|
+
// 'close' handler runs rememberDisconnectedSim → this.sims.delete.
|
|
1687
|
+
this.closeSimSocketFromHost(sim.ws)
|
|
1688
|
+
continue
|
|
1689
|
+
}
|
|
1690
|
+
if (automation) automationLive.push({ sim, idleMs })
|
|
1691
|
+
}
|
|
1692
|
+
// concurrent cap: a burst of capture opens can pile up hundreds inside the
|
|
1693
|
+
// TTL window. keep at most maxConcurrentAutomationSims of the freshest;
|
|
1694
|
+
// reap the most-idle overflow, but never one active within the grace (an
|
|
1695
|
+
// agent mid-capture between screenshots).
|
|
1696
|
+
const cap = this.maxConcurrentAutomationSims
|
|
1697
|
+
if (automationLive.length > cap) {
|
|
1698
|
+
automationLive.sort((a, b) => b.idleMs - a.idleMs) // most-idle first
|
|
1699
|
+
for (const { sim, idleMs } of automationLive.slice(
|
|
1700
|
+
0,
|
|
1701
|
+
automationLive.length - cap,
|
|
1702
|
+
)) {
|
|
1703
|
+
if (idleMs < this.automationSimActiveGraceMs) continue
|
|
1704
|
+
this.closeSimSocketFromHost(sim.ws)
|
|
1705
|
+
}
|
|
1640
1706
|
}
|
|
1641
1707
|
}
|
|
1642
1708
|
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c,d}from"./chunk-MSQUL5BU.js";import"./chunk-BBIN2U26.js";import"./chunk-YBSNSFBX.js";import"./chunk-FK2YXBKR.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import"./chunk-Y76W7GZV.js";import{a,b,c,d,e,f,g,h,i}from"./chunk-C44OZFHJ.js";import"./chunk-H2EIYIRP.js";import"./chunk-UD4SYXDQ.js";import"./chunk-DRCRPS2N.js";import"./chunk-A7JX3OQC.js";import"./chunk-YBSNSFBX.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{e as ALL_DRIVERS,i as buildDriverListRows,a as chromiumDriver,b as electronDriver,f as getAllDrivers,g as getDriver,c as playwrightDriver,h as resolveDriver,d as systemDriver};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as c,b as d,c as e,d as f}from"./chunk-ERAE4LJT.js";import"./chunk-BE2ZDRIJ.js";import"./chunk-OU42HTKN.js";import"./chunk-PCW4TKI2.js";import"./chunk-JZW2R5D7.js";import"./chunk-HZHZY7N5.js";import{c as a,d as b}from"./chunk-H6LFGGJW.js";import"./chunk-IAO27BWC.js";import"./chunk-XRQDMB2J.js";import"./chunk-MVLNHZMU.js";import"./chunk-DP5FSZHW.js";import"./chunk-MIIAYBFL.js";import"./chunk-BBIN2U26.js";import"./chunk-G7JMTSF6.js";import"./chunk-C44OZFHJ.js";import"./chunk-H2EIYIRP.js";import"./chunk-UD4SYXDQ.js";import"./chunk-DRCRPS2N.js";import"./chunk-A7JX3OQC.js";import"./chunk-YBSNSFBX.js";import"./chunk-Q6BHESL2.js";import"./chunk-R7CMXY5T.js";import"./chunk-WFXLVOUA.js";import"./chunk-3RPHEE3K.js";import"./chunk-FK2YXBKR.js";import"./chunk-XO4VQYFP.js";import"./chunk-RTD4RNZV.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{c as discoverSootsimUrl,e as hoistLeadingSimFlag,a as parseFlowFile,f as runFlow,d as runFlowPlayback,b as validateFlowFile};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-TZXKFPBJ.js";import"./chunk-WFXLVOUA.js";import"./chunk-AOPFT3S4.js";import"./chunk-3RPHEE3K.js";import"./chunk-FK2YXBKR.js";import"./chunk-4KNMAGC4.js";import"./chunk-HWB7DPXH.js";import"./chunk-RTD4RNZV.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as o}from"./chunk-ATJRNMNA.js";import"./chunk-2PYDOYIS.js";import"./chunk-MSQUL5BU.js";import"./chunk-BBIN2U26.js";import"./chunk-YBSNSFBX.js";import"./chunk-Q6BHESL2.js";import"./chunk-R7CMXY5T.js";import"./chunk-FK2YXBKR.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";async function t(n){console.error(" note: `sootsim install` is now `sootsim setup-repo`. forwarding\u2026\n"),await o(n)}export{t as runInstall};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b}from"./chunk-35QJJ4MM.js";import"./chunk-BBIN2U26.js";import"./chunk-YBSNSFBX.js";import"./chunk-FK2YXBKR.js";import"./chunk-GD473DHN.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{b as formatReleaseEntry,a as runRuntime};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a}from"./chunk-ATJRNMNA.js";import"./chunk-2PYDOYIS.js";import"./chunk-MSQUL5BU.js";import"./chunk-BBIN2U26.js";import"./chunk-YBSNSFBX.js";import"./chunk-Q6BHESL2.js";import"./chunk-R7CMXY5T.js";import"./chunk-FK2YXBKR.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{a as runSetupRepo};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.146 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-JZW2R5D7.js";import"./chunk-HZHZY7N5.js";import"./chunk-MIIAYBFL.js";import"./chunk-BBIN2U26.js";import"./chunk-DRCRPS2N.js";import"./chunk-A7JX3OQC.js";import"./chunk-YBSNSFBX.js";import"./chunk-Q6BHESL2.js";import"./chunk-R7CMXY5T.js";import"./chunk-FK2YXBKR.js";import"./chunk-IADMCPLZ.js";import"./chunk-TLFNO2L4.js";export{a as resolveDefaultUploadOrigin,b as resolvePublicPreviewOrigin,c as runUpload};
|