File size: 1,725 Bytes
149698e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f67c466
149698e
 
 
47b1169
149698e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import { z } from 'zod';
import dotenv from 'dotenv';
import { resolve, dirname } from 'path';
import { fileURLToPath } from 'url';

const __dirname = dirname(fileURLToPath(import.meta.url));
// Load .env from monorepo root (3 levels up from src/config/)
dotenv.config({ path: resolve(__dirname, '../../../../.env') });

const envSchema = z.object({
  PORT: z.coerce.number().default(3001),
  DATABASE_URL: z.string().default('sqlite.db'),
  JWT_SECRET: z.string().default('dev-secret-change-in-production-min32chars'),
  VITE_GOOGLE_CLIENT_ID: z.string().optional(),
  GOOGLE_CLIENT_SECRET: z.string().optional(),

  // AI Provider routing
  AI_PRIMARY_PROVIDER: z.string().default('groq'),
  AI_FALLBACK_PROVIDER: z.string().default('mistral'),
  AI_AUTO_ROTATE: z.coerce.boolean().default(true),
  AI_TIER: z.enum(['free', 'paid']).default('free'),

  // Groq (free tier)
  GROQ_API_KEY: z.string().optional(),
  GROQ_MODEL: z.string().default('llama-3.3-70b-versatile'),

  // Mistral (free tier)
  MISTRAL_API_KEY: z.string().optional(),
  MISTRAL_MODEL: z.string().default('mistral-small-latest'),

  // Other AI keys (paid / optional)
  AI_PROVIDER: z
    .enum(['groq', 'mistral', 'anthropic', 'openai', 'google', 'openrouter', 'ollama'])
    .default('groq'),
  ANTHROPIC_API_KEY: z.string().optional(),
  OPENAI_API_KEY: z.string().optional(),
  GOOGLE_AI_API_KEY: z.string().optional(),
  OPENROUTER_API_KEY: z.string().optional(),
  OLLAMA_BASE_URL: z.string().default('http://localhost:11434'),

  APP_URL: z.string().default('http://localhost:5173'),
  SCAN_INTERVAL_MINUTES: z.coerce.number().default(5),
});

export const config = envSchema.parse(process.env);
export type Config = z.infer<typeof envSchema>;