From 4d0bbf31caa07be356bc7383183ad04f136619b1 Mon Sep 17 00:00:00 2001 From: Egor Date: Tue, 9 Sep 2025 02:30:42 -0700 Subject: [PATCH] fully refactoring from classes to functions, don't allow switching frontends when launched --- eslint.config.ts | 1 + package.json | 21 +- src/App.tsx | 1 + src/assets/kcpp_sdui.embd | 524 -------------- src/components/ErrorBoundary.tsx | 159 ++--- src/components/screens/Launch/index.tsx | 2 +- src/components/settings/GeneralTab.tsx | 9 +- src/components/settings/SettingsModal.tsx | 4 +- src/constants/index.ts | 2 + src/main/cli.ts | 176 +++-- src/main/gui.ts | 122 ++-- src/main/index.ts | 6 +- src/main/ipc.ts | 450 ++++++------ src/main/managers/BinaryManager.ts | 206 ------ src/main/managers/ConfigManager.ts | 112 --- src/main/managers/HardwareManager.ts | 495 -------------- src/main/managers/KoboldCppManager.ts | 796 ---------------------- src/main/managers/LogManager.ts | 97 --- src/main/managers/OpenWebUIManager.ts | 288 -------- src/main/managers/SillyTavernManager.ts | 569 ---------------- src/main/managers/WindowManager.ts | 213 ------ src/main/modules/binary.ts | 175 +++++ src/main/modules/config.ts | 94 +++ src/main/modules/hardware.ts | 472 +++++++++++++ src/main/modules/koboldcpp.ts | 740 ++++++++++++++++++++ src/main/modules/logging.ts | 95 +++ src/main/modules/openwebui.ts | 242 +++++++ src/main/modules/sillytavern.ts | 522 ++++++++++++++ src/main/modules/window.ts | 195 ++++++ src/main/utils/assets.ts | 9 - src/stores/launchConfig.ts | 6 +- src/utils/environment.ts | 1 + src/utils/path.ts | 8 - yarn.lock | 24 +- 34 files changed, 3001 insertions(+), 3835 deletions(-) delete mode 100644 src/assets/kcpp_sdui.embd delete mode 100644 src/main/managers/BinaryManager.ts delete mode 100644 src/main/managers/ConfigManager.ts delete mode 100644 src/main/managers/HardwareManager.ts delete mode 100644 src/main/managers/KoboldCppManager.ts delete mode 100644 src/main/managers/LogManager.ts delete mode 100644 src/main/managers/OpenWebUIManager.ts delete mode 100644 src/main/managers/SillyTavernManager.ts delete mode 100644 src/main/managers/WindowManager.ts create mode 100644 src/main/modules/binary.ts create mode 100644 src/main/modules/config.ts create mode 100644 src/main/modules/hardware.ts create mode 100644 src/main/modules/koboldcpp.ts create mode 100644 src/main/modules/logging.ts create mode 100644 src/main/modules/openwebui.ts create mode 100644 src/main/modules/sillytavern.ts create mode 100644 src/main/modules/window.ts create mode 100644 src/utils/environment.ts diff --git a/eslint.config.ts b/eslint.config.ts index 7a2a225..b125c1b 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -143,6 +143,7 @@ const config = [ 'arrow-body-style': ['error', 'as-needed'], 'prefer-arrow-callback': ['error', { allowNamedFunctions: false }], + 'object-shorthand': ['error', 'always'], 'no-console': 'error', diff --git a/package.json b/package.json index 9fe712d..5bb356a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "gerbil", "productName": "Gerbil", - "version": "1.0.6", + "version": "1.1.0", "description": "Run Large Language Models locally", "main": "out/main/index.js", "homepage": "./", @@ -67,9 +67,10 @@ "@mantine/hooks": "^8.3.0", "axios": "^1.11.0", "execa": "^9.6.0", - "lucide-react": "^0.542.0", + "lucide-react": "^0.543.0", "react": "^19.1.1", "react-dom": "^19.1.1", + "react-error-boundary": "^6.0.0", "systeminformation": "^5.27.8", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", @@ -90,15 +91,7 @@ "out/**/*", "dist/**/*" ], - "extraFiles": [ - { - "from": "assets/gerbil.desktop", - "to": "assets/gerbil.desktop", - "filter": [ - "**/*" - ] - } - ], + "extraFiles": [], "mac": { "compression": "maximum", "category": "public.app-category.productivity", @@ -163,6 +156,12 @@ "StartupWMClass": "Gerbil" } }, + "extraFiles": [ + { + "from": "assets/gerbil.desktop", + "to": "assets/gerbil.desktop" + } + ], "target": [ { "target": "AppImage", diff --git a/src/App.tsx b/src/App.tsx index a16fb82..558fe24 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -224,6 +224,7 @@ export const App = () => { /> { setSettingsModalOpen(false); diff --git a/src/assets/kcpp_sdui.embd b/src/assets/kcpp_sdui.embd deleted file mode 100644 index 8799aa4..0000000 --- a/src/assets/kcpp_sdui.embd +++ /dev/null @@ -1,524 +0,0 @@ - - - - - - - Stable UI for KoboldCpp - - - - -
- - - - diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index e7500da..11b91ab 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -1,106 +1,85 @@ -import { Component, ReactNode, ErrorInfo } from 'react'; +import { ReactNode } from 'react'; import { Center, Stack, Text, Button, Alert, rem } from '@mantine/core'; import { AlertTriangle, FolderOpen } from 'lucide-react'; +import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary'; import { safeExecute } from '@/utils/logger'; interface Props { children: ReactNode; } -interface State { - hasError: boolean; - error?: Error; -} +const ErrorFallback = ({ + error, + resetErrorBoundary, +}: { + error: Error; + resetErrorBoundary: () => void; +}) => ( +
+ + -export class ErrorBoundary extends Component { - constructor(props: Props) { - super(props); - this.state = { hasError: false }; - } + + Application Error + - static getDerivedStateFromError(error: Error): State { - return { hasError: true, error }; - } + + + The application encountered an unexpected error and crashed. You can + view the error details in the logs folder. + - componentDidCatch(error: Error, _errorInfo: ErrorInfo) { - window.electronAPI?.logs?.logError( - 'App crashed with unhandled error:', - error - ); - } + + {error.message} + - render() { - if (this.state.hasError) { - return ( -
- - + + - - Application Error - + + - - - The application encountered an unexpected error and crashed. You - can view the error details in the logs folder. - + + + +
+); - {this.state.error && ( - - {this.state.error.message} - - )} - - -
- - - - - - -
-
+export const ErrorBoundary = ({ children }: Props) => ( + { + window.electronAPI?.logs?.logError( + 'App crashed with unhandled error:', + error ); - } - - return this.props.children; - } -} + }} + > + {children} + +); diff --git a/src/components/screens/Launch/index.tsx b/src/components/screens/Launch/index.tsx index 020c47a..c866194 100644 --- a/src/components/screens/Launch/index.tsx +++ b/src/components/screens/Launch/index.tsx @@ -152,7 +152,7 @@ export const LaunchScreen = ({ onLaunch }: LaunchScreenProps) => { }; const buildConfigData = () => ({ - autoGpuLayers: autoGpuLayers, + autoGpuLayers, gpulayers: gpuLayers, contextsize: contextSize, model, diff --git a/src/components/settings/GeneralTab.tsx b/src/components/settings/GeneralTab.tsx index 4cf7807..615eb49 100644 --- a/src/components/settings/GeneralTab.tsx +++ b/src/components/settings/GeneralTab.tsx @@ -28,7 +28,13 @@ interface FrontendConfig { requirementCheck?: () => Promise; } -export const GeneralTab = () => { +interface GeneralTabProps { + isOnInterfaceScreen?: boolean; +} + +export const GeneralTab = ({ + isOnInterfaceScreen = false, +}: GeneralTabProps) => { const [installDir, setInstallDir] = useState(''); const [FrontendPreference, setFrontendPreference] = useState('koboldcpp'); @@ -245,6 +251,7 @@ export const GeneralTab = () => {