sootsim 0.1.164 → 0.1.166
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-5PVW4KHZ.js → agent-C2HTMDLW.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-REXQODXV.js → agent-wrapper-EE2BNDAQ.js} +2 -2
- package/dist-cli/chunks/{app-fonts-XAXAUEB5.js → app-fonts-5JUWVRIA.js} +2 -2
- package/dist-cli/chunks/{assert-QDOO5I6J.js → assert-KF2OHBES.js} +2 -2
- package/dist-cli/chunks/auto-bootstrap-ITBEBASC.js +2 -0
- package/dist-cli/chunks/beta-FUBQGOA5.js +2 -0
- package/dist-cli/chunks/{camera-VUJYI6SX.js → camera-L2DDKMHH.js} +2 -2
- package/dist-cli/chunks/{chunk-3VE6THTL.js → chunk-2TE65ODE.js} +1 -1
- package/dist-cli/chunks/chunk-3CTBL6ST.js +1 -0
- package/dist-cli/chunks/chunk-4SYV3YPR.js +4 -0
- package/dist-cli/chunks/{chunk-XFJGEFTK.js → chunk-6OOIOB2X.js} +3 -3
- package/dist-cli/chunks/{chunk-TFB7NU6N.js → chunk-7534S5IR.js} +1 -1
- package/dist-cli/chunks/{chunk-6RAT7QRJ.js → chunk-7RFYWPAN.js} +1 -1
- package/dist-cli/chunks/chunk-B47GJVB3.js +3 -0
- package/dist-cli/chunks/{chunk-LJUGD5H3.js → chunk-BFEM7E4T.js} +2 -2
- package/dist-cli/chunks/{chunk-7UZSNS5H.js → chunk-C7KANC2Z.js} +2 -2
- package/dist-cli/chunks/{chunk-46J7FLJB.js → chunk-D3GGZIBS.js} +5 -4
- package/dist-cli/chunks/{chunk-ZE2PAAZW.js → chunk-EFCPQBFY.js} +1 -1
- package/dist-cli/chunks/{chunk-LN5AJIPO.js → chunk-F4FR47MS.js} +3 -3
- package/dist-cli/chunks/chunk-FEWTUTZE.js +1 -0
- package/dist-cli/chunks/chunk-FLDFTC6A.js +27 -0
- package/dist-cli/chunks/chunk-GS6OBVQR.js +1 -0
- package/dist-cli/chunks/{chunk-J6TNRMST.js → chunk-H52Z73AU.js} +2 -2
- package/dist-cli/chunks/{chunk-RHWMAYGO.js → chunk-HHMW6MXX.js} +2 -2
- package/dist-cli/chunks/{chunk-PQMXEPA5.js → chunk-HNZF4VNH.js} +1 -1
- package/dist-cli/chunks/{chunk-R4K3EZQP.js → chunk-ITF7FOSZ.js} +1 -1
- package/dist-cli/chunks/{chunk-422J3RDX.js → chunk-ITJSVY3L.js} +2 -2
- package/dist-cli/chunks/{chunk-SG5ONZJA.js → chunk-J7FYMPIN.js} +1 -1
- package/dist-cli/chunks/{chunk-YDZJR4M3.js → chunk-JXHFW3SD.js} +1 -1
- package/dist-cli/chunks/{chunk-T6VPZ5ES.js → chunk-KCP7TTSW.js} +2 -2
- package/dist-cli/chunks/chunk-LIYFRTZG.js +2 -0
- package/dist-cli/chunks/{chunk-JNC5ZO7K.js → chunk-LOGFVSIT.js} +1 -1
- package/dist-cli/chunks/{chunk-AZMD3HP3.js → chunk-LSDWJEFJ.js} +2 -2
- package/dist-cli/chunks/{chunk-TDPLTM27.js → chunk-M77N57QN.js} +1 -1
- package/dist-cli/chunks/{chunk-53DOSJFQ.js → chunk-MC5ENPQM.js} +2 -2
- package/dist-cli/chunks/{chunk-FUD4ZCJ2.js → chunk-MPJ2W2JQ.js} +1 -1
- package/dist-cli/chunks/{chunk-2QMMSZ4Z.js → chunk-O3PHDVRF.js} +2 -2
- package/dist-cli/chunks/chunk-OIVSYUZ4.js +5 -0
- package/dist-cli/chunks/{chunk-YJ3CJUUU.js → chunk-OY57XV3X.js} +2 -2
- package/dist-cli/chunks/{chunk-4PJLRB36.js → chunk-OYY6EJM7.js} +2 -2
- package/dist-cli/chunks/chunk-QIPSGUG7.js +13 -0
- package/dist-cli/chunks/{chunk-3C3MA5ZZ.js → chunk-R3YXB2EL.js} +2 -2
- package/dist-cli/chunks/{chunk-AXSNLS34.js → chunk-S2MAMEQX.js} +1 -1
- package/dist-cli/chunks/{chunk-XHNXDUYR.js → chunk-S4DTM5EZ.js} +23 -13
- package/dist-cli/chunks/chunk-SBMHSZXI.js +119 -0
- package/dist-cli/chunks/{chunk-PGN2263R.js → chunk-USUANHKD.js} +2 -2
- package/dist-cli/chunks/{chunk-4V6DKD5E.js → chunk-V6OGDC6H.js} +1 -1
- package/dist-cli/chunks/{chunk-NKAWHNJR.js → chunk-VKAJ6AJC.js} +1 -1
- package/dist-cli/chunks/{chunk-E5KU4NBO.js → chunk-VS5TCZSA.js} +6 -6
- package/dist-cli/chunks/{chunk-ZUYTGVNA.js → chunk-WCJQSVYO.js} +1 -1
- package/dist-cli/chunks/{chunk-2U5VK6PG.js → chunk-WPJGFVZ5.js} +2 -2
- package/dist-cli/chunks/{chunk-YBO4Z43H.js → chunk-Y6RN5IR4.js} +1 -1
- package/dist-cli/chunks/{chunk-EOQBPXIN.js → chunk-Y7PCKIZD.js} +2 -2
- package/dist-cli/chunks/cli-version-7JACJRBF.js +2 -0
- package/dist-cli/chunks/{compat-UKAJB7JZ.js → compat-SSS76KYC.js} +3 -3
- package/dist-cli/chunks/{config-MTGWPMUR.js → config-6HJMGQPE.js} +2 -2
- package/dist-cli/chunks/control-X3X6VYUC.js +2 -0
- package/dist-cli/chunks/{cpu-profile-4GAXCXJO.js → cpu-profile-UQKTGYR7.js} +2 -2
- package/dist-cli/chunks/daemon-XSH6YITB.js +67 -0
- package/dist-cli/chunks/{debug-MKV3W32U.js → debug-UCOOENBO.js} +3 -3
- package/dist-cli/chunks/{detox-PHFTGHRM.js → detox-BJP2O7XH.js} +2 -2
- package/dist-cli/chunks/{device-ACKEFGW6.js → device-CVN2YZJF.js} +2 -2
- package/dist-cli/chunks/{diagnose-TSP4DCH2.js → diagnose-7XEK27S3.js} +2 -2
- package/dist-cli/chunks/drivers-JQ5QIRRE.js +2 -0
- package/dist-cli/chunks/{electron-N7KR775O.js → electron-4HYAKJ2I.js} +3 -3
- package/dist-cli/chunks/flow-YTT2UHCY.js +2 -0
- package/dist-cli/chunks/help-C4GBFKLP.js +2 -0
- package/dist-cli/chunks/{hints-6IYSDQA3.js → hints-DWCFCVNT.js} +2 -2
- package/dist-cli/chunks/{home-paths-5P4PDEPL.js → home-paths-V6KYK6EL.js} +2 -2
- package/dist-cli/chunks/{inspect-F6KLATMN.js → inspect-TCCQEJHM.js} +3 -3
- package/dist-cli/chunks/install-EN2VEO4H.js +2 -0
- package/dist-cli/chunks/{install-desktop-65COOWJC.js → install-desktop-2YKS5HAY.js} +3 -3
- package/dist-cli/chunks/{keys-2RI5OCTX.js → keys-GQWGTUBQ.js} +2 -2
- package/dist-cli/chunks/{launch-JKAX6AOP.js → launch-26WSX7AZ.js} +3 -3
- package/dist-cli/chunks/{login-CD2MYGGF.js → login-TD7H5EDV.js} +4 -4
- package/dist-cli/chunks/{logout-2SPZSYJD.js → logout-6ARTPVDG.js} +2 -2
- package/dist-cli/chunks/{maestro-B4XYYVZV.js → maestro-DPZQ34MP.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-J65S4L7Y.js +2 -0
- package/dist-cli/chunks/{preview-YWXGWAZR.js → preview-RFQX4EDS.js} +2 -2
- package/dist-cli/chunks/{profile-YPKBHJOK.js → profile-RCTOBUDR.js} +2 -2
- package/dist-cli/chunks/{react-NNFPIW6R.js → react-ECJL6YMK.js} +2 -2
- package/dist-cli/chunks/{record-JGTPXRTW.js → record-3UMKAJKA.js} +4 -4
- package/dist-cli/chunks/runtime-GPY6OO6J.js +2 -0
- package/dist-cli/chunks/runtime-delivery-F4P6KJZM.js +2 -0
- package/dist-cli/chunks/{screenshot-RF55R7LF.js → screenshot-N2UGTFR3.js} +2 -2
- package/dist-cli/chunks/{screenshot-mode-X76SGXYB.js → screenshot-mode-OAMJJM3R.js} +2 -2
- package/dist-cli/chunks/{screenshots-FVO7MYFJ.js → screenshots-WRE3VRYN.js} +2 -2
- package/dist-cli/chunks/{server-BGZ2S4NF.js → server-6CLFPGMH.js} +3 -3
- package/dist-cli/chunks/setup-repo-2FQX6VMQ.js +2 -0
- package/dist-cli/chunks/{skills-DH5NOT3N.js → skills-HO4NIDC3.js} +2 -2
- package/dist-cli/chunks/{slides-CXQMYD3P.js → slides-PJ3DY3WK.js} +2 -2
- package/dist-cli/chunks/{start-6AZUCGBI.js → start-P2UWHC5R.js} +4 -4
- package/dist-cli/chunks/store-KUJUGFQQ.js +2 -0
- package/dist-cli/chunks/telemetry-ZD3GGZT5.js +2 -0
- package/dist-cli/chunks/{test-WEATIZNI.js → test-WV2CC6VE.js} +3 -3
- package/dist-cli/chunks/{three-mode-ZPRCTDNM.js → three-mode-BLBIUFK7.js} +2 -2
- package/dist-cli/chunks/{timeline-AA7E4QQF.js → timeline-T7DCGGXA.js} +2 -2
- package/dist-cli/chunks/{upgrade-O3HVW3U3.js → upgrade-MDJCUJG3.js} +2 -2
- package/dist-cli/chunks/upload-DBW7W7BM.js +2 -0
- package/dist-cli/chunks/version-LPLNI3HW.js +4 -0
- package/dist-cli/chunks/{web-VODHXXG7.js → web-BQYICLPD.js} +2 -2
- package/dist-cli/chunks/{what-happened-6KGU7OQL.js → what-happened-7QAYQKHI.js} +2 -2
- package/dist-cli/chunks/{whoami-4FBBNV5W.js → whoami-3PLHCC2N.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/src/runtime-delivery.ts +6 -99
- package/dist-cli/chunks/auto-bootstrap-PAA3FSVB.js +0 -2
- package/dist-cli/chunks/beta-5ICQFWFG.js +0 -2
- package/dist-cli/chunks/chunk-36HXTKWO.js +0 -5
- package/dist-cli/chunks/chunk-CBKH2EZL.js +0 -4
- package/dist-cli/chunks/chunk-HAP45V4J.js +0 -13
- package/dist-cli/chunks/chunk-JTWMHYRS.js +0 -1
- package/dist-cli/chunks/chunk-PYX7POQN.js +0 -33
- package/dist-cli/chunks/chunk-Q2IYU4KK.js +0 -2
- package/dist-cli/chunks/chunk-SSTIFD3Y.js +0 -119
- package/dist-cli/chunks/chunk-U2Z32HGJ.js +0 -1
- package/dist-cli/chunks/chunk-VEQNMRGS.js +0 -1
- package/dist-cli/chunks/chunk-ZCPGEUMM.js +0 -3
- package/dist-cli/chunks/cli-version-4TLMMPH2.js +0 -2
- package/dist-cli/chunks/control-5FU4OLTE.js +0 -2
- package/dist-cli/chunks/daemon-VYP6PWR2.js +0 -67
- package/dist-cli/chunks/drivers-SDO5XDCT.js +0 -2
- package/dist-cli/chunks/flow-3NGH6OZO.js +0 -2
- package/dist-cli/chunks/help-ZKCJG65K.js +0 -2
- package/dist-cli/chunks/install-6EKDNJOM.js +0 -2
- package/dist-cli/chunks/optional-demo-registry-OBP5WLPI.js +0 -2
- package/dist-cli/chunks/runtime-D4T7CD4H.js +0 -2
- package/dist-cli/chunks/runtime-delivery-DN7LYYY6.js +0 -2
- package/dist-cli/chunks/setup-repo-FNIP3MNA.js +0 -2
- package/dist-cli/chunks/store-VWLWKCQT.js +0 -2
- package/dist-cli/chunks/telemetry-7C5WB6PU.js +0 -2
- package/dist-cli/chunks/upload-DQBOMRID.js +0 -2
- package/dist-cli/chunks/version-M2DLT2IX.js +0 -4
|
@@ -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.166 | (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-JXHFW3SD.js";import{c as N,e as F}from"./chunk-KCP7TTSW.js";import"./chunk-WCJQSVYO.js";import{b as k}from"./chunk-2TE65ODE.js";import"./chunk-V6OGDC6H.js";import"./chunk-M77N57QN.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.166 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
import{d as i}from"./chunk-H52Z73AU.js";import{d as n}from"./chunk-Y7PCKIZD.js";import"./chunk-V6OGDC6H.js";import"./chunk-M77N57QN.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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166 | (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.166",
|
|
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
|
+
}
|
package/src/runtime-delivery.ts
CHANGED
|
@@ -34,50 +34,12 @@ export interface RuntimeManifest {
|
|
|
34
34
|
versions: Record<string, RuntimeManifestVersion>
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export interface RuntimeReleaseNoteItem {
|
|
44
|
-
/** LLM-condensed proper-case one-liner. */
|
|
45
|
-
summary: string
|
|
46
|
-
scope?: string
|
|
47
|
-
hash: string
|
|
48
|
-
breaking?: boolean
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface RuntimeReleaseSection {
|
|
52
|
-
kind: 'breaking' | 'features' | 'fixes' | 'performance' | 'other'
|
|
53
|
-
title: string
|
|
54
|
-
items: RuntimeReleaseNoteItem[]
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface RuntimeReleaseEntry {
|
|
58
|
-
title: string
|
|
59
|
-
version: string
|
|
60
|
-
channel: string
|
|
61
|
-
commit: string
|
|
62
|
-
date: string
|
|
63
|
-
cliVersion?: string
|
|
64
|
-
sections: RuntimeReleaseSection[]
|
|
65
|
-
commitCount: number
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** one page of the changelog, as returned by /api/changelog/sootsim. the stored
|
|
69
|
-
* R2 file holds the full history; the endpoint paginates it (see
|
|
70
|
-
* app/api/changelog/[product]+api.ts), so the CLI drains pages via hasMore. */
|
|
71
|
-
export interface RuntimeReleasesPage {
|
|
72
|
-
product: string
|
|
73
|
-
updatedThrough: string | null
|
|
74
|
-
page: number
|
|
75
|
-
pageSize: number
|
|
76
|
-
total: number
|
|
77
|
-
totalPages: number
|
|
78
|
-
hasMore: boolean
|
|
79
|
-
entries: RuntimeReleaseEntry[]
|
|
80
|
-
}
|
|
37
|
+
/** website URL where the sootsim changelog is rendered. the CLI used to drain
|
|
38
|
+
* a paginated /api/changelog/sootsim endpoint here; the changelog is now a
|
|
39
|
+
* static page checked into the soot repo (one MDX file per runtime release
|
|
40
|
+
* under src/features/site/changelog/sootsim-entries/), so `sootsim runtime
|
|
41
|
+
* notes` points users at the page. */
|
|
42
|
+
export const SOOTSIM_CHANGELOG_URL = 'https://sootsim.com/changelog'
|
|
81
43
|
|
|
82
44
|
export interface RuntimeInstallOptions {
|
|
83
45
|
version?: string | null
|
|
@@ -156,61 +118,6 @@ export async function fetchRuntimeManifest(cdnOrigin?: string): Promise<RuntimeM
|
|
|
156
118
|
return (await res.json()) as RuntimeManifest
|
|
157
119
|
}
|
|
158
120
|
|
|
159
|
-
export function runtimeReleasesUrl(page: number, cdnOrigin?: string): string {
|
|
160
|
-
const url = new URL(`${resolveRuntimeCdnOrigin(cdnOrigin)}/api/changelog/sootsim`)
|
|
161
|
-
url.searchParams.set('page', String(page))
|
|
162
|
-
// bust cdn edge caching so `sootsim runtime notes` always sees the latest.
|
|
163
|
-
url.searchParams.set('t', String(Date.now()))
|
|
164
|
-
return url.toString()
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
async function fetchReleasesPage(
|
|
168
|
-
page: number,
|
|
169
|
-
cdnOrigin?: string,
|
|
170
|
-
): Promise<RuntimeReleasesPage> {
|
|
171
|
-
const url = runtimeReleasesUrl(page, cdnOrigin)
|
|
172
|
-
const res = await fetch(url, { headers: { Accept: 'application/json' } })
|
|
173
|
-
// a missing file is a valid state until the first release ships — callers
|
|
174
|
-
// render "no release notes yet" rather than an error.
|
|
175
|
-
if (res.status === 404) {
|
|
176
|
-
return {
|
|
177
|
-
product: 'sootsim',
|
|
178
|
-
updatedThrough: null,
|
|
179
|
-
page,
|
|
180
|
-
pageSize: 0,
|
|
181
|
-
total: 0,
|
|
182
|
-
totalPages: 0,
|
|
183
|
-
hasMore: false,
|
|
184
|
-
entries: [],
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (!res.ok) {
|
|
188
|
-
throw new Error(`releases fetch failed: ${res.status} ${res.statusText} (${url})`)
|
|
189
|
-
}
|
|
190
|
-
return (await res.json()) as RuntimeReleasesPage
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/** fetch the full sootsim changelog (newest release first) by draining every
|
|
194
|
-
* page of the paginated endpoint. the CLI wants the whole history (notes
|
|
195
|
-
* --all, version lookups for any release), so it pages through; the website
|
|
196
|
-
* loads one page at a time. throws on network/parse failure so callers can
|
|
197
|
-
* surface a clear message. */
|
|
198
|
-
export async function fetchRuntimeReleases(
|
|
199
|
-
cdnOrigin?: string,
|
|
200
|
-
): Promise<RuntimeReleaseEntry[]> {
|
|
201
|
-
const entries: RuntimeReleaseEntry[] = []
|
|
202
|
-
let page = 1
|
|
203
|
-
// bounded by totalPages from the first response; the guard is a backstop
|
|
204
|
-
// against a malformed hasMore that never settles.
|
|
205
|
-
for (let guard = 0; guard < 1000; guard++) {
|
|
206
|
-
const result = await fetchReleasesPage(page, cdnOrigin)
|
|
207
|
-
if (Array.isArray(result.entries)) entries.push(...result.entries)
|
|
208
|
-
if (!result.hasMore || result.entries.length === 0) break
|
|
209
|
-
page++
|
|
210
|
-
}
|
|
211
|
-
return entries
|
|
212
|
-
}
|
|
213
|
-
|
|
214
121
|
export function resolveRuntimeVersion(
|
|
215
122
|
manifest: RuntimeManifest,
|
|
216
123
|
opts: Pick<RuntimeInstallOptions, 'version' | 'channel'> = {},
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c,d}from"./chunk-LN5AJIPO.js";import"./chunk-T6VPZ5ES.js";import"./chunk-3VE6THTL.js";import"./chunk-ZUYTGVNA.js";import"./chunk-4V6DKD5E.js";import"./chunk-TDPLTM27.js";export{c as ensureDaemonRunning,a as ensureRuntimeInstalled,d as ensureSootsimReady,b as resolveBootstrapPort};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a as C,b as k}from"./chunk-FUD4ZCJ2.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,4 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.164 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{A as R,B as g,C as v,E as w,k as p,t as b,v as S}from"./chunk-4V6DKD5E.js";import{spawn as I}from"child_process";import P from"crypto";import s from"fs";import l from"path";import{Readable as k}from"stream";import{pipeline as E}from"stream/promises";var M="https://sootbean.com",C="SOOTSIM_CDN_ORIGIN",N="SOOTSIM_RUNTIME_CHANNEL";function $(){try{let e=JSON.parse(s.readFileSync(S(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return{}}}function m(e){let t=$();return(e||process.env[C]||t.cdnOrigin||M).replace(/\/+$/,"")}function x(e){let t=$();return e||process.env[N]||t.runtimeChannel||"stable"}function T(e){let t=new URL(`${m(e)}/runtimes/manifest.json`);return t.searchParams.set("t",String(Date.now())),t.toString()}function D(e,t){return`${m(t)}/runtimes/sootsim-runtime-${e}.tar.gz`}async function y(e){let t=T(e),r=await fetch(t,{headers:{Accept:"application/json"}});if(!r.ok)throw new Error(`manifest fetch failed: ${r.status} ${r.statusText} (${t})`);return await r.json()}function U(e,t){let r=new URL(`${m(t)}/api/changelog/sootsim`);return r.searchParams.set("page",String(e)),r.searchParams.set("t",String(Date.now())),r.toString()}async function V(e,t){let r=U(e,t),n=await fetch(r,{headers:{Accept:"application/json"}});if(n.status===404)return{product:"sootsim",updatedThrough:null,page:e,pageSize:0,total:0,totalPages:0,hasMore:!1,entries:[]};if(!n.ok)throw new Error(`releases fetch failed: ${n.status} ${n.statusText} (${r})`);return await n.json()}async function K(e){let t=[],r=1;for(let n=0;n<1e3;n++){let i=await V(r,e);if(Array.isArray(i.entries)&&t.push(...i.entries),!i.hasMore||i.entries.length===0)break;r++}return t}function A(e,t={}){let r=x(t.channel),n=t.version||e.channels[r]?.latest;if(!n)throw new Error(`no version specified and channel '${r}' has no latest entry in the manifest`);let i=e.versions[n];if(!i)throw new Error(`version ${n} not found in manifest; available: ${Object.keys(e.versions).slice(-10).join(", ")||"(none)"}`);return{version:n,channel:r,entry:i}}async function j(e={}){R();let t=m(e.cdnOrigin),r=await y(t),{version:n,channel:i,entry:o}=A(r,e),a=p(n),c=e.setActive!==!1;if(!e.force&&s.existsSync(l.join(a,"index.html")))return c&&v(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!1,activated:c,manifest:r};let d=o.tarball||D(n,t),f=l.join(b(),`sootsim-runtime-${n}.tar.gz`);process.stderr.write(`sootsim: downloading runtime ${n}\u2026
|
|
3
|
-
`),await _(d,f),process.stderr.write(`sootsim: extracting runtime ${n}\u2026
|
|
4
|
-
`);let h=await z(f);if(h!==o.sha256)throw s.rmSync(f,{force:!0}),new Error(`sha256 mismatch for runtime ${n}: expected ${o.sha256}, actual ${h}`);let u=l.join(l.dirname(a),`.installing-${n}-${process.pid}`);s.rmSync(u,{recursive:!0,force:!0}),s.mkdirSync(u,{recursive:!0});try{if(await L(f,u),!s.existsSync(l.join(u,"index.html")))throw new Error(`extracted tarball for runtime ${n} is missing index.html`);s.rmSync(a,{recursive:!0,force:!0}),s.renameSync(u,a)}catch(O){throw s.rmSync(u,{recursive:!0,force:!0}),O}return c&&v(n),{version:n,channel:i,cdnOrigin:t,runtimeDir:a,installed:!0,activated:c,manifest:r}}async function Q(e={}){R();let t=m(e.cdnOrigin),r=x(e.channel),n=await y(t),i=n.channels[r]?.latest;if(!i)return{checked:!0,updated:!1,reason:`channel '${r}' has no latest runtime`,activeVersion:g()};if(!n.versions[i])return{checked:!0,updated:!1,reason:`manifest is missing version ${i}`,activeVersion:g(),latestVersion:i};let a=g(),c=a?p(a):null,d=c?s.existsSync(l.join(c,"index.html")):!1;if(!(!a||!d||w(i,a)>0))return{checked:!0,updated:!1,reason:"active runtime is current",activeVersion:a,latestVersion:i};let h=await j({version:i,channel:r,cdnOrigin:t,setActive:!1});return{checked:!0,updated:!0,activeVersion:i,latestVersion:i,install:h}}async function X(e={}){let t=g();try{let r=await y(m(e.cdnOrigin)),n=x(e.channel),i=r.channels[n]?.latest??null,o=!!(i&&(!t||w(i,t)>0));return{active:t,latest:i,outdated:o}}catch{return{active:t,latest:null,outdated:!1}}}async function _(e,t){let r=await fetch(e);if(!r.ok||!r.body)throw new Error(`download failed: ${r.status} ${r.statusText} (${e})`);s.mkdirSync(l.dirname(t),{recursive:!0});let n=`${t}.partial`;try{await E(k.fromWeb(r.body),s.createWriteStream(n)),s.renameSync(n,t)}catch(i){try{s.unlinkSync(n)}catch{}throw i}}function z(e){return new Promise((t,r)=>{let n=P.createHash("sha256"),i=s.createReadStream(e);i.on("data",o=>n.update(o)),i.on("error",r),i.on("end",()=>t(n.digest("hex")))})}function L(e,t){return new Promise((r,n)=>{let i=I("tar",["-xzf",e,"-C",t],{stdio:["ignore","inherit","inherit"]});i.on("error",n),i.on("exit",o=>{o===0?r():n(new Error(`tar exited with code ${o}`))})})}export{M as a,C as b,N as c,m as d,x as e,T as f,D as g,y as h,U as i,K as j,A as k,j as l,Q as m,X as n};
|