import { logger } from "./logger.js"; import { pool } from "./db.js"; import { startHealthServer, setSessionCountsProvider } from "./health.js"; import { sessionManager } from "./whatsapp/session-manager.js"; import { startBoss, stopBoss } from "./scheduler/pgboss-client.js"; import { registerReminderJobs } from "./scheduler/reminder-jobs.js"; import { startCommandConsumer, registerDefaultHandlers, } from "./ipc/command-consumer.js"; import { sweepStalePendingAccounts } from "./ipc/pair-handler.js"; async function main(): Promise { logger.info("bot starting"); const health = startHealthServer(); setSessionCountsProvider(() => sessionManager.getCounts()); const boss = await startBoss(); await registerReminderJobs(boss); registerDefaultHandlers(); const stopConsumer = await startCommandConsumer(); await sweepStalePendingAccounts(); await sessionManager.resumeFromDb(); const shutdown = async (signal: string): Promise => { logger.info({ signal }, "shutting down"); await stopConsumer(); await sessionManager.stopAll(); await stopBoss(); health.close(); await pool.end(); process.exit(0); }; process.on("SIGINT", () => void shutdown("SIGINT")); process.on("SIGTERM", () => void shutdown("SIGTERM")); logger.info("bot ready"); } main().catch((err) => { logger.fatal({ err }, "bot failed to start"); process.exit(1); });