spb/social-runtime-crawler
Public
TypeScript 91.8%
HTML 3.2%
JavaScript 3%
SQL 1.4%
CSS 0.7%
1import path from "node:path";2import fs from "node:fs";34/** Minimal .env loader (no dependency). Does not override already-set variables. */5export function loadDotEnv(cwd = process.cwd()): void {6 const file = path.join(cwd, ".env");7 if (!fs.existsSync(file)) return;8 for (const line of fs.readFileSync(file, "utf8").split("\n")) {9 const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);10 if (!m) continue;11 const key = m[1]!;12 let val = m[2]!;13 if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) val = val.slice(1, -1);14 if (process.env[key] === undefined) process.env[key] = val;15 }16}1718export interface AppConfig {19 dataDir: string;20 profilesDir: string;21 sessionsDir: string;22 platformModelDir: string;23 mediaDir: string;24 databaseUrl?: string;25 headless: boolean;26 browserChannel: string;27 llmProvider: "none" | "anthropic" | "local";28 llmModel: string;29 localLlmUrl?: string;30 localLlmKey?: string;31 localLlmModel?: string;32 dashboardPort: number;33}3435export function loadConfig(): AppConfig {36 loadDotEnv();37 const dataDir = path.resolve(process.env.SRC_DATA_DIR ?? "./data");38 const cfg: AppConfig = {39 dataDir,40 profilesDir: path.join(dataDir, "browser_profiles"),41 sessionsDir: path.join(dataDir, "sessions"),42 platformModelDir: path.join(dataDir, "platform_model"),43 mediaDir: path.join(dataDir, "media"),44 databaseUrl: process.env.SRC_DATABASE_URL || undefined,45 headless: /^(1|true|yes)$/i.test(process.env.SRC_HEADLESS ?? "false"),46 browserChannel: process.env.SRC_BROWSER_CHANNEL ?? "chromium",47 llmProvider: (process.env.SRC_LLM_PROVIDER as AppConfig["llmProvider"]) ?? "none",48 llmModel: process.env.SRC_LLM_MODEL ?? "claude-opus-5",49 localLlmUrl: process.env.SRC_LOCAL_LLM_URL,50 localLlmKey: process.env.SRC_LOCAL_LLM_KEY,51 localLlmModel: process.env.SRC_LOCAL_LLM_MODEL,52 dashboardPort: Number(process.env.SRC_DASHBOARD_PORT ?? 8340),53 };54 for (const d of [cfg.profilesDir, cfg.sessionsDir, cfg.platformModelDir, cfg.mediaDir]) fs.mkdirSync(d, { recursive: true });55 return cfg;56}57