/** * Persistent Storage * Electron-store wrapper for application settings */ import { randomBytes } from 'crypto'; // Lazy-load electron-store (ESM module) // eslint-disable-next-line @typescript-eslint/no-explicit-any let settingsStoreInstance: any = null; /** * Generate a random token for gateway authentication */ function generateToken(): string { return `clawx-${randomBytes(16).toString('hex')}`; } /** * Application settings schema */ export interface AppSettings { // General theme: 'light' | 'dark' | 'system'; language: string; startMinimized: boolean; launchAtStartup: boolean; // Gateway gatewayAutoStart: boolean; gatewayPort: number; gatewayToken: string; proxyEnabled: boolean; proxyServer: string; proxyHttpServer: string; proxyHttpsServer: string; proxyAllServer: string; proxyBypassRules: string; gatewayTransportPreference: 'ws-first' | 'http-first' | 'ws-only' | 'http-only' | 'ipc-only'; // Update updateChannel: 'stable' | 'beta' | 'dev'; autoCheckUpdate: boolean; autoDownloadUpdate: boolean; skippedVersions: string[]; // UI State sidebarCollapsed: boolean; devModeUnlocked: boolean; // Presets selectedBundles: string[]; enabledSkills: string[]; disabledSkills: string[]; } /** * Default settings */ const defaults: AppSettings = { // General theme: 'system', language: 'en', startMinimized: false, launchAtStartup: false, // Gateway gatewayAutoStart: true, gatewayPort: 18789, gatewayToken: generateToken(), proxyEnabled: false, proxyServer: '', proxyHttpServer: '', proxyHttpsServer: '', proxyAllServer: '', proxyBypassRules: ';localhost;127.0.0.1;::1', gatewayTransportPreference: 'ws-first', // Update updateChannel: 'stable', autoCheckUpdate: true, autoDownloadUpdate: false, skippedVersions: [], // UI State sidebarCollapsed: false, devModeUnlocked: false, // Presets selectedBundles: ['productivity', 'developer'], enabledSkills: [], disabledSkills: [], }; /** * Get the settings store instance (lazy initialization) */ async function getSettingsStore() { if (!settingsStoreInstance) { const Store = (await import('electron-store')).default; settingsStoreInstance = new Store({ name: 'settings', defaults, }); } return settingsStoreInstance; } /** * Get a setting value */ export async function getSetting(key: K): Promise { const store = await getSettingsStore(); return store.get(key); } /** * Set a setting value */ export async function setSetting( key: K, value: AppSettings[K] ): Promise { const store = await getSettingsStore(); store.set(key, value); } /** * Get all settings */ export async function getAllSettings(): Promise { const store = await getSettingsStore(); return store.store; } /** * Reset settings to defaults */ export async function resetSettings(): Promise { const store = await getSettingsStore(); store.clear(); } /** * Export settings to JSON */ export async function exportSettings(): Promise { const store = await getSettingsStore(); return JSON.stringify(store.store, null, 2); } /** * Import settings from JSON */ export async function importSettings(json: string): Promise { try { const settings = JSON.parse(json); const store = await getSettingsStore(); store.set(settings); } catch { throw new Error('Invalid settings JSON'); } }