upgrade to latest electron-vite v5, better cloudflared implementation to download on demand to reduce bundle size

This commit is contained in:
Egor 2025-12-07 12:40:49 -08:00
parent 9aca174a48
commit d302f07e79
6 changed files with 276 additions and 184 deletions

View file

@ -13,5 +13,8 @@
"editor.defaultFormatter": "prettier.prettier-vscode",
"[typescriptreact]": {
"editor.defaultFormatter": "prettier.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "prettier.prettier-vscode"
}
}

View file

@ -1,11 +1,13 @@
import { defineConfig, externalizeDepsPlugin } from 'electron-vite';
import { defineConfig } from 'electron-vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';
import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig({
main: {
plugins: [externalizeDepsPlugin()],
build: {
externalizeDeps: true,
},
resolve: {
alias: {
'@': resolve(__dirname, './src'),
@ -13,7 +15,9 @@ export default defineConfig({
},
},
preload: {
plugins: [externalizeDepsPlugin()],
build: {
externalizeDeps: true,
},
resolve: {
alias: {
'@': resolve(__dirname, './src'),

View file

@ -1,7 +1,7 @@
{
"name": "gerbil",
"productName": "Gerbil",
"version": "1.15.1",
"version": "1.16.0",
"description": "Run Large Language Models locally",
"main": "out/main/index.js",
"homepage": "./",
@ -37,6 +37,28 @@
"email": "lonecloud604@proton.me"
},
"license": "AGPL-3.0-or-later",
"dependencies": {
"@codemirror/search": "^6.5.11",
"@codemirror/theme-one-dark": "^6.1.3",
"@codemirror/view": "^6.38.8",
"@fontsource/inter": "^5.2.8",
"@huggingface/gguf": "^0.3.2",
"@mantine/core": "^8.3.9",
"@mantine/hooks": "^8.3.9",
"@uiw/react-codemirror": "^4.25.3",
"electron-updater": "^6.6.2",
"execa": "^9.6.1",
"lucide-react": "^0.556.0",
"mime-types": "^3.0.2",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-error-boundary": "^6.0.0",
"systeminformation": "^5.27.11",
"winston": "^3.19.0",
"winston-daily-rotate-file": "^5.0.0",
"yauzl": "^3.2.0",
"zustand": "^5.0.9"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@types/mime-types": "^3.0.1",
@ -50,7 +72,7 @@
"cross-env": "^10.1.0",
"electron": "^38.7.2",
"electron-builder": "^26.0.12",
"electron-vite": "^4.0.1",
"electron-vite": "^5.0.0",
"eslint": "^9.39.1",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-no-comments": "^1.1.10",
@ -65,29 +87,6 @@
"typescript": "^5.9.3",
"vite": "^7.2.6"
},
"dependencies": {
"@codemirror/search": "^6.5.11",
"@codemirror/theme-one-dark": "^6.1.3",
"@codemirror/view": "^6.38.8",
"@fontsource/inter": "^5.2.8",
"@huggingface/gguf": "^0.3.2",
"@mantine/core": "^8.3.9",
"@mantine/hooks": "^8.3.9",
"@uiw/react-codemirror": "^4.25.3",
"cloudflared": "^0.7.1",
"electron-updater": "^6.6.2",
"execa": "^9.6.1",
"lucide-react": "^0.556.0",
"mime-types": "^3.0.2",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"react-error-boundary": "^6.0.0",
"systeminformation": "^5.27.11",
"winston": "^3.18.3",
"winston-daily-rotate-file": "^5.0.0",
"yauzl": "^3.2.0",
"zustand": "^5.0.9"
},
"build": {
"appId": "com.gerbil.app",
"productName": "Gerbil",

View file

@ -45,6 +45,7 @@ export const GITHUB_API = {
KOBOLDCPP_REPO: 'LostRuins/koboldcpp',
KOBOLDCPP_ROCM_REPO: 'YellowRoseCx/koboldcpp-rocm',
GERBIL_REPO: 'lone-cloud/gerbil',
CLOUDFLARED_REPO: 'cloudflare/cloudflared',
get LATEST_RELEASE_URL() {
return `${this.BASE_URL}/repos/${this.KOBOLDCPP_REPO}/releases/latest` as const;
},
@ -60,6 +61,12 @@ export const GITHUB_API = {
get GERBIL_LATEST_RELEASE_URL() {
return `${this.BASE_URL}/repos/${this.GERBIL_REPO}/releases/latest` as const;
},
get CLOUDFLARED_LATEST_RELEASE_URL() {
return `${this.BASE_URL}/repos/${this.CLOUDFLARED_REPO}/releases/latest` as const;
},
getCloudflaredDownloadUrl(version: string, filename: string) {
return `${this.GITHUB_BASE_URL}/${this.CLOUDFLARED_REPO}/releases/download/${version}/${filename}` as const;
},
} as const;
export const ASSET_SUFFIXES = {

View file

@ -1,16 +1,19 @@
import fs from 'fs';
import { createWriteStream } from 'fs';
import { chmod, access } from 'fs/promises';
import path from 'path';
import { Tunnel, install, use as setCloudflaredBin } from 'cloudflared';
import { platform } from 'process';
import { platform, arch } from 'process';
import { pipeline } from 'stream/promises';
import { Readable } from 'stream';
import { execa, type ResultPromise } from 'execa';
import { logError } from '@/utils/node/logging';
import { sendKoboldOutput, sendToRenderer } from '../window';
import { PROXY } from '@/constants/proxy';
import { SILLYTAVERN, OPENWEBUI } from '@/constants';
import { SILLYTAVERN, OPENWEBUI, GITHUB_API } from '@/constants';
import { getInstallDir } from '@/main/modules/config';
import type { FrontendPreference } from '@/types';
let activeTunnel: Tunnel | null = null;
let activeTunnel: ResultPromise | null = null;
let tunnelUrl: string | null = null;
const getCloudflaredBin = () => {
@ -18,6 +21,55 @@ const getCloudflaredBin = () => {
return path.join(getInstallDir(), binName);
};
const getCloudflaredAssetName = () => {
const archSuffix = arch === 'arm64' ? 'arm64' : 'amd64';
if (platform === 'win32') {
return 'cloudflared-windows-amd64.exe';
} else if (platform === 'darwin') {
return `cloudflared-darwin-${archSuffix}`;
} else {
return `cloudflared-linux-${archSuffix}`;
}
};
const getCloudflaredDownloadUrl = async () => {
const response = await fetch(GITHUB_API.CLOUDFLARED_LATEST_RELEASE_URL);
if (!response.ok) {
throw new Error(
`Failed to fetch latest cloudflared release: ${response.statusText}`
);
}
const release = (await response.json()) as { tag_name: string };
return GITHUB_API.getCloudflaredDownloadUrl(
release.tag_name,
getCloudflaredAssetName()
);
};
const downloadCloudflared = async (binPath: string) => {
const url = await getCloudflaredDownloadUrl();
sendKoboldOutput(`Downloading cloudflared from ${url}...`);
const response = await fetch(url);
if (!response.ok || !response.body) {
throw new Error(`Failed to download cloudflared: ${response.statusText}`);
}
await pipeline(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Readable.fromWeb(response.body as any),
createWriteStream(binPath)
);
if (platform !== 'win32') {
await chmod(binPath, 0o755);
}
sendKoboldOutput(`Downloaded cloudflared to ${binPath}`);
};
const getTunnelTarget = (frontendPreference: FrontendPreference) => {
switch (frontendPreference) {
case 'sillytavern':
@ -41,42 +93,74 @@ export const startTunnel = async (
const bin = getCloudflaredBin();
if (!fs.existsSync(bin)) {
sendKoboldOutput(`Installing cloudflared binary to ${bin}...`);
await install(bin);
const binExists = await access(bin)
.then(() => true)
.catch(() => false);
if (!binExists) {
await downloadCloudflared(bin);
}
setCloudflaredBin(bin);
const tunnelTarget = getTunnelTarget(frontendPreference);
const tunnel = Tunnel.quick(tunnelTarget, { '--no-autoupdate': true });
const tunnel = execa(bin, [
'tunnel',
'--url',
tunnelTarget,
'--no-autoupdate',
]);
activeTunnel = tunnel;
let rateLimited = false;
let output = '';
let urlFound = false;
tunnel.on('stderr', (data: string) => {
if (data.includes('429') || data.includes('Too Many Requests')) {
tunnel.stderr?.on('data', (data: Buffer) => {
const text = data.toString();
output += text;
if (text.includes('429') || text.includes('Too Many Requests')) {
rateLimited = true;
}
});
tunnel.stdout?.on('data', (data: Buffer) => {
output += data.toString();
});
const url = await new Promise<string>((resolve, reject) => {
const timeout = setTimeout(() => {
const message = rateLimited
? 'Cloudflare rate limit exceeded. Please wait a few minutes and try again.'
: 'Tunnel connection timed out';
tunnel.kill();
reject(new Error(message));
}, 30000);
tunnel.once('url', (url) => {
const checkForUrl = () => {
const match = output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/);
if (match) {
urlFound = true;
clearTimeout(timeout);
resolve(url);
});
clearInterval(checkInterval);
resolve(match[0]);
}
};
const checkInterval = setInterval(checkForUrl, 100);
tunnel.once('error', (error) => {
clearTimeout(timeout);
clearInterval(checkInterval);
reject(error);
});
tunnel.once('exit', (code) => {
if (!urlFound) {
clearTimeout(timeout);
clearInterval(checkInterval);
reject(new Error(`Tunnel process exited with code ${code}`));
}
});
});
tunnelUrl = url;
@ -88,7 +172,7 @@ export const startTunnel = async (
sendKoboldOutput(`Tunnel error: ${error.message}`);
});
tunnel.on('exit', (code, signal) => {
tunnel.on('exit', (code: number, signal: string) => {
sendKoboldOutput(
`Tunnel process exited (code: ${code}, signal: ${signal})`
);
@ -102,7 +186,12 @@ export const startTunnel = async (
const errorMessage = error instanceof Error ? error.message : String(error);
logError(`Failed to start tunnel: ${errorMessage}`, error as Error);
sendKoboldOutput(`Failed to start tunnel: ${errorMessage}`);
if (activeTunnel) {
activeTunnel.kill();
activeTunnel = null;
}
return null;
}
};
@ -114,7 +203,7 @@ export const stopTunnel = () => {
try {
sendKoboldOutput('Stopping Cloudflare tunnel...');
activeTunnel.stop();
activeTunnel.kill();
activeTunnel = null;
tunnelUrl = null;
sendToRenderer('tunnel-url-changed', null);

262
yarn.lock
View file

@ -30,7 +30,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/core@npm:^7.24.4, @babel/core@npm:^7.27.7, @babel/core@npm:^7.28.5":
"@babel/core@npm:^7.24.4, @babel/core@npm:^7.28.4, @babel/core@npm:^7.28.5":
version: 7.28.5
resolution: "@babel/core@npm:7.28.5"
dependencies:
@ -474,184 +474,184 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/aix-ppc64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/aix-ppc64@npm:0.25.11"
"@esbuild/aix-ppc64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/aix-ppc64@npm:0.25.12"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/android-arm64@npm:0.25.11"
"@esbuild/android-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/android-arm64@npm:0.25.12"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/android-arm@npm:0.25.11"
"@esbuild/android-arm@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/android-arm@npm:0.25.12"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/android-x64@npm:0.25.11"
"@esbuild/android-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/android-x64@npm:0.25.12"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/darwin-arm64@npm:0.25.11"
"@esbuild/darwin-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/darwin-arm64@npm:0.25.12"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/darwin-x64@npm:0.25.11"
"@esbuild/darwin-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/darwin-x64@npm:0.25.12"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/freebsd-arm64@npm:0.25.11"
"@esbuild/freebsd-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/freebsd-arm64@npm:0.25.12"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/freebsd-x64@npm:0.25.11"
"@esbuild/freebsd-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/freebsd-x64@npm:0.25.12"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-arm64@npm:0.25.11"
"@esbuild/linux-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-arm64@npm:0.25.12"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-arm@npm:0.25.11"
"@esbuild/linux-arm@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-arm@npm:0.25.12"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-ia32@npm:0.25.11"
"@esbuild/linux-ia32@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-ia32@npm:0.25.12"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-loong64@npm:0.25.11"
"@esbuild/linux-loong64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-loong64@npm:0.25.12"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-mips64el@npm:0.25.11"
"@esbuild/linux-mips64el@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-mips64el@npm:0.25.12"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-ppc64@npm:0.25.11"
"@esbuild/linux-ppc64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-ppc64@npm:0.25.12"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-riscv64@npm:0.25.11"
"@esbuild/linux-riscv64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-riscv64@npm:0.25.12"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-s390x@npm:0.25.11"
"@esbuild/linux-s390x@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-s390x@npm:0.25.12"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/linux-x64@npm:0.25.11"
"@esbuild/linux-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-x64@npm:0.25.12"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@esbuild/netbsd-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/netbsd-arm64@npm:0.25.11"
"@esbuild/netbsd-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/netbsd-arm64@npm:0.25.12"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/netbsd-x64@npm:0.25.11"
"@esbuild/netbsd-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/netbsd-x64@npm:0.25.12"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openbsd-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/openbsd-arm64@npm:0.25.11"
"@esbuild/openbsd-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/openbsd-arm64@npm:0.25.12"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/openbsd-x64@npm:0.25.11"
"@esbuild/openbsd-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/openbsd-x64@npm:0.25.12"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openharmony-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/openharmony-arm64@npm:0.25.11"
"@esbuild/openharmony-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/openharmony-arm64@npm:0.25.12"
conditions: os=openharmony & cpu=arm64
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/sunos-x64@npm:0.25.11"
"@esbuild/sunos-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/sunos-x64@npm:0.25.12"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/win32-arm64@npm:0.25.11"
"@esbuild/win32-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/win32-arm64@npm:0.25.12"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/win32-ia32@npm:0.25.11"
"@esbuild/win32-ia32@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/win32-ia32@npm:0.25.12"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.25.11":
version: 0.25.11
resolution: "@esbuild/win32-x64@npm:0.25.11"
"@esbuild/win32-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/win32-x64@npm:0.25.12"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@ -2304,15 +2304,6 @@ __metadata:
languageName: node
linkType: hard
"cloudflared@npm:^0.7.1":
version: 0.7.1
resolution: "cloudflared@npm:0.7.1"
bin:
cloudflared: lib/cloudflared.js
checksum: 10c0/e5cb2a44f514c19f80078eed019cf772d545ff58e528359b5d31a96de0885e959085fee37b21d3c99053d93b5a4abeb8c23b5cb66127257ad4dc92ef01912626
languageName: node
linkType: hard
"clsx@npm:^2.1.1":
version: 2.1.1
resolution: "clsx@npm:2.1.1"
@ -2779,15 +2770,15 @@ __metadata:
languageName: node
linkType: hard
"electron-vite@npm:^4.0.1":
version: 4.0.1
resolution: "electron-vite@npm:4.0.1"
"electron-vite@npm:^5.0.0":
version: 5.0.0
resolution: "electron-vite@npm:5.0.0"
dependencies:
"@babel/core": "npm:^7.27.7"
"@babel/core": "npm:^7.28.4"
"@babel/plugin-transform-arrow-functions": "npm:^7.27.1"
cac: "npm:^6.7.14"
esbuild: "npm:^0.25.5"
magic-string: "npm:^0.30.17"
esbuild: "npm:^0.25.11"
magic-string: "npm:^0.30.19"
picocolors: "npm:^1.1.1"
peerDependencies:
"@swc/core": ^1.0.0
@ -2797,7 +2788,7 @@ __metadata:
optional: true
bin:
electron-vite: bin/electron-vite.js
checksum: 10c0/4e81ac4e4ede6060ffec56ba9b1d5ff95bb263496e62527345e8c79542924c54c54def39de9b466a81ed250b68774792c2106b93274c790b4cd8e7be448f6af8
checksum: 10c0/e7797910b23f23f39c12ded92d07d7164c5c6adab294aa13278c1b49ada3b12868b13ace8546d2656db4dbab89978cf8368a659d1ce6a2fb9f1aeddb1c8de557
languageName: node
linkType: hard
@ -3015,36 +3006,36 @@ __metadata:
languageName: node
linkType: hard
"esbuild@npm:^0.25.0, esbuild@npm:^0.25.5":
version: 0.25.11
resolution: "esbuild@npm:0.25.11"
"esbuild@npm:^0.25.0, esbuild@npm:^0.25.11":
version: 0.25.12
resolution: "esbuild@npm:0.25.12"
dependencies:
"@esbuild/aix-ppc64": "npm:0.25.11"
"@esbuild/android-arm": "npm:0.25.11"
"@esbuild/android-arm64": "npm:0.25.11"
"@esbuild/android-x64": "npm:0.25.11"
"@esbuild/darwin-arm64": "npm:0.25.11"
"@esbuild/darwin-x64": "npm:0.25.11"
"@esbuild/freebsd-arm64": "npm:0.25.11"
"@esbuild/freebsd-x64": "npm:0.25.11"
"@esbuild/linux-arm": "npm:0.25.11"
"@esbuild/linux-arm64": "npm:0.25.11"
"@esbuild/linux-ia32": "npm:0.25.11"
"@esbuild/linux-loong64": "npm:0.25.11"
"@esbuild/linux-mips64el": "npm:0.25.11"
"@esbuild/linux-ppc64": "npm:0.25.11"
"@esbuild/linux-riscv64": "npm:0.25.11"
"@esbuild/linux-s390x": "npm:0.25.11"
"@esbuild/linux-x64": "npm:0.25.11"
"@esbuild/netbsd-arm64": "npm:0.25.11"
"@esbuild/netbsd-x64": "npm:0.25.11"
"@esbuild/openbsd-arm64": "npm:0.25.11"
"@esbuild/openbsd-x64": "npm:0.25.11"
"@esbuild/openharmony-arm64": "npm:0.25.11"
"@esbuild/sunos-x64": "npm:0.25.11"
"@esbuild/win32-arm64": "npm:0.25.11"
"@esbuild/win32-ia32": "npm:0.25.11"
"@esbuild/win32-x64": "npm:0.25.11"
"@esbuild/aix-ppc64": "npm:0.25.12"
"@esbuild/android-arm": "npm:0.25.12"
"@esbuild/android-arm64": "npm:0.25.12"
"@esbuild/android-x64": "npm:0.25.12"
"@esbuild/darwin-arm64": "npm:0.25.12"
"@esbuild/darwin-x64": "npm:0.25.12"
"@esbuild/freebsd-arm64": "npm:0.25.12"
"@esbuild/freebsd-x64": "npm:0.25.12"
"@esbuild/linux-arm": "npm:0.25.12"
"@esbuild/linux-arm64": "npm:0.25.12"
"@esbuild/linux-ia32": "npm:0.25.12"
"@esbuild/linux-loong64": "npm:0.25.12"
"@esbuild/linux-mips64el": "npm:0.25.12"
"@esbuild/linux-ppc64": "npm:0.25.12"
"@esbuild/linux-riscv64": "npm:0.25.12"
"@esbuild/linux-s390x": "npm:0.25.12"
"@esbuild/linux-x64": "npm:0.25.12"
"@esbuild/netbsd-arm64": "npm:0.25.12"
"@esbuild/netbsd-x64": "npm:0.25.12"
"@esbuild/openbsd-arm64": "npm:0.25.12"
"@esbuild/openbsd-x64": "npm:0.25.12"
"@esbuild/openharmony-arm64": "npm:0.25.12"
"@esbuild/sunos-x64": "npm:0.25.12"
"@esbuild/win32-arm64": "npm:0.25.12"
"@esbuild/win32-ia32": "npm:0.25.12"
"@esbuild/win32-x64": "npm:0.25.12"
dependenciesMeta:
"@esbuild/aix-ppc64":
optional: true
@ -3100,7 +3091,7 @@ __metadata:
optional: true
bin:
esbuild: bin/esbuild
checksum: 10c0/7f819b16a9f502091ddc6e1855291eaa5ede32c2b792cd8a8a60cc24faee469e3c7b607e2f22ea8684eb7c7bc377b2509e9f1cd50f10b3bf5042d1e9e4234be3
checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b
languageName: node
linkType: hard
@ -3728,12 +3719,11 @@ __metadata:
"@typescript-eslint/parser": "npm:^8.48.1"
"@uiw/react-codemirror": "npm:^4.25.3"
"@vitejs/plugin-react": "npm:^5.1.1"
cloudflared: "npm:^0.7.1"
cross-env: "npm:^10.1.0"
electron: "npm:^38.7.2"
electron-builder: "npm:^26.0.12"
electron-updater: "npm:^6.6.2"
electron-vite: "npm:^4.0.1"
electron-vite: "npm:^5.0.0"
eslint: "npm:^9.39.1"
eslint-plugin-import: "npm:^2.32.0"
eslint-plugin-no-comments: "npm:^1.1.10"
@ -3754,7 +3744,7 @@ __metadata:
systeminformation: "npm:^5.27.11"
typescript: "npm:^5.9.3"
vite: "npm:^7.2.6"
winston: "npm:^3.18.3"
winston: "npm:^3.19.0"
winston-daily-rotate-file: "npm:^5.0.0"
yauzl: "npm:^3.2.0"
zustand: "npm:^5.0.9"
@ -4813,12 +4803,12 @@ __metadata:
languageName: node
linkType: hard
"magic-string@npm:^0.30.17":
version: 0.30.19
resolution: "magic-string@npm:0.30.19"
"magic-string@npm:^0.30.19":
version: 0.30.21
resolution: "magic-string@npm:0.30.21"
dependencies:
"@jridgewell/sourcemap-codec": "npm:^1.5.5"
checksum: 10c0/db23fd2e2ee98a1aeb88a4cdb2353137fcf05819b883c856dd79e4c7dfb25151e2a5a4d5dbd88add5e30ed8ae5c51bcf4accbc6becb75249d924ec7b4fbcae27
checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a
languageName: node
linkType: hard
@ -7156,9 +7146,9 @@ __metadata:
languageName: node
linkType: hard
"winston@npm:^3.18.3":
version: 3.18.3
resolution: "winston@npm:3.18.3"
"winston@npm:^3.19.0":
version: 3.19.0
resolution: "winston@npm:3.19.0"
dependencies:
"@colors/colors": "npm:^1.6.0"
"@dabh/diagnostics": "npm:^2.0.8"
@ -7171,7 +7161,7 @@ __metadata:
stack-trace: "npm:0.0.x"
triple-beam: "npm:^1.3.0"
winston-transport: "npm:^4.9.0"
checksum: 10c0/0bd666590d7f1f2e1fa1273b699463e14b2fcf2bab503e16bc62f275c4b52f14c3dda7bb255d5cc4cef046dd3e112c45518ec8f3c3536ab666421b7265d8c45b
checksum: 10c0/341a8ccfb726120209d34e2466040e2ca72cadb1a3402c4fc90425facad002b81275675b4ab9b4432a624311bc47ef7c9fb7652c86fca454d2be2f2ee1882226
languageName: node
linkType: hard