better modals, new button to allow deleting configs, CPU/GPU temp metrics on hover

This commit is contained in:
Egor 2025-09-19 22:53:55 -07:00
parent 02ce36b8ec
commit 4cc4358eb0
26 changed files with 627 additions and 426 deletions

View file

@ -170,6 +170,8 @@ const config = [
'sonarjs/cognitive-complexity': ['warn', 25], 'sonarjs/cognitive-complexity': ['warn', 25],
'no-empty': ['error', { allowEmptyCatch: true }],
'promise/prefer-await-to-then': 'error', 'promise/prefer-await-to-then': 'error',
'promise/prefer-await-to-callbacks': 'off', 'promise/prefer-await-to-callbacks': 'off',
'promise/no-nesting': 'error', 'promise/no-nesting': 'error',

View file

@ -1,7 +1,7 @@
{ {
"name": "gerbil", "name": "gerbil",
"productName": "Gerbil", "productName": "Gerbil",
"version": "1.4.0", "version": "1.4.1",
"description": "Run Large Language Models locally", "description": "Run Large Language Models locally",
"main": "out/main/index.js", "main": "out/main/index.js",
"homepage": "./", "homepage": "./",
@ -38,7 +38,7 @@
}, },
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.35.0", "@eslint/js": "^9.36.0",
"@types/node": "^24.5.2", "@types/node": "^24.5.2",
"@types/react": "^19.1.13", "@types/react": "^19.1.13",
"@types/react-dom": "^19.1.9", "@types/react-dom": "^19.1.9",
@ -49,7 +49,7 @@
"electron": "^38.1.2", "electron": "^38.1.2",
"electron-builder": "^26.0.12", "electron-builder": "^26.0.12",
"electron-vite": "^4.0.0", "electron-vite": "^4.0.0",
"eslint": "^9.35.0", "eslint": "^9.36.0",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-no-comments": "^1.1.10", "eslint-plugin-no-comments": "^1.1.10",
"eslint-plugin-promise": "^7.2.1", "eslint-plugin-promise": "^7.2.1",

View file

@ -1,6 +1,6 @@
import { useState } from 'react'; import { useState } from 'react';
import { Modal, Text, Group, Button, Checkbox, Stack } from '@mantine/core'; import { Text, Group, Button, Checkbox, Stack } from '@mantine/core';
import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; import { Modal } from '@/components/Modal';
interface EjectConfirmModalProps { interface EjectConfirmModalProps {
opened: boolean; opened: boolean;
@ -30,10 +30,6 @@ export const EjectConfirmModal = ({
opened={opened} opened={opened}
onClose={handleClose} onClose={handleClose}
title="Are you sure you want to eject?" title="Are you sure you want to eject?"
centered
closeOnClickOutside={false}
closeOnEscape={false}
styles={MODAL_STYLES_WITH_TITLEBAR}
> >
<Stack gap="md"> <Stack gap="md">
<Text size="sm" c="dimmed"> <Text size="sm" c="dimmed">

View file

@ -1,5 +1,4 @@
import { Badge, Tooltip } from '@mantine/core'; import { Button, Tooltip } from '@mantine/core';
import { useState } from 'react';
interface PerformanceBadgeProps { interface PerformanceBadgeProps {
label: string; label: string;
@ -12,8 +11,6 @@ export const PerformanceBadge = ({
value, value,
tooltipLabel, tooltipLabel,
}: PerformanceBadgeProps) => { }: PerformanceBadgeProps) => {
const [isHovered, setIsHovered] = useState(false);
const handlePerformanceClick = async () => { const handlePerformanceClick = async () => {
const result = await window.electronAPI.app.openPerformanceManager(); const result = await window.electronAPI.app.openPerformanceManager();
@ -26,22 +23,23 @@ export const PerformanceBadge = ({
return ( return (
<Tooltip label={tooltipLabel} position="top"> <Tooltip label={tooltipLabel} position="top">
<Badge <Button
size="sm" size="xs"
variant="light" variant="light"
style={{ style={{
minWidth: '5rem', minWidth: '5rem',
textAlign: 'center', textAlign: 'center',
cursor: 'pointer', height: 'auto',
transition: 'background-color 0.2s ease', padding: '0.25rem 0.5rem',
backgroundColor: isHovered ? 'rgba(34, 139, 230, 0.2)' : undefined, margin: '0.125rem 0',
borderRadius: '0.75rem',
fontSize: '0.7em',
fontWeight: 500,
}} }}
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
onClick={handlePerformanceClick} onClick={handlePerformanceClick}
> >
{label}: {value} {label}: {value}
</Badge> </Button>
</Tooltip> </Tooltip>
); );
}; };

View file

@ -73,7 +73,7 @@ export const StatusBar = ({ maxDataPoints = 60 }: StatusBarProps) => {
<PerformanceBadge <PerformanceBadge
label="CPU" label="CPU"
value={`${cpuMetrics.usage}%`} value={`${cpuMetrics.usage}%`}
tooltipLabel={`${cpuMetrics.usage}%`} tooltipLabel={`${cpuMetrics.usage}%${cpuMetrics.temperature ? `${cpuMetrics.temperature}°C` : ''}`}
/> />
<PerformanceBadge <PerformanceBadge
@ -89,7 +89,7 @@ export const StatusBar = ({ maxDataPoints = 60 }: StatusBarProps) => {
<PerformanceBadge <PerformanceBadge
label={`GPU${gpuMetrics.gpus.length > 1 ? ` ${index + 1}` : ''}`} label={`GPU${gpuMetrics.gpus.length > 1 ? ` ${index + 1}` : ''}`}
value={`${gpu.usage}%`} value={`${gpu.usage}%`}
tooltipLabel={`${gpu.usage}%`} tooltipLabel={`${gpu.usage}%${gpu.temperature ? `${gpu.temperature}°C` : ''}`}
/> />
<PerformanceBadge <PerformanceBadge

View file

@ -1,5 +1,4 @@
import { import {
Modal,
Stack, Stack,
Text, Text,
Group, Group,
@ -15,8 +14,9 @@ import type { DownloadItem } from '@/types/electron';
import type { BinaryUpdateInfo } from '@/hooks/useUpdateChecker'; import type { BinaryUpdateInfo } from '@/hooks/useUpdateChecker';
import { useKoboldVersions } from '@/hooks/useKoboldVersions'; import { useKoboldVersions } from '@/hooks/useKoboldVersions';
import { getDisplayNameFromPath } from '@/utils/version'; import { getDisplayNameFromPath } from '@/utils/version';
import { GITHUB_API, MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; import { GITHUB_API } from '@/constants';
import { safeExecute } from '@/utils/logger'; import { safeExecute } from '@/utils/logger';
import { Modal } from '@/components/Modal';
interface UpdateAvailableModalProps { interface UpdateAvailableModalProps {
opened: boolean; opened: boolean;
@ -59,10 +59,7 @@ export const UpdateAvailableModal = ({
onClose={onClose} onClose={onClose}
size="sm" size="sm"
title="A newer version is available" title="A newer version is available"
centered
closeOnClickOutside={false}
closeOnEscape={!isDownloading && !isUpdating} closeOnEscape={!isDownloading && !isUpdating}
styles={MODAL_STYLES_WITH_TITLEBAR}
> >
<Stack gap="md"> <Stack gap="md">
<Card withBorder radius="md" p="md" bd="2px solid orange"> <Card withBorder radius="md" p="md" bd="2px solid orange">

64
src/components/Modal.tsx Normal file
View file

@ -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) => (
<MantineModal
opened={opened}
onClose={onClose}
title={title}
size={size}
centered
closeOnClickOutside={closeOnClickOutside}
closeOnEscape={closeOnEscape}
styles={MODAL_STYLES_WITH_TITLEBAR}
{...props}
>
{children}
{showCloseButton && (
<Box
style={{
padding: '0.5rem 1.5rem 1.5rem',
display: 'flex',
justifyContent: 'flex-end',
flexShrink: 0,
}}
>
<Button onClick={onClose} variant="filled">
Close
</Button>
</Box>
)}
</MantineModal>
);

View file

@ -1,6 +1,4 @@
import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants';
import { import {
Modal,
Text, Text,
Stack, Stack,
Group, Group,
@ -9,9 +7,9 @@ import {
Code, Code,
TextInput, TextInput,
Button, Button,
Box,
} from '@mantine/core'; } from '@mantine/core';
import { useState } from 'react'; import { useState } from 'react';
import { Modal } from '@/components/Modal';
interface CommandLineArgumentsModalProps { interface CommandLineArgumentsModalProps {
opened: boolean; opened: boolean;
@ -555,8 +553,7 @@ export const CommandLineArgumentsModal = ({
onClose={onClose} onClose={onClose}
title="Available Command Line Arguments" title="Available Command Line Arguments"
size="xl" size="xl"
centered showCloseButton
styles={MODAL_STYLES_WITH_TITLEBAR}
> >
<Stack gap="md"> <Stack gap="md">
<Text size="sm" c="dimmed"> <Text size="sm" c="dimmed">
@ -659,20 +656,6 @@ export const CommandLineArgumentsModal = ({
</Accordion.Item> </Accordion.Item>
))} ))}
</Accordion> </Accordion>
<Box
style={{
backgroundColor: 'var(--mantine-color-body)',
padding: '0.5rem 1.5rem 0',
display: 'flex',
justifyContent: 'flex-end',
flexShrink: 0,
}}
>
<Button onClick={onClose} variant="filled">
Close
</Button>
</Box>
</Stack> </Stack>
</Modal> </Modal>
); );

View file

@ -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 { 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 type { ConfigFile } from '@/types';
import { CreateConfigModal } from './CreateConfigModal'; import { CreateConfigModal } from './CreateConfigModal';
import { DeleteConfigModal } from './DeleteConfigModal';
interface ConfigFileManagerProps { interface ConfigFileManagerProps {
configFiles: ConfigFile[]; configFiles: ConfigFile[];
@ -10,6 +11,7 @@ interface ConfigFileManagerProps {
onFileSelection: (fileName: string) => Promise<void>; onFileSelection: (fileName: string) => Promise<void>;
onCreateNewConfig: (configName: string) => Promise<void>; onCreateNewConfig: (configName: string) => Promise<void>;
onSaveConfig: () => Promise<boolean>; onSaveConfig: () => Promise<boolean>;
onDeleteConfig: (fileName: string) => Promise<boolean>;
onLoadConfigFiles: () => Promise<void>; onLoadConfigFiles: () => Promise<void>;
} }
@ -19,9 +21,12 @@ export const ConfigFileManager = ({
onFileSelection, onFileSelection,
onCreateNewConfig, onCreateNewConfig,
onSaveConfig, onSaveConfig,
onDeleteConfig,
}: ConfigFileManagerProps) => { }: ConfigFileManagerProps) => {
const [configModalOpened, setConfigModalOpened] = useState(false); const [configModalOpened, setConfigModalOpened] = useState(false);
const [saveSuccess, setSaveSuccess] = useState(false); const [saveSuccess, setSaveSuccess] = useState(false);
const [deleteModalOpened, setDeleteModalOpened] = useState(false);
const [configToDelete, setConfigToDelete] = useState<string | null>(null);
const existingConfigNames = configFiles.map((file) => { const existingConfigNames = configFiles.map((file) => {
const extension = file.name.split('.').pop() || ''; const extension = file.name.split('.').pop() || '';
@ -36,6 +41,28 @@ export const ConfigFileManager = ({
setConfigModalOpened(false); 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 () => { const handleSaveClick = async () => {
if (selectedFile) { if (selectedFile) {
const success = await onSaveConfig(); const success = await onSaveConfig();
@ -103,6 +130,19 @@ export const ConfigFileManager = ({
> >
{saveSuccess ? 'Saved!' : 'Save'} {saveSuccess ? 'Saved!' : 'Save'}
</Button> </Button>
<Tooltip label="Delete Configuration">
<Button
variant="outline"
size="sm"
onClick={handleDeleteClick}
disabled={!selectedFile}
color="red"
style={{ width: '2.5rem', padding: '0 0.5rem' }}
>
<Trash2 size={16} />
</Button>
</Tooltip>
</Group> </Group>
</Stack> </Stack>
@ -112,6 +152,13 @@ export const ConfigFileManager = ({
onCreateConfig={onCreateNewConfig} onCreateConfig={onCreateNewConfig}
existingConfigNames={existingConfigNames} existingConfigNames={existingConfigNames}
/> />
<DeleteConfigModal
opened={deleteModalOpened}
onClose={handleDeleteCancel}
onConfirm={handleDeleteConfirm}
configName={configToDelete}
/>
</> </>
); );
}; };

View file

@ -1,5 +1,5 @@
import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; import { TextInput, Group, Button, Stack } from '@mantine/core';
import { Modal, TextInput, Group, Button, Stack } from '@mantine/core'; import { Modal } from '@/components/Modal';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
interface CreateConfigModalProps { interface CreateConfigModalProps {
@ -46,7 +46,6 @@ export const CreateConfigModal = ({
onClose={handleClose} onClose={handleClose}
title="Create New Configuration" title="Create New Configuration"
size="sm" size="sm"
styles={MODAL_STYLES_WITH_TITLEBAR}
> >
<Stack gap="md"> <Stack gap="md">
<TextInput <TextInput

View file

@ -0,0 +1,38 @@
import { Text, Group, Button, Stack } from '@mantine/core';
import { Modal } from '@/components/Modal';
interface DeleteConfigModalProps {
opened: boolean;
onClose: () => void;
onConfirm: () => Promise<void>;
configName: string | null;
}
export const DeleteConfigModal = ({
opened,
onClose,
onConfirm,
configName,
}: DeleteConfigModalProps) => {
const displayName = configName?.replace(/\.[^/.]+$/, '') || '';
return (
<Modal opened={opened} onClose={onClose} title="Delete Configuration">
<Stack gap="md">
<Text size="sm" c="dimmed">
Are you sure you want to delete &ldquo;{displayName}&rdquo;? This
action cannot be undone.
</Text>
<Group justify="flex-end" gap="sm">
<Button variant="subtle" onClick={onClose}>
Cancel
</Button>
<Button color="red" onClick={onConfirm}>
Delete
</Button>
</Group>
</Stack>
</Modal>
);
};

View file

@ -223,6 +223,32 @@ export const LaunchScreen = ({ onLaunch }: LaunchScreenProps) => {
return true; 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(() => { useEffect(() => {
void loadConfigFiles(); void loadConfigFiles();
@ -290,6 +316,7 @@ export const LaunchScreen = ({ onLaunch }: LaunchScreenProps) => {
onFileSelection={handleFileSelection} onFileSelection={handleFileSelection}
onCreateNewConfig={handleCreateNewConfig} onCreateNewConfig={handleCreateNewConfig}
onSaveConfig={handleSaveConfig} onSaveConfig={handleSaveConfig}
onDeleteConfig={handleDeleteConfig}
onLoadConfigFiles={loadConfigFiles} onLoadConfigFiles={loadConfigFiles}
/> />

View file

@ -1,5 +1,5 @@
import { useState, useEffect } from 'react'; 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 { import {
Settings, Settings,
Palette, Palette,
@ -12,7 +12,7 @@ import { VersionsTab } from '@/components/settings/VersionsTab';
import { AppearanceTab } from '@/components/settings/AppearanceTab'; import { AppearanceTab } from '@/components/settings/AppearanceTab';
import { AboutTab } from '@/components/settings/AboutTab'; import { AboutTab } from '@/components/settings/AboutTab';
import type { Screen } from '@/types'; import type { Screen } from '@/types';
import { MODAL_STYLES_WITH_TITLEBAR } from '@/constants'; import { Modal } from '@/components/Modal';
interface SettingsModalProps { interface SettingsModalProps {
opened: boolean; opened: boolean;
@ -67,111 +67,95 @@ export const SettingsModal = ({
</Group> </Group>
} }
size="xl" size="xl"
centered showCloseButton
lockScroll={false} >
styles={{ <div
...MODAL_STYLES_WITH_TITLEBAR, style={{
content: {
paddingBottom: 0,
},
body: {
height: '70vh', height: '70vh',
padding: 0, padding: 0,
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
position: 'relative', position: 'relative',
},
}}
>
<Tabs
value={activeTab}
onChange={(value) => 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',
},
}} }}
> >
<Tabs.List> <Tabs
<Tabs.Tab value={activeTab}
value="general" onChange={(value) => value && setActiveTab(value)}
leftSection={ orientation="vertical"
<SlidersHorizontal style={{ width: rem(16), height: rem(16) }} /> variant="pills"
} styles={{
> root: {
General flex: 1,
</Tabs.Tab> minHeight: 0,
{showVersionsTab && ( },
panel: {
height: '100%',
overflow: 'auto',
paddingLeft: '1.5rem',
paddingRight: '1.5rem',
},
tabLabel: {
textAlign: 'left',
justifyContent: 'flex-start',
},
}}
>
<Tabs.List>
<Tabs.Tab <Tabs.Tab
value="versions" value="general"
leftSection={ leftSection={
<GitBranch style={{ width: rem(16), height: rem(16) }} /> <SlidersHorizontal
style={{ width: rem(16), height: rem(16) }}
/>
} }
> >
Versions General
</Tabs.Tab> </Tabs.Tab>
)} {showVersionsTab && (
<Tabs.Tab <Tabs.Tab
value="appearance" value="versions"
leftSection={ leftSection={
<Palette style={{ width: rem(16), height: rem(16) }} /> <GitBranch style={{ width: rem(16), height: rem(16) }} />
} }
> >
Appearance Versions
</Tabs.Tab> </Tabs.Tab>
<Tabs.Tab )}
value="about" <Tabs.Tab
leftSection={<Info style={{ width: rem(16), height: rem(16) }} />} value="appearance"
> leftSection={
About <Palette style={{ width: rem(16), height: rem(16) }} />
</Tabs.Tab> }
</Tabs.List> >
Appearance
</Tabs.Tab>
<Tabs.Tab
value="about"
leftSection={<Info style={{ width: rem(16), height: rem(16) }} />}
>
About
</Tabs.Tab>
</Tabs.List>
<Tabs.Panel value="general"> <Tabs.Panel value="general">
<GeneralTab isOnInterfaceScreen={isOnInterfaceScreen} /> <GeneralTab isOnInterfaceScreen={isOnInterfaceScreen} />
</Tabs.Panel>
{showVersionsTab && (
<Tabs.Panel value="versions">
<VersionsTab />
</Tabs.Panel> </Tabs.Panel>
)}
<Tabs.Panel value="appearance"> {showVersionsTab && (
<AppearanceTab /> <Tabs.Panel value="versions">
</Tabs.Panel> <VersionsTab />
</Tabs.Panel>
)}
<Tabs.Panel value="about"> <Tabs.Panel value="appearance">
<AboutTab /> <AppearanceTab />
</Tabs.Panel> </Tabs.Panel>
</Tabs>
<Box <Tabs.Panel value="about">
style={{ <AboutTab />
backgroundColor: 'var(--mantine-color-body)', </Tabs.Panel>
padding: '0.5rem 1.5rem 1.5rem', </Tabs>
display: 'flex', </div>
justifyContent: 'flex-end',
flexShrink: 0,
}}
>
<Button onClick={onClose} variant="filled">
Close
</Button>
</Box>
</Modal> </Modal>
); );
}; };

View file

@ -6,15 +6,6 @@ export const TITLEBAR_HEIGHT = '2.5rem';
export const STATUSBAR_HEIGHT = '1.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 = { export const SERVER_READY_SIGNALS = {
KOBOLDCPP: 'Please connect to custom endpoint at', KOBOLDCPP: 'Please connect to custom endpoint at',
SILLYTAVERN: 'SillyTavern is listening on', SILLYTAVERN: 'SillyTavern is listening on',

View file

@ -47,9 +47,7 @@ const saveToCache = (releases: DownloadItem[]) => {
timestamp: Date.now(), timestamp: Date.now(),
}; };
localStorage.setItem(CACHE_KEY, JSON.stringify(data)); localStorage.setItem(CACHE_KEY, JSON.stringify(data));
} catch { } catch {}
void 0;
}
}; };
const transformReleaseToDownloadItems = ( const transformReleaseToDownloadItems = (

View file

@ -29,9 +29,7 @@ export const useLogoClickSounds = () => {
setIsMouseSqueaking(false); setIsMouseSqueaking(false);
}, 300); }, 300);
} }
} catch { } catch {}
void 0;
}
}; };
const getLogoStyles = () => ({ const getLogoStyles = () => ({

View file

@ -10,6 +10,7 @@ import {
getCurrentVersion, getCurrentVersion,
getConfigFiles, getConfigFiles,
saveConfigFile, saveConfigFile,
deleteConfigFile,
setCurrentVersion, setCurrentVersion,
selectInstallDirectory, selectInstallDirectory,
stopKoboldCpp, stopKoboldCpp,
@ -107,6 +108,10 @@ export function setupIPCHandlers() {
saveConfigFile(configName, configData) saveConfigFile(configName, configData)
); );
ipcMain.handle('kobold:deleteConfigFile', async (_, configName) =>
deleteConfigFile(configName)
);
ipcMain.handle('kobold:getSelectedConfig', () => getSelectedConfig()); ipcMain.handle('kobold:getSelectedConfig', () => getSelectedConfig());
ipcMain.handle('kobold:setSelectedConfig', (_, configName) => ipcMain.handle('kobold:setSelectedConfig', (_, configName) =>

View file

@ -62,9 +62,7 @@ export async function getUvEnvironment() {
try { try {
await access(path); await access(path);
existingPaths.push(path); existingPaths.push(path);
} catch { } catch {}
void 0;
}
} }
if (existingPaths.length > 0) { if (existingPaths.length > 0) {

View file

@ -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') { export async function selectModelFile(title = 'Select Model File') {
try { try {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();

View file

@ -6,6 +6,7 @@ import { tryExecute } from '@/utils/node/logger';
export interface CpuMetrics { export interface CpuMetrics {
usage: number; usage: number;
temperature?: number;
} }
export interface MemoryMetrics { export interface MemoryMetrics {
@ -21,6 +22,7 @@ export interface GpuMetrics {
memoryUsed: number; memoryUsed: number;
memoryTotal: number; memoryTotal: number;
memoryUsage: number; memoryUsage: number;
temperature?: number;
}[]; }[];
} }
@ -96,6 +98,16 @@ async function collectAndSendCpuMetrics() {
usage: Math.round(cpuData.currentLoad), 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()) { if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.webContents.send('cpu-metrics', metrics); mainWindow.webContents.send('cpu-metrics', metrics);
} }
@ -132,6 +144,7 @@ async function collectAndSendGpuMetrics() {
gpuInfo.memoryTotal > 0 gpuInfo.memoryTotal > 0
? Math.round((gpuInfo.memoryUsed / gpuInfo.memoryTotal) * 100) ? Math.round((gpuInfo.memoryUsed / gpuInfo.memoryTotal) * 100)
: 0, : 0,
temperature: gpuInfo.temperature,
})), })),
}; };

View file

@ -38,6 +38,8 @@ const koboldAPI: KoboldAPI = {
getConfigFiles: () => ipcRenderer.invoke('kobold:getConfigFiles'), getConfigFiles: () => ipcRenderer.invoke('kobold:getConfigFiles'),
saveConfigFile: (configName, configData) => saveConfigFile: (configName, configData) =>
ipcRenderer.invoke('kobold:saveConfigFile', configName, configData), ipcRenderer.invoke('kobold:saveConfigFile', configName, configData),
deleteConfigFile: (configName) =>
ipcRenderer.invoke('kobold:deleteConfigFile', configName),
getSelectedConfig: () => ipcRenderer.invoke('kobold:getSelectedConfig'), getSelectedConfig: () => ipcRenderer.invoke('kobold:getSelectedConfig'),
setSelectedConfig: (configName) => setSelectedConfig: (configName) =>
ipcRenderer.invoke('kobold:setSelectedConfig', configName), ipcRenderer.invoke('kobold:setSelectedConfig', configName),

View file

@ -3,7 +3,9 @@
@import '@fontsource/inter/latin-500.css'; @import '@fontsource/inter/latin-500.css';
@import '@fontsource/inter/latin-600.css'; @import '@fontsource/inter/latin-600.css';
:root { :root,
.mantine-Modal-root,
.mantine-Portal {
--mantine-color-body: #fafafa; --mantine-color-body: #fafafa;
--mantine-color-white: #fafafa; --mantine-color-white: #fafafa;
@ -15,7 +17,9 @@
--mantine-color-default-border: #e5e7eb; --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-body: #0f0f0f;
--mantine-color-dark-7: #1a1a1a; --mantine-color-dark-7: #1a1a1a;
--mantine-color-dark-6: #2d2d2d; --mantine-color-dark-6: #2d2d2d;
@ -130,3 +134,11 @@
.mantine-Tooltip-arrow { .mantine-Tooltip-arrow {
background-color: var(--mantine-color-dark-6) !important; 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;
}

View file

@ -124,6 +124,7 @@ export interface KoboldAPI {
configName: string, configName: string,
configData: KoboldConfig configData: KoboldConfig
) => Promise<boolean>; ) => Promise<boolean>;
deleteConfigFile: (configName: string) => Promise<boolean>;
getSelectedConfig: () => Promise<string | null>; getSelectedConfig: () => Promise<string | null>;
setSelectedConfig: (configName: string) => Promise<boolean>; setSelectedConfig: (configName: string) => Promise<boolean>;
parseConfigFile: (filePath: string) => Promise<KoboldConfig | null>; parseConfigFile: (filePath: string) => Promise<KoboldConfig | null>;

View file

@ -6,6 +6,7 @@ interface CachedGPUInfo {
deviceName: string; deviceName: string;
devicePath: string; devicePath: string;
memoryTotal: number; memoryTotal: number;
hwmonPath?: string;
} }
interface GPUData { interface GPUData {
@ -13,6 +14,7 @@ interface GPUData {
usage: number; usage: number;
memoryUsed: number; memoryUsed: number;
memoryTotal: number; memoryTotal: number;
temperature?: number;
} }
let linuxGpuCache: CachedGPUInfo[] | null = null; let linuxGpuCache: CachedGPUInfo[] | null = null;
@ -36,6 +38,7 @@ async function initializeLinuxGPUCache() {
return linuxCachePromise; return linuxCachePromise;
} }
// eslint-disable-next-line sonarjs/cognitive-complexity
linuxCachePromise = (async () => { linuxCachePromise = (async () => {
try { try {
const drmPath = '/sys/class/drm'; const drmPath = '/sys/class/drm';
@ -80,14 +83,9 @@ async function initializeLinuxGPUCache() {
} else { } else {
deviceName = `GPU (${vendorId}:${deviceId})`; deviceName = `GPU (${vendorId}:${deviceId})`;
} }
} catch { } catch {}
void 0;
}
} }
} catch { } catch {}
void 0;
}
try { try {
const memTotalData = await readFile( const memTotalData = await readFile(
`${devicePath}/mem_info_vram_total`, `${devicePath}/mem_info_vram_total`,
@ -99,10 +97,22 @@ async function initializeLinuxGPUCache() {
); );
if (memoryTotal > 0) { 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({ gpus.push({
deviceName, deviceName,
devicePath, devicePath,
memoryTotal, memoryTotal,
hwmonPath,
}); });
} }
} catch { } catch {
@ -145,11 +155,23 @@ async function getLinuxGPUData() {
(parseInt(memUsedData.trim(), 10) || 0) / (1024 * 1024 * 1024) (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({ gpus.push({
deviceName: cachedGPU.deviceName, deviceName: cachedGPU.deviceName,
usage, usage,
memoryUsed: parseFloat(memoryUsed.toFixed(2)), memoryUsed: parseFloat(memoryUsed.toFixed(2)),
memoryTotal: parseFloat(cachedGPU.memoryTotal.toFixed(2)), memoryTotal: parseFloat(cachedGPU.memoryTotal.toFixed(2)),
temperature,
}); });
} catch { } catch {
continue; continue;

View file

@ -36,18 +36,14 @@ export const initializeAudio = async () => {
audio.pause(); audio.pause();
audio.currentTime = 0; audio.currentTime = 0;
audio.volume = 0.5; audio.volume = 0.5;
} catch { } catch {}
void 0;
}
audioCache.set(soundUrl, audio); audioCache.set(soundUrl, audio);
}); });
await Promise.allSettled(initPromises); await Promise.allSettled(initPromises);
audioInitialized = true; audioInitialized = true;
} catch { } catch {}
void 0;
}
}; };
export const playSound = async (soundUrl: string, volume = 0.5) => { 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.volume = volume;
audio.currentTime = 0; audio.currentTime = 0;
await audio.play(); await audio.play();
} catch { } catch {}
void 0;
}
}; };

516
yarn.lock
View file

@ -402,184 +402,184 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/aix-ppc64@npm:0.25.9": "@esbuild/aix-ppc64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/aix-ppc64@npm:0.25.9" resolution: "@esbuild/aix-ppc64@npm:0.25.10"
conditions: os=aix & cpu=ppc64 conditions: os=aix & cpu=ppc64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm64@npm:0.25.9": "@esbuild/android-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/android-arm64@npm:0.25.9" resolution: "@esbuild/android-arm64@npm:0.25.10"
conditions: os=android & cpu=arm64 conditions: os=android & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm@npm:0.25.9": "@esbuild/android-arm@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/android-arm@npm:0.25.9" resolution: "@esbuild/android-arm@npm:0.25.10"
conditions: os=android & cpu=arm conditions: os=android & cpu=arm
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-x64@npm:0.25.9": "@esbuild/android-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/android-x64@npm:0.25.9" resolution: "@esbuild/android-x64@npm:0.25.10"
conditions: os=android & cpu=x64 conditions: os=android & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-arm64@npm:0.25.9": "@esbuild/darwin-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/darwin-arm64@npm:0.25.9" resolution: "@esbuild/darwin-arm64@npm:0.25.10"
conditions: os=darwin & cpu=arm64 conditions: os=darwin & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-x64@npm:0.25.9": "@esbuild/darwin-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/darwin-x64@npm:0.25.9" resolution: "@esbuild/darwin-x64@npm:0.25.10"
conditions: os=darwin & cpu=x64 conditions: os=darwin & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-arm64@npm:0.25.9": "@esbuild/freebsd-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/freebsd-arm64@npm:0.25.9" resolution: "@esbuild/freebsd-arm64@npm:0.25.10"
conditions: os=freebsd & cpu=arm64 conditions: os=freebsd & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-x64@npm:0.25.9": "@esbuild/freebsd-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/freebsd-x64@npm:0.25.9" resolution: "@esbuild/freebsd-x64@npm:0.25.10"
conditions: os=freebsd & cpu=x64 conditions: os=freebsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm64@npm:0.25.9": "@esbuild/linux-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-arm64@npm:0.25.9" resolution: "@esbuild/linux-arm64@npm:0.25.10"
conditions: os=linux & cpu=arm64 conditions: os=linux & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm@npm:0.25.9": "@esbuild/linux-arm@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-arm@npm:0.25.9" resolution: "@esbuild/linux-arm@npm:0.25.10"
conditions: os=linux & cpu=arm conditions: os=linux & cpu=arm
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ia32@npm:0.25.9": "@esbuild/linux-ia32@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-ia32@npm:0.25.9" resolution: "@esbuild/linux-ia32@npm:0.25.10"
conditions: os=linux & cpu=ia32 conditions: os=linux & cpu=ia32
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-loong64@npm:0.25.9": "@esbuild/linux-loong64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-loong64@npm:0.25.9" resolution: "@esbuild/linux-loong64@npm:0.25.10"
conditions: os=linux & cpu=loong64 conditions: os=linux & cpu=loong64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-mips64el@npm:0.25.9": "@esbuild/linux-mips64el@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-mips64el@npm:0.25.9" resolution: "@esbuild/linux-mips64el@npm:0.25.10"
conditions: os=linux & cpu=mips64el conditions: os=linux & cpu=mips64el
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ppc64@npm:0.25.9": "@esbuild/linux-ppc64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-ppc64@npm:0.25.9" resolution: "@esbuild/linux-ppc64@npm:0.25.10"
conditions: os=linux & cpu=ppc64 conditions: os=linux & cpu=ppc64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-riscv64@npm:0.25.9": "@esbuild/linux-riscv64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-riscv64@npm:0.25.9" resolution: "@esbuild/linux-riscv64@npm:0.25.10"
conditions: os=linux & cpu=riscv64 conditions: os=linux & cpu=riscv64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-s390x@npm:0.25.9": "@esbuild/linux-s390x@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-s390x@npm:0.25.9" resolution: "@esbuild/linux-s390x@npm:0.25.10"
conditions: os=linux & cpu=s390x conditions: os=linux & cpu=s390x
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-x64@npm:0.25.9": "@esbuild/linux-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/linux-x64@npm:0.25.9" resolution: "@esbuild/linux-x64@npm:0.25.10"
conditions: os=linux & cpu=x64 conditions: os=linux & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/netbsd-arm64@npm:0.25.9": "@esbuild/netbsd-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/netbsd-arm64@npm:0.25.9" resolution: "@esbuild/netbsd-arm64@npm:0.25.10"
conditions: os=netbsd & cpu=arm64 conditions: os=netbsd & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/netbsd-x64@npm:0.25.9": "@esbuild/netbsd-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/netbsd-x64@npm:0.25.9" resolution: "@esbuild/netbsd-x64@npm:0.25.10"
conditions: os=netbsd & cpu=x64 conditions: os=netbsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/openbsd-arm64@npm:0.25.9": "@esbuild/openbsd-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/openbsd-arm64@npm:0.25.9" resolution: "@esbuild/openbsd-arm64@npm:0.25.10"
conditions: os=openbsd & cpu=arm64 conditions: os=openbsd & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/openbsd-x64@npm:0.25.9": "@esbuild/openbsd-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/openbsd-x64@npm:0.25.9" resolution: "@esbuild/openbsd-x64@npm:0.25.10"
conditions: os=openbsd & cpu=x64 conditions: os=openbsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/openharmony-arm64@npm:0.25.9": "@esbuild/openharmony-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/openharmony-arm64@npm:0.25.9" resolution: "@esbuild/openharmony-arm64@npm:0.25.10"
conditions: os=openharmony & cpu=arm64 conditions: os=openharmony & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/sunos-x64@npm:0.25.9": "@esbuild/sunos-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/sunos-x64@npm:0.25.9" resolution: "@esbuild/sunos-x64@npm:0.25.10"
conditions: os=sunos & cpu=x64 conditions: os=sunos & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-arm64@npm:0.25.9": "@esbuild/win32-arm64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/win32-arm64@npm:0.25.9" resolution: "@esbuild/win32-arm64@npm:0.25.10"
conditions: os=win32 & cpu=arm64 conditions: os=win32 & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-ia32@npm:0.25.9": "@esbuild/win32-ia32@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/win32-ia32@npm:0.25.9" resolution: "@esbuild/win32-ia32@npm:0.25.10"
conditions: os=win32 & cpu=ia32 conditions: os=win32 & cpu=ia32
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-x64@npm:0.25.9": "@esbuild/win32-x64@npm:0.25.10":
version: 0.25.9 version: 0.25.10
resolution: "@esbuild/win32-x64@npm:0.25.9" resolution: "@esbuild/win32-x64@npm:0.25.10"
conditions: os=win32 & cpu=x64 conditions: os=win32 & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
@ -646,10 +646,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint/js@npm:9.35.0, @eslint/js@npm:^9.35.0": "@eslint/js@npm:9.36.0, @eslint/js@npm:^9.36.0":
version: 9.35.0 version: 9.36.0
resolution: "@eslint/js@npm:9.35.0" resolution: "@eslint/js@npm:9.36.0"
checksum: 10c0/d40fe38724bc76c085c0b753cdf937fa35c0d6807ae76b2632e3f5f66c3040c91adcf1aff2ce70b4f45752e60629fadc415eeec9af3be3c274bae1cac54b9840 checksum: 10c0/e3f6fb7d6f117d79615574f7bef4f238bcfed6ece0465d28226c3a75d2b6fac9cc189121e8673562796ca8ccea2bf9861715ee5cf4a3dbef87d17811c0dac22c
languageName: node languageName: node
linkType: hard linkType: hard
@ -841,12 +841,12 @@ __metadata:
linkType: hard linkType: hard
"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": "@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28":
version: 0.3.30 version: 0.3.31
resolution: "@jridgewell/trace-mapping@npm:0.3.30" resolution: "@jridgewell/trace-mapping@npm:0.3.31"
dependencies: dependencies:
"@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/resolve-uri": "npm:^3.1.0"
"@jridgewell/sourcemap-codec": "npm:^1.4.14" "@jridgewell/sourcemap-codec": "npm:^1.4.14"
checksum: 10c0/3a1516c10f44613b9ba27c37a02ff8f410893776b2b3dad20a391b51b884dd60f97bbb56936d65d2ff8fe978510a0000266654ab8426bdb9ceb5fb4585b19e23 checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9
languageName: node languageName: node
linkType: hard linkType: hard
@ -981,149 +981,156 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-android-arm-eabi@npm:4.50.1": "@rollup/rollup-android-arm-eabi@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.1" resolution: "@rollup/rollup-android-arm-eabi@npm:4.52.0"
conditions: os=android & cpu=arm conditions: os=android & cpu=arm
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-android-arm64@npm:4.50.1": "@rollup/rollup-android-arm64@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-android-arm64@npm:4.50.1" resolution: "@rollup/rollup-android-arm64@npm:4.52.0"
conditions: os=android & cpu=arm64 conditions: os=android & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-darwin-arm64@npm:4.50.1": "@rollup/rollup-darwin-arm64@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-darwin-arm64@npm:4.50.1" resolution: "@rollup/rollup-darwin-arm64@npm:4.52.0"
conditions: os=darwin & cpu=arm64 conditions: os=darwin & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-darwin-x64@npm:4.50.1": "@rollup/rollup-darwin-x64@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-darwin-x64@npm:4.50.1" resolution: "@rollup/rollup-darwin-x64@npm:4.52.0"
conditions: os=darwin & cpu=x64 conditions: os=darwin & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-freebsd-arm64@npm:4.50.1": "@rollup/rollup-freebsd-arm64@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.1" resolution: "@rollup/rollup-freebsd-arm64@npm:4.52.0"
conditions: os=freebsd & cpu=arm64 conditions: os=freebsd & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-freebsd-x64@npm:4.50.1": "@rollup/rollup-freebsd-x64@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-freebsd-x64@npm:4.50.1" resolution: "@rollup/rollup-freebsd-x64@npm:4.52.0"
conditions: os=freebsd & cpu=x64 conditions: os=freebsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1": "@rollup/rollup-linux-arm-gnueabihf@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1" resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.52.0"
conditions: os=linux & cpu=arm & libc=glibc conditions: os=linux & cpu=arm & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm-musleabihf@npm:4.50.1": "@rollup/rollup-linux-arm-musleabihf@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.1" resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.52.0"
conditions: os=linux & cpu=arm & libc=musl conditions: os=linux & cpu=arm & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm64-gnu@npm:4.50.1": "@rollup/rollup-linux-arm64-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.1" resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.52.0"
conditions: os=linux & cpu=arm64 & libc=glibc conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm64-musl@npm:4.50.1": "@rollup/rollup-linux-arm64-musl@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.1" resolution: "@rollup/rollup-linux-arm64-musl@npm:4.52.0"
conditions: os=linux & cpu=arm64 & libc=musl conditions: os=linux & cpu=arm64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1": "@rollup/rollup-linux-loong64-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1" resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.52.0"
conditions: os=linux & cpu=loong64 & libc=glibc conditions: os=linux & cpu=loong64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-ppc64-gnu@npm:4.50.1": "@rollup/rollup-linux-ppc64-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.1" resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.52.0"
conditions: os=linux & cpu=ppc64 & libc=glibc conditions: os=linux & cpu=ppc64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-riscv64-gnu@npm:4.50.1": "@rollup/rollup-linux-riscv64-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.1" resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.52.0"
conditions: os=linux & cpu=riscv64 & libc=glibc conditions: os=linux & cpu=riscv64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-riscv64-musl@npm:4.50.1": "@rollup/rollup-linux-riscv64-musl@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.1" resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.52.0"
conditions: os=linux & cpu=riscv64 & libc=musl conditions: os=linux & cpu=riscv64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-s390x-gnu@npm:4.50.1": "@rollup/rollup-linux-s390x-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.1" resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.52.0"
conditions: os=linux & cpu=s390x & libc=glibc conditions: os=linux & cpu=s390x & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-x64-gnu@npm:4.50.1": "@rollup/rollup-linux-x64-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.1" resolution: "@rollup/rollup-linux-x64-gnu@npm:4.52.0"
conditions: os=linux & cpu=x64 & libc=glibc conditions: os=linux & cpu=x64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-x64-musl@npm:4.50.1": "@rollup/rollup-linux-x64-musl@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.1" resolution: "@rollup/rollup-linux-x64-musl@npm:4.52.0"
conditions: os=linux & cpu=x64 & libc=musl conditions: os=linux & cpu=x64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-openharmony-arm64@npm:4.50.1": "@rollup/rollup-openharmony-arm64@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.1" resolution: "@rollup/rollup-openharmony-arm64@npm:4.52.0"
conditions: os=openharmony & cpu=arm64 conditions: os=openharmony & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-win32-arm64-msvc@npm:4.50.1": "@rollup/rollup-win32-arm64-msvc@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.1" resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.52.0"
conditions: os=win32 & cpu=arm64 conditions: os=win32 & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-win32-ia32-msvc@npm:4.50.1": "@rollup/rollup-win32-ia32-msvc@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.1" resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.52.0"
conditions: os=win32 & cpu=ia32 conditions: os=win32 & cpu=ia32
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-win32-x64-msvc@npm:4.50.1": "@rollup/rollup-win32-x64-gnu@npm:4.52.0":
version: 4.50.1 version: 4.52.0
resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.1" 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 conditions: os=win32 & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
@ -1297,11 +1304,11 @@ __metadata:
linkType: hard linkType: hard
"@types/node@npm:^22.7.7": "@types/node@npm:^22.7.7":
version: 22.18.1 version: 22.18.6
resolution: "@types/node@npm:22.18.1" resolution: "@types/node@npm:22.18.6"
dependencies: dependencies:
undici-types: "npm:~6.21.0" undici-types: "npm:~6.21.0"
checksum: 10c0/1912b0ea6cb9ef59722b0fed64652388e13b41d52569c16198f1278a882837bbf4c8a4ec913e852893356f07c0c44b4e00fbca289ac7222741d03449104e22fe checksum: 10c0/7ba190da2e64e56c59270661af8cd682c830a1375b6f965ab153be90baabfdaa867aa1d63f87b42de80956996d46dfe1cf93ecefe982d9a16e485b6756949f9a
languageName: node languageName: node
linkType: hard linkType: hard
@ -1892,6 +1899,15 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "bl@npm:^4.1.0":
version: 4.1.0 version: 4.1.0
resolution: "bl@npm:4.1.0" resolution: "bl@npm:4.1.0"
@ -1939,16 +1955,17 @@ __metadata:
linkType: hard linkType: hard
"browserslist@npm:^4.24.0": "browserslist@npm:^4.24.0":
version: 4.25.4 version: 4.26.2
resolution: "browserslist@npm:4.25.4" resolution: "browserslist@npm:4.26.2"
dependencies: dependencies:
caniuse-lite: "npm:^1.0.30001737" baseline-browser-mapping: "npm:^2.8.3"
electron-to-chromium: "npm:^1.5.211" caniuse-lite: "npm:^1.0.30001741"
node-releases: "npm:^2.0.19" electron-to-chromium: "npm:^1.5.218"
node-releases: "npm:^2.0.21"
update-browserslist-db: "npm:^1.1.3" update-browserslist-db: "npm:^1.1.3"
bin: bin:
browserslist: cli.js browserslist: cli.js
checksum: 10c0/2b105948990dc2fc0bc2536b4889aadfa15d637e1d857a121611a704cdf539a68f575a391f6bf8b7ff19db36cee1b7834565571f35a7ea691051d2e7fb4f2eb1 checksum: 10c0/1146339dad33fda77786b11ea07f1c40c48899edd897d73a9114ee0dbb1ee6475bb4abda263a678c104508bdca8e66760ff8e10be1947d3e20d34bae01d8b89b
languageName: node languageName: node
linkType: hard linkType: hard
@ -2149,10 +2166,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"caniuse-lite@npm:^1.0.30001737": "caniuse-lite@npm:^1.0.30001741":
version: 1.0.30001741 version: 1.0.30001743
resolution: "caniuse-lite@npm:1.0.30001741" resolution: "caniuse-lite@npm:1.0.30001743"
checksum: 10c0/45746f896205a61a8eeb85a32aeca243ebce640cd6eb80d04949d9389a13f4659c737860300d7b988057599f0958c55eeab74ec02ce9ef137feb7d006e75fec1 checksum: 10c0/1bd730ca10d881a1ca9f55ce864d34c3b18501718c03976e0d3419f4694b715159e13fdef6d58ad47b6d2445d315940f3a01266658876828c820a3331aac021d
languageName: node languageName: node
linkType: hard linkType: hard
@ -2441,14 +2458,14 @@ __metadata:
linkType: hard 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": "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 version: 4.4.3
resolution: "debug@npm:4.4.1" resolution: "debug@npm:4.4.3"
dependencies: dependencies:
ms: "npm:^2.1.3" ms: "npm:^2.1.3"
peerDependenciesMeta: peerDependenciesMeta:
supports-color: supports-color:
optional: true optional: true
checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6
languageName: node languageName: node
linkType: hard linkType: hard
@ -2530,9 +2547,9 @@ __metadata:
linkType: hard linkType: hard
"detect-libc@npm:^2.0.1": "detect-libc@npm:^2.0.1":
version: 2.0.4 version: 2.1.0
resolution: "detect-libc@npm:2.0.4" resolution: "detect-libc@npm:2.1.0"
checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c checksum: 10c0/4d0d36c77fdcb1d3221779d8dfc7d5808dd52530d49db67193fb3cd8149e2d499a1eeb87bb830ad7c442294929992c12e971f88ae492965549f8f83e5336eba6
languageName: node languageName: node
linkType: hard linkType: hard
@ -2686,10 +2703,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"electron-to-chromium@npm:^1.5.211": "electron-to-chromium@npm:^1.5.218":
version: 1.5.215 version: 1.5.222
resolution: "electron-to-chromium@npm:1.5.215" resolution: "electron-to-chromium@npm:1.5.222"
checksum: 10c0/3a45976d1193e57284533096b3bbec218a5d4d85af4f7c133522aae35b14bbf22734f48ccc3f0e43a451441ebc375fa2f4350390fd729dcedb97543692133e39 checksum: 10c0/a81eb8d2b171236884faf9b5dd382c66d9250283032cb89a3e555d788bf3956f7f4f6bf7bf30b3daf9e5c945ef837bfcd1be21b3f41cfe186ed2f25da13c9af3
languageName: node languageName: node
linkType: hard linkType: hard
@ -2946,35 +2963,35 @@ __metadata:
linkType: hard linkType: hard
"esbuild@npm:^0.25.0, esbuild@npm:^0.25.5": "esbuild@npm:^0.25.0, esbuild@npm:^0.25.5":
version: 0.25.9 version: 0.25.10
resolution: "esbuild@npm:0.25.9" resolution: "esbuild@npm:0.25.10"
dependencies: dependencies:
"@esbuild/aix-ppc64": "npm:0.25.9" "@esbuild/aix-ppc64": "npm:0.25.10"
"@esbuild/android-arm": "npm:0.25.9" "@esbuild/android-arm": "npm:0.25.10"
"@esbuild/android-arm64": "npm:0.25.9" "@esbuild/android-arm64": "npm:0.25.10"
"@esbuild/android-x64": "npm:0.25.9" "@esbuild/android-x64": "npm:0.25.10"
"@esbuild/darwin-arm64": "npm:0.25.9" "@esbuild/darwin-arm64": "npm:0.25.10"
"@esbuild/darwin-x64": "npm:0.25.9" "@esbuild/darwin-x64": "npm:0.25.10"
"@esbuild/freebsd-arm64": "npm:0.25.9" "@esbuild/freebsd-arm64": "npm:0.25.10"
"@esbuild/freebsd-x64": "npm:0.25.9" "@esbuild/freebsd-x64": "npm:0.25.10"
"@esbuild/linux-arm": "npm:0.25.9" "@esbuild/linux-arm": "npm:0.25.10"
"@esbuild/linux-arm64": "npm:0.25.9" "@esbuild/linux-arm64": "npm:0.25.10"
"@esbuild/linux-ia32": "npm:0.25.9" "@esbuild/linux-ia32": "npm:0.25.10"
"@esbuild/linux-loong64": "npm:0.25.9" "@esbuild/linux-loong64": "npm:0.25.10"
"@esbuild/linux-mips64el": "npm:0.25.9" "@esbuild/linux-mips64el": "npm:0.25.10"
"@esbuild/linux-ppc64": "npm:0.25.9" "@esbuild/linux-ppc64": "npm:0.25.10"
"@esbuild/linux-riscv64": "npm:0.25.9" "@esbuild/linux-riscv64": "npm:0.25.10"
"@esbuild/linux-s390x": "npm:0.25.9" "@esbuild/linux-s390x": "npm:0.25.10"
"@esbuild/linux-x64": "npm:0.25.9" "@esbuild/linux-x64": "npm:0.25.10"
"@esbuild/netbsd-arm64": "npm:0.25.9" "@esbuild/netbsd-arm64": "npm:0.25.10"
"@esbuild/netbsd-x64": "npm:0.25.9" "@esbuild/netbsd-x64": "npm:0.25.10"
"@esbuild/openbsd-arm64": "npm:0.25.9" "@esbuild/openbsd-arm64": "npm:0.25.10"
"@esbuild/openbsd-x64": "npm:0.25.9" "@esbuild/openbsd-x64": "npm:0.25.10"
"@esbuild/openharmony-arm64": "npm:0.25.9" "@esbuild/openharmony-arm64": "npm:0.25.10"
"@esbuild/sunos-x64": "npm:0.25.9" "@esbuild/sunos-x64": "npm:0.25.10"
"@esbuild/win32-arm64": "npm:0.25.9" "@esbuild/win32-arm64": "npm:0.25.10"
"@esbuild/win32-ia32": "npm:0.25.9" "@esbuild/win32-ia32": "npm:0.25.10"
"@esbuild/win32-x64": "npm:0.25.9" "@esbuild/win32-x64": "npm:0.25.10"
dependenciesMeta: dependenciesMeta:
"@esbuild/aix-ppc64": "@esbuild/aix-ppc64":
optional: true optional: true
@ -3030,7 +3047,7 @@ __metadata:
optional: true optional: true
bin: bin:
esbuild: bin/esbuild esbuild: bin/esbuild
checksum: 10c0/aaa1284c75fcf45c82f9a1a117fe8dc5c45628e3386bda7d64916ae27730910b51c5aec7dd45a6ba19256be30ba2935e64a8f011a3f0539833071e06bf76d5b3 checksum: 10c0/8ee5fdd43ed0d4092ce7f41577c63147f54049d5617763f0549c638bbe939e8adaa8f1a2728adb63417eb11df51956b7b0d8eb88ee08c27ad1d42960256158fa
languageName: node languageName: node
linkType: hard linkType: hard
@ -3199,9 +3216,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint@npm:^9.35.0": "eslint@npm:^9.36.0":
version: 9.35.0 version: 9.36.0
resolution: "eslint@npm:9.35.0" resolution: "eslint@npm:9.36.0"
dependencies: dependencies:
"@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/eslint-utils": "npm:^4.8.0"
"@eslint-community/regexpp": "npm:^4.12.1" "@eslint-community/regexpp": "npm:^4.12.1"
@ -3209,7 +3226,7 @@ __metadata:
"@eslint/config-helpers": "npm:^0.3.1" "@eslint/config-helpers": "npm:^0.3.1"
"@eslint/core": "npm:^0.15.2" "@eslint/core": "npm:^0.15.2"
"@eslint/eslintrc": "npm:^3.3.1" "@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" "@eslint/plugin-kit": "npm:^0.3.5"
"@humanfs/node": "npm:^0.16.6" "@humanfs/node": "npm:^0.16.6"
"@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/module-importer": "npm:^1.0.1"
@ -3245,7 +3262,7 @@ __metadata:
optional: true optional: true
bin: bin:
eslint: bin/eslint.js eslint: bin/eslint.js
checksum: 10c0/798c527520ccf62106f8cd210bd1db1f8eb1b0e7a56feb0a8b322bf3a1e6a0bc6dc3a414542c22b1b393d58d5e3cd0252c44c023049de9067b836450503a2f03 checksum: 10c0/0e2705a94847813b03f2f3c1367c0708319cbb66458250a09b2d056a088c56e079a1c1d76c44feebf51971d9ce64d010373b2a4f007cd1026fc24f95c89836df
languageName: node languageName: node
linkType: hard linkType: hard
@ -3547,13 +3564,13 @@ __metadata:
linkType: hard linkType: hard
"fs-extra@npm:^11.1.1": "fs-extra@npm:^11.1.1":
version: 11.3.1 version: 11.3.2
resolution: "fs-extra@npm:11.3.1" resolution: "fs-extra@npm:11.3.2"
dependencies: dependencies:
graceful-fs: "npm:^4.2.0" graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1" jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0" universalify: "npm:^2.0.0"
checksum: 10c0/61e5b7285b1ca72c68dfe1058b2514294a922683afac2a80aa90540f9bd85370763d675e3b408ef500077d355956fece3bd24b546790e261c3d3015967e2b2d9 checksum: 10c0/f5d629e1bb646d5dedb4d8b24c5aad3deb8cc1d5438979d6f237146cd10e113b49a949ae1b54212c2fbc98e2d0995f38009a9a1d0520f0287943335e65fe919b
languageName: node languageName: node
linkType: hard linkType: hard
@ -3670,7 +3687,7 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "gerbil@workspace:." resolution: "gerbil@workspace:."
dependencies: dependencies:
"@eslint/js": "npm:^9.35.0" "@eslint/js": "npm:^9.36.0"
"@fontsource/inter": "npm:^5.2.8" "@fontsource/inter": "npm:^5.2.8"
"@mantine/core": "npm:^8.3.1" "@mantine/core": "npm:^8.3.1"
"@mantine/hooks": "npm:^8.3.1" "@mantine/hooks": "npm:^8.3.1"
@ -3687,7 +3704,7 @@ __metadata:
electron-builder: "npm:^26.0.12" electron-builder: "npm:^26.0.12"
electron-updater: "npm:6.6.2" electron-updater: "npm:6.6.2"
electron-vite: "npm:^4.0.0" 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-import: "npm:^2.32.0"
eslint-plugin-no-comments: "npm:^1.1.10" eslint-plugin-no-comments: "npm:^1.1.10"
eslint-plugin-promise: "npm:^7.2.1" eslint-plugin-promise: "npm:^7.2.1"
@ -4182,9 +4199,9 @@ __metadata:
linkType: hard linkType: hard
"is-arrayish@npm:^0.3.1": "is-arrayish@npm:^0.3.1":
version: 0.3.2 version: 0.3.4
resolution: "is-arrayish@npm:0.3.2" resolution: "is-arrayish@npm:0.3.4"
checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 checksum: 10c0/1fa672a2f0bedb74154440310f616c0b6e53a95cf0625522ae050f06626d1cabd1a3d8085c882dc45c61ad0e7df2529aff122810b3b4a552880bf170d6df94e0
languageName: node languageName: node
linkType: hard linkType: hard
@ -5239,10 +5256,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-releases@npm:^2.0.19": "node-releases@npm:^2.0.21":
version: 2.0.20 version: 2.0.21
resolution: "node-releases@npm:2.0.20" resolution: "node-releases@npm:2.0.21"
checksum: 10c0/24c5b1f5aa16d042c47a651ca2e022ca27320f95e4d2b76b9e543cc470eadd01032646383212ec373f1a3dd15cccce83d77c318ee99585366dbd25db4366abd8 checksum: 10c0/0eb94916eeebbda9d51da6a9ea47428a12b2bb0dd94930c949632b0c859356abf53b2e5a2792021f96c5fda4f791a8e195f2375b78ae7dba8d8bc3141baa1469
languageName: node languageName: node
linkType: hard linkType: hard
@ -5644,11 +5661,11 @@ __metadata:
linkType: hard linkType: hard
"pretty-ms@npm:^9.2.0": "pretty-ms@npm:^9.2.0":
version: 9.2.0 version: 9.3.0
resolution: "pretty-ms@npm:9.2.0" resolution: "pretty-ms@npm:9.3.0"
dependencies: dependencies:
parse-ms: "npm:^4.0.0" parse-ms: "npm:^4.0.0"
checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb checksum: 10c0/555ea39a1de48a30601938aedb76d682871d33b6dee015281c37108921514b11e1792928b1648c2e5589acc73c8ef0fb5e585fb4c718e340a28b86799e90fb34
languageName: node languageName: node
linkType: hard linkType: hard
@ -6090,30 +6107,31 @@ __metadata:
linkType: hard linkType: hard
"rollup@npm:^4.43.0": "rollup@npm:^4.43.0":
version: 4.50.1 version: 4.52.0
resolution: "rollup@npm:4.50.1" resolution: "rollup@npm:4.52.0"
dependencies: dependencies:
"@rollup/rollup-android-arm-eabi": "npm:4.50.1" "@rollup/rollup-android-arm-eabi": "npm:4.52.0"
"@rollup/rollup-android-arm64": "npm:4.50.1" "@rollup/rollup-android-arm64": "npm:4.52.0"
"@rollup/rollup-darwin-arm64": "npm:4.50.1" "@rollup/rollup-darwin-arm64": "npm:4.52.0"
"@rollup/rollup-darwin-x64": "npm:4.50.1" "@rollup/rollup-darwin-x64": "npm:4.52.0"
"@rollup/rollup-freebsd-arm64": "npm:4.50.1" "@rollup/rollup-freebsd-arm64": "npm:4.52.0"
"@rollup/rollup-freebsd-x64": "npm:4.50.1" "@rollup/rollup-freebsd-x64": "npm:4.52.0"
"@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.1" "@rollup/rollup-linux-arm-gnueabihf": "npm:4.52.0"
"@rollup/rollup-linux-arm-musleabihf": "npm:4.50.1" "@rollup/rollup-linux-arm-musleabihf": "npm:4.52.0"
"@rollup/rollup-linux-arm64-gnu": "npm:4.50.1" "@rollup/rollup-linux-arm64-gnu": "npm:4.52.0"
"@rollup/rollup-linux-arm64-musl": "npm:4.50.1" "@rollup/rollup-linux-arm64-musl": "npm:4.52.0"
"@rollup/rollup-linux-loongarch64-gnu": "npm:4.50.1" "@rollup/rollup-linux-loong64-gnu": "npm:4.52.0"
"@rollup/rollup-linux-ppc64-gnu": "npm:4.50.1" "@rollup/rollup-linux-ppc64-gnu": "npm:4.52.0"
"@rollup/rollup-linux-riscv64-gnu": "npm:4.50.1" "@rollup/rollup-linux-riscv64-gnu": "npm:4.52.0"
"@rollup/rollup-linux-riscv64-musl": "npm:4.50.1" "@rollup/rollup-linux-riscv64-musl": "npm:4.52.0"
"@rollup/rollup-linux-s390x-gnu": "npm:4.50.1" "@rollup/rollup-linux-s390x-gnu": "npm:4.52.0"
"@rollup/rollup-linux-x64-gnu": "npm:4.50.1" "@rollup/rollup-linux-x64-gnu": "npm:4.52.0"
"@rollup/rollup-linux-x64-musl": "npm:4.50.1" "@rollup/rollup-linux-x64-musl": "npm:4.52.0"
"@rollup/rollup-openharmony-arm64": "npm:4.50.1" "@rollup/rollup-openharmony-arm64": "npm:4.52.0"
"@rollup/rollup-win32-arm64-msvc": "npm:4.50.1" "@rollup/rollup-win32-arm64-msvc": "npm:4.52.0"
"@rollup/rollup-win32-ia32-msvc": "npm:4.50.1" "@rollup/rollup-win32-ia32-msvc": "npm:4.52.0"
"@rollup/rollup-win32-x64-msvc": "npm:4.50.1" "@rollup/rollup-win32-x64-gnu": "npm:4.52.0"
"@rollup/rollup-win32-x64-msvc": "npm:4.52.0"
"@types/estree": "npm:1.0.8" "@types/estree": "npm:1.0.8"
fsevents: "npm:~2.3.2" fsevents: "npm:~2.3.2"
dependenciesMeta: dependenciesMeta:
@ -6137,7 +6155,7 @@ __metadata:
optional: true optional: true
"@rollup/rollup-linux-arm64-musl": "@rollup/rollup-linux-arm64-musl":
optional: true optional: true
"@rollup/rollup-linux-loongarch64-gnu": "@rollup/rollup-linux-loong64-gnu":
optional: true optional: true
"@rollup/rollup-linux-ppc64-gnu": "@rollup/rollup-linux-ppc64-gnu":
optional: true optional: true
@ -6157,13 +6175,15 @@ __metadata:
optional: true optional: true
"@rollup/rollup-win32-ia32-msvc": "@rollup/rollup-win32-ia32-msvc":
optional: true optional: true
"@rollup/rollup-win32-x64-gnu":
optional: true
"@rollup/rollup-win32-x64-msvc": "@rollup/rollup-win32-x64-msvc":
optional: true optional: true
fsevents: fsevents:
optional: true optional: true
bin: bin:
rollup: dist/bin/rollup rollup: dist/bin/rollup
checksum: 10c0/2029282826d5fb4e308be261b2c28329a4d2bd34304cc3960da69fd21d5acccd0267d6770b1656ffc8f166203ef7e865b4583d5f842a519c8ef059ac71854205 checksum: 10c0/05b33f5143cfeb2c64df6bfa13a971c3d94081828f763e22b4154ed1452091abe648418d9a45abc8d5656a9a979f5b12e9cd5b390f247c3af4640ad8ed333523
languageName: node languageName: node
linkType: hard linkType: hard
@ -6424,11 +6444,11 @@ __metadata:
linkType: hard linkType: hard
"simple-swizzle@npm:^0.2.2": "simple-swizzle@npm:^0.2.2":
version: 0.2.2 version: 0.2.4
resolution: "simple-swizzle@npm:0.2.2" resolution: "simple-swizzle@npm:0.2.4"
dependencies: dependencies:
is-arrayish: "npm:^0.3.1" is-arrayish: "npm:^0.3.1"
checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 checksum: 10c0/846c3fdd1325318d5c71295cfbb99bfc9edc4c8dffdda5e6e9efe30482bbcd32cf360fc2806f46ac43ff7d09bcfaff20337bb79f826f0e6a8e366efd3cdd7868
languageName: node languageName: node
linkType: hard linkType: hard