From 4cc4358eb05eb0d72cb0aa742e25e8e28ed1c428 Mon Sep 17 00:00:00 2001 From: Egor Date: Fri, 19 Sep 2025 22:53:55 -0700 Subject: [PATCH] better modals, new button to allow deleting configs, CPU/GPU temp metrics on hover --- eslint.config.ts | 2 + package.json | 6 +- src/components/App/EjectConfirmModal.tsx | 8 +- src/components/App/PerformanceBadge.tsx | 22 +- src/components/App/StatusBar.tsx | 4 +- src/components/App/UpdateAvailableModal.tsx | 7 +- src/components/Modal.tsx | 64 +++ .../Launch/CommandLineArgumentsModal.tsx | 21 +- .../screens/Launch/ConfigFileManager.tsx | 51 +- .../screens/Launch/CreateConfigModal.tsx | 5 +- .../screens/Launch/DeleteConfigModal.tsx | 38 ++ src/components/screens/Launch/index.tsx | 27 + src/components/settings/SettingsModal.tsx | 164 +++--- src/constants/index.ts | 9 - src/hooks/useKoboldVersions.ts | 4 +- src/hooks/useLogoClickSounds.ts | 4 +- src/main/ipc.ts | 5 + src/main/modules/dependencies.ts | 4 +- src/main/modules/koboldcpp.ts | 12 + src/main/modules/monitoring.ts | 13 + src/preload/index.ts | 2 + src/styles/index.css | 16 +- src/types/electron.d.ts | 1 + src/utils/node/gpu.ts | 36 +- src/utils/sounds.ts | 12 +- yarn.lock | 516 +++++++++--------- 26 files changed, 627 insertions(+), 426 deletions(-) create mode 100644 src/components/Modal.tsx create mode 100644 src/components/screens/Launch/DeleteConfigModal.tsx diff --git a/eslint.config.ts b/eslint.config.ts index 650706d..a961243 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -170,6 +170,8 @@ const config = [ 'sonarjs/cognitive-complexity': ['warn', 25], + 'no-empty': ['error', { allowEmptyCatch: true }], + 'promise/prefer-await-to-then': 'error', 'promise/prefer-await-to-callbacks': 'off', 'promise/no-nesting': 'error', diff --git a/package.json b/package.json index 1f838fd..67c3dd2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "gerbil", "productName": "Gerbil", - "version": "1.4.0", + "version": "1.4.1", "description": "Run Large Language Models locally", "main": "out/main/index.js", "homepage": "./", @@ -38,7 +38,7 @@ }, "license": "AGPL-3.0-or-later", "devDependencies": { - "@eslint/js": "^9.35.0", + "@eslint/js": "^9.36.0", "@types/node": "^24.5.2", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", @@ -49,7 +49,7 @@ "electron": "^38.1.2", "electron-builder": "^26.0.12", "electron-vite": "^4.0.0", - "eslint": "^9.35.0", + "eslint": "^9.36.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-no-comments": "^1.1.10", "eslint-plugin-promise": "^7.2.1", diff --git a/src/components/App/EjectConfirmModal.tsx b/src/components/App/EjectConfirmModal.tsx index f678713..04da1cf 100644 --- a/src/components/App/EjectConfirmModal.tsx +++ b/src/components/App/EjectConfirmModal.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { Modal, Text, Group, Button, Checkbox, Stack } from '@mantine/core'; -import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; +import { Text, Group, Button, Checkbox, Stack } from '@mantine/core'; +import { Modal } from '@/components/Modal'; interface EjectConfirmModalProps { opened: boolean; @@ -30,10 +30,6 @@ export const EjectConfirmModal = ({ opened={opened} onClose={handleClose} title="Are you sure you want to eject?" - centered - closeOnClickOutside={false} - closeOnEscape={false} - styles={MODAL_STYLES_WITH_TITLEBAR} > diff --git a/src/components/App/PerformanceBadge.tsx b/src/components/App/PerformanceBadge.tsx index a4d3aa3..0606615 100644 --- a/src/components/App/PerformanceBadge.tsx +++ b/src/components/App/PerformanceBadge.tsx @@ -1,5 +1,4 @@ -import { Badge, Tooltip } from '@mantine/core'; -import { useState } from 'react'; +import { Button, Tooltip } from '@mantine/core'; interface PerformanceBadgeProps { label: string; @@ -12,8 +11,6 @@ export const PerformanceBadge = ({ value, tooltipLabel, }: PerformanceBadgeProps) => { - const [isHovered, setIsHovered] = useState(false); - const handlePerformanceClick = async () => { const result = await window.electronAPI.app.openPerformanceManager(); @@ -26,22 +23,23 @@ export const PerformanceBadge = ({ return ( - setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} onClick={handlePerformanceClick} > {label}: {value} - + ); }; diff --git a/src/components/App/StatusBar.tsx b/src/components/App/StatusBar.tsx index dd05dd0..0086ce0 100644 --- a/src/components/App/StatusBar.tsx +++ b/src/components/App/StatusBar.tsx @@ -73,7 +73,7 @@ export const StatusBar = ({ maxDataPoints = 60 }: StatusBarProps) => { { 1 ? ` ${index + 1}` : ''}`} value={`${gpu.usage}%`} - tooltipLabel={`${gpu.usage}%`} + tooltipLabel={`${gpu.usage}%${gpu.temperature ? ` • ${gpu.temperature}°C` : ''}`} /> diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx new file mode 100644 index 0000000..f494724 --- /dev/null +++ b/src/components/Modal.tsx @@ -0,0 +1,64 @@ +import { Modal as MantineModal, Button, Box } from '@mantine/core'; +import { ReactNode } from 'react'; + +const TITLEBAR_HEIGHT = '2.5rem'; + +const MODAL_STYLES_WITH_TITLEBAR = { + overlay: { + top: TITLEBAR_HEIGHT, + }, + content: { + marginTop: TITLEBAR_HEIGHT, + }, +} as const; + +export interface ModalProps { + opened: boolean; + onClose: () => void; + title: ReactNode; + children: ReactNode; + size?: string | number; + closeOnClickOutside?: boolean; + closeOnEscape?: boolean; + showCloseButton?: boolean; +} + +export const Modal = ({ + opened, + onClose, + title, + children, + size, + closeOnClickOutside = false, + closeOnEscape = true, + showCloseButton = false, + ...props +}: ModalProps) => ( + + {children} + {showCloseButton && ( + + + + )} + +); diff --git a/src/components/screens/Launch/CommandLineArgumentsModal.tsx b/src/components/screens/Launch/CommandLineArgumentsModal.tsx index 5509cc1..0cc109a 100644 --- a/src/components/screens/Launch/CommandLineArgumentsModal.tsx +++ b/src/components/screens/Launch/CommandLineArgumentsModal.tsx @@ -1,6 +1,4 @@ -import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; import { - Modal, Text, Stack, Group, @@ -9,9 +7,9 @@ import { Code, TextInput, Button, - Box, } from '@mantine/core'; import { useState } from 'react'; +import { Modal } from '@/components/Modal'; interface CommandLineArgumentsModalProps { opened: boolean; @@ -555,8 +553,7 @@ export const CommandLineArgumentsModal = ({ onClose={onClose} title="Available Command Line Arguments" size="xl" - centered - styles={MODAL_STYLES_WITH_TITLEBAR} + showCloseButton > @@ -659,20 +656,6 @@ export const CommandLineArgumentsModal = ({ ))} - - - - ); diff --git a/src/components/screens/Launch/ConfigFileManager.tsx b/src/components/screens/Launch/ConfigFileManager.tsx index 67ba559..0791f35 100644 --- a/src/components/screens/Launch/ConfigFileManager.tsx +++ b/src/components/screens/Launch/ConfigFileManager.tsx @@ -1,8 +1,9 @@ -import { Stack, Text, Group, Button, Select } from '@mantine/core'; +import { Stack, Text, Group, Button, Select, Tooltip } from '@mantine/core'; import { useState, useCallback } from 'react'; -import { Save, File, Plus, Check } from 'lucide-react'; +import { Save, File, Plus, Check, Trash2 } from 'lucide-react'; import type { ConfigFile } from '@/types'; import { CreateConfigModal } from './CreateConfigModal'; +import { DeleteConfigModal } from './DeleteConfigModal'; interface ConfigFileManagerProps { configFiles: ConfigFile[]; @@ -10,6 +11,7 @@ interface ConfigFileManagerProps { onFileSelection: (fileName: string) => Promise; onCreateNewConfig: (configName: string) => Promise; onSaveConfig: () => Promise; + onDeleteConfig: (fileName: string) => Promise; onLoadConfigFiles: () => Promise; } @@ -19,9 +21,12 @@ export const ConfigFileManager = ({ onFileSelection, onCreateNewConfig, onSaveConfig, + onDeleteConfig, }: ConfigFileManagerProps) => { const [configModalOpened, setConfigModalOpened] = useState(false); const [saveSuccess, setSaveSuccess] = useState(false); + const [deleteModalOpened, setDeleteModalOpened] = useState(false); + const [configToDelete, setConfigToDelete] = useState(null); const existingConfigNames = configFiles.map((file) => { const extension = file.name.split('.').pop() || ''; @@ -36,6 +41,28 @@ export const ConfigFileManager = ({ setConfigModalOpened(false); }, []); + const handleDeleteClick = () => { + if (selectedFile) { + setConfigToDelete(selectedFile); + setDeleteModalOpened(true); + } + }; + + const handleDeleteConfirm = async () => { + if (configToDelete) { + const success = await onDeleteConfig(configToDelete); + if (success) { + setConfigToDelete(null); + setDeleteModalOpened(false); + } + } + }; + + const handleDeleteCancel = () => { + setConfigToDelete(null); + setDeleteModalOpened(false); + }; + const handleSaveClick = async () => { if (selectedFile) { const success = await onSaveConfig(); @@ -103,6 +130,19 @@ export const ConfigFileManager = ({ > {saveSuccess ? 'Saved!' : 'Save'} + + + + @@ -112,6 +152,13 @@ export const ConfigFileManager = ({ onCreateConfig={onCreateNewConfig} existingConfigNames={existingConfigNames} /> + + ); }; diff --git a/src/components/screens/Launch/CreateConfigModal.tsx b/src/components/screens/Launch/CreateConfigModal.tsx index 2960df6..db09557 100644 --- a/src/components/screens/Launch/CreateConfigModal.tsx +++ b/src/components/screens/Launch/CreateConfigModal.tsx @@ -1,5 +1,5 @@ -import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; -import { Modal, TextInput, Group, Button, Stack } from '@mantine/core'; +import { TextInput, Group, Button, Stack } from '@mantine/core'; +import { Modal } from '@/components/Modal'; import { useState, useEffect } from 'react'; interface CreateConfigModalProps { @@ -46,7 +46,6 @@ export const CreateConfigModal = ({ onClose={handleClose} title="Create New Configuration" size="sm" - styles={MODAL_STYLES_WITH_TITLEBAR} > void; + onConfirm: () => Promise; + configName: string | null; +} + +export const DeleteConfigModal = ({ + opened, + onClose, + onConfirm, + configName, +}: DeleteConfigModalProps) => { + const displayName = configName?.replace(/\.[^/.]+$/, '') || ''; + + return ( + + + + Are you sure you want to delete “{displayName}”? This + action cannot be undone. + + + + + + + + + ); +}; diff --git a/src/components/screens/Launch/index.tsx b/src/components/screens/Launch/index.tsx index 85e7ef9..4f5eec4 100644 --- a/src/components/screens/Launch/index.tsx +++ b/src/components/screens/Launch/index.tsx @@ -223,6 +223,32 @@ export const LaunchScreen = ({ onLaunch }: LaunchScreenProps) => { return true; }; + const handleDeleteConfig = async (fileName: string) => { + const deleteSuccess = + await window.electronAPI.kobold.deleteConfigFile(fileName); + + if (deleteSuccess) { + await loadConfigFiles(); + + const updatedFiles = await window.electronAPI.kobold.getConfigFiles(); + if (updatedFiles.length > 0) { + const firstConfig = updatedFiles[0].name; + setSelectedFile(firstConfig); + await window.electronAPI.kobold.setSelectedConfig(firstConfig); + + const selectedConfig = updatedFiles.find((f) => f.name === firstConfig); + if (selectedConfig) { + await parseAndApplyConfigFile(selectedConfig.path); + } + } else { + setSelectedFile(null); + await window.electronAPI.kobold.setSelectedConfig(''); + } + } + + return deleteSuccess; + }; + useEffect(() => { void loadConfigFiles(); @@ -290,6 +316,7 @@ export const LaunchScreen = ({ onLaunch }: LaunchScreenProps) => { onFileSelection={handleFileSelection} onCreateNewConfig={handleCreateNewConfig} onSaveConfig={handleSaveConfig} + onDeleteConfig={handleDeleteConfig} onLoadConfigFiles={loadConfigFiles} /> diff --git a/src/components/settings/SettingsModal.tsx b/src/components/settings/SettingsModal.tsx index 98037b0..8a23cad 100644 --- a/src/components/settings/SettingsModal.tsx +++ b/src/components/settings/SettingsModal.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { Modal, Tabs, Text, Group, rem, Button, Box } from '@mantine/core'; +import { Tabs, Text, Group, rem } from '@mantine/core'; import { Settings, Palette, @@ -12,7 +12,7 @@ import { VersionsTab } from '@/components/settings/VersionsTab'; import { AppearanceTab } from '@/components/settings/AppearanceTab'; import { AboutTab } from '@/components/settings/AboutTab'; import type { Screen } from '@/types'; -import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; +import { Modal } from '@/components/Modal'; interface SettingsModalProps { opened: boolean; @@ -67,111 +67,95 @@ export const SettingsModal = ({ } size="xl" - centered - lockScroll={false} - styles={{ - ...MODAL_STYLES_WITH_TITLEBAR, - content: { - paddingBottom: 0, - }, - body: { + showCloseButton + > +
- value && setActiveTab(value)} - orientation="vertical" - variant="pills" - styles={{ - root: { - flex: 1, - minHeight: 0, - }, - panel: { - height: '100%', - overflow: 'auto', - paddingLeft: '1.5rem', - paddingRight: '1.5rem', - }, - tabLabel: { - textAlign: 'left', - justifyContent: 'flex-start', - }, }} > - - - } - > - General - - {showVersionsTab && ( + value && setActiveTab(value)} + orientation="vertical" + variant="pills" + styles={{ + root: { + flex: 1, + minHeight: 0, + }, + panel: { + height: '100%', + overflow: 'auto', + paddingLeft: '1.5rem', + paddingRight: '1.5rem', + }, + tabLabel: { + textAlign: 'left', + justifyContent: 'flex-start', + }, + }} + > + + } > - Versions + General - )} - - } - > - Appearance - - } - > - About - - + {showVersionsTab && ( + + } + > + Versions + + )} + + } + > + Appearance + + } + > + About + + - - - - - {showVersionsTab && ( - - + + - )} - - - + {showVersionsTab && ( + + + + )} - - - - + + + - - - + + + + +
); }; diff --git a/src/constants/index.ts b/src/constants/index.ts index f4904e0..7d5595c 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -6,15 +6,6 @@ export const TITLEBAR_HEIGHT = '2.5rem'; export const STATUSBAR_HEIGHT = '1.5rem'; -export const MODAL_STYLES_WITH_TITLEBAR = { - overlay: { - top: TITLEBAR_HEIGHT, - }, - content: { - marginTop: TITLEBAR_HEIGHT, - }, -} as const; - export const SERVER_READY_SIGNALS = { KOBOLDCPP: 'Please connect to custom endpoint at', SILLYTAVERN: 'SillyTavern is listening on', diff --git a/src/hooks/useKoboldVersions.ts b/src/hooks/useKoboldVersions.ts index 6a997e2..d982e5b 100644 --- a/src/hooks/useKoboldVersions.ts +++ b/src/hooks/useKoboldVersions.ts @@ -47,9 +47,7 @@ const saveToCache = (releases: DownloadItem[]) => { timestamp: Date.now(), }; localStorage.setItem(CACHE_KEY, JSON.stringify(data)); - } catch { - void 0; - } + } catch {} }; const transformReleaseToDownloadItems = ( diff --git a/src/hooks/useLogoClickSounds.ts b/src/hooks/useLogoClickSounds.ts index 40fd7b8..6f8974e 100644 --- a/src/hooks/useLogoClickSounds.ts +++ b/src/hooks/useLogoClickSounds.ts @@ -29,9 +29,7 @@ export const useLogoClickSounds = () => { setIsMouseSqueaking(false); }, 300); } - } catch { - void 0; - } + } catch {} }; const getLogoStyles = () => ({ diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 6b43501..8480c58 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -10,6 +10,7 @@ import { getCurrentVersion, getConfigFiles, saveConfigFile, + deleteConfigFile, setCurrentVersion, selectInstallDirectory, stopKoboldCpp, @@ -107,6 +108,10 @@ export function setupIPCHandlers() { saveConfigFile(configName, configData) ); + ipcMain.handle('kobold:deleteConfigFile', async (_, configName) => + deleteConfigFile(configName) + ); + ipcMain.handle('kobold:getSelectedConfig', () => getSelectedConfig()); ipcMain.handle('kobold:setSelectedConfig', (_, configName) => diff --git a/src/main/modules/dependencies.ts b/src/main/modules/dependencies.ts index 59ce54f..a2f3f00 100644 --- a/src/main/modules/dependencies.ts +++ b/src/main/modules/dependencies.ts @@ -62,9 +62,7 @@ export async function getUvEnvironment() { try { await access(path); existingPaths.push(path); - } catch { - void 0; - } + } catch {} } if (existingPaths.length > 0) { diff --git a/src/main/modules/koboldcpp.ts b/src/main/modules/koboldcpp.ts index b3dd337..97d93c6 100644 --- a/src/main/modules/koboldcpp.ts +++ b/src/main/modules/koboldcpp.ts @@ -428,6 +428,18 @@ export async function saveConfigFile( } } +export async function deleteConfigFile(configFileName: string) { + try { + const installDir = getInstallDir(); + const configPath = join(installDir, configFileName); + await unlink(configPath); + return true; + } catch (error) { + logError('Error deleting config file:', error as Error); + return false; + } +} + export async function selectModelFile(title = 'Select Model File') { try { const mainWindow = getMainWindow(); diff --git a/src/main/modules/monitoring.ts b/src/main/modules/monitoring.ts index 13292fb..1e5761c 100644 --- a/src/main/modules/monitoring.ts +++ b/src/main/modules/monitoring.ts @@ -6,6 +6,7 @@ import { tryExecute } from '@/utils/node/logger'; export interface CpuMetrics { usage: number; + temperature?: number; } export interface MemoryMetrics { @@ -21,6 +22,7 @@ export interface GpuMetrics { memoryUsed: number; memoryTotal: number; memoryUsage: number; + temperature?: number; }[]; } @@ -96,6 +98,16 @@ async function collectAndSendCpuMetrics() { usage: Math.round(cpuData.currentLoad), }; + if (platform === 'linux') { + try { + const tempData = await si.cpuTemperature(); + metrics.temperature = + tempData.main && tempData.main > 0 + ? Math.round(tempData.main) + : undefined; + } catch {} + } + if (mainWindow && !mainWindow.isDestroyed()) { mainWindow.webContents.send('cpu-metrics', metrics); } @@ -132,6 +144,7 @@ async function collectAndSendGpuMetrics() { gpuInfo.memoryTotal > 0 ? Math.round((gpuInfo.memoryUsed / gpuInfo.memoryTotal) * 100) : 0, + temperature: gpuInfo.temperature, })), }; diff --git a/src/preload/index.ts b/src/preload/index.ts index 925b6ed..77f474b 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -38,6 +38,8 @@ const koboldAPI: KoboldAPI = { getConfigFiles: () => ipcRenderer.invoke('kobold:getConfigFiles'), saveConfigFile: (configName, configData) => ipcRenderer.invoke('kobold:saveConfigFile', configName, configData), + deleteConfigFile: (configName) => + ipcRenderer.invoke('kobold:deleteConfigFile', configName), getSelectedConfig: () => ipcRenderer.invoke('kobold:getSelectedConfig'), setSelectedConfig: (configName) => ipcRenderer.invoke('kobold:setSelectedConfig', configName), diff --git a/src/styles/index.css b/src/styles/index.css index f562b5d..dcf1ca4 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -3,7 +3,9 @@ @import '@fontsource/inter/latin-500.css'; @import '@fontsource/inter/latin-600.css'; -:root { +:root, +.mantine-Modal-root, +.mantine-Portal { --mantine-color-body: #fafafa; --mantine-color-white: #fafafa; @@ -15,7 +17,9 @@ --mantine-color-default-border: #e5e7eb; } -[data-mantine-color-scheme='dark'] { +[data-mantine-color-scheme='dark'], +[data-mantine-color-scheme='dark'] .mantine-Modal-root, +[data-mantine-color-scheme='dark'] .mantine-Portal { --mantine-color-body: #0f0f0f; --mantine-color-dark-7: #1a1a1a; --mantine-color-dark-6: #2d2d2d; @@ -130,3 +134,11 @@ .mantine-Tooltip-arrow { background-color: var(--mantine-color-dark-6) !important; } + +[data-mantine-color-scheme='dark'] .mantine-Modal-content { + background-color: var(--mantine-color-dark-7) !important; +} + +[data-mantine-color-scheme='dark'] .mantine-Modal-header { + background-color: var(--mantine-color-dark-7) !important; +} diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index 65abf11..2a1422a 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -124,6 +124,7 @@ export interface KoboldAPI { configName: string, configData: KoboldConfig ) => Promise; + deleteConfigFile: (configName: string) => Promise; getSelectedConfig: () => Promise; setSelectedConfig: (configName: string) => Promise; parseConfigFile: (filePath: string) => Promise; diff --git a/src/utils/node/gpu.ts b/src/utils/node/gpu.ts index d854845..031e548 100644 --- a/src/utils/node/gpu.ts +++ b/src/utils/node/gpu.ts @@ -6,6 +6,7 @@ interface CachedGPUInfo { deviceName: string; devicePath: string; memoryTotal: number; + hwmonPath?: string; } interface GPUData { @@ -13,6 +14,7 @@ interface GPUData { usage: number; memoryUsed: number; memoryTotal: number; + temperature?: number; } let linuxGpuCache: CachedGPUInfo[] | null = null; @@ -36,6 +38,7 @@ async function initializeLinuxGPUCache() { return linuxCachePromise; } + // eslint-disable-next-line sonarjs/cognitive-complexity linuxCachePromise = (async () => { try { const drmPath = '/sys/class/drm'; @@ -80,14 +83,9 @@ async function initializeLinuxGPUCache() { } else { deviceName = `GPU (${vendorId}:${deviceId})`; } - } catch { - void 0; - } + } catch {} } - } catch { - void 0; - } - + } catch {} try { const memTotalData = await readFile( `${devicePath}/mem_info_vram_total`, @@ -99,10 +97,22 @@ async function initializeLinuxGPUCache() { ); if (memoryTotal > 0) { + let hwmonPath: string | undefined; + try { + const hwmonEntries = await readdir(`${devicePath}/hwmon`); + const hwmonEntry = hwmonEntries.find((e) => + e.startsWith('hwmon') + ); + if (hwmonEntry) { + hwmonPath = `${devicePath}/hwmon/${hwmonEntry}`; + } + } catch {} + gpus.push({ deviceName, devicePath, memoryTotal, + hwmonPath, }); } } catch { @@ -145,11 +155,23 @@ async function getLinuxGPUData() { (parseInt(memUsedData.trim(), 10) || 0) / (1024 * 1024 * 1024) ); + let temperature: number | undefined; + if (cachedGPU.hwmonPath) { + try { + const tempData = await readFile( + `${cachedGPU.hwmonPath}/temp1_input`, + 'utf8' + ); + temperature = Math.round(parseInt(tempData.trim(), 10) / 1000); + } catch {} + } + gpus.push({ deviceName: cachedGPU.deviceName, usage, memoryUsed: parseFloat(memoryUsed.toFixed(2)), memoryTotal: parseFloat(cachedGPU.memoryTotal.toFixed(2)), + temperature, }); } catch { continue; diff --git a/src/utils/sounds.ts b/src/utils/sounds.ts index 89e5ff8..bfb108c 100644 --- a/src/utils/sounds.ts +++ b/src/utils/sounds.ts @@ -36,18 +36,14 @@ export const initializeAudio = async () => { audio.pause(); audio.currentTime = 0; audio.volume = 0.5; - } catch { - void 0; - } + } catch {} audioCache.set(soundUrl, audio); }); await Promise.allSettled(initPromises); audioInitialized = true; - } catch { - void 0; - } + } catch {} }; export const playSound = async (soundUrl: string, volume = 0.5) => { @@ -65,7 +61,5 @@ export const playSound = async (soundUrl: string, volume = 0.5) => { audio.volume = volume; audio.currentTime = 0; await audio.play(); - } catch { - void 0; - } + } catch {} }; diff --git a/yarn.lock b/yarn.lock index ee2696a..ea0206c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -402,184 +402,184 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/aix-ppc64@npm:0.25.9" +"@esbuild/aix-ppc64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/aix-ppc64@npm:0.25.10" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-arm64@npm:0.25.9" +"@esbuild/android-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/android-arm64@npm:0.25.10" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-arm@npm:0.25.9" +"@esbuild/android-arm@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/android-arm@npm:0.25.10" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-x64@npm:0.25.9" +"@esbuild/android-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/android-x64@npm:0.25.10" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/darwin-arm64@npm:0.25.9" +"@esbuild/darwin-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/darwin-arm64@npm:0.25.10" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/darwin-x64@npm:0.25.9" +"@esbuild/darwin-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/darwin-x64@npm:0.25.10" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/freebsd-arm64@npm:0.25.9" +"@esbuild/freebsd-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/freebsd-arm64@npm:0.25.10" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/freebsd-x64@npm:0.25.9" +"@esbuild/freebsd-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/freebsd-x64@npm:0.25.10" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-arm64@npm:0.25.9" +"@esbuild/linux-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-arm64@npm:0.25.10" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-arm@npm:0.25.9" +"@esbuild/linux-arm@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-arm@npm:0.25.10" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-ia32@npm:0.25.9" +"@esbuild/linux-ia32@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-ia32@npm:0.25.10" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-loong64@npm:0.25.9" +"@esbuild/linux-loong64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-loong64@npm:0.25.10" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-mips64el@npm:0.25.9" +"@esbuild/linux-mips64el@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-mips64el@npm:0.25.10" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-ppc64@npm:0.25.9" +"@esbuild/linux-ppc64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-ppc64@npm:0.25.10" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-riscv64@npm:0.25.9" +"@esbuild/linux-riscv64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-riscv64@npm:0.25.10" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-s390x@npm:0.25.9" +"@esbuild/linux-s390x@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-s390x@npm:0.25.10" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-x64@npm:0.25.9" +"@esbuild/linux-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/linux-x64@npm:0.25.10" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/netbsd-arm64@npm:0.25.9" +"@esbuild/netbsd-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/netbsd-arm64@npm:0.25.10" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/netbsd-x64@npm:0.25.9" +"@esbuild/netbsd-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/netbsd-x64@npm:0.25.10" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/openbsd-arm64@npm:0.25.9" +"@esbuild/openbsd-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/openbsd-arm64@npm:0.25.10" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/openbsd-x64@npm:0.25.9" +"@esbuild/openbsd-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/openbsd-x64@npm:0.25.10" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/openharmony-arm64@npm:0.25.9" +"@esbuild/openharmony-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/openharmony-arm64@npm:0.25.10" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/sunos-x64@npm:0.25.9" +"@esbuild/sunos-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/sunos-x64@npm:0.25.10" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/win32-arm64@npm:0.25.9" +"@esbuild/win32-arm64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/win32-arm64@npm:0.25.10" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/win32-ia32@npm:0.25.9" +"@esbuild/win32-ia32@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/win32-ia32@npm:0.25.10" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/win32-x64@npm:0.25.9" +"@esbuild/win32-x64@npm:0.25.10": + version: 0.25.10 + resolution: "@esbuild/win32-x64@npm:0.25.10" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -646,10 +646,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.35.0, @eslint/js@npm:^9.35.0": - version: 9.35.0 - resolution: "@eslint/js@npm:9.35.0" - checksum: 10c0/d40fe38724bc76c085c0b753cdf937fa35c0d6807ae76b2632e3f5f66c3040c91adcf1aff2ce70b4f45752e60629fadc415eeec9af3be3c274bae1cac54b9840 +"@eslint/js@npm:9.36.0, @eslint/js@npm:^9.36.0": + version: 9.36.0 + resolution: "@eslint/js@npm:9.36.0" + checksum: 10c0/e3f6fb7d6f117d79615574f7bef4f238bcfed6ece0465d28226c3a75d2b6fac9cc189121e8673562796ca8ccea2bf9861715ee5cf4a3dbef87d17811c0dac22c languageName: node linkType: hard @@ -841,12 +841,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": - version: 0.3.30 - resolution: "@jridgewell/trace-mapping@npm:0.3.30" + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3a1516c10f44613b9ba27c37a02ff8f410893776b2b3dad20a391b51b884dd60f97bbb56936d65d2ff8fe978510a0000266654ab8426bdb9ceb5fb4585b19e23 + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 languageName: node linkType: hard @@ -981,149 +981,156 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.1" +"@rollup/rollup-android-arm-eabi@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.52.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-android-arm64@npm:4.50.1" +"@rollup/rollup-android-arm64@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-android-arm64@npm:4.52.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.50.1" +"@rollup/rollup-darwin-arm64@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.52.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.50.1" +"@rollup/rollup-darwin-x64@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.52.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.1" +"@rollup/rollup-freebsd-arm64@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.52.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-freebsd-x64@npm:4.50.1" +"@rollup/rollup-freebsd-x64@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.52.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.52.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.1" +"@rollup/rollup-linux-arm-musleabihf@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.52.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.1" +"@rollup/rollup-linux-arm64-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.52.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.1" +"@rollup/rollup-linux-arm64-musl@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.52.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1" +"@rollup/rollup-linux-loong64-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.52.0" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.1" +"@rollup/rollup-linux-ppc64-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.52.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.1" +"@rollup/rollup-linux-riscv64-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.52.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.1" +"@rollup/rollup-linux-riscv64-musl@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.52.0" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.1" +"@rollup/rollup-linux-s390x-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.52.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.1" +"@rollup/rollup-linux-x64-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.52.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.1" +"@rollup/rollup-linux-x64-musl@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.52.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-openharmony-arm64@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.1" +"@rollup/rollup-openharmony-arm64@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.52.0" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.1" +"@rollup/rollup-win32-arm64-msvc@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.52.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.1" +"@rollup/rollup-win32-ia32-msvc@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.52.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.50.1": - version: 4.50.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.1" +"@rollup/rollup-win32-x64-gnu@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.52.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.52.0": + version: 4.52.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.52.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1297,11 +1304,11 @@ __metadata: linkType: hard "@types/node@npm:^22.7.7": - version: 22.18.1 - resolution: "@types/node@npm:22.18.1" + version: 22.18.6 + resolution: "@types/node@npm:22.18.6" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/1912b0ea6cb9ef59722b0fed64652388e13b41d52569c16198f1278a882837bbf4c8a4ec913e852893356f07c0c44b4e00fbca289ac7222741d03449104e22fe + checksum: 10c0/7ba190da2e64e56c59270661af8cd682c830a1375b6f965ab153be90baabfdaa867aa1d63f87b42de80956996d46dfe1cf93ecefe982d9a16e485b6756949f9a languageName: node linkType: hard @@ -1892,6 +1899,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.3": + version: 2.8.6 + resolution: "baseline-browser-mapping@npm:2.8.6" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10c0/ea628db5048d1e5c0251d4783e0496f5ce8de7a0e20ea29c8876611cb0acf58ffc76bf6561786c6388db22f130646e3ecb91eebc1c03954552a21d38fa38320f + languageName: node + linkType: hard + "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -1939,16 +1955,17 @@ __metadata: linkType: hard "browserslist@npm:^4.24.0": - version: 4.25.4 - resolution: "browserslist@npm:4.25.4" + version: 4.26.2 + resolution: "browserslist@npm:4.26.2" dependencies: - caniuse-lite: "npm:^1.0.30001737" - electron-to-chromium: "npm:^1.5.211" - node-releases: "npm:^2.0.19" + baseline-browser-mapping: "npm:^2.8.3" + caniuse-lite: "npm:^1.0.30001741" + electron-to-chromium: "npm:^1.5.218" + node-releases: "npm:^2.0.21" update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/2b105948990dc2fc0bc2536b4889aadfa15d637e1d857a121611a704cdf539a68f575a391f6bf8b7ff19db36cee1b7834565571f35a7ea691051d2e7fb4f2eb1 + checksum: 10c0/1146339dad33fda77786b11ea07f1c40c48899edd897d73a9114ee0dbb1ee6475bb4abda263a678c104508bdca8e66760ff8e10be1947d3e20d34bae01d8b89b languageName: node linkType: hard @@ -2149,10 +2166,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001737": - version: 1.0.30001741 - resolution: "caniuse-lite@npm:1.0.30001741" - checksum: 10c0/45746f896205a61a8eeb85a32aeca243ebce640cd6eb80d04949d9389a13f4659c737860300d7b988057599f0958c55eeab74ec02ce9ef137feb7d006e75fec1 +"caniuse-lite@npm:^1.0.30001741": + version: 1.0.30001743 + resolution: "caniuse-lite@npm:1.0.30001743" + checksum: 10c0/1bd730ca10d881a1ca9f55ce864d34c3b18501718c03976e0d3419f4694b715159e13fdef6d58ad47b6d2445d315940f3a01266658876828c820a3331aac021d languageName: node linkType: hard @@ -2441,14 +2458,14 @@ __metadata: linkType: hard "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.4.1 - resolution: "debug@npm:4.4.1" + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 languageName: node linkType: hard @@ -2530,9 +2547,9 @@ __metadata: linkType: hard "detect-libc@npm:^2.0.1": - version: 2.0.4 - resolution: "detect-libc@npm:2.0.4" - checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c + version: 2.1.0 + resolution: "detect-libc@npm:2.1.0" + checksum: 10c0/4d0d36c77fdcb1d3221779d8dfc7d5808dd52530d49db67193fb3cd8149e2d499a1eeb87bb830ad7c442294929992c12e971f88ae492965549f8f83e5336eba6 languageName: node linkType: hard @@ -2686,10 +2703,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.211": - version: 1.5.215 - resolution: "electron-to-chromium@npm:1.5.215" - checksum: 10c0/3a45976d1193e57284533096b3bbec218a5d4d85af4f7c133522aae35b14bbf22734f48ccc3f0e43a451441ebc375fa2f4350390fd729dcedb97543692133e39 +"electron-to-chromium@npm:^1.5.218": + version: 1.5.222 + resolution: "electron-to-chromium@npm:1.5.222" + checksum: 10c0/a81eb8d2b171236884faf9b5dd382c66d9250283032cb89a3e555d788bf3956f7f4f6bf7bf30b3daf9e5c945ef837bfcd1be21b3f41cfe186ed2f25da13c9af3 languageName: node linkType: hard @@ -2946,35 +2963,35 @@ __metadata: linkType: hard "esbuild@npm:^0.25.0, esbuild@npm:^0.25.5": - version: 0.25.9 - resolution: "esbuild@npm:0.25.9" + version: 0.25.10 + resolution: "esbuild@npm:0.25.10" dependencies: - "@esbuild/aix-ppc64": "npm:0.25.9" - "@esbuild/android-arm": "npm:0.25.9" - "@esbuild/android-arm64": "npm:0.25.9" - "@esbuild/android-x64": "npm:0.25.9" - "@esbuild/darwin-arm64": "npm:0.25.9" - "@esbuild/darwin-x64": "npm:0.25.9" - "@esbuild/freebsd-arm64": "npm:0.25.9" - "@esbuild/freebsd-x64": "npm:0.25.9" - "@esbuild/linux-arm": "npm:0.25.9" - "@esbuild/linux-arm64": "npm:0.25.9" - "@esbuild/linux-ia32": "npm:0.25.9" - "@esbuild/linux-loong64": "npm:0.25.9" - "@esbuild/linux-mips64el": "npm:0.25.9" - "@esbuild/linux-ppc64": "npm:0.25.9" - "@esbuild/linux-riscv64": "npm:0.25.9" - "@esbuild/linux-s390x": "npm:0.25.9" - "@esbuild/linux-x64": "npm:0.25.9" - "@esbuild/netbsd-arm64": "npm:0.25.9" - "@esbuild/netbsd-x64": "npm:0.25.9" - "@esbuild/openbsd-arm64": "npm:0.25.9" - "@esbuild/openbsd-x64": "npm:0.25.9" - "@esbuild/openharmony-arm64": "npm:0.25.9" - "@esbuild/sunos-x64": "npm:0.25.9" - "@esbuild/win32-arm64": "npm:0.25.9" - "@esbuild/win32-ia32": "npm:0.25.9" - "@esbuild/win32-x64": "npm:0.25.9" + "@esbuild/aix-ppc64": "npm:0.25.10" + "@esbuild/android-arm": "npm:0.25.10" + "@esbuild/android-arm64": "npm:0.25.10" + "@esbuild/android-x64": "npm:0.25.10" + "@esbuild/darwin-arm64": "npm:0.25.10" + "@esbuild/darwin-x64": "npm:0.25.10" + "@esbuild/freebsd-arm64": "npm:0.25.10" + "@esbuild/freebsd-x64": "npm:0.25.10" + "@esbuild/linux-arm": "npm:0.25.10" + "@esbuild/linux-arm64": "npm:0.25.10" + "@esbuild/linux-ia32": "npm:0.25.10" + "@esbuild/linux-loong64": "npm:0.25.10" + "@esbuild/linux-mips64el": "npm:0.25.10" + "@esbuild/linux-ppc64": "npm:0.25.10" + "@esbuild/linux-riscv64": "npm:0.25.10" + "@esbuild/linux-s390x": "npm:0.25.10" + "@esbuild/linux-x64": "npm:0.25.10" + "@esbuild/netbsd-arm64": "npm:0.25.10" + "@esbuild/netbsd-x64": "npm:0.25.10" + "@esbuild/openbsd-arm64": "npm:0.25.10" + "@esbuild/openbsd-x64": "npm:0.25.10" + "@esbuild/openharmony-arm64": "npm:0.25.10" + "@esbuild/sunos-x64": "npm:0.25.10" + "@esbuild/win32-arm64": "npm:0.25.10" + "@esbuild/win32-ia32": "npm:0.25.10" + "@esbuild/win32-x64": "npm:0.25.10" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -3030,7 +3047,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/aaa1284c75fcf45c82f9a1a117fe8dc5c45628e3386bda7d64916ae27730910b51c5aec7dd45a6ba19256be30ba2935e64a8f011a3f0539833071e06bf76d5b3 + checksum: 10c0/8ee5fdd43ed0d4092ce7f41577c63147f54049d5617763f0549c638bbe939e8adaa8f1a2728adb63417eb11df51956b7b0d8eb88ee08c27ad1d42960256158fa languageName: node linkType: hard @@ -3199,9 +3216,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.35.0": - version: 9.35.0 - resolution: "eslint@npm:9.35.0" +"eslint@npm:^9.36.0": + version: 9.36.0 + resolution: "eslint@npm:9.36.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.1" @@ -3209,7 +3226,7 @@ __metadata: "@eslint/config-helpers": "npm:^0.3.1" "@eslint/core": "npm:^0.15.2" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.35.0" + "@eslint/js": "npm:9.36.0" "@eslint/plugin-kit": "npm:^0.3.5" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -3245,7 +3262,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/798c527520ccf62106f8cd210bd1db1f8eb1b0e7a56feb0a8b322bf3a1e6a0bc6dc3a414542c22b1b393d58d5e3cd0252c44c023049de9067b836450503a2f03 + checksum: 10c0/0e2705a94847813b03f2f3c1367c0708319cbb66458250a09b2d056a088c56e079a1c1d76c44feebf51971d9ce64d010373b2a4f007cd1026fc24f95c89836df languageName: node linkType: hard @@ -3547,13 +3564,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.1": - version: 11.3.1 - resolution: "fs-extra@npm:11.3.1" + version: 11.3.2 + resolution: "fs-extra@npm:11.3.2" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10c0/61e5b7285b1ca72c68dfe1058b2514294a922683afac2a80aa90540f9bd85370763d675e3b408ef500077d355956fece3bd24b546790e261c3d3015967e2b2d9 + checksum: 10c0/f5d629e1bb646d5dedb4d8b24c5aad3deb8cc1d5438979d6f237146cd10e113b49a949ae1b54212c2fbc98e2d0995f38009a9a1d0520f0287943335e65fe919b languageName: node linkType: hard @@ -3670,7 +3687,7 @@ __metadata: version: 0.0.0-use.local resolution: "gerbil@workspace:." dependencies: - "@eslint/js": "npm:^9.35.0" + "@eslint/js": "npm:^9.36.0" "@fontsource/inter": "npm:^5.2.8" "@mantine/core": "npm:^8.3.1" "@mantine/hooks": "npm:^8.3.1" @@ -3687,7 +3704,7 @@ __metadata: electron-builder: "npm:^26.0.12" electron-updater: "npm:6.6.2" electron-vite: "npm:^4.0.0" - eslint: "npm:^9.35.0" + eslint: "npm:^9.36.0" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-no-comments: "npm:^1.1.10" eslint-plugin-promise: "npm:^7.2.1" @@ -4182,9 +4199,9 @@ __metadata: linkType: hard "is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 + version: 0.3.4 + resolution: "is-arrayish@npm:0.3.4" + checksum: 10c0/1fa672a2f0bedb74154440310f616c0b6e53a95cf0625522ae050f06626d1cabd1a3d8085c882dc45c61ad0e7df2529aff122810b3b4a552880bf170d6df94e0 languageName: node linkType: hard @@ -5239,10 +5256,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.20 - resolution: "node-releases@npm:2.0.20" - checksum: 10c0/24c5b1f5aa16d042c47a651ca2e022ca27320f95e4d2b76b9e543cc470eadd01032646383212ec373f1a3dd15cccce83d77c318ee99585366dbd25db4366abd8 +"node-releases@npm:^2.0.21": + version: 2.0.21 + resolution: "node-releases@npm:2.0.21" + checksum: 10c0/0eb94916eeebbda9d51da6a9ea47428a12b2bb0dd94930c949632b0c859356abf53b2e5a2792021f96c5fda4f791a8e195f2375b78ae7dba8d8bc3141baa1469 languageName: node linkType: hard @@ -5644,11 +5661,11 @@ __metadata: linkType: hard "pretty-ms@npm:^9.2.0": - version: 9.2.0 - resolution: "pretty-ms@npm:9.2.0" + version: 9.3.0 + resolution: "pretty-ms@npm:9.3.0" dependencies: parse-ms: "npm:^4.0.0" - checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb + checksum: 10c0/555ea39a1de48a30601938aedb76d682871d33b6dee015281c37108921514b11e1792928b1648c2e5589acc73c8ef0fb5e585fb4c718e340a28b86799e90fb34 languageName: node linkType: hard @@ -6090,30 +6107,31 @@ __metadata: linkType: hard "rollup@npm:^4.43.0": - version: 4.50.1 - resolution: "rollup@npm:4.50.1" + version: 4.52.0 + resolution: "rollup@npm:4.52.0" dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.50.1" - "@rollup/rollup-android-arm64": "npm:4.50.1" - "@rollup/rollup-darwin-arm64": "npm:4.50.1" - "@rollup/rollup-darwin-x64": "npm:4.50.1" - "@rollup/rollup-freebsd-arm64": "npm:4.50.1" - "@rollup/rollup-freebsd-x64": "npm:4.50.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.50.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.50.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.50.1" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.50.1" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.50.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.50.1" - "@rollup/rollup-linux-riscv64-musl": "npm:4.50.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.50.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.50.1" - "@rollup/rollup-linux-x64-musl": "npm:4.50.1" - "@rollup/rollup-openharmony-arm64": "npm:4.50.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.50.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.50.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.50.1" + "@rollup/rollup-android-arm-eabi": "npm:4.52.0" + "@rollup/rollup-android-arm64": "npm:4.52.0" + "@rollup/rollup-darwin-arm64": "npm:4.52.0" + "@rollup/rollup-darwin-x64": "npm:4.52.0" + "@rollup/rollup-freebsd-arm64": "npm:4.52.0" + "@rollup/rollup-freebsd-x64": "npm:4.52.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.52.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.52.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.52.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.52.0" + "@rollup/rollup-linux-loong64-gnu": "npm:4.52.0" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.52.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.52.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.52.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.52.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.52.0" + "@rollup/rollup-linux-x64-musl": "npm:4.52.0" + "@rollup/rollup-openharmony-arm64": "npm:4.52.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.52.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.52.0" + "@rollup/rollup-win32-x64-gnu": "npm:4.52.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.52.0" "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -6137,7 +6155,7 @@ __metadata: optional: true "@rollup/rollup-linux-arm64-musl": optional: true - "@rollup/rollup-linux-loongarch64-gnu": + "@rollup/rollup-linux-loong64-gnu": optional: true "@rollup/rollup-linux-ppc64-gnu": optional: true @@ -6157,13 +6175,15 @@ __metadata: optional: true "@rollup/rollup-win32-ia32-msvc": optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true "@rollup/rollup-win32-x64-msvc": optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/2029282826d5fb4e308be261b2c28329a4d2bd34304cc3960da69fd21d5acccd0267d6770b1656ffc8f166203ef7e865b4583d5f842a519c8ef059ac71854205 + checksum: 10c0/05b33f5143cfeb2c64df6bfa13a971c3d94081828f763e22b4154ed1452091abe648418d9a45abc8d5656a9a979f5b12e9cd5b390f247c3af4640ad8ed333523 languageName: node linkType: hard @@ -6424,11 +6444,11 @@ __metadata: linkType: hard "simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" + version: 0.2.4 + resolution: "simple-swizzle@npm:0.2.4" dependencies: is-arrayish: "npm:^0.3.1" - checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 + checksum: 10c0/846c3fdd1325318d5c71295cfbb99bfc9edc4c8dffdda5e6e9efe30482bbcd32cf360fc2806f46ac43ff7d09bcfaff20337bb79f826f0e6a8e366efd3cdd7868 languageName: node linkType: hard