import fs from "node:fs"; import path from "node:path"; import type { FleetConfig, TaskTemplate } from "@/lib/types"; export const OPENCLAW_RUNTIME_ROOT = process.env.OPENCLAW_RUNTIME_ROOT || "/home/bear/.openclaw"; export const OPENCLAW_AGENTS_DIR = process.env.AGENTS_DIR || "/home/bear/.openclaw/agents"; export const OPENCLAW_CONFIG_PATH = process.env.OPENCLAW_CONFIG || "/home/bear/.openclaw/openclaw.json"; export const SWARM_TASKS_FILE = process.env.SWARM_TASKS_FILE || "/app/swarm/active-tasks.json"; export const SWARM_REPO_MAP_FILE = process.env.SWARM_REPO_MAP_FILE || "/app/swarm/repo-map.json"; export const SWARM_WORKTREES_DIR = process.env.SWARM_WORKTREES_DIR || "/app/swarm/worktrees"; export const REPO_ACCESS_ROOTS = (process.env.REPO_ACCESS_ROOTS || "/srv/apps,/home/bear") .split(",") .map((entry) => entry.trim()) .filter(Boolean); export const ZEROCLAW_PRIMARY_DIR = process.env.ZEROCLAW_PRIMARY_DIR || "/app/zeroclaw/grizzley"; export const ZEROCLAW_CONTROL_DIR = process.env.ZEROCLAW_CONTROL_DIR || "/app/zeroclaw/ice"; export const ZEROCLAW_WEBHOOK_TIMEOUT_MS = Number(process.env.ZEROCLAW_WEBHOOK_TIMEOUT_MS || "15000"); const CONFIG_DIR = path.join(process.cwd(), "config"); const FLEET_CONFIG_PATH = path.join(CONFIG_DIR, "fleet.json"); const TASK_TEMPLATE_PATH = path.join(CONFIG_DIR, "task-templates.json"); function readJsonFile(filePath: string, fallback: T): T { try { return JSON.parse(fs.readFileSync(filePath, "utf8")) as T; } catch { return fallback; } } export const FLEET_CONFIG = readJsonFile(FLEET_CONFIG_PATH, { title: "Claw Fleet Architecture", overview: [], topologyDiagram: "", sections: [], zeroclawAgents: [], }); export const TASK_TEMPLATES = readJsonFile(TASK_TEMPLATE_PATH, []); export const ARCHITECTURE_DOCUMENT = { generatedAt: new Date().toISOString(), title: FLEET_CONFIG.title, overview: FLEET_CONFIG.overview, sections: FLEET_CONFIG.sections, topologyDiagram: FLEET_CONFIG.topologyDiagram, };