import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'; import { homedir } from 'node:os'; import { join } from 'node:path'; const CONFIG_DIR = join(homedir(), '.qwen-s'); const CONFIG_FILE = join(CONFIG_DIR, 'config.json'); interface ScannerConfig { api_key?: unknown; } function readConfig(): ScannerConfig { if (!existsSync(CONFIG_FILE)) { return {}; } try { const raw = readFileSync(CONFIG_FILE, 'utf8'); const parsed = JSON.parse(raw) as ScannerConfig; if (parsed !== null && typeof parsed === 'object') { return parsed; } } catch { // If config is corrupted, treat as empty and allow overwriting. } return {}; } function writeConfigAtomic(config: ScannerConfig): void { const payload = `${JSON.stringify(config, null, 2)}\n`; const tempFile = join(CONFIG_DIR, `config.${process.pid}.tmp`); writeFileSync(tempFile, payload, { encoding: 'utf8', mode: 0o600 }); renameSync(tempFile, CONFIG_FILE); } export function saveApiKey(key: string): void { const normalized = key.trim(); if (normalized.length === 0) { throw new Error('API key cannot be empty.'); } mkdirSync(CONFIG_DIR, { recursive: true }); const current = readConfig(); const next: ScannerConfig = { ...current, api_key: normalized, }; writeConfigAtomic(next); } export function loadApiKey(): string | null { const config = readConfig(); if (typeof config.api_key !== 'string') { return null; } const normalized = config.api_key.trim(); return normalized.length > 0 ? normalized : null; }