Исходный код agent-hub: API-сервер, ядро запуска агентов, Telegram-канал, база данных, определения агентов. Настроен .gitignore для node_modules, dist, data и .env. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
86 lines
3.1 KiB
TypeScript
86 lines
3.1 KiB
TypeScript
import { config } from "dotenv";
|
||
config();
|
||
|
||
import { getDb, registerAgent, logActivity } from "./core/database.js";
|
||
import { startApiServer } from "./api/server.js";
|
||
import { startTelegram, notifyFounder } from "./channels/telegram.js";
|
||
import { AGENT_ROSTER } from "./agents/definitions.js";
|
||
import { runAgent } from "./core/agent-runner.js";
|
||
import { logger } from "./utils/logger.js";
|
||
|
||
async function main() {
|
||
logger.info(`
|
||
╔══════════════════════════════════════════════╗
|
||
║ Верный вектор — Agent Hub v0.2.0 ║
|
||
║ AI-first Software Development Company ║
|
||
╚══════════════════════════════════════════════╝`);
|
||
|
||
// 1. БД
|
||
logger.info("Initializing database...");
|
||
getDb();
|
||
|
||
// 2. Регистрация агентов
|
||
logger.info(`Registering ${AGENT_ROSTER.length} agents...`);
|
||
for (const agent of AGENT_ROSTER) {
|
||
registerAgent(agent);
|
||
logger.info(` + ${agent.name} (${agent.id})`);
|
||
}
|
||
|
||
// 3. API
|
||
const port = parseInt(process.env.API_PORT || "18800");
|
||
startApiServer(port);
|
||
|
||
// 4. Telegram
|
||
startTelegram();
|
||
|
||
// 5. Планировщик
|
||
startScheduler();
|
||
|
||
logActivity("system", "hub:start", undefined, "Agent Hub v0.2.0 started");
|
||
logger.info("All systems operational.");
|
||
|
||
// Уведомляем основателя
|
||
setTimeout(() => {
|
||
notifyFounder("Верный вектор запущен. Все агенты на месте. Жду команд.");
|
||
}, 3000);
|
||
|
||
process.on("SIGINT", () => { logger.info("Shutdown"); process.exit(0); });
|
||
process.on("SIGTERM", () => { logger.info("Shutdown"); process.exit(0); });
|
||
}
|
||
|
||
function startScheduler() {
|
||
// DevOps: каждые 30 мин
|
||
setInterval(async () => {
|
||
try {
|
||
const result = await runAgent("devops-agent",
|
||
"Проверь здоровье сервера: CPU, RAM, диск, Docker, сервисы. Если проблемы — алерт.",
|
||
"Плановая проверка"
|
||
);
|
||
if (result.response.toLowerCase().includes("критич") || result.response.toLowerCase().includes("ошибк")) {
|
||
await notifyFounder("⚠️ DevOps нашёл проблему:\n\n" + result.response);
|
||
}
|
||
} catch (e: any) {
|
||
logger.error("DevOps check failed", { error: e.message });
|
||
}
|
||
}, 30 * 60 * 1000);
|
||
|
||
// Координатор: каждый час
|
||
setInterval(async () => {
|
||
try {
|
||
await runAgent("coordinator",
|
||
"Обзор: статус проектов, незавершённые задачи, новые сообщения. Если есть блокеры — прими меры.",
|
||
"Плановый обзор"
|
||
);
|
||
} catch (e: any) {
|
||
logger.error("Coordinator review failed", { error: e.message });
|
||
}
|
||
}, 60 * 60 * 1000);
|
||
|
||
logger.info("Scheduler: DevOps/30min, Coordinator/60min");
|
||
}
|
||
|
||
main().catch((err) => {
|
||
logger.error("Fatal", { error: err.message, stack: err.stack });
|
||
process.exit(1);
|
||
});
|