import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; import { dirname, join } from "node:path"; import { homedir } from "node:os"; import { getModelById, MODELS } from "./registry/models.js"; import { getTuiById, TUIS } from "./registry/tuis.js"; import type { ModelDef } from "./registry/models.js"; import type { TuiDef } from "./registry/tuis.js"; export interface RuntimeConfig { chatModel: string; autocompleteModel: string; tui: string; } const CONFIG_PATH = join(homedir(), ".config", "localcode", "config.json"); const DEFAULTS: RuntimeConfig = { chatModel: "gpt-oss", autocompleteModel: "qwen-1.5b-autocomplete", tui: "aider", }; export function loadConfig(): RuntimeConfig { try { const raw = readFileSync(CONFIG_PATH, "utf-8"); const parsed = JSON.parse(raw) as Partial; return { ...DEFAULTS, ...parsed }; } catch { return { ...DEFAULTS }; } } export function saveConfig(config: RuntimeConfig): void { mkdirSync(dirname(CONFIG_PATH), { recursive: true }); writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n"); } export function getActiveChatModel(): ModelDef { const config = loadConfig(); return getModelById(config.chatModel) ?? MODELS[0]!; } export function getActiveAutocompleteModel(): ModelDef { const config = loadConfig(); return ( getModelById(config.autocompleteModel) ?? MODELS.find((m) => m.role === "autocomplete")! ); } export function getActiveTui(): TuiDef { const config = loadConfig(); return getTuiById(config.tui) ?? TUIS[0]!; }