/** * Common utilities and state for setup routes */ import { createLogger } from '@automaker/utils'; import path from 'path'; import fs from 'fs/promises'; import { getErrorMessage as getErrorMessageShared, createLogError } from '../common.js'; const logger = createLogger('Setup'); // Storage for API keys (in-memory cache) - private const apiKeys: Record = {}; /** * Get an API key for a provider */ export function getApiKey(provider: string): string | undefined { return apiKeys[provider]; } /** * Set an API key for a provider */ export function setApiKey(provider: string, key: string): void { apiKeys[provider] = key; } /** * Get all API keys (for read-only access) */ export function getAllApiKeys(): Record { return { ...apiKeys }; } /** * Helper to persist API keys to .env file */ export async function persistApiKeyToEnv(key: string, value: string): Promise { const envPath = path.join(process.cwd(), '.env'); try { let envContent = ''; try { envContent = await fs.readFile(envPath, 'utf-8'); } catch { // .env file doesn't exist, we'll create it } // Parse existing env content const lines = envContent.split('\n'); const keyRegex = new RegExp(`^${key}=`); let found = false; const newLines = lines.map((line) => { if (keyRegex.test(line)) { found = true; return `${key}=${value}`; } return line; }); if (!found) { // Add the key at the end newLines.push(`${key}=${value}`); } await fs.writeFile(envPath, newLines.join('\n')); logger.info(`[Setup] Persisted ${key} to .env file`); } catch (error) { logger.error(`[Setup] Failed to persist ${key} to .env:`, error); throw error; } } // Re-export shared utilities export { getErrorMessageShared as getErrorMessage }; export const logError = createLogError(logger);