import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { homedir } from 'node:os'; import { dirname, join } from 'node:path'; import type { OkraPiConfig } from './types.js'; export function configPath(): string { if (process.env.PDF_PARSE_CONFIG) return process.env.PDF_PARSE_CONFIG; if (process.env.OKRA_PI_CONFIG) return process.env.OKRA_PI_CONFIG; const agentDir = process.env.PI_CODING_AGENT_DIR ?? join(homedir(), '.pi', 'agent'); return join(agentDir, 'pdf-parse.json'); } export async function readConfig(path = configPath()): Promise { try { const parsed: unknown = JSON.parse(await readFile(path, 'utf8')); if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { return { aliases: {} }; } const record = parsed as Record; const aliases: Record = {}; if (record.aliases && typeof record.aliases === 'object' && !Array.isArray(record.aliases)) { for (const [name, value] of Object.entries(record.aliases as Record)) { if (typeof value === 'string') aliases[name] = value; } } return { ...(typeof record.defaultModel === 'string' ? { defaultModel: record.defaultModel } : {}), aliases, }; } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') { if (path === configPath() && !process.env.PDF_PARSE_CONFIG && !process.env.OKRA_PI_CONFIG) { const legacyPath = join(dirname(path), 'okra.json'); if (legacyPath !== path) { try { return await readConfig(legacyPath); } catch (legacyError) { if ((legacyError as NodeJS.ErrnoException).code !== 'ENOENT') throw legacyError; } } } return { aliases: {} }; } throw error; } } export async function writeConfig(config: OkraPiConfig, path = configPath()): Promise { await mkdir(dirname(path), { recursive: true, mode: 0o700 }); await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 }); }