// Configuration persistence — ~/.pi/pi-search-kit/config.json // // Env vars take precedence over config file values: // TAVILY_API_KEY, ANYSEARCH_API_KEY, JINA_API_KEY, EXA_API_KEY, SERPER_API_KEY, // FIRECRAWL_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, IFLOW_API_KEY import { existsSync, readFileSync } from "node:fs"; import { homedir } from "node:os"; import { join } from "node:path"; const CONFIG_DIR = join(homedir(), ".pi", "pi-search-kit"); const CONFIG_PATH = join(CONFIG_DIR, "config.json"); export interface SearchConfig { apiKeys?: Record; defaults?: { max_results?: number; }; } const DEFAULT_CONFIG: SearchConfig = {}; export function loadConfig(configPath = CONFIG_PATH): SearchConfig { if (!existsSync(configPath)) return { ...DEFAULT_CONFIG }; try { const raw = readFileSync(configPath, "utf-8"); return { ...DEFAULT_CONFIG, ...(JSON.parse(raw) as SearchConfig) }; } catch (err) { console.error("Failed to parse config.json:", err instanceof Error ? err.message : err); return { ...DEFAULT_CONFIG }; } } export function resolveApiKey(name: string, envVar: string, config: SearchConfig): string | undefined { // env var wins const envKey = process.env[envVar]?.trim(); if (envKey) return envKey; // config file return config.apiKeys?.[name]?.trim() || undefined; }