diff --git a/src/App.tsx b/src/App.tsx index d99df61..92b3d2b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,7 +4,6 @@ import { DownloadScreen } from '@/components/screens/Download'; import { LaunchScreen } from '@/components/screens/Launch'; import { InterfaceScreen } from '@/components/screens/Interface'; import { WelcomeScreen } from '@/components/screens/Welcome'; -import { UpdateDialog } from '@/components/UpdateDialog'; import { UpdateAvailableModal } from '@/components/UpdateAvailableModal'; import { SettingsModal } from '@/components/settings/SettingsModal'; import { EjectConfirmDialog } from '@/components/EjectConfirmDialog'; @@ -13,15 +12,12 @@ import { AppHeader } from '@/components/AppHeader'; import { useUpdateChecker } from '@/hooks/useUpdateChecker'; import { useKoboldVersions } from '@/hooks/useKoboldVersions'; import { UI } from '@/constants'; -import type { UpdateInfo } from '@/types'; import type { DownloadItem } from '@/types/electron'; type Screen = 'welcome' | 'download' | 'launch' | 'interface'; export const App = () => { const [currentScreen, setCurrentScreen] = useState(null); - const [updateInfo, setUpdateInfo] = useState(null); - const [showUpdateDialog, setShowUpdateDialog] = useState(false); const [settingsOpened, setSettingsOpened] = useState(false); const [hasInitialized, setHasInitialized] = useState(false); const [showEjectDialog, setShowEjectDialog] = useState(false); @@ -100,11 +96,6 @@ export const App = () => { checkInstallation(); - window.electronAPI.kobold.onUpdateAvailable((info) => { - setUpdateInfo(info); - setShowUpdateDialog(true); - }); - const cleanupInstallDirListener = window.electronAPI.kobold.onInstallDirChanged(() => { checkInstallation(); @@ -117,7 +108,6 @@ export const App = () => { ); return () => { - window.electronAPI.kobold.removeAllListeners('update-available'); cleanupInstallDirListener(); cleanupVersionsListener(); }; @@ -224,15 +214,6 @@ export const App = () => { } }; - const handleUpdateIgnore = () => { - setShowUpdateDialog(false); - }; - - const handleUpdateAccept = () => { - setShowUpdateDialog(false); - setCurrentScreenWithTransition('download'); - }; - return ( <> { )} - {showUpdateDialog && updateInfo && ( - - )} - {showUpdateModal && binaryUpdateInfo && ( void; - onAccept: () => void; -} - -export const UpdateDialog = ({ - updateInfo, - onIgnore, - onAccept, -}: UpdateDialogProps) => ( - - - - A new version of KoboldCpp is available: {updateInfo.latestVersion} - - - Current version: {updateInfo.currentVersion} - - - - - - - -); diff --git a/src/components/ConfigFileManager.tsx b/src/components/screens/Launch/ConfigFileManager.tsx similarity index 100% rename from src/components/ConfigFileManager.tsx rename to src/components/screens/Launch/ConfigFileManager.tsx diff --git a/src/components/screens/Launch/index.tsx b/src/components/screens/Launch/index.tsx index bcae641..ac1eeb5 100644 --- a/src/components/screens/Launch/index.tsx +++ b/src/components/screens/Launch/index.tsx @@ -8,7 +8,7 @@ import { AdvancedTab } from '@/components/screens/Launch/AdvancedTab'; import { NetworkTab } from '@/components/screens/Launch/NetworkTab'; import { ImageGenerationTab } from '@/components/screens/Launch/ImageGenerationTab'; import { WarningDisplay } from '@/components/WarningDisplay'; -import { ConfigFileManager } from '@/components/ConfigFileManager'; +import { ConfigFileManager } from '@/components/screens/Launch/ConfigFileManager'; import { DEFAULT_MODEL_URL } from '@/constants'; import type { ConfigFile } from '@/types'; diff --git a/src/constants/defaults.ts b/src/constants/defaults.ts index 48e6898..407a566 100644 --- a/src/constants/defaults.ts +++ b/src/constants/defaults.ts @@ -4,21 +4,3 @@ 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 = ''; - -export const DEFAULT_VOLUME = 0.5; - -export const DEFAULT_SKIP_EJECT_CONFIRMATION = false; - -export const DEFAULT_HAS_SEEN_WELCOME = false; - -export const DEFAULT_FLUX_MODELS = { - T5XXL: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors?download=true', - CLIP_L: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors?download=true', - VAE: 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/ae.safetensors?download=true', - U_NET: '', - CLIP: '', - LORA: '', - AESTHETIC: '', -} as const; diff --git a/src/hooks/useChangeTracker.ts b/src/hooks/useChangeTracker.ts deleted file mode 100644 index d361bb1..0000000 --- a/src/hooks/useChangeTracker.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useCallback } from 'react'; - -export const useChangeTracker = ( - handler: (...args: T) => void, - setHasUnsavedChanges: (value: boolean) => void -) => - useCallback( - (...args: T) => { - handler(...args); - setHasUnsavedChanges(true); - }, - [handler, setHasUnsavedChanges] - ); diff --git a/src/hooks/useChangeTracking.ts b/src/hooks/useChangeTracking.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/hooks/useTrackedConfigHandlers.ts b/src/hooks/useTrackedConfigHandlers.ts deleted file mode 100644 index 10c00ab..0000000 --- a/src/hooks/useTrackedConfigHandlers.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { useChangeTracker } from '@/hooks/useChangeTracker'; - -interface TrackedConfigHandlersProps { - setHasUnsavedChanges: (value: boolean) => void; - handlers: { - handleModelPathChange: (path: string) => void; - handleGpuLayersChange: (layers: number) => void; - handleAutoGpuLayersChange: (auto: boolean) => void; - handleContextSizeChangeWithStep: (size: number) => void; - handleAdditionalArgumentsChange: (args: string) => void; - handlePortChange: (port: number | undefined) => void; - handleHostChange: (host: string) => void; - handleMultiuserChange: (enabled: boolean) => void; - handleMultiplayerChange: (enabled: boolean) => void; - handleRemotetunnelChange: (enabled: boolean) => void; - handleNocertifyChange: (enabled: boolean) => void; - handleWebsearchChange: (enabled: boolean) => void; - handleNoshiftChange: (enabled: boolean) => void; - handleFlashattentionChange: (enabled: boolean) => void; - handleNoavx2Change: (enabled: boolean) => void; - handleFailsafeChange: (enabled: boolean) => void; - handleLowvramChange: (enabled: boolean) => void; - handleQuantmatmulChange: (enabled: boolean) => void; - handleBackendChange: (backend: string) => void; - handleGpuDeviceChange: (device: number) => void; - handleGpuPlatformChange: (platform: number) => void; - handleSdmodelChange: (path: string) => void; - handleSdt5xxlChange: (path: string) => void; - handleSdcliplChange: (path: string) => void; - handleSdclipgChange: (path: string) => void; - handleSdphotomakerChange: (path: string) => void; - handleSdvaeChange: (path: string) => void; - handleSdloraChange: (path: string) => void; - }; -} - -export const useTrackedConfigHandlers = ({ - setHasUnsavedChanges, - handlers, -}: TrackedConfigHandlersProps) => { - const createChangeTracker = useChangeTracker; - - const { - handleModelPathChange, - handleGpuLayersChange, - handleAutoGpuLayersChange, - handleContextSizeChangeWithStep, - handleAdditionalArgumentsChange, - handlePortChange, - handleHostChange, - handleMultiuserChange, - handleMultiplayerChange, - handleRemotetunnelChange, - handleNocertifyChange, - handleWebsearchChange, - handleNoshiftChange, - handleFlashattentionChange, - handleNoavx2Change, - handleFailsafeChange, - handleLowvramChange, - handleQuantmatmulChange, - handleBackendChange, - handleGpuDeviceChange, - handleGpuPlatformChange, - handleSdmodelChange, - handleSdt5xxlChange, - handleSdcliplChange, - handleSdclipgChange, - handleSdphotomakerChange, - handleSdvaeChange, - handleSdloraChange, - } = handlers; - - return { - handleModelPathChangeWithTracking: createChangeTracker( - handleModelPathChange, - setHasUnsavedChanges - ), - handleGpuLayersChangeWithTracking: createChangeTracker( - handleGpuLayersChange, - setHasUnsavedChanges - ), - handleAutoGpuLayersChangeWithTracking: createChangeTracker( - handleAutoGpuLayersChange, - setHasUnsavedChanges - ), - handleContextSizeChangeWithTracking: createChangeTracker( - handleContextSizeChangeWithStep, - setHasUnsavedChanges - ), - handleAdditionalArgumentsChangeWithTracking: createChangeTracker( - handleAdditionalArgumentsChange, - setHasUnsavedChanges - ), - handlePortChangeWithTracking: createChangeTracker( - handlePortChange, - setHasUnsavedChanges - ), - handleHostChangeWithTracking: createChangeTracker( - handleHostChange, - setHasUnsavedChanges - ), - handleNoshiftChangeWithTracking: createChangeTracker( - handleNoshiftChange, - setHasUnsavedChanges - ), - handleFlashattentionChangeWithTracking: createChangeTracker( - handleFlashattentionChange, - setHasUnsavedChanges - ), - handleNoavx2ChangeWithTracking: createChangeTracker( - handleNoavx2Change, - setHasUnsavedChanges - ), - handleFailsafeChangeWithTracking: createChangeTracker( - handleFailsafeChange, - setHasUnsavedChanges - ), - handleLowvramChangeWithTracking: createChangeTracker( - handleLowvramChange, - setHasUnsavedChanges - ), - handleQuantmatmulChangeWithTracking: createChangeTracker( - handleQuantmatmulChange, - setHasUnsavedChanges - ), - handleMultiuserChangeWithTracking: createChangeTracker( - handleMultiuserChange, - setHasUnsavedChanges - ), - handleMultiplayerChangeWithTracking: createChangeTracker( - handleMultiplayerChange, - setHasUnsavedChanges - ), - handleRemotetunnelChangeWithTracking: createChangeTracker( - handleRemotetunnelChange, - setHasUnsavedChanges - ), - handleNocertifyChangeWithTracking: createChangeTracker( - handleNocertifyChange, - setHasUnsavedChanges - ), - handleWebsearchChangeWithTracking: createChangeTracker( - handleWebsearchChange, - setHasUnsavedChanges - ), - handleBackendChangeWithTracking: createChangeTracker( - handleBackendChange, - setHasUnsavedChanges - ), - handleGpuDeviceChangeWithTracking: createChangeTracker( - handleGpuDeviceChange, - setHasUnsavedChanges - ), - handleGpuPlatformChangeWithTracking: createChangeTracker( - handleGpuPlatformChange, - setHasUnsavedChanges - ), - handleSdmodelChangeWithTracking: createChangeTracker( - handleSdmodelChange, - setHasUnsavedChanges - ), - handleSdt5xxlChangeWithTracking: createChangeTracker( - handleSdt5xxlChange, - setHasUnsavedChanges - ), - handleSdcliplChangeWithTracking: createChangeTracker( - handleSdcliplChange, - setHasUnsavedChanges - ), - handleSdclipgChangeWithTracking: createChangeTracker( - handleSdclipgChange, - setHasUnsavedChanges - ), - handleSdphotomakerChangeWithTracking: createChangeTracker( - handleSdphotomakerChange, - setHasUnsavedChanges - ), - handleSdvaeChangeWithTracking: createChangeTracker( - handleSdvaeChange, - setHasUnsavedChanges - ), - handleSdloraChangeWithTracking: createChangeTracker( - handleSdloraChange, - setHasUnsavedChanges - ), - }; -}; diff --git a/src/hooks/useUpdateChecker.ts b/src/hooks/useUpdateChecker.ts index 07ccafb..cdadbf0 100644 --- a/src/hooks/useUpdateChecker.ts +++ b/src/hooks/useUpdateChecker.ts @@ -1,32 +1,8 @@ import { useState, useCallback } from 'react'; import { getDisplayNameFromPath } from '@/utils/versionUtils'; +import { compareVersions } from '@/utils'; import type { InstalledVersion, DownloadItem } from '@/types/electron'; -const compareVersions = (versionA: string, versionB: string): number => { - const cleanVersion = (version: string): string => - version.replace(/^v/, '').replace(/[^0-9.]/g, ''); - - const parseVersion = (version: string): number[] => - cleanVersion(version) - .split('.') - .map((num) => parseInt(num, 10) || 0); - - const a = parseVersion(versionA); - const b = parseVersion(versionB); - const maxLength = Math.max(a.length, b.length); - - for (let i = 0; i < maxLength; i++) { - const aVal = a[i] || 0; - const bVal = b[i] || 0; - - if (aVal !== bVal) { - return aVal - bVal; - } - } - - return 0; -}; - interface UpdateInfo { currentVersion: InstalledVersion; availableUpdate: DownloadItem; diff --git a/src/main/managers/KoboldCppManager.ts b/src/main/managers/KoboldCppManager.ts index de8e7fa..9a34ca2 100644 --- a/src/main/managers/KoboldCppManager.ts +++ b/src/main/managers/KoboldCppManager.ts @@ -19,6 +19,7 @@ import { LogManager } from '@/main/managers/LogManager'; import { WindowManager } from '@/main/managers/WindowManager'; import { ROCM } from '@/constants'; import { stripAssetExtensions } from '@/utils/versionUtils'; +import { compareVersions } from '@/utils'; import type { DownloadItem } from '@/types/electron'; interface GitHubAsset { @@ -846,7 +847,7 @@ export class KoboldCppManager { const latestVersion = latestRelease.tag_name.replace(/^v/, ''); const current = currentVersion.version.replace(/^v/, ''); - const hasUpdate = this.compareVersions(current, latestVersion) < 0; + const hasUpdate = compareVersions(current, latestVersion) < 0; return { currentVersion: current, @@ -859,21 +860,6 @@ export class KoboldCppManager { } } - private compareVersions(a: string, b: string): number { - const aParts = a.split('.').map(Number); - const bParts = b.split('.').map(Number); - - for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) { - const aPart = aParts[i] || 0; - const bPart = bParts[i] || 0; - - if (aPart < bPart) return -1; - if (aPart > bPart) return 1; - } - - return 0; - } - async getLatestReleaseWithDownloadStatus(): Promise { try { const latestRelease = await this.githubService.getRawLatestRelease(); diff --git a/src/preload/index.ts b/src/preload/index.ts index 9c21655..76a688a 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,11 +1,5 @@ import { contextBridge, ipcRenderer, type IpcRendererEvent } from 'electron'; -import type { - KoboldAPI, - AppAPI, - ConfigAPI, - LogsAPI, - UpdateInfo, -} from '@/types/electron'; +import type { KoboldAPI, AppAPI, ConfigAPI, LogsAPI } from '@/types/electron'; const koboldAPI: KoboldAPI = { getInstalledVersion: () => ipcRenderer.invoke('kobold:getInstalledVersion'), @@ -83,12 +77,6 @@ const koboldAPI: KoboldAPI = { (_: IpcRendererEvent, progress: number) => callback(progress) ); }, - onUpdateAvailable: (callback) => { - ipcRenderer.on( - 'update-available', - (_: IpcRendererEvent, updateInfo: UpdateInfo) => callback(updateInfo) - ); - }, onInstallDirChanged: (callback: (newPath: string) => void) => { const handler = (_: IpcRendererEvent, newPath: string) => callback(newPath); ipcRenderer.on('install-dir-changed', handler); diff --git a/src/components/AppHeader/AppHeader.css b/src/styles/AppHeader.css similarity index 100% rename from src/components/AppHeader/AppHeader.css rename to src/styles/AppHeader.css diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index 192381d..b4dc0d6 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -145,7 +145,6 @@ export interface KoboldAPI { selectModelFile: () => Promise; stopKoboldCpp: () => void; onDownloadProgress: (callback: (progress: number) => void) => void; - onUpdateAvailable: (callback: (updateInfo: UpdateInfo) => void) => void; onInstallDirChanged: (callback: (newPath: string) => void) => () => void; onVersionsUpdated: (callback: () => void) => () => void; onKoboldOutput: (callback: (data: string) => void) => () => void; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index f7ed5c8..fcb99d7 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -26,15 +26,6 @@ export interface UpdateInfo { hasUpdate: boolean; } -export interface ReleaseWithStatus { - release: GitHubRelease; - availableAssets: Array<{ - asset: GitHubAsset; - isDownloaded: boolean; - installedVersion?: string; - }>; -} - export interface InstalledVersion { version: string; path: string; @@ -42,12 +33,6 @@ export interface InstalledVersion { size?: number; } -export interface ROCmDownload { - name: string; - url: string; - size: number; -} - export type { CPUCapabilities, GPUCapabilities, diff --git a/src/utils/clblast.ts b/src/utils/clblast.ts index a9fd5e3..b3e0535 100644 --- a/src/utils/clblast.ts +++ b/src/utils/clblast.ts @@ -11,15 +11,3 @@ export function parseCLBlastDevice(deviceString: string): { } return null; } - -export function formatCLBlastArgs( - deviceIndex: number, - platformIndex: number -): [string, string] { - return [deviceIndex.toString(), platformIndex.toString()]; -} - -export function getCLBlastDeviceName(deviceString: string): string { - const match = deviceString.match(/^(.+?)\s+\(Platform:/); - return match ? match[1].trim() : deviceString; -} diff --git a/src/utils/fileSize.ts b/src/utils/fileSize.ts index 660d801..44046d0 100644 --- a/src/utils/fileSize.ts +++ b/src/utils/fileSize.ts @@ -1,13 +1,3 @@ -export const formatFileSize = (bytes: number) => { - if (bytes === 0) return '0 Bytes'; - const k = 1024; - const sizes = ['Bytes', 'KB', 'MB', 'GB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - const sizeUnit = sizes[Math.min(i, sizes.length - 1)] || 'Bytes'; - - return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizeUnit; -}; - export const formatFileSizeInMB = (bytes: number) => { if (bytes === 0) return '0 MB'; const mb = bytes / (1024 * 1024); diff --git a/src/utils/imageModelPresets.ts b/src/utils/imageModelPresets.ts index be5f4d3..1bf6241 100644 --- a/src/utils/imageModelPresets.ts +++ b/src/utils/imageModelPresets.ts @@ -49,6 +49,3 @@ export const IMAGE_MODEL_PRESETS: ImageModelPreset[] = [ sdvae: '', }, ]; - -export const getPresetByName = (name: string): ImageModelPreset | undefined => - IMAGE_MODEL_PRESETS.find((preset) => preset.name === name); diff --git a/src/utils/index.ts b/src/utils/index.ts index 44ee491..bba0c2c 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -4,7 +4,6 @@ export * from './downloadUtils'; export * from './fileSize'; export * from './hardware'; export * from './imageModelPresets'; -export * from './nullish'; export * from './platform'; export * from './sounds'; export * from './validation'; diff --git a/src/utils/nullish.ts b/src/utils/nullish.ts deleted file mode 100644 index ebad5a1..0000000 --- a/src/utils/nullish.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const isNotNullish = (value: T | null | undefined): value is T => - value != null; - -export const isNullish = (value: unknown): value is null | undefined => - value == null;