// Paths and settings shared by the dashboard backend. // Secrets come from the project .env (same file the social-manager connector uses). import path from "node:path"; import fs from "node:fs"; import crypto from "node:crypto"; import { loadEnv, PROJECT_ROOT } from "../../connector/src/env.js"; loadEnv(); export { PROJECT_ROOT }; export const CLIENTS_DIR = path.join(PROJECT_ROOT, "clients"); export const TEMPLATE_DIR = path.join(CLIENTS_DIR, "_template"); export const DATA_DIR = process.env.QUORLA_DASHBOARD_DATA || path.join(PROJECT_ROOT, "data", "dashboard"); // override for tests export const BRANDING_DIR = path.join(PROJECT_ROOT, "branding"); export const WEB_DIST = path.join(PROJECT_ROOT, "dashboard", "web", "dist"); fs.mkdirSync(DATA_DIR, { recursive: true }); export const PORT = Number(process.env.DASHBOARD_PORT || 4310); export const AGENCY_NAME = process.env.AGENCY_NAME || "Metatroncube"; // Session signing secret. In production set DASHBOARD_SECRET; otherwise a random one is // generated per process (everyone is logged out on restart). export const SESSION_SECRET = process.env.DASHBOARD_SECRET || crypto.randomBytes(32).toString("hex"); export const SESSION_HOURS = Number(process.env.DASHBOARD_SESSION_HOURS || 12); export const COOKIE_SECURE = process.env.DASHBOARD_COOKIE_SECURE === "true"; export const ODOO = { url: (process.env.ODOO_URL || "").replace(/\/$/, ""), db: process.env.ODOO_DATABASE || process.env.ODOO_DB || "", username: process.env.ODOO_USERNAME || "", secret: process.env.ODOO_API_KEY || process.env.ODOO_PASSWORD || "", allowWrites: process.env.ODOO_ALLOW_WRITES === "true", }; // AI runs (audits, plans, reports) go through the Claude Agent SDK. export const AI = { model: process.env.DASHBOARD_AI_MODEL || "claude-opus-5-5", maxTurns: Number(process.env.DASHBOARD_AI_MAX_TURNS || 80), };