import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; import { homedir } from "os"; import { dirname, join } from "path"; export interface Settings { lastChangelogVersion?: string; defaultProvider?: string; defaultModel?: string; defaultThinkingLevel?: "off" | "minimal" | "low" | "medium" | "high"; queueMode?: "all" | "one-at-a-time"; theme?: string; } export class SettingsManager { private settingsPath: string; private settings: Settings; constructor(baseDir?: string) { const dir = baseDir || join(homedir(), ".pi", "agent"); this.settingsPath = join(dir, "settings.json"); this.settings = this.load(); } private load(): Settings { if (!existsSync(this.settingsPath)) { return {}; } try { const content = readFileSync(this.settingsPath, "utf-8"); return JSON.parse(content); } catch (error) { console.error(`Warning: Could not read settings file: ${error}`); return {}; } } private save(): void { try { // Ensure directory exists const dir = dirname(this.settingsPath); if (!existsSync(dir)) { mkdirSync(dir, { recursive: true }); } writeFileSync(this.settingsPath, JSON.stringify(this.settings, null, 2), "utf-8"); } catch (error) { console.error(`Warning: Could not save settings file: ${error}`); } } getLastChangelogVersion(): string | undefined { return this.settings.lastChangelogVersion; } setLastChangelogVersion(version: string): void { this.settings.lastChangelogVersion = version; this.save(); } getDefaultProvider(): string | undefined { return this.settings.defaultProvider; } getDefaultModel(): string | undefined { return this.settings.defaultModel; } setDefaultProvider(provider: string): void { this.settings.defaultProvider = provider; this.save(); } setDefaultModel(modelId: string): void { this.settings.defaultModel = modelId; this.save(); } setDefaultModelAndProvider(provider: string, modelId: string): void { this.settings.defaultProvider = provider; this.settings.defaultModel = modelId; this.save(); } getQueueMode(): "all" | "one-at-a-time" { return this.settings.queueMode || "one-at-a-time"; } setQueueMode(mode: "all" | "one-at-a-time"): void { this.settings.queueMode = mode; this.save(); } getTheme(): string | undefined { return this.settings.theme; } setTheme(theme: string): void { this.settings.theme = theme; this.save(); } getDefaultThinkingLevel(): "off" | "minimal" | "low" | "medium" | "high" | undefined { return this.settings.defaultThinkingLevel; } setDefaultThinkingLevel(level: "off" | "minimal" | "low" | "medium" | "high"): void { this.settings.defaultThinkingLevel = level; this.save(); } }