diff --git a/.vscode/settings.json b/.vscode/settings.json index ba7d7d7..668c0fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,5 +13,8 @@ "editor.defaultFormatter": "prettier.prettier-vscode", "[typescriptreact]": { "editor.defaultFormatter": "prettier.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "prettier.prettier-vscode" } } diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 0b587c1..6ce3dc0 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -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'), diff --git a/package.json b/package.json index 4539d3e..a263cbc 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/constants/index.ts b/src/constants/index.ts index bd5f252..9b1b186 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -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 = { diff --git a/src/main/modules/koboldcpp/tunnel.ts b/src/main/modules/koboldcpp/tunnel.ts index 1541a57..2bb5a35 100644 --- a/src/main/modules/koboldcpp/tunnel.ts +++ b/src/main/modules/koboldcpp/tunnel.ts @@ -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((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) => { - clearTimeout(timeout); - resolve(url); - }); + const checkForUrl = () => { + const match = output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/); + if (match) { + urlFound = true; + clearTimeout(timeout); + 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}`); - activeTunnel = null; + + 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); diff --git a/yarn.lock b/yarn.lock index cd09d98..97e5691 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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