import * as path from "path"; import { loadEnv, loadDisclawConfig } from "./config/loader"; import { DisclawDatabase } from "./db/database"; import { startBot } from "./bot"; import { acquireLock } from "./runtime/lockfile"; const ROOT_DIR = path.resolve(__dirname, ".."); async function main(): Promise { console.log("DisClaw starting..."); // 1. Load configuration const envConfig = loadEnv(ROOT_DIR); const disclawConfig = loadDisclawConfig(ROOT_DIR); console.log( `Config loaded. Workspaces root: ${disclawConfig.workspaces_root}` ); // 2. Acquire startup lock (before DB init) const lockRelease = await acquireLock( path.join(disclawConfig.workspaces_root, ".disclaw.lock") ); // 3. Initialize database const dbPath = path.join(ROOT_DIR, "data", "disclaw.db"); const db = new DisclawDatabase(dbPath); console.log(`Database initialized at ${dbPath}`); // 4. Start Discord bot await startBot(envConfig, disclawConfig, db); // Graceful shutdown const shutdown = (): void => { console.log("\nShutting down..."); db.close(); lockRelease(); process.exit(0); }; process.on("SIGINT", shutdown); process.on("SIGTERM", shutdown); } main().catch((err) => { console.error("Fatal error:", err); process.exit(1); });