"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadConfig = loadConfig; const zod_1 = require("zod"); const dotenv_1 = __importDefault(require("dotenv")); dotenv_1.default.config(); const configSchema = zod_1.z.object({ port: zod_1.z.coerce.number().default(3001), host: zod_1.z.string().default('0.0.0.0'), nodeEnv: zod_1.z.enum(['development', 'production', 'test']).default('development'), db: zod_1.z.object({ driver: zod_1.z.enum(['sqlite', 'postgres']).default('sqlite'), path: zod_1.z.string().default('./data/abe.db'), url: zod_1.z.string().optional(), }), auth: zod_1.z.object({ secret: zod_1.z.string().min(16).default('abe-dev-secret-change-in-prod'), sessionMaxAge: zod_1.z.coerce.number().default(86400), }), storage: zod_1.z.object({ driver: zod_1.z.enum(['local', 's3']).default('local'), path: zod_1.z.string().default('./data/storage'), }), cors: zod_1.z.object({ origin: zod_1.z.string().default('http://localhost:5173') }), log: zod_1.z.object({ level: zod_1.z.enum(['debug', 'info', 'warn', 'error']).default('info') }), api: zod_1.z.object({ key: zod_1.z.string().default('abe-dev-key-123'), rateLimitWindowMs: zod_1.z.coerce.number().default(900000), rateLimitMax: zod_1.z.coerce.number().default(100), }), ai: zod_1.z.object({ provider: zod_1.z.enum(['claude', 'openai', 'ollama', 'none']).default('none'), apiKey: zod_1.z.string().default(''), autoEnrich: zod_1.z.coerce.boolean().default(false), minSeverity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).default('high'), }), jobs: zod_1.z.object({ maxConcurrentSessions: zod_1.z.coerce.number().default(3), pollIntervalMs: zod_1.z.coerce.number().default(1000), }), license: zod_1.z.object({ key: zod_1.z.string().default('') }), }); function loadConfig() { const raw = { port: process.env['ABE_PORT'] ?? process.env['PORT'], host: process.env['ABE_HOST'], nodeEnv: process.env['NODE_ENV'], db: { driver: process.env['ABE_DB_DRIVER'], path: process.env['ABE_DB_PATH'], url: process.env['ABE_DB_URL'], }, auth: { secret: process.env['ABE_AUTH_SECRET'], sessionMaxAge: process.env['ABE_SESSION_MAX_AGE'], }, storage: { driver: process.env['ABE_STORAGE_DRIVER'], path: process.env['ABE_STORAGE_PATH'], }, cors: { origin: process.env['ABE_CORS_ORIGIN'] }, log: { level: process.env['ABE_LOG_LEVEL'] }, api: { key: process.env['ABE_API_KEY'], rateLimitWindowMs: process.env['ABE_RATE_LIMIT_WINDOW_MS'], rateLimitMax: process.env['ABE_RATE_LIMIT_MAX'], }, ai: { provider: process.env['ABE_AI_PROVIDER'], apiKey: process.env['ABE_AI_API_KEY'], autoEnrich: process.env['ABE_AI_AUTO_ENRICH'], minSeverity: process.env['ABE_AI_MIN_SEVERITY'], }, jobs: { maxConcurrentSessions: process.env['ABE_JOBS_MAX_CONCURRENT'], pollIntervalMs: process.env['ABE_JOBS_POLL_INTERVAL_MS'], }, license: { key: process.env['ABE_LICENSE_KEY'] }, }; const result = configSchema.safeParse(raw); if (!result.success) { const issues = result.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('\n'); throw new Error(`Invalid configuration:\n${issues}`); } return result.data; }