import { readFileSync } from "node:fs"; import { join } from "node:path"; import { getAgentDir } from "@earendil-works/pi-coding-agent"; import type { DarkOrLightConfig, LoadedSettings } from "./types.js"; function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); } function readJsonFile(filePath: string): Record { try { const parsed = JSON.parse(readFileSync(filePath, "utf-8")); return isRecord(parsed) ? parsed : {}; } catch { return {}; } } function normalizeDarkOrLightConfig(value: unknown): DarkOrLightConfig | undefined { if (!isRecord(value)) return undefined; const dark = typeof value.dark === "string" && value.dark.trim() ? value.dark.trim() : undefined; const light = typeof value.light === "string" && value.light.trim() ? value.light.trim() : undefined; const defaultMode = value.default === "dark" || value.default === "light" ? value.default : undefined; if (!dark && !light && !defaultMode) return undefined; return { dark, light, default: defaultMode }; } function readDarkOrLightConfig(filePath: string): DarkOrLightConfig | undefined { const settings = readJsonFile(filePath); return normalizeDarkOrLightConfig(settings["dark-or-light"] ?? settings.darkOrLight); } export function loadSettings(cwd: string): LoadedSettings { const globalSettingsPath = join(getAgentDir(), "settings.json"); const projectSettingsPath = join(cwd, ".pi", "settings.json"); const darkOrLight = { ...readDarkOrLightConfig(globalSettingsPath), ...readDarkOrLightConfig(projectSettingsPath), }; return { darkOrLight: Object.keys(darkOrLight).length > 0 ? darkOrLight : undefined, }; }