diff --git a/.cspell/project-terms.txt b/.cspell/project-terms.txt index 4a1a15f..6d8c536 100644 --- a/.cspell/project-terms.txt +++ b/.cspell/project-terms.txt @@ -74,9 +74,11 @@ trycloudflare unquantized useclblast usecuda +usemmap usevulkan vram vulkan vulkaninfo wayland websearch +MMAP diff --git a/package.json b/package.json index 956d93f..842fd63 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "friendly-kobold", "productName": "Friendly Kobold", - "version": "0.4.0", + "version": "0.4.1", "description": "A modern Electron shell for KoboldCpp", "main": "out/main/index.js", "homepage": "./", diff --git a/src/App.tsx b/src/App.tsx index 92b3d2b..9196515 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,7 +6,7 @@ import { InterfaceScreen } from '@/components/screens/Interface'; import { WelcomeScreen } from '@/components/screens/Welcome'; import { UpdateAvailableModal } from '@/components/UpdateAvailableModal'; import { SettingsModal } from '@/components/settings/SettingsModal'; -import { EjectConfirmDialog } from '@/components/EjectConfirmDialog'; +import { EjectConfirmModal } from '@/components/EjectConfirmModal'; import { ScreenTransition } from '@/components/ScreenTransition'; import { AppHeader } from '@/components/AppHeader'; import { useUpdateChecker } from '@/hooks/useUpdateChecker'; @@ -20,7 +20,7 @@ export const App = () => { const [currentScreen, setCurrentScreen] = useState(null); const [settingsOpened, setSettingsOpened] = useState(false); const [hasInitialized, setHasInitialized] = useState(false); - const [showEjectDialog, setShowEjectDialog] = useState(false); + const [showEjectModal, setShowEjectModal] = useState(false); const [activeInterfaceTab, setActiveInterfaceTab] = useState( 'terminal' ); @@ -179,7 +179,7 @@ export const App = () => { if (skipEjectConfirmation) { performEject(); } else { - setShowEjectDialog(true); + setShowEjectModal(true); } }; @@ -309,9 +309,9 @@ export const App = () => { onClose={() => setSettingsOpened(false)} currentScreen={currentScreen || undefined} /> - setShowEjectDialog(false)} + setShowEjectModal(false)} onConfirm={handleEjectConfirm} /> diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx index 7b6c1a3..11ff2e1 100644 --- a/src/components/AppHeader.tsx +++ b/src/components/AppHeader.tsx @@ -14,7 +14,6 @@ import { Settings, ArrowLeft } from 'lucide-react'; import { StyledTooltip } from '@/components/StyledTooltip'; import { soundAssets, playSound, initializeAudio } from '@/utils'; import iconUrl from '/icon.png'; -import '@/styles/AppHeader.css'; type Screen = 'welcome' | 'download' | 'launch' | 'interface'; diff --git a/src/components/EjectConfirmDialog.tsx b/src/components/EjectConfirmModal.tsx similarity index 92% rename from src/components/EjectConfirmDialog.tsx rename to src/components/EjectConfirmModal.tsx index 0d08aac..cdec0c9 100644 --- a/src/components/EjectConfirmDialog.tsx +++ b/src/components/EjectConfirmModal.tsx @@ -1,17 +1,17 @@ import { useState } from 'react'; import { Modal, Text, Group, Button, Checkbox, Stack } from '@mantine/core'; -interface EjectConfirmDialogProps { +interface EjectConfirmModalProps { opened: boolean; onClose: () => void; onConfirm: (skipConfirmation: boolean) => void; } -export const EjectConfirmDialog = ({ +export const EjectConfirmModal = ({ opened, onClose, onConfirm, -}: EjectConfirmDialogProps) => { +}: EjectConfirmModalProps) => { const [skipConfirmation, setSkipConfirmation] = useState(false); const handleConfirm = () => { diff --git a/src/components/screens/Launch/AdvancedTab.tsx b/src/components/screens/Launch/AdvancedTab.tsx index 88a80d4..ec226ea 100644 --- a/src/components/screens/Launch/AdvancedTab.tsx +++ b/src/components/screens/Launch/AdvancedTab.tsx @@ -13,6 +13,7 @@ export const AdvancedTab = () => { failsafe, lowvram, quantmatmul, + usemmap, backend, handleAdditionalArgumentsChange, handleNoshiftChange, @@ -21,6 +22,7 @@ export const AdvancedTab = () => { handleFailsafeChange, handleLowvramChange, handleQuantmatmulChange, + handleUsemmapChange, } = useLaunchConfig(); const [backendSupport, setBackendSupport] = useState<{ noavx2: boolean; @@ -148,6 +150,19 @@ export const AdvancedTab = () => { /> + +
+ + + handleUsemmapChange(event.currentTarget.checked) + } + label="MMAP" + /> + + +
diff --git a/src/components/screens/Launch/index.tsx b/src/components/screens/Launch/index.tsx index ac1eeb5..961c7b2 100644 --- a/src/components/screens/Launch/index.tsx +++ b/src/components/screens/Launch/index.tsx @@ -49,6 +49,7 @@ export const LaunchScreen = ({ failsafe, lowvram, quantmatmul, + usemmap, backend, gpuDevice, gpuPlatform, @@ -148,6 +149,7 @@ export const LaunchScreen = ({ flashattention, noavx2, failsafe, + usemmap, usecuda: backend === 'cuda' || backend === 'rocm', usevulkan: backend === 'vulkan', useclblast: backend === 'clblast', @@ -248,10 +250,13 @@ export const LaunchScreen = ({ websearch, noshift, flashattention, + noavx2, + failsafe, backend, lowvram, gpuDevice, quantmatmul, + usemmap, additionalArguments, sdt5xxl, sdclipl, diff --git a/src/constants/defaults.ts b/src/constants/defaults.ts index 407a566..088b64a 100644 --- a/src/constants/defaults.ts +++ b/src/constants/defaults.ts @@ -2,5 +2,3 @@ export const DEFAULT_CONTEXT_SIZE = 4096; export const DEFAULT_MODEL_URL = 'https://huggingface.co/MaziyarPanahi/gemma-3-4b-it-GGUF/resolve/main/gemma-3-4b-it.Q8_0.gguf?download=true'; - -export const DEFAULT_HOST = ''; diff --git a/src/hooks/useLaunchConfig.ts b/src/hooks/useLaunchConfig.ts index cb3c438..30a12c1 100644 --- a/src/hooks/useLaunchConfig.ts +++ b/src/hooks/useLaunchConfig.ts @@ -26,6 +26,7 @@ export const useLaunchConfig = () => { failsafe: state.failsafe, lowvram: state.lowvram, quantmatmul: state.quantmatmul, + usemmap: state.usemmap, backend: state.backend, gpuDevice: state.gpuDevice, gpuPlatform: state.gpuPlatform, @@ -55,6 +56,7 @@ export const useLaunchConfig = () => { handleFailsafeChange: state.setFailsafe, handleLowvramChange: state.setLowvram, handleQuantmatmulChange: state.setQuantmatmul, + handleUsemmapChange: state.setUsemmap, handleBackendChange: state.setBackend, handleGpuDeviceChange: state.setGpuDevice, handleGpuPlatformChange: state.setGpuPlatform, diff --git a/src/hooks/useLaunchLogic.ts b/src/hooks/useLaunchLogic.ts index 5b54e84..bdebbda 100644 --- a/src/hooks/useLaunchLogic.ts +++ b/src/hooks/useLaunchLogic.ts @@ -21,10 +21,13 @@ interface LaunchArgs { websearch: boolean; noshift: boolean; flashattention: boolean; + noavx2: boolean; + failsafe: boolean; backend: string; lowvram: boolean; gpuDevice: number | string; quantmatmul: boolean; + usemmap: boolean; additionalArguments: string; sdt5xxl: string; sdclipl: string; @@ -98,6 +101,9 @@ const buildConfigArgs = (launchArgs: LaunchArgs): string[] => { [launchArgs.websearch, '--websearch'], [launchArgs.noshift, '--noshift'], [launchArgs.flashattention, '--flashattention'], + [launchArgs.noavx2, '--noavx2'], + [launchArgs.failsafe, '--failsafe'], + [launchArgs.usemmap, '--usemmap'], ]; flagMappings.forEach(([condition, flag, value]) => { diff --git a/src/main/managers/KoboldCppManager.ts b/src/main/managers/KoboldCppManager.ts index 9a34ca2..ea8eac8 100644 --- a/src/main/managers/KoboldCppManager.ts +++ b/src/main/managers/KoboldCppManager.ts @@ -384,6 +384,7 @@ export class KoboldCppManager { flashattention?: boolean; noavx2?: boolean; failsafe?: boolean; + usemmap?: boolean; usecuda?: boolean; usevulkan?: boolean; useclblast?: [number, number] | boolean; diff --git a/src/main/managers/WindowManager.ts b/src/main/managers/WindowManager.ts index 963f9d3..81f8faa 100644 --- a/src/main/managers/WindowManager.ts +++ b/src/main/managers/WindowManager.ts @@ -1,11 +1,4 @@ -import { - BrowserWindow, - app, - Menu, - shell, - ipcMain, - nativeImage, -} from 'electron'; +import { BrowserWindow, app, Menu, shell, nativeImage } from 'electron'; import * as os from 'os'; import { join } from 'path'; import { GITHUB_API } from '../../constants'; @@ -311,8 +304,9 @@ OS: ${osInfo}`; maximizable: false, show: false, webPreferences: { - nodeIntegration: true, - contextIsolation: false, + nodeIntegration: false, + contextIsolation: true, + preload: join(__dirname, '../preload/index.js'), }, }); @@ -328,21 +322,6 @@ OS: ${osInfo}`; aboutWindow.once('ready-to-show', () => { aboutWindow.show(); }); - - ipcMain.once('open-github', () => { - shell.openExternal( - `https://github.com/${GITHUB_API.FRIENDLY_KOBOLD_REPO}` - ); - }); - - ipcMain.once('close-about-dialog', () => { - aboutWindow.close(); - }); - - aboutWindow.on('closed', () => { - ipcMain.removeAllListeners('open-github'); - ipcMain.removeAllListeners('close-about-dialog'); - }); } private getTemplatePath(filename: string): string { diff --git a/src/main/templates/about-dialog.html b/src/main/templates/about-dialog.html index d857067..fbc5eb5 100644 --- a/src/main/templates/about-dialog.html +++ b/src/main/templates/about-dialog.html @@ -131,8 +131,6 @@