// Environment variable loading and validation. export function loadConfig() { const key = process.env.OPENAI_API_KEY; if (!key) { throw new Error('Configuration error: OPENAI_API_KEY is missing.'); } const parseNum = (name, raw, fallback) => { if (raw === undefined || raw === '') return fallback; const n = Number(raw); if (isNaN(n) || !Number.isFinite(n) || n < 0) { throw new Error( `Configuration error: ${name} must be a positive number, got "${raw}".` ); } return n; }; const parseBool = (name, raw, fallback) => { if (raw === undefined || raw === '') return fallback; if (raw === 'true') return true; if (raw === 'false') return false; throw new Error( `Configuration error: ${name} must be true or false, got "${raw}".` ); }; return { openaiApiKey: key, openaiModel: process.env.OPENAI_MODEL || 'gpt-5.1', temperature: parseNum('OPENAI_TEMPERATURE', process.env.OPENAI_TEMPERATURE, 0.2), maxOutputTokens: parseNum('OPENAI_MAX_OUTPUT_TOKENS', process.env.OPENAI_MAX_OUTPUT_TOKENS, 2000), logLevel: process.env.CHATGPT_MCP_LOG_LEVEL || 'info', enableFileContext: parseBool('CHATGPT_MCP_ENABLE_FILE_CONTEXT', process.env.CHATGPT_MCP_ENABLE_FILE_CONTEXT, false), contextDir: process.env.CHATGPT_MCP_CONTEXT_DIR || './context', maxInputChars: parseNum('CHATGPT_MCP_MAX_INPUT_CHARS', process.env.CHATGPT_MCP_MAX_INPUT_CHARS, 30000), maxFileChars: parseNum('CHATGPT_MCP_MAX_FILE_CHARS', process.env.CHATGPT_MCP_MAX_FILE_CHARS, 12000), maxFiles: parseNum('CHATGPT_MCP_MAX_FILES', process.env.CHATGPT_MCP_MAX_FILES, 5), maxLogChars: parseNum('CHATGPT_MCP_MAX_LOG_CHARS', process.env.CHATGPT_MCP_MAX_LOG_CHARS, 10000), redactSecrets: parseBool('CHATGPT_MCP_REDACT_SECRETS', process.env.CHATGPT_MCP_REDACT_SECRETS, true), chatgptMcpProvider: process.env.CHATGPT_MCP_PROVIDER || 'openai', ollamaBaseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434', ollamaModel: process.env.OLLAMA_MODEL || 'qwen3:latest', ollamaTemperature: parseNum('OLLAMA_TEMPERATURE', process.env.OLLAMA_TEMPERATURE, 0.2), ollamaTimeout: parseNum('OLLAMA_TIMEOUT', process.env.OLLAMA_TIMEOUT, 60), }; }