sootsim 0.1.165 → 0.1.167
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/README.md +7 -0
- package/dist-cli/bin.js +3 -3
- package/dist-cli/chunks/{agent-2EPUTBUL.js → agent-FGNA3LC6.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-VMZZJY7Y.js → agent-wrapper-5CRKG7K7.js} +2 -2
- package/dist-cli/chunks/{app-fonts-6L4RKPLM.js → app-fonts-CM3ML6NV.js} +2 -2
- package/dist-cli/chunks/{assert-7XQLVOIT.js → assert-DCO6XYDU.js} +2 -2
- package/dist-cli/chunks/auto-bootstrap-QJUHQLQH.js +2 -0
- package/dist-cli/chunks/beta-W5Y32GJR.js +2 -0
- package/dist-cli/chunks/{camera-F7ADKILD.js → camera-HWLYOMJV.js} +2 -2
- package/dist-cli/chunks/{chunk-5IXQLSHV.js → chunk-27CWE62K.js} +2 -2
- package/dist-cli/chunks/{chunk-32YLDVP3.js → chunk-2QPTZHGU.js} +2 -2
- package/dist-cli/chunks/{chunk-T3SJIJNN.js → chunk-2UGS25BK.js} +1 -1
- package/dist-cli/chunks/{chunk-WJHZQUAF.js → chunk-3MQAPPOW.js} +1 -1
- package/dist-cli/chunks/{chunk-QQXWV7VE.js → chunk-3RHECMKV.js} +4 -6
- package/dist-cli/chunks/{chunk-6WWYHNYI.js → chunk-47JNNTYQ.js} +1 -1
- package/dist-cli/chunks/chunk-7P6CUODK.js +1 -0
- package/dist-cli/chunks/{chunk-MF7QK7PS.js → chunk-AB6TZFIE.js} +1 -1
- package/dist-cli/chunks/{chunk-2N5FR2CU.js → chunk-ACNSMZSP.js} +1 -1
- package/dist-cli/chunks/chunk-BIG5BGMC.js +5 -0
- package/dist-cli/chunks/{chunk-ESGMJNNM.js → chunk-D6QVHHDU.js} +1 -1
- package/dist-cli/chunks/{chunk-XJQRNGCW.js → chunk-DAMNOIAJ.js} +5 -4
- package/dist-cli/chunks/{chunk-ALSMTP6C.js → chunk-DM2EOTY5.js} +2 -2
- package/dist-cli/chunks/{chunk-X3Q65CKA.js → chunk-DWYDDN7J.js} +2 -2
- package/dist-cli/chunks/chunk-E5E7XQIN.js +2 -0
- package/dist-cli/chunks/{chunk-HQZMG2HF.js → chunk-EIMDQRZS.js} +2 -2
- package/dist-cli/chunks/{chunk-TGNYK2JI.js → chunk-ELHNXEJI.js} +2 -2
- package/dist-cli/chunks/chunk-F2UUNDRU.js +119 -0
- package/dist-cli/chunks/chunk-F5PLWUIU.js +1 -0
- package/dist-cli/chunks/{chunk-XLVOIA4F.js → chunk-F5REXFAW.js} +23 -13
- package/dist-cli/chunks/{chunk-ZUY4EZUO.js → chunk-GNHGTWDX.js} +2 -2
- package/dist-cli/chunks/{chunk-FXQRRTHD.js → chunk-HCNW2QTI.js} +3 -3
- package/dist-cli/chunks/chunk-HHOQMAVJ.js +1 -0
- package/dist-cli/chunks/{chunk-YXQNPOHC.js → chunk-IV5NEIXZ.js} +2 -2
- package/dist-cli/chunks/{chunk-BZS6I346.js → chunk-JDFPPPPS.js} +1 -1
- package/dist-cli/chunks/{chunk-AA5UBYX7.js → chunk-JI72D4RY.js} +1 -1
- package/dist-cli/chunks/{chunk-5IIMWTMI.js → chunk-JL7K7EPF.js} +3 -3
- package/dist-cli/chunks/{chunk-AJD3G3DQ.js → chunk-KCETAALD.js} +2 -2
- package/dist-cli/chunks/{chunk-L3ZBX3DX.js → chunk-MGX3HHAR.js} +1 -1
- package/dist-cli/chunks/{chunk-HAJPACUR.js → chunk-MI7BLMGH.js} +2 -2
- package/dist-cli/chunks/chunk-MPUONWKJ.js +13 -0
- package/dist-cli/chunks/{chunk-EV5NG4AO.js → chunk-OGH3OCGP.js} +2 -2
- package/dist-cli/chunks/{chunk-J7YRSCPF.js → chunk-OKBGHUCY.js} +1 -1
- package/dist-cli/chunks/{chunk-43R7N2HR.js → chunk-PDPBZD5O.js} +1 -1
- package/dist-cli/chunks/{chunk-UYFIE5X3.js → chunk-QIXDVNSM.js} +6 -6
- package/dist-cli/chunks/{chunk-KMXETT3S.js → chunk-QX25ZRIQ.js} +2 -2
- package/dist-cli/chunks/{chunk-BVMLSYUA.js → chunk-RTBG543W.js} +2 -2
- package/dist-cli/chunks/{chunk-HA5LR3RI.js → chunk-SIRMLK54.js} +1 -1
- package/dist-cli/chunks/{chunk-DZPNBMAP.js → chunk-T4UHUISG.js} +1 -1
- package/dist-cli/chunks/{chunk-EGBFMW45.js → chunk-TFF3KXNC.js} +1 -1
- package/dist-cli/chunks/{chunk-6YEVWYSG.js → chunk-U7LLQDO4.js} +1 -1
- package/dist-cli/chunks/{chunk-53AQC5XE.js → chunk-UC7LRLPE.js} +1 -1
- package/dist-cli/chunks/chunk-UF2T46AA.js +3 -0
- package/dist-cli/chunks/{chunk-OXGEETXY.js → chunk-VCKKDUWG.js} +2 -2
- package/dist-cli/chunks/{chunk-FNUHS7EZ.js → chunk-WXFUXFY7.js} +2 -2
- package/dist-cli/chunks/{chunk-IIY2O6LJ.js → chunk-ZLZ3R452.js} +2 -2
- package/dist-cli/chunks/cli-version-RHOJPOQJ.js +2 -0
- package/dist-cli/chunks/{compat-VN34CJ6G.js → compat-WZAQMU3Y.js} +3 -3
- package/dist-cli/chunks/{config-XDZODP5I.js → config-EMVWQLSZ.js} +2 -2
- package/dist-cli/chunks/control-P3M34LCO.js +2 -0
- package/dist-cli/chunks/{cpu-profile-JFAHFE6I.js → cpu-profile-FIXB3BPM.js} +2 -2
- package/dist-cli/chunks/daemon-VPUPR3CK.js +67 -0
- package/dist-cli/chunks/{debug-ABBVZGOK.js → debug-QW2VVENB.js} +3 -3
- package/dist-cli/chunks/{detox-SIZWOR5E.js → detox-RLEEW5BN.js} +2 -2
- package/dist-cli/chunks/{device-RLXPXXPO.js → device-MCFZ5J5W.js} +2 -2
- package/dist-cli/chunks/{diagnose-V73S6VLC.js → diagnose-VSSY5XMS.js} +2 -2
- package/dist-cli/chunks/drivers-GPZ62RP5.js +2 -0
- package/dist-cli/chunks/{electron-YQR52UGK.js → electron-OD7H7UBA.js} +3 -3
- package/dist-cli/chunks/flow-JFSZHDB2.js +2 -0
- package/dist-cli/chunks/help-DFQRIC3T.js +2 -0
- package/dist-cli/chunks/{hints-ZL56EHFZ.js → hints-TU5HBDRY.js} +2 -2
- package/dist-cli/chunks/{home-paths-U4FRKF6W.js → home-paths-6WZQKHRA.js} +2 -2
- package/dist-cli/chunks/{inspect-LPQT5DTA.js → inspect-UNZ7Z5PF.js} +3 -3
- package/dist-cli/chunks/install-7JTNTNNX.js +2 -0
- package/dist-cli/chunks/{install-desktop-KEOL5MR2.js → install-desktop-6LB2C5H5.js} +3 -3
- package/dist-cli/chunks/{keys-7S22SCJL.js → keys-5XMDDDUV.js} +2 -2
- package/dist-cli/chunks/{launch-MP6Y7PAS.js → launch-RVQHYE5V.js} +3 -3
- package/dist-cli/chunks/{login-7IAUA2K7.js → login-BGMYYUK2.js} +4 -4
- package/dist-cli/chunks/{logout-L2KZIVSL.js → logout-PXZVOWLU.js} +2 -2
- package/dist-cli/chunks/{maestro-UPW6VRQA.js → maestro-RIGROEAZ.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-GQL6Z6OH.js +2 -0
- package/dist-cli/chunks/{preview-D4GRDZRM.js → preview-3XCXJMNU.js} +2 -2
- package/dist-cli/chunks/{profile-NU5AQZYQ.js → profile-7MQEP55V.js} +2 -2
- package/dist-cli/chunks/{react-FMBASJYN.js → react-BBOQIY6V.js} +2 -2
- package/dist-cli/chunks/{record-UGXBLMIS.js → record-4U2X6JDH.js} +4 -4
- package/dist-cli/chunks/runtime-HPZWCYML.js +2 -0
- package/dist-cli/chunks/{runtime-delivery-23LSZG33.js → runtime-delivery-VK2HCMQW.js} +2 -2
- package/dist-cli/chunks/screenshot-MCFHIP2H.js +35 -0
- package/dist-cli/chunks/{screenshot-mode-Y26AAZTJ.js → screenshot-mode-VJEAECKO.js} +2 -2
- package/dist-cli/chunks/{screenshots-OWPSRJ5A.js → screenshots-3NSCRA3U.js} +2 -2
- package/dist-cli/chunks/{server-3ZCQ257D.js → server-HIPHVNKP.js} +3 -3
- package/dist-cli/chunks/setup-repo-LFSW66HX.js +2 -0
- package/dist-cli/chunks/{skills-BF5OYDL4.js → skills-JILZXX7E.js} +2 -2
- package/dist-cli/chunks/{slides-NI6F3FRT.js → slides-IWZX6TCC.js} +2 -2
- package/dist-cli/chunks/{start-PN6254AD.js → start-4RYQMQMM.js} +4 -4
- package/dist-cli/chunks/store-RGD3TDGI.js +2 -0
- package/dist-cli/chunks/telemetry-7TRVV4JE.js +2 -0
- package/dist-cli/chunks/{test-GYLIVGBO.js → test-VQ6HIPKR.js} +3 -3
- package/dist-cli/chunks/{three-mode-BXCPBK7G.js → three-mode-UWH72A46.js} +2 -2
- package/dist-cli/chunks/{timeline-RR75CYQP.js → timeline-T6LM4W3H.js} +2 -2
- package/dist-cli/chunks/{upgrade-POFEYCZJ.js → upgrade-KEJ2H2WE.js} +2 -2
- package/dist-cli/chunks/upload-BWSIC24N.js +2 -0
- package/dist-cli/chunks/{version-ZIW3AABE.js → version-PIJ2OP5O.js} +2 -2
- package/dist-cli/chunks/{web-AMUML35L.js → web-DCGXY52J.js} +2 -2
- package/dist-cli/chunks/{what-happened-YRVA42P7.js → what-happened-CUA3N455.js} +2 -2
- package/dist-cli/chunks/{whoami-TIO2K57H.js → whoami-Z5XNGCGJ.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 +1 -1
- 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/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +1 -1
- package/dist-lib/vite.cjs +1 -1
- package/package.json +4 -2
- package/scripts/preuninstall.cjs +118 -0
- package/src/native-dev-bundle-url.ts +22 -0
- package/dist-cli/chunks/auto-bootstrap-GOOU4KQE.js +0 -2
- package/dist-cli/chunks/beta-CRII6BIU.js +0 -2
- package/dist-cli/chunks/chunk-5QWSPJHN.js +0 -13
- package/dist-cli/chunks/chunk-HFPCHOKV.js +0 -2
- package/dist-cli/chunks/chunk-HKCO4GFF.js +0 -5
- package/dist-cli/chunks/chunk-M72THY5Y.js +0 -1
- package/dist-cli/chunks/chunk-O4J2RSBF.js +0 -119
- package/dist-cli/chunks/chunk-RAS5AWIY.js +0 -1
- package/dist-cli/chunks/chunk-X3TVSME2.js +0 -3
- package/dist-cli/chunks/chunk-YIZQFYDE.js +0 -1
- package/dist-cli/chunks/cli-version-EJUVAAK3.js +0 -2
- package/dist-cli/chunks/control-QUGPN5RE.js +0 -2
- package/dist-cli/chunks/daemon-TUYHAVYA.js +0 -67
- package/dist-cli/chunks/drivers-HBCRUONZ.js +0 -2
- package/dist-cli/chunks/flow-VY5435YB.js +0 -2
- package/dist-cli/chunks/help-GCFMWV2P.js +0 -2
- package/dist-cli/chunks/install-HLUFKIYY.js +0 -2
- package/dist-cli/chunks/optional-demo-registry-WSPMNQX5.js +0 -2
- package/dist-cli/chunks/runtime-QAQWW2CP.js +0 -2
- package/dist-cli/chunks/screenshot-RFDYG3WW.js +0 -35
- package/dist-cli/chunks/setup-repo-IT6HNGID.js +0 -2
- package/dist-cli/chunks/store-NU4G6MAF.js +0 -2
- package/dist-cli/chunks/telemetry-WZFPP7XR.js +0 -2
- package/dist-cli/chunks/upload-NHL3ZR6J.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.167 | (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-AB6TZFIE.js";import{c as N,e as F}from"./chunk-ZLZ3R452.js";import"./chunk-U7LLQDO4.js";import{b as k}from"./chunk-D6QVHHDU.js";import"./chunk-TFF3KXNC.js";import"./chunk-ACNSMZSP.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.167 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{d as i}from"./chunk-WXFUXFY7.js";import{d as n}from"./chunk-DM2EOTY5.js";import"./chunk-TFF3KXNC.js";import"./chunk-ACNSMZSP.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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.167 | (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/menu.mjs
CHANGED
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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.167 | (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/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.167 | (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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sootsim",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.167",
|
|
4
4
|
"description": "sootsim CLI + vite/metro plugins + skills registry. bridge client for driving the proprietary sootsim-engine over WebSocket.",
|
|
5
5
|
"author": "Tamagui LLC",
|
|
6
6
|
"license": "MIT",
|
|
@@ -136,6 +136,7 @@
|
|
|
136
136
|
"scripts/optional-demo-registry.ts",
|
|
137
137
|
"detox/",
|
|
138
138
|
"scripts/postinstall.cjs",
|
|
139
|
+
"scripts/preuninstall.cjs",
|
|
139
140
|
"README.md",
|
|
140
141
|
"LICENSE"
|
|
141
142
|
],
|
|
@@ -144,7 +145,8 @@
|
|
|
144
145
|
"build:cli": "bun scripts/build-cli.ts",
|
|
145
146
|
"build:cli-binary": "bun scripts/build-cli-binary.ts",
|
|
146
147
|
"pack:smoke": "bun scripts/pack-smoke.ts",
|
|
147
|
-
"postinstall": "node ./scripts/postinstall.cjs"
|
|
148
|
+
"postinstall": "node ./scripts/postinstall.cjs",
|
|
149
|
+
"preuninstall": "node ./scripts/preuninstall.cjs"
|
|
148
150
|
},
|
|
149
151
|
"dependencies": {
|
|
150
152
|
"ws": "^8.18.0"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// preuninstall — runs before `npm rm -g sootsim` actually removes the bin.
|
|
3
|
+
//
|
|
4
|
+
// without this hook the user is left with a 79MB ghost: a launchd/systemd
|
|
5
|
+
// service still ENABLED + actively running (with ExecStart pointing at the
|
|
6
|
+
// now-missing binary), ~/.sootsim/ (cache + runtimes + electron + profiles +
|
|
7
|
+
// daemon.json), and the user's first instinct (`sootsim daemon uninstall`)
|
|
8
|
+
// is gone with the package. so we tear it all down here, while the bin still
|
|
9
|
+
// exists.
|
|
10
|
+
//
|
|
11
|
+
// reliability: npm preuninstall hooks are best-effort — they don't fire when
|
|
12
|
+
// the package wasn't installed by npm (yarn/bun/pnpm have their own lifecycle
|
|
13
|
+
// rules), and they don't run as part of `npm cache verify` cleanup or manual
|
|
14
|
+
// dir removal. that's why we also document `sootsim daemon uninstall` as the
|
|
15
|
+
// manual fallback and show a hint pointing at it.
|
|
16
|
+
//
|
|
17
|
+
// strategy: spawn the bundled bin to run `daemon uninstall` (single source of
|
|
18
|
+
// truth — the same logic the user invokes manually). if that fails for any
|
|
19
|
+
// reason — node version mismatch, the bin already removed by a previous
|
|
20
|
+
// half-completed run, missing $HOME — do a best-effort raw fs cleanup so the
|
|
21
|
+
// machine isn't left in a broken state.
|
|
22
|
+
|
|
23
|
+
const { spawnSync } = require('child_process')
|
|
24
|
+
const fs = require('fs')
|
|
25
|
+
const os = require('os')
|
|
26
|
+
const path = require('path')
|
|
27
|
+
|
|
28
|
+
if (process.env.SOOTSIM_SKIP_PREUNINSTALL === '1') {
|
|
29
|
+
process.exit(0)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// dev / workspace installs (running inside the soot monorepo, not in a
|
|
33
|
+
// node_modules tree) — don't tear anything down. the developer is rebuilding
|
|
34
|
+
// the workspace, not actually uninstalling.
|
|
35
|
+
const pkgDir = path.resolve(__dirname, '..')
|
|
36
|
+
if (!pkgDir.includes(`${path.sep}node_modules${path.sep}`)) {
|
|
37
|
+
process.exit(0)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// skipped under sudo for the same reason as postinstall: $HOME would be /root,
|
|
41
|
+
// but the user who needs cleanup is the one who installed sootsim. they can
|
|
42
|
+
// run `sootsim daemon uninstall` themselves before `sudo npm rm -g sootsim`
|
|
43
|
+
// to clean their own home.
|
|
44
|
+
const isRoot = typeof process.getuid === 'function' && process.getuid() === 0
|
|
45
|
+
if (isRoot && process.env.SUDO_USER) {
|
|
46
|
+
console.log(
|
|
47
|
+
'sootsim: preuninstall skipped under sudo — run `sootsim daemon uninstall` ' +
|
|
48
|
+
'as your user first to remove ~/.sootsim and the bridge daemon',
|
|
49
|
+
)
|
|
50
|
+
process.exit(0)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const bin = path.join(pkgDir, 'dist-cli', 'bin.js')
|
|
54
|
+
let unifiedOk = false
|
|
55
|
+
if (fs.existsSync(bin)) {
|
|
56
|
+
const res = spawnSync(process.execPath, [bin, 'daemon', 'uninstall'], {
|
|
57
|
+
stdio: 'inherit',
|
|
58
|
+
timeout: 30_000,
|
|
59
|
+
})
|
|
60
|
+
unifiedOk = res.status === 0
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!unifiedOk) {
|
|
64
|
+
// raw fallback. mirrors teardownDaemonService + teardownSootsimHome from
|
|
65
|
+
// cli/commands/daemon.ts. idempotent: each entry is checked before remove.
|
|
66
|
+
console.log('sootsim: bin path failed — running raw cleanup fallback')
|
|
67
|
+
rawCleanup()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
process.exit(0)
|
|
71
|
+
|
|
72
|
+
function rawCleanup() {
|
|
73
|
+
const home = sootsimHomeDir()
|
|
74
|
+
if (process.platform === 'darwin') {
|
|
75
|
+
safeSpawn('launchctl', ['bootout', `gui/${getuid()}/dev.sootsim.daemon`])
|
|
76
|
+
safeSpawn('launchctl', ['bootout', `gui/${getuid()}/dev.sootsim.server`])
|
|
77
|
+
safeRemove(path.join(os.homedir(), 'Library/LaunchAgents/dev.sootsim.daemon.plist'))
|
|
78
|
+
safeRemove(path.join(os.homedir(), 'Library/LaunchAgents/dev.sootsim.server.plist'))
|
|
79
|
+
safeRemove(path.join(os.homedir(), 'Library/Logs/sootsim'), {
|
|
80
|
+
recursive: true,
|
|
81
|
+
})
|
|
82
|
+
} else if (process.platform === 'linux') {
|
|
83
|
+
safeSpawn('systemctl', ['--user', 'disable', '--now', 'sootsim-server'])
|
|
84
|
+
safeSpawn('systemctl', ['--user', 'daemon-reload'])
|
|
85
|
+
safeSpawn('systemctl', ['--user', 'reset-failed', 'sootsim-server'])
|
|
86
|
+
safeRemove(path.join(os.homedir(), '.config/systemd/user/sootsim-server.service'))
|
|
87
|
+
safeRemove(path.join(os.homedir(), '.local/state/sootsim'), { recursive: true })
|
|
88
|
+
}
|
|
89
|
+
// ~/.sootsim is the same on every platform; honor $SOOTSIM_HOME.
|
|
90
|
+
safeRemove(home, { recursive: true })
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function sootsimHomeDir() {
|
|
94
|
+
const env = process.env.SOOTSIM_HOME
|
|
95
|
+
if (env && env.length > 0) return path.resolve(env)
|
|
96
|
+
return path.join(os.homedir(), '.sootsim')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function safeRemove(p, opts) {
|
|
100
|
+
try {
|
|
101
|
+
if (fs.existsSync(p)) {
|
|
102
|
+
fs.rmSync(p, { force: true, ...(opts || {}) })
|
|
103
|
+
console.log(` removed ${p}`)
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
console.log(` could not remove ${p}: ${err && err.message}`)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function safeSpawn(cmd, args) {
|
|
111
|
+
try {
|
|
112
|
+
spawnSync(cmd, args, { stdio: 'ignore' })
|
|
113
|
+
} catch {}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function getuid() {
|
|
117
|
+
return typeof process.getuid === 'function' ? process.getuid() : 0
|
|
118
|
+
}
|
|
@@ -60,3 +60,25 @@ export function normalizeNativeDevBundleUrl(bundleUrl: string): string {
|
|
|
60
60
|
return bundleUrl
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
|
|
64
|
+
// explicit override used by `sootsim open` to flip metro's `hot` query when
|
|
65
|
+
// the caller knows their context: interactive opens want `hot=true` so metro
|
|
66
|
+
// includes its HMR/react-refresh runtime in the bundle prelude and pushes
|
|
67
|
+
// edits as `update` events; `--driver playwright` / agent-test runs want
|
|
68
|
+
// `hot=false` for deterministic e2e (no in-bundle refresh wiring, no
|
|
69
|
+
// background ws). normalizeNativeDevBundleUrl deliberately preserves
|
|
70
|
+
// whatever value the launchAsset URL carries so metro's bundle cache is
|
|
71
|
+
// shared with real iOS sims; this helper is the one place that breaks that
|
|
72
|
+
// rule on purpose. non-`.bundle` paths pass through unchanged.
|
|
73
|
+
export function applyHotMode(bundleUrl: string, hot: boolean): string {
|
|
74
|
+
try {
|
|
75
|
+
const isAbsolute = isAbsoluteHttpUrl(bundleUrl)
|
|
76
|
+
const parsed = new URL(bundleUrl, 'http://soot.local')
|
|
77
|
+
if (!isNativeDevBundlePath(parsed.pathname)) return bundleUrl
|
|
78
|
+
parsed.searchParams.set('hot', hot ? 'true' : 'false')
|
|
79
|
+
if (isAbsolute) return parsed.toString()
|
|
80
|
+
return `${parsed.pathname}${parsed.search}${parsed.hash}`
|
|
81
|
+
} catch {
|
|
82
|
+
return bundleUrl
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.165 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c,d}from"./chunk-5IIMWTMI.js";import"./chunk-IIY2O6LJ.js";import"./chunk-ESGMJNNM.js";import"./chunk-6YEVWYSG.js";import"./chunk-EGBFMW45.js";import"./chunk-2N5FR2CU.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.165 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as B,b as V,c as me,d as ue}from"./chunk-HKCO4GFF.js";import{m as D}from"./chunk-32YLDVP3.js";import{m as ce,o as de}from"./chunk-MF7QK7PS.js";import{a as he,b as we}from"./chunk-BZS6I346.js";import{a as fe,b as G,c as ge}from"./chunk-6WWYHNYI.js";import{b as le,c as I,d as v,e as P}from"./chunk-IIY2O6LJ.js";import{g as Q}from"./chunk-XJQRNGCW.js";import{a as M,b as J}from"./chunk-L3ZBX3DX.js";import{c as pe}from"./chunk-HAJPACUR.js";import{d as q}from"./chunk-43R7N2HR.js";import{d as C,e as w,f as T}from"./chunk-ESGMJNNM.js";import{a as ae}from"./chunk-HFPCHOKV.js";import{G as se,H as ie}from"./chunk-EGBFMW45.js";import Z from"node:fs";import He from"node:os";import x from"node:path";function Oe(e){return e.replace(/^\[|\]$/g,"").toLowerCase()}function L(e){let o=Oe(e);return o==="localhost"||o.endsWith(".localhost")||o==="0.0.0.0"||o==="::1"||/^127(?:\.\d{1,3}){3}$/.test(o)}function be(e){return new Error(`could not resolve a native bundle for ${e}. pass an explicit bundle URL or open Connect and choose the app there.`)}function De(e,o){return e?.includes("/one/metro-entry.bundle")?"one":typeof o=="string"&&o?"expo":"unknown"}function Se(e,o,t){return`${e}//${o}:${t}`}function Be(e){if(typeof window>"u")return!1;try{let o=new URL(e);return L(o.hostname)&&L(window.location.hostname)&&o.origin!==window.location.origin}catch{return!1}}async function ye(e,o){let t={...o,cache:o?.cache??"no-store"};return Be(e)?fetch(`/__fetch-proxy?url=${encodeURIComponent(e)}`,t):fetch(e,t)}function Le(e){return e==="https:"?443:80}function Ae(e){let o=e.pathname||"/";return(o==="/"||o==="")&&!e.search&&!e.hash}async function Ne(e){try{let o=await fetch("/__server-scan",{cache:"no-store"});if(!o.ok||!(o.headers.get("content-type")||"").toLowerCase().includes("json"))return null;let t=await o.json();if(!Array.isArray(t))return null;let n=t.find(r=>!!r&&typeof r=="object"&&r.port===e&&typeof r.bundleUrl=="string");return n?{bundleUrl:n.bundleUrl,port:e,framework:typeof n.framework=="string"?n.framework:"unknown",projectName:typeof n.projectName=="string"?n.projectName:void 0}:null}catch{return null}}async function $e(e,o){let t=e.replace(/\/+$/,"");try{if(L(new URL(t).hostname)){let n=await Ne(o);if(n)return n}}catch{}try{let n=await ye(`${t}/`,{headers:{"expo-platform":"ios"}});if(n.ok){let r=await n.json(),s=r?.extra?.expoClient||r?.extra||{},i=typeof r?.launchAsset?.url=="string"?r.launchAsset.url:void 0;if(i||s.name)return{bundleUrl:me(i||`${t}${V}`),port:o,framework:De(i,s.sdkVersion),projectName:s.name}}}catch{}try{let n=await ye(`${t}/status`);if(n.ok&&(await n.text()).includes("packager-status:running"))return{bundleUrl:`${t}${V}`,port:o,framework:"metro"}}catch{}return null}async function ve(e){return $e(Se("http:","localhost",e),e)}async function Ie(e){let o=e.trim();if(/^\d+$/.test(o)){let a=parseInt(o,10),l=await ve(a);if(l)return l;let c=3;for(let d=1;d<=c;d++){let m=await ve(a+d);if(m)return m}throw be(`localhost:${a} (also scanned +1..+${c})`)}let t=o.startsWith("http")?o:`http://${o}`,n;try{n=new URL(t)}catch{throw new Error(`could not parse "${e}". pass a dev-server port, a dev-server base URL, or a full bundle URL.`)}let r=n.protocol||"http:",s=n.port?parseInt(n.port,10):Le(r),i=Se(r,n.hostname,s);if(Ae(n)){let a=await $e(i,s);if(a)return a;throw be(i)}return{bundleUrl:n.toString(),port:s,framework:"unknown"}}function xt(){console.error(" no sootsim desktop companion found."),console.error(""),console.error(" install the desktop app:"),console.error(" sootsim install-desktop"),console.error(""),console.error(" or wire sootsim into your own project so your dev server hosts the bridge:"),console.error(" sootsim setup-repo"),console.error("")}function Pe(e){let o=M();if(console.log(` note: no sootsim bridge detected on port ${e}`),o){console.log(" launch the installed companion with:"),console.log(" sootsim electron");return}console.log(""),console.log(" to get a bridge running, either:"),console.log(" sootsim install-desktop # download the electron app"),console.log(" sootsim setup-repo # wire sootsim into your own project")}function Fe(e){console.error(""),console.error(` no sim is connected to the sootsim bridge on port ${e}.`),console.error(""),console.error(" start your app dev server, then open it in sootsim:"),console.error(" npx expo start --localhost --port 8081"),console.error(" sootsim open 8081"),console.error(""),console.error(" then inspect the live app:"),console.error(" sootsim describe")}async function kt(e,o,t){let n=[];try{n=await e.listSims()}catch{}if(console.error(""),n.length===0){Fe(o);return}console.error(` no sim with id "${t}" is connected to the bridge on port ${o}.`),console.error(""),console.error(" connected sims:");for(let r of n){let s=[r.isPrimary?"primary":null,r.readyState,r.userVisible===!1?"hidden":r.userVisible===!0?"visible":null,r.userFocused?"focused":null].filter(Boolean).join(", ");console.error(` ${r.id} (${s})`)}console.error(""),console.error(" pass a valid --sim id, or run `sootsim list` to see all sessions.")}var je=12e4,xe=500,Ke=5e3,We={rn:"/rn",connectrn:"/rn","connect-rn":"/rn",clock:"/app/clock","native-ui":"/app/native-ui",tamagui:"/app/tamagui",settings:"/app/settings",photos:"/app/photos",camera:"/app/camera"};function S(e){return new Promise(o=>setTimeout(o,e))}function ke(e){let o=process.env[e]?.trim();if(!o)return null;let t=Number(o);return Number.isInteger(t)&&t>0?t:null}function ze(){let e=ke("SOOTSIM_DRIVER_CONNECT_TIMEOUT_MS")??ke("SOOTSIM_PW_CONNECT_TIMEOUT_MS")??je;return{timeoutMs:e,hostTimeoutMs:e+Ke,intervalMs:xe,attempts:Math.max(1,Math.ceil(e/xe))}}function qe(e){return e==="chromium"||e==="electron"||e==="playwright"||e==="system"}function F(e){return e.trim()}function Y(e){try{let o=new URL(e),t=o.pathname.replace(/\/+$/,"")||"/";return o.searchParams.has("open")||o.searchParams.has("port")||o.searchParams.has("bundle")||o.searchParams.has("demo")||o.pathname.includes("/sootsim/index.html")||t==="/sootsim"||o.pathname==="/__soot"||o.pathname==="/__soot/"||t==="/rn"||/^\/rn\/[^/]+$/i.test(t)||/^\/app\/[^/]+$/i.test(t)||t==="/__soot/rn"||/^\/__soot\/rn\/[^/]+$/i.test(t)||/^\/__soot\/app\/[^/]+$/i.test(t)}catch{return!1}}function Ve(e){try{let o=new URL(e).pathname.replace(/\/+$/,"")||"/";return/^\/preview\/[^/]+$/.test(o)||/^\/build\/.+/.test(o)}catch{return!1}}async function Vt(e){let o=F(e);return(await Re(o)).bundleUrl}function Ge(e){try{let o=new URL(e.startsWith("http")?e:`http://${e}`),t=o.pathname||"/";if(t!=="/"&&t!==""||o.search||o.hash||!/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(o.hostname))return null;let n=o.port?Number(o.port):o.protocol==="https:"?443:80;return Number.isFinite(n)&&n>0?n:null}catch{return null}}async function Re(e){let o=F(e),t=/^\d+$/.test(o)?Number(o):Ge(o);if(t&&t>0){let n=await ue(t);if(n)return{bundleUrl:n.bundleUrl,port:n.port,framework:n.framework,projectName:n.projectName}}return Ie(o)}function ee(e){let o=e.replace(/\/+$/,"")||"/";return o==="/__soot"||o.startsWith("/__soot/")?"/__soot":""}function Je(e,o){let t=F(e),n=new URL(o),r=ee(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),/^\d+$/.test(t)?n.pathname=`${r}/rn/${t}`:(n.pathname=`${r}/rn`,n.searchParams.set("open",t)),n.toString()}function Qe(e){let o=F(e);return/^\d+$/.test(o)||/^https?:\/\//i.test(o)?!0:/^(localhost|127\.0\.0\.1|\[::1\]|[^/]+\.localhost):\d+(?:\/.*)?$/i.test(o)}async function Xe(e,o){let t=await Re(e),n=new URL(o),r=ee(n.pathname);return n.pathname=`${r}/rn`,n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.set("bundle",t.bundleUrl),n.toString()}function Ye(e){return e.startsWith("~/")?x.join(He.homedir(),e.slice(2)):x.isAbsolute(e)?e:x.resolve(process.cwd(),e)}function Ze(e){let o={},t={};for(let r=0;r<e.length;r++){if(e[r]==="--replace"){let s=e[r+1];s||(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let i=s.indexOf("=");(i<=0||i===s.length-1)&&(console.error(" sootsim open: --replace expects <module>=<file>"),process.exit(1));let a=s.slice(0,i).trim(),l=Ye(s.slice(i+1).trim());Z.existsSync(l)||(console.error(` sootsim open: replacement file not found: ${l}`),process.exit(1)),o[a]={file:l},r++;continue}if(e[r]==="--remap"){let s=e[r+1],i=s?s.indexOf("="):-1;(!s||i<=0||i===s.length-1)&&(console.error(" sootsim open: --remap expects <host:port>=<host:port>"),process.exit(1)),t[s.slice(0,i).trim()]=s.slice(i+1).trim(),r++;continue}}let n={};return Object.keys(o).length>0&&(n.modules=o),Object.keys(t).length>0&&(n.network={remap:t}),n.modules||n.network?n:void 0}function _e(){let e=se();return ie(e)&&e.runtimePort>0?`http://localhost:${e.runtimePort}/`:ae}async function et(e){try{let o=new URL(e),t=o.searchParams.get("bundle")||"";if(!t)return e;let n=process.env.SOOT_REPO_DIR||await G(t)||void 0,r=fe({bundleUrl:t,repoDir:n});if(r.length===0)return e;let s=await tt(r);return s.length===0?e:(o.searchParams.set("appFonts",ge(s)),o.toString())}catch{return e}}async function tt(e){let o=await Promise.all(e.map(async n=>{let r=new AbortController,s=setTimeout(()=>r.abort(),1500);try{let i=await fetch(n.url,{method:"HEAD",signal:r.signal});return i.status>=200&&i.status<400?n:null}catch{return null}finally{clearTimeout(s)}})),t=[];for(let n of o)n!==null&&t.push(n);return t}async function ot(e,o){if(!e)return new URL(o).toString();if(Y(e))return new URL(e).toString();let t=We[e.toLowerCase()];if(t){let n=new URL(o),r=ee(n.pathname);return n.pathname=`${r}${t}`,n.toString()}return Qe(e)?Xe(e,o):Je(e,o)}async function nt(e){try{let o=new URL(e),t=o.searchParams.get("bundle")||"";if(!t)return e;let n=process.env.SOOT_REPO_DIR||await G(t)||void 0,r=he({bundleUrl:t,repoDir:n});return!r||r.imageUrl&&!await rt(r.imageUrl)?e:(o.searchParams.set("appSplash",we(r)),o.toString())}catch{return e}}async function rt(e){let o=new AbortController,t=setTimeout(()=>o.abort(),1500);try{let n=await fetch(e,{method:"HEAD",signal:o.signal});return n.status>=200&&n.status<400}catch{return!1}finally{clearTimeout(t)}}async function N(e,o=_e()){let t=await ot(e,o);return nt(await et(t))}function Ce(e,o){let t=e?.url||e?.origin||o;try{let n=new URL(t);return n.searchParams.delete("bundle"),n.searchParams.delete("demo"),n.searchParams.delete("app"),n.searchParams.delete("open"),n.searchParams.delete("port"),n.searchParams.delete("inspectOpen"),n.searchParams.delete("appFonts"),n.searchParams.delete("appSplash"),n.toString()}catch{return o}}async function st(e,o,t){let n=new URL(await N(e,o));return n.searchParams.set("inspectOpen",t),n.toString()}async function it(e,o,t,n={}){let r=n.attempts??30,s=n.intervalMs??500,i=n.minNodeCount??10;for(let a=0;a<r;a++){let l=v(e,{commandTimeoutMs:o,simId:t,simIdSource:"flag"});try{let c=await l.send({type:"evaluate",code:"(async () => (await window.__sootsimTest?.getNodeCount()) || 0)()"});if(typeof c=="number"&&c>i)return{bridge:l,count:c}}catch{}l.close(),await S(s)}return null}function at(e){if(!e)return null;try{let o=new URL(e);if(o.searchParams.has("bundle")){let t=o.searchParams.get("bundle")||"";try{let n=new URL(t),r=n.pathname.length>36?`...${n.pathname.slice(-36)}`:n.pathname;return`bundle ${n.host}${r}`}catch{return"bundle"}}return o.searchParams.has("port")?`connect :${o.searchParams.get("port")||""}`:o.searchParams.has("open")?`connect ${o.searchParams.get("open")||""}`:o.searchParams.has("demo")?`demo ${o.searchParams.get("demo")||"default"}`:o.pathname.includes("/sootsim/index.html")||o.pathname==="/sootsim/"||o.pathname==="/sootsim"?"embedded sootsim":null}catch{return null}}function lt(e){let o=e.indexOf(":");if(o<=0)return e.length>24?`${e.slice(0,21)}\u2026`:e;let t=e.slice(0,o),n=e.slice(o+1),r=n.length>12?`${n.slice(0,8)}\u2026`:n;return t==="CLAUDE_CODE_SESSION_ID"||t==="CODEX_THREAD_ID"?`agent ${r}`:`${t} ${r}`}function ct(e,o){if(e.length===0){console.log(" no sims connected");return}console.log(` connected sims (${e.length}):
|
|
3
|
-
`);for(let t of e){let n=t.lockedBy&&t.lockExpiresAt?`locked by ${lt(t.lockedBy)} (${Math.max(0,Math.round((t.lockExpiresAt-Date.now())/1e3))}s)`:"",r=[t.isPrimary?"primary":"",t.id===o?"selected":"",t.readyState,t.userVisible===!1?"hidden":t.userVisible===!0?"visible":"",t.attachedCliCount&&t.attachedCliCount>0?"in use":"",t.userFocused?"focused":"",n].filter(Boolean);console.log(` ${t.id}${r.length?` [${r.join(", ")}]`:""}`);let s=at(t.url);if(s)console.log(` loaded: ${s}`);else if(t.url){let a=t.url.length>96?`${t.url.slice(0,93)}\u2026`:t.url;console.log(` url: ${a}`)}else t.origin&&console.log(` origin: ${t.origin}`);let i=dt(t);i&&console.log(` engine: ${i}`),t.title&&console.log(` title: ${t.title}`),t.visibilityState&&t.visibilityState!=="visible"&&console.log(` visibility: ${t.visibilityState}`),console.log(` connected: ${Te(Date.now()-t.connectedAt)}`),t.lastActiveAt&&t.lastActiveAt>0&&console.log(` last active: ${Te(Date.now()-t.lastActiveAt)}`)}}function dt(e){let o=e.url||e.origin||"";if(!o)return null;try{let t=new URL(o).port;return t==="5173"?"dev \u2014 local source (:5173)":t==="3000"?"soot app embedded (:3000)":`runtime \u2014 published engine (:${t||"?"})`}catch{return null}}function Te(e){let o=Math.max(0,Math.round(e/1e3));return o<60?`${o}s ago`:o<3600?`${Math.round(o/60)}m ago`:o<86400?`${Math.round(o/3600)}h ago`:`${Math.round(o/86400)}d ago`}async function A(e,o,t,n={}){let r=n.attempts??30,s=n.intervalMs??500;for(let i=0;i<r;i++){let a=v(e,{commandTimeoutMs:o});try{let c=(await a.listSims()).find(t);if(c)return c}catch{}finally{a.close()}await S(s)}return null}async function mt(e,o,t,n={}){let r=n.attempts??20,s=n.intervalMs??250;for(let i=0;i<r;i++){let a=v(e,{commandTimeoutMs:o});try{let c=(await a.listSims()).find(d=>d.id===t);if(!c||c.readyState!=="open")return!0}catch{return!0}finally{a.close()}await S(s)}return!1}function ut(e){let o=e.meta;if(!o||o.sootsimHostDriver!=="playwright")return null;let t=Number(o.sootsimHostPid);return!Number.isInteger(t)||t<=1||t===process.pid?null:t}function pt(e){if(!e.connectAckFile)return!1;try{return Z.writeFileSync(e.connectAckFile,`${JSON.stringify({connectedAt:Date.now(),pid:e.pid??null})}
|
|
4
|
-
`,{flag:"w"}),!0}catch{return!1}}function ft(e){if(e.diagnosticLogPath)try{let o=Z.readFileSync(e.diagnosticLogPath,"utf8").trim();if(!o){console.error(` ${x.basename(e.diagnosticLogPath)} was empty`);return}let t=o.length>4e3?`\u2026
|
|
5
|
-
${o.slice(-4e3)}`:o;console.error(` ${x.basename(e.diagnosticLogPath)}:`),console.error(t)}catch(o){let t=o instanceof Error?o.message:String(o);console.error(` failed to read ${x.basename(e.diagnosticLogPath)}: ${t}`)}}function Me(e){try{return process.kill(e,0),!0}catch(o){return o?.code==="EPERM"}}async function gt(e,o=2500){let t=Date.now()+o;for(;Date.now()<t;){if(!Me(e))return!0;await S(100)}return!Me(e)}async function X(e,o){let t=new Set(o),n=new Set;for(let r of e){if(!t.has(r.id))continue;let s=ut(r);s&&n.add(s)}for(let r of n){try{process.kill(r,"SIGTERM")}catch{}if(await gt(r)){console.log(` closed playwright host process ${r}`);continue}try{process.kill(r,"SIGKILL"),console.log(` force-closed playwright host process ${r}`)}catch{}}}function H(e,o){if(o){let r=o.trim(),s=e.find(i=>i.id===r);if(!s)throw new Error(`no sim connected with id ${r}`);return s}let t=e.find(r=>r.isPrimary&&r.readyState==="open");if(t)return t;let n=e.find(r=>r.readyState==="open");if(n)return n;throw new Error("no sim connected")}function R(e,o,t){console.log(` ${t==="current sim"?"loaded":"opened"}: ${e} [${t}]`),console.log(` current sim: ${o.id}`),console.log(JSON.stringify({simId:o.id,url:o.url},null,2))}async function _(e,o,t){if(t.includes("--no-describe"))return;let n=process.env.SOOTSIM_QUIET_TARGET_NOTICE;process.env.SOOTSIM_QUIET_TARGET_NOTICE="1";try{await ht(e,o,{stableMs:150,maxMs:400});let r=v(e,{commandTimeoutMs:3e3,simId:o,cliLabel:"open --describe",simIdSource:"flag"});try{let s=null;try{s=await r.send({type:"evaluate",code:ce})}catch{}if(s&&!(s.flag===!0&&!s.loadingText&&de(s))){let d=s.loadingText?`still showing "${s.loadingText}"`:s.flag!==!0?"guest ready event has not fired":s.targets<=0?"no visible app content is inspectable yet":"app tree is still stabilizing";console.log(` app still loading: ${d} (nodes: ${s.nodes}, targets: ${s.targets})`),console.log(" before interacting, run: sootsim wait ready --max-ms 120000")}let a=`(async () => {
|
|
6
|
-
const t = window.__sootsimTest
|
|
7
|
-
const ms = window.SootSim?.bridges?.mainShell
|
|
8
|
-
if (!t) return null
|
|
9
|
-
let shell = null
|
|
10
|
-
try { shell = ms?.getState ? await ms.getState() : null } catch {}
|
|
11
|
-
const tree = await t.dumpTree(12, ${JSON.stringify({describe:!0,verbose:!1,filter:""})})
|
|
12
|
-
return { tree, shell }
|
|
13
|
-
})()`,l=await r.send({type:"evaluate",code:a});if(!l?.tree)return;if(console.log(""),l.shell?.state){let c=[`state=${l.shell.state}`,l.shell.activeApp?`app=${l.shell.activeApp}`:null].filter(Boolean);console.log(` shell: ${c.join(" ")}`)}console.log(l.tree)}finally{r.close()}}catch{}finally{n===void 0?delete process.env.SOOTSIM_QUIET_TARGET_NOTICE:process.env.SOOTSIM_QUIET_TARGET_NOTICE=n}}async function ht(e,o,t){let n=Date.now()+t.maxMs,r="(async () => (await window.__sootsimTest?.getNodeCount?.()) || 0)()",s=v(e,{commandTimeoutMs:2e3,simId:o,simIdSource:"flag"});try{let i=-1,a=0;for(;Date.now()<n;){let l=-1;try{let c=await s.send({type:"evaluate",code:r});typeof c=="number"&&(l=c)}catch{}if(l>=0&&l===i){if(Date.now()-a>=t.stableMs)return}else i=l,a=Date.now();await S(50)}}finally{s.close()}}async function Gt(e,o={}){let t=I(e,{port:o.port,commandTimeoutMs:o.timeoutMs}),n=P(t);try{let r=await n.listSims();ct(r,t.simId)}finally{n.close()}}async function Jt(e,o={}){let t=I(e,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--new","--headless","--ephemeral"],stripValueFlags:["--base-url","--replace","--driver","--profile","--cdp-port"]}),n=e.find((u,p)=>e[p-1]==="--profile"),r=e.includes("--ephemeral"),s=e.find((u,p)=>e[p-1]==="--cdp-port"),i=s?Number(s):void 0;s&&(!Number.isFinite(i)||i<=0)&&(console.error(` sootsim open: --cdp-port must be a positive port number, got "${s}"`),process.exit(1)),n&&r&&(console.error(" sootsim open: --profile cannot be combined with --ephemeral"),process.exit(1));let a=n?pe(n).id:void 0,l=!!a||r,c=e.includes("--new")||l,d=Ze(e);c&&t.simIdSource==="flag"&&(console.error(" sootsim open: --new, --profile, and --ephemeral cannot be combined with --sim"),process.exit(1));let m=t.positional[0]||"";if(Ve(m)){let u=(()=>{try{return/^(localhost|127\.0\.0\.1|\[::1\]|::1)$/i.test(new URL(m).hostname)}catch{return!1}})();console.log(" that\u2019s a SootSim preview/build link \u2014 a full player page, not a driveable sim."),console.log(" opening it in your browser for viewing\u2026");try{await q(m,{background:!1})}catch(p){console.error(` could not launch a browser: ${p instanceof Error?p.message:String(p)}`),console.error(` open it yourself: ${m}`),process.exit(1)}console.log(u?" to drive it under the CLI, point `sootsim open` at the app\u2019s dev port instead (e.g. `sootsim open 8081`).":" the CLI can\u2019t drive a remote preview (the engine only attaches to the local bridge from localhost). to drive the app, run it locally and `sootsim open <port>`.");return}let h=e.find((u,p)=>e[p-1]==="--driver")||"",j=e.includes("--headless");i&&h!=="playwright"&&(console.error(" sootsim open: --cdp-port is only honored by the playwright driver \u2014 add `--driver playwright`"),process.exit(1));let k=e.find((u,p)=>e[p-1]==="--base-url")||_e(),te=e.includes("--base-url"),oe=C();if(!h&&!c&&(t.simIdSource==="flag"||t.simIdSource==="saved"&&!!oe)){let u=P(t),p=t.simId?` --sim ${t.simId}`:"",f=!1;try{let g=null;try{let y=await u.listSims();if(t.simIdSource==="saved"?(g=y.find($=>$.id===oe&&$.readyState==="open")??null,g||T()):g=H(y,t.simId),!g)if(t.simIdSource==="saved")f=!0;else throw new Error("no sim connected");if(!f&&g){let $=te||Y(m)?k:Ce(g,k),O=await N(m,B($,d));u.send({type:"evaluate",simId:g.id,code:`window.location.href = ${JSON.stringify(O)}`}).catch(()=>{})}}catch(y){console.error(` open failed: ${y instanceof Error?y.message:String(y)}`),await D(u,{errorsCommand:`sootsim get errors 5${p}`,warningsCommand:`sootsim get warnings 5${p}`,requestsCommand:`sootsim get requests 5${p}`}),process.exit(1)}if(!f&&g){await S(1500);let y=await it(t.wsPort,t.commandTimeoutMs,g.id);y||(console.error(" timed out waiting for current sim to load target"),process.exit(1)),y.bridge.close(),w(g.id);let $=te||Y(m)?k:Ce(g,k),O=await N(m,B($,d));R(O,{...g,url:O},"current sim"),await _(t.wsPort,g.id,e);return}}finally{u.close()}}let ne=B(k,d),Ee=await N(m,ne),re=`cli-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,b=await st(m,ne,re),K={newWindow:!0},U=u=>u.url?.includes(`inspectOpen=${re}`)??!1;if(h){qe(h)||(console.error(` unknown driver "${h}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let u=Q(h);u||(console.error(` unknown driver "${h}" \u2014 run \`sootsim list --drivers\``),process.exit(1));let p=ze(),f=await u.launch({url:b,headless:j,newWindow:K.newWindow,profileId:a,ephemeralProfile:r,cdpPort:i,connectTimeoutMs:p.hostTimeoutMs});f.launched||(console.error(` ${u.name} driver: ${f.message}`),process.exit(1));let g=await A(t.wsPort,t.commandTimeoutMs,U,{attempts:p.attempts,intervalMs:p.intervalMs});if(!g){if(f.pid)try{process.kill(f.pid,"SIGTERM"),console.error(` closed ${u.name} host process ${f.pid}`)}catch{}ft(f),console.error(` timed out after ${p.timeoutMs}ms waiting for opened sim to connect`),process.exit(1)}w(g.id),pt(f),R(b,g,`${u.name} driver`),await _(t.wsPort,g.id,e);return}if(l){let u=M();u||(console.error(" profiles require electron or playwright; install the desktop companion or use `--driver playwright`"),process.exit(1));try{(await J(b,u,{profileId:a,ephemeralProfile:r})).launched||(console.error(" desktop companion failed to start"),process.exit(1))}catch(f){console.error(` desktop companion failed: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}let p=await A(t.wsPort,t.commandTimeoutMs,U,{attempts:40,intervalMs:500});p||(console.error(" timed out waiting for profiled sim to connect"),process.exit(1)),w(p.id),R(b,p,"desktop companion"),await _(t.wsPort,p.id,e);return}let W=!1,z=!1;try{let u=v(t.wsPort,{commandTimeoutMs:2e3});try{await u.listSims(),W=!0}finally{u.close()}}catch{}if(W)try{let u=v(t.wsPort,{commandTimeoutMs:3e3});try{await u.openUrl(b,K),z=!0}finally{u.close()}}catch{}if(!z){let u=M();if(u)try{if((await J(b,u)).launched){let f=await A(t.wsPort,t.commandTimeoutMs,U,{attempts:20,intervalMs:500});if(f){w(f.id),R(b,f,"desktop companion"),await _(t.wsPort,f.id,e);return}}}catch{}try{await q(b,K)}catch(p){console.error(` open failed: ${p instanceof Error?p.message:String(p)}`),Q("playwright")?.availability().available?console.error(" no system browser found \u2014 retry with `sootsim open \u2026 --driver playwright` for a headless sim."):console.error(" run `sootsim list --drivers` to see available drivers."),process.exit(1)}if(!W){console.log(` opened: ${Ee}`),Pe(t.wsPort);return}}let E=await A(t.wsPort,t.commandTimeoutMs,U,{attempts:30,intervalMs:500});E||(console.error(" timed out waiting for opened sim to connect"),process.exit(1)),w(E.id),R(b,E,z?"bridge":"direct shell open"),await _(t.wsPort,E.id,e)}async function Ue(e,o={}){let t=I(e,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=e.includes("--force"),r=P(t),s=t.simId?` --sim ${t.simId}`:"";try{try{let i=await r.listSims(),a=H(i,t.positional[0]||t.simId);if(a.lockedBy&&a.lockExpiresAt&&a.lockExpiresAt>Date.now()){let l=Math.max(0,Math.round((a.lockExpiresAt-Date.now())/1e3));a.lockedByKind==="user-active"&&(console.error(` refused: ${a.id} is locked by the active user (${l}s) \u2014 that's a live human tab`),console.error(" run `sootsim open --new` for a fresh investigation sim"),process.exit(1)),n||(console.error(` refused: ${a.id} is leased by ${a.lockedBy} (${l}s)`),console.error(` \`sootsim use ${a.id} --force\` to take it, or \`sootsim open --new\` for a fresh sim`),process.exit(1))}await r.focusSim(a.id),w(a.id),console.log(` using: ${a.id}`)}catch(i){console.error(` use failed: ${i instanceof Error?i.message:String(i)}`),await D(r,{errorsCommand:`sootsim get errors 5${s}`,warningsCommand:`sootsim get warnings 5${s}`,requestsCommand:`sootsim get requests 5${s}`}),process.exit(1)}}finally{r.close()}}async function Qt(e,o={}){await Ue(e,o)}async function Xt(e,o={}){await Ue(e,o)}async function Yt(e,o={}){let t=I(e,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--force"]}),n=e.includes("--force"),r=P(t);try{try{let s=await r.listSims(),i=H(s,t.positional[0]||t.simId),a=n&&i.lockedBy&&i.lockedByKind!=="user-active"?i.lockedBy:null,l=await r.claim(i.id,{force:n});w(i.id);let c=Math.max(0,Math.round((l.lockExpiresAt-Date.now())/1e3)),d=l.bootedCount>0?` (booted ${l.bootedCount})`:"";console.log(` claimed: ${l.simId} [${c}s]${d}`),a&&console.log(` took over from: ${a}`)}catch(s){if(s instanceof le){let i=Math.max(0,Math.round(s.lock.expiresInMs/1e3));console.error(` claim failed: locked by ${s.lock.by} for ${i}s more`),console.error(" use --force to take it, or `sootsim open --new` for a fresh sim"),process.exit(1)}console.error(` claim failed: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}}finally{r.close()}}async function wt(e,o,t,n){if(n.length===0)return{closed:[],remaining:[]};await Promise.all(n.map(s=>e.closeSim(s).catch(()=>{})));let r=new Set(n);for(let s=0;s<40;s++){let i=[];try{let a=v(o,{commandTimeoutMs:t});try{i=(await a.listSims()).filter(c=>r.has(c.id)&&c.readyState==="open").map(c=>c.id)}finally{a.close()}}catch{i=[]}if(i.length===0)return{closed:[...r],remaining:[]};if(s===39)return{closed:[...r].filter(a=>!i.includes(a)),remaining:i};await S(250)}return{closed:[...r],remaining:[]}}function bt(e,o){let t=e.filter(m=>m.readyState==="open"),n=t.map(m=>m.id),r=o.explicitKeepId?.trim()||"",s=o.savedKeepId?.trim()||"",i=s?t.some(m=>m.id===s):!1,a=s&&!i?s:null,l=null,c=null,d=null;if(o.closeOthers)if(r){let m=t.find(h=>h.id===r);m?l=m.id:c=r}else if(s&&i)l=s;else{let m=t.find(h=>h.isPrimary)??t[0]??null;m&&(l=m.id,s&&!i&&(d=m.id))}return{openIds:n,keepId:l,targets:c?[]:n.filter(m=>m!==l),staleSavedId:a,missingExplicitKeepId:c,fallbackKeepId:d}}async function Zt(e,o={}){let t=I(e,{port:o.port,commandTimeoutMs:o.timeoutMs,stripBooleanFlags:["--all","--others"]}),n=P(t),r=t.simId?` --sim ${t.simId}`:"",s=e.includes("--all"),i=e.includes("--others");if(s||i){try{let a=await n.listSims(),l=C(),c=t.positional[0]||(t.simIdSource==="flag"?t.simId:void 0),d=bt(a,{closeOthers:i,explicitKeepId:c,savedKeepId:l});if(d.staleSavedId&&T(),d.fallbackKeepId&&(w(d.fallbackKeepId),console.log(` saved sim ${d.staleSavedId} is gone \u2014 keeping primary ${d.fallbackKeepId}`)),d.missingExplicitKeepId&&(console.error(` close failed: keep sim ${d.missingExplicitKeepId} is not connected; not closing other sims`),process.exit(1)),d.targets.length===0){console.log(d.keepId?` nothing to close \u2014 only the kept sim ${d.keepId} is connected`:d.staleSavedId?` nothing to close \u2014 no sims connected (cleared stale current sim ${d.staleSavedId})`:" nothing to close \u2014 no sims connected");return}let m=await wt(n,t.wsPort,t.commandTimeoutMs,d.targets);await X(a,d.targets);let h=C();h&&m.closed.includes(h)&&(d.keepId?w(d.keepId):T());let j=` closed ${m.closed.length} sim(s)${d.keepId?` (kept ${d.keepId})`:""}`;console.log(j),m.remaining.length>0&&(console.error(` close failed: still connected: ${m.remaining.join(", ")}`),process.exit(1))}catch(a){console.error(` close failed: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}finally{n.close()}return}try{try{let a=await n.listSims(),l=H(a,t.positional[0]||t.simId),c=a.find(m=>m.id!==l.id&&m.readyState==="open");await n.closeSim(l.id),await mt(t.wsPort,t.commandTimeoutMs,l.id)||(await X(a,[l.id]),console.error(` close failed: ${l.id} is still connected`),process.exit(1)),await X(a,[l.id]),C()===l.id&&(c?w(c.id):T()),console.log(` closed: ${l.id}`)}catch(a){console.error(` close failed: ${a instanceof Error?a.message:String(a)}`),await D(n,{errorsCommand:`sootsim get errors 5${r}`,warningsCommand:`sootsim get warnings 5${r}`,requestsCommand:`sootsim get requests 5${r}`}),process.exit(1)}}finally{n.close()}}export{xt as a,Fe as b,kt as c,ze as d,Vt as e,_e as f,N as g,st as h,at as i,ct as j,A as k,ut as l,pt as m,X as n,Gt as o,Jt as p,Qt as q,Xt as r,Yt as s,wt as t,bt as u,Zt as v};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.165 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as C,b as k}from"./chunk-WJHZQUAF.js";var x="sootsimConfig";function m(e){return!!e&&Object.keys(e).length>0}function D(e){return e?m(e.modules)||m(e.turboModules)||m(e.nativeModules)||m(e.env)||m(e.network?.remap)||m(e.settings)||m(e.initialState):!1}function M(e,o){let t=new URL(e);return D(o)?t.searchParams.set(x,JSON.stringify(o)):t.searchParams.delete(x),t.toString()}import{exec as N}from"child_process";import L from"http";import O from"net";import{promisify as $}from"util";var te="/index.bundle?platform=ios&dev=true&hot=true&minify=false";function T(e){return/^https?:\/\//i.test(e)}function E(e){return e.endsWith(".bundle")}function A(e){process.env.SOOTSIM_PREVIEW_PROD_BUNDLE&&(e.searchParams.set("dev","false"),e.searchParams.set("minify","true"),e.searchParams.has("hot")&&e.searchParams.set("hot","false"))}function U(e){try{let o=T(e),t=new URL(e,"http://soot.local");return t.pathname=t.pathname.replace(/\.\.bundle$/,".bundle"),E(t.pathname)?(t.searchParams.delete("transform.bytecode"),A(t),o?t.toString():`${t.pathname}${t.search}${t.hash}`):e}catch{return e}}var v=$(N);C();var I=250,B=1500,H=120;function j(e,o=H){return new Promise(t=>{let r=new O.Socket,s=!1,i=a=>{s||(s=!0,r.destroy(),t(a))};r.setTimeout(o),r.once("connect",()=>i(!0)),r.once("timeout",()=>i(!1)),r.once("error",()=>i(!1)),r.connect(e,"localhost")})}function h(e,o,t="GET",r=I,s={}){return new Promise(i=>{let a=L.request({hostname:"localhost",port:e,path:o,method:t,timeout:r,headers:s},n=>{let u="";n.on("data",l=>u+=l.toString());let c=(()=>{let l=n.headers["content-type"];if(typeof l=="string")return l;if(Array.isArray(l))return l[0]})();n.on("end",()=>i({statusCode:n.statusCode||0,body:u,contentType:c}))});a.on("error",()=>i(null)),a.setTimeout(r,()=>{a.destroy(),i(null)}),a.end()})}var W=[8081,8082,8083,8084,8085,8086,3e3,3001,19e3].map(e=>({port:e,pid:0}));function P(e,o){return!(e<=0||e>=2e4||o.has(e)||e>=5170&&e<=5200)}async function F(e=[]){let o=new Set(e);try{let{stdout:t}=await v("lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep -E '^(node|bun)'",{encoding:"utf8",timeout:2e3});if(t.trim()){let r=new Map;for(let s of t.trim().split(`
|
|
3
|
-
`)){let i=s.trim().split(/\s+/);if(i.length<9)continue;let a=Number(i[1]),u=i[8].match(/:(\d+)$/);if(!u)continue;let c=Number(u[1]);P(c,o)&&(r.has(c)||r.set(c,a))}if(r.size>0)return[...r.entries()].map(([s,i])=>({port:s,pid:i}))}}catch{}try{let{stdout:t}=await v(`ss -tlnp 2>/dev/null | grep -E '"(node|bun)"'`,{encoding:"utf8",timeout:2e3});if(t.trim()){let r=new Map;for(let s of t.trim().split(`
|
|
4
|
-
`)){let i=s.match(/:(\d+)\s/),a=s.match(/pid=(\d+)/);if(!i)continue;let n=Number(i[1]),u=a?Number(a[1]):0;P(n,o)&&(r.has(n)||r.set(n,u))}if(r.size>0)return[...r.entries()].map(([s,i])=>({port:s,pid:i}))}}catch{}return W.filter(t=>P(t.port,o))}var y=new Map;async function G(e){if(e<=0)return null;let o=y.get(e);if(o)return o;try{let{stdout:t}=await v(`lsof -p ${e} -a -d cwd -Fn 2>/dev/null`,{encoding:"utf8",timeout:1500});for(let r of t.split(`
|
|
5
|
-
`))if(r.startsWith("n")&&r.length>1){let s=r.slice(1).trim();if(s)return y.set(e,s),s}}catch{}return null}function z(e,o){return{port:e,framework:o,bundleUrl:g(e,`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()}}function g(e,o){let t=k().find(s=>s.preferredPort===e),r=t?.runtimeConfig?M(o,t.runtimeConfig):o;return U(r)}function J(e){return e.includes("/node_modules/one/metro-entry.bundle")}function K(e){try{let o=JSON.parse(e);return o&&typeof o=="object"?o:null}catch{return null}}function w(e,o,t){if(!o)return e;try{let r=JSON.parse(o.body),s=r?.extra?.expoClient||r?.extra||{};s.name&&(e.projectName=s.name),s.ios?.bundleIdentifier&&(e.bundleId=s.ios.bundleIdentifier),e.framework==="metro"&&s.sdkVersion&&(e.framework="expo");let i=r?.launchAsset?.url;i&&!e.patched&&!J(e.bundleUrl)&&(e.bundleUrl=g(e.port,i));let a=s.iconUrl||s.ios?.iconUrl||s.icon||s.ios?.icon;if(a)if(e.iconPath=a,t)if(a.startsWith("http"))e.iconUrl=t(a);else{let n=a.replace(/^\.\//,"");e.iconUrl=t(`http://localhost:${e.port}/assets/${n}`)}else e.iconUrl=a.startsWith("http")?a:`http://localhost:${e.port}/assets/${a.replace(/^\.\//,"")}`}catch{}return e}var d=new Set,p=new Set,S=new Set;async function V(e,o){if(!await j(e))return null;let t="/node_modules/one/metro-entry.bundle?platform=ios&dev=true",[r,s,i,a]=await Promise.all([d.has(e)?Promise.resolve(null):h(e,"/__soot/"),h(e,"/status"),S.has(e)?Promise.resolve(null):h(e,"/","GET",B,{"expo-platform":"ios"}),p.has(e)?Promise.resolve(null):h(e,"/_expo/status")]);a&&a.statusCode===200?p.delete(e):p.has(e)||p.add(e);let n=i?K(i.body):null,u=typeof n?.launchAsset?.url=="string"?n.launchAsset.url:null,c=n?.extra?.expoClient||n?.extra||{};if(n&&(u||typeof c.name=="string")){d.add(e);let R=u||`http://localhost:${e}/index.bundle?platform=ios&dev=true&hot=true&minify=false`,_=R.includes("/one/metro-entry.bundle")?"one":"expo";return w({port:e,framework:_,bundleUrl:g(e,R),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},i,o)}if(s&&s.body.includes("packager-status:running"))return d.add(e),w(z(e,a&&a.statusCode===200?"expo":"metro"),i,o);if(r&&r.statusCode===200&&r.body.includes("sootsim-patched"))return d.delete(e),w({port:e,framework:"one",bundleUrl:g(e,`http://localhost:${e}/__soot/bundle.js`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now(),patched:!0},i,o);if(s&&s.statusCode===200||a&&a.statusCode===200||i&&i.statusCode===200&&n!=null)return null;let f=await h(e,t,"HEAD");return f&&f.statusCode>0&&f.statusCode<400&&/application\/javascript/i.test(f.contentType||"")?(d.add(e),S.add(e),w({port:e,framework:"one",bundleUrl:g(e,`http://localhost:${e}${t}&minify=false`),hmrUrl:`ws://localhost:${e}/hot`,lastSeen:Date.now()},i,o)):(d.add(e),null)}function q(e){let o=e.projectName?.trim().toLowerCase();return!!(o==="soot"||o==="sootsim"||e.bundleId?.trim().toLowerCase()?.startsWith("dev.soot"))}var b=new Map,Q=3e4,Y=1500;function X(e){return!e||e.framework==="metro"||e.framework==="unknown"}function Z(e){return e?g(e.port,e.bundleUrl)===e.bundleUrl:!0}function ee(e,o,t=Date.now()){if(o===0||e.pid!==o||!Z(e.result))return!1;let r=t-e.cachedAt;return!(e.result===null&&r>=Q||X(e.result)&&r>=Y)}async function de(e={}){let o=await F(e.excludePorts),t=new Set(o.map(n=>n.port));for(let n of[...b.keys()])t.has(n)||b.delete(n);for(let n of[...d])t.has(n)||d.delete(n);for(let n of[...p])t.has(n)||p.delete(n);for(let n of[...S])t.has(n)||S.delete(n);let r=[],s=[];for(let{port:n,pid:u}of o){let c=b.get(n);if(c&&ee(c,u)){c.result&&r.push(c.result);continue}c&&c.pid!==u&&(d.delete(n),p.delete(n),S.delete(n)),s.push({port:n,pid:u})}s.length>0&&(await Promise.all(s.map(u=>V(u.port,e.buildIconProxyUrl)))).forEach((u,c)=>{let{port:l,pid:f}=s[c];f!==0&&b.set(l,{pid:f,result:u,cachedAt:Date.now()}),u&&r.push(u)});let i=new Map;for(let{port:n,pid:u}of o)u>0&&i.set(n,u);await Promise.all(r.map(async n=>{let u=i.get(n.port);if(!u)return;n.pid=u;let c=await G(u);c&&(n.cwd=c)}));let a=new Set(i.values());for(let n of[...y.keys()])a.has(n)||y.delete(n);return r.filter(n=>!q(n))}export{M as a,te as b,U as c,V as d,de as e};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.165 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|