Files
DeskClaw/electron/utils/store.ts
Haze af76b28286 fix(gateway): use GitHub URL for OpenClaw submodule and add token auth
- Change submodule URL from local path to https://github.com/openclaw/openclaw.git
- Checkout stable version v2026.2.3
- Add auto-generated gateway token (clawx-xxx) stored in electron-store
- Pass token via --token argument and OPENCLAW_GATEWAY_TOKEN env var
- Include token in WebSocket URL for authentication
- Add --dev and --allow-unconfigured flags for first-time setup
2026-02-06 00:50:19 +08:00

149 lines
3.0 KiB
TypeScript

/**
* Persistent Storage
* Electron-store wrapper for application settings
*/
import { randomBytes } from 'crypto';
// Lazy-load electron-store (ESM module)
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;
// 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(),
// 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<AppSettings>({
name: 'settings',
defaults,
});
}
return settingsStoreInstance;
}
/**
* Get a setting value
*/
export async function getSetting<K extends keyof AppSettings>(key: K): Promise<AppSettings[K]> {
const store = await getSettingsStore();
return store.get(key);
}
/**
* Set a setting value
*/
export async function setSetting<K extends keyof AppSettings>(
key: K,
value: AppSettings[K]
): Promise<void> {
const store = await getSettingsStore();
store.set(key, value);
}
/**
* Get all settings
*/
export async function getAllSettings(): Promise<AppSettings> {
const store = await getSettingsStore();
return store.store;
}
/**
* Reset settings to defaults
*/
export async function resetSettings(): Promise<void> {
const store = await getSettingsStore();
store.clear();
}
/**
* Export settings to JSON
*/
export async function exportSettings(): Promise<string> {
const store = await getSettingsStore();
return JSON.stringify(store.store, null, 2);
}
/**
* Import settings from JSON
*/
export async function importSettings(json: string): Promise<void> {
try {
const settings = JSON.parse(json);
const store = await getSettingsStore();
store.set(settings);
} catch (error) {
throw new Error('Invalid settings JSON');
}
}