diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b8daae..1ba5986 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -119,7 +119,8 @@ jobs: run: | gh release create ${{ steps.tag.outputs.tag }} \ --title "Gerbil ${{ steps.tag.outputs.tag }}" \ - --generate-notes + --generate-notes \ + --prerelease env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/src/constants/index.ts b/src/constants/index.ts index 9210fdc..93dbec1 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,4 +1,3 @@ -export const APP_NAME = 'gerbil'; export const PRODUCT_NAME = 'Gerbil'; export const CONFIG_FILE_NAME = 'config.json'; diff --git a/src/main/cli.ts b/src/main/cli.ts index d1b69f6..1b54ec1 100644 --- a/src/main/cli.ts +++ b/src/main/cli.ts @@ -1,34 +1,14 @@ /* eslint-disable no-console */ import { spawn } from 'child_process'; -import { join } from 'path'; -import { homedir } from 'os'; -import { PRODUCT_NAME, CONFIG_FILE_NAME } from '@/constants'; import { terminateProcess } from '@/utils/process'; import { pathExists, readJsonFile } from '@/utils/fs'; +import { getConfigDir } from '@/utils/path'; export class LightweightCliHandler { - private getConfigDir(appName: string): string { - const platform = process.platform; - const home = homedir(); - - switch (platform) { - case 'win32': - return join(home, 'AppData', 'Roaming', appName); - case 'darwin': - return join(home, 'Library', 'Application Support', appName); - default: - return join(home, '.config', appName); - } - } - - private getConfigPath(): string { - return join(this.getConfigDir(PRODUCT_NAME), CONFIG_FILE_NAME); - } - private async getCurrentKoboldBinary(): Promise { try { - const configPath = this.getConfigPath(); + const configPath = getConfigDir(); if (!(await pathExists(configPath))) { return null; } diff --git a/src/main/gui.ts b/src/main/gui.ts index 41450d5..a4e2d86 100644 --- a/src/main/gui.ts +++ b/src/main/gui.ts @@ -9,9 +9,10 @@ import { SillyTavernManager } from '@/main/managers/SillyTavernManager'; import { HardwareManager } from '@/main/managers/HardwareManager'; import { BinaryManager } from '@/main/managers/BinaryManager'; import { IPCHandlers } from '@/main/ipc'; -import { PRODUCT_NAME, CONFIG_FILE_NAME } from '@/constants'; +import { PRODUCT_NAME } from '@/constants'; import { homedir } from 'os'; import { ensureDir } from '@/utils/fs'; +import { getConfigDir } from '@/utils/path'; export class GerbilApp { private windowManager: WindowManager; @@ -27,10 +28,7 @@ export class GerbilApp { this.logManager = new LogManager(); this.logManager.setupGlobalErrorHandlers(); - this.configManager = new ConfigManager( - this.getConfigPath(), - this.logManager - ); + this.configManager = new ConfigManager(getConfigDir(), this.logManager); this.windowManager = new WindowManager(); this.hardwareManager = new HardwareManager(this.logManager); @@ -61,28 +59,23 @@ export class GerbilApp { ); } - private getConfigPath() { - return join(app.getPath('userData'), CONFIG_FILE_NAME); - } - - private getDefaultInstallDir(appName: string): string { + private getDefaultInstallDir(): string { const platform = process.platform; const home = homedir(); switch (platform) { case 'win32': - return join(home, appName); + return join(home, PRODUCT_NAME); case 'darwin': - return join(home, 'Applications', appName); + return join(home, 'Applications', PRODUCT_NAME); default: - return join(home, '.local', 'share', appName); + return join(home, '.local', 'share', PRODUCT_NAME); } } private async ensureInstallDirectory(): Promise { const installDir = - this.configManager.getInstallDir() || - this.getDefaultInstallDir(PRODUCT_NAME); + this.configManager.getInstallDir() || this.getDefaultInstallDir(); if (!this.configManager.getInstallDir()) { await this.configManager.setInstallDir(installDir); diff --git a/src/main/managers/BinaryManager.ts b/src/main/managers/BinaryManager.ts index 24bf574..73bbbd0 100644 --- a/src/main/managers/BinaryManager.ts +++ b/src/main/managers/BinaryManager.ts @@ -1,18 +1,9 @@ import { join, dirname } from 'path'; +import { pathExists } from '@/utils/fs'; import { LogManager } from '@/main/managers/LogManager'; import type { KoboldCppManager } from '@/main/managers/KoboldCppManager'; import type { HardwareManager } from '@/main/managers/HardwareManager'; -import type { BackendOption } from '@/types'; -import { pathExists } from '@/utils/fs'; - -export interface BackendSupport { - rocm: boolean; - vulkan: boolean; - clblast: boolean; - noavx2: boolean; - failsafe: boolean; - cuda: boolean; -} +import type { BackendOption, BackendSupport } from '@/types'; export class BinaryManager { private backendSupportCache = new Map(); diff --git a/src/types/electron.d.ts b/src/types/electron.d.ts index b26a942..cb6ab76 100644 --- a/src/types/electron.d.ts +++ b/src/types/electron.d.ts @@ -4,7 +4,7 @@ import type { BasicGPUInfo, GPUMemoryInfo, } from '@/types/hardware'; -import type { BackendOption } from '@/types'; +import type { BackendOption, BackendSupport } from '@/types'; export interface GitHubAsset { name: string; @@ -43,7 +43,6 @@ export interface ReleaseWithStatus { export interface InstalledVersion { version: string; path: string; - type: 'github' | 'rocm'; filename: string; size?: number; } @@ -103,14 +102,7 @@ export interface KoboldAPI { detectGPUCapabilities: () => Promise; detectGPUMemory: () => Promise; detectROCm: () => Promise<{ supported: boolean; devices: string[] }>; - detectBackendSupport: () => Promise<{ - rocm: boolean; - vulkan: boolean; - clblast: boolean; - noavx2: boolean; - failsafe: boolean; - cuda: boolean; - } | null>; + detectBackendSupport: () => Promise; getAvailableBackends: (includeDisabled?: boolean) => Promise; getCurrentInstallDir: () => Promise; selectInstallDirectory: () => Promise; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 8b62111..db58648 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -52,3 +52,12 @@ export interface BackendOption extends SelectOption { devices?: string[]; disabled?: boolean; } + +export interface BackendSupport { + rocm: boolean; + vulkan: boolean; + clblast: boolean; + noavx2: boolean; + failsafe: boolean; + cuda: boolean; +} diff --git a/src/utils/path.ts b/src/utils/path.ts new file mode 100644 index 0000000..d996264 --- /dev/null +++ b/src/utils/path.ts @@ -0,0 +1,21 @@ +import { join } from 'path'; +import { homedir } from 'os'; +import { PRODUCT_NAME, CONFIG_FILE_NAME } from '@/constants'; + +export function getConfigDir(): string { + return join(getConfigDirPath(), CONFIG_FILE_NAME); +} + +function getConfigDirPath(): string { + const platform = process.platform; + const home = homedir(); + + switch (platform) { + case 'win32': + return join(home, 'AppData', 'Roaming', PRODUCT_NAME); + case 'darwin': + return join(home, 'Library', 'Application Support', PRODUCT_NAME); + default: + return join(home, '.config', PRODUCT_NAME); + } +} diff --git a/src/utils/paths.ts b/src/utils/paths.ts deleted file mode 100644 index 4df0629..0000000 --- a/src/utils/paths.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { join } from 'path'; - -export function getPlatformPathFromWindowsPath( - basePath: string, - windowsBinaryPath: string -): string { - const binaryName = - process.platform === 'win32' - ? windowsBinaryPath - : windowsBinaryPath.replace(/\.[^.]*$/, ''); - return join(basePath, 'node_modules', '.bin', binaryName); -}