- Отвечает только администраторам из ADMIN_IDS - Личности на чат: встроенные и пользовательские (/personas, /persona, /persona_add, /persona_del) - Вопросы через /ask, упоминание, ответ боту или личку - Сохраняет сообщения чата в SQLite; агент по просьбе читает их инструментом read_chat_messages - Модели через OpenRouter (по умолчанию DeepSeek) - Слои: libs, repositories, services, bot/handlers - Dockerfile для деплоя в Dokploy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.9 KiB
2.9 KiB
Boltun AI
Telegram-бот на Node.js + TypeScript + grammY, AI через Mastra (модели через OpenRouter, например DeepSeek). Хранилище — SQLite (better-sqlite3).
Команды
pnpm dev— запуск с автоперезагрузкой (читает.env)pnpm typecheck— проверка типовpnpm build/pnpm start— сборка вdist/и запуск- Node.js 24 (
.nvmrc); Mastra требует Node >= 22.13
Архитектура
Зависимости идут сверху вниз: bot → services → repositories → libs. Сборка всех слоёв (composition root) — в src/index.ts.
src/
index.ts — создание зависимостей и запуск бота
config.ts — чтение и валидация env
types.ts — доменные типы (Persona, ChatMessage)
constants/ — встроенные личности и прочие константы
libs/ — инфраструктура без бизнес-логики (SQLite, форматирование Telegram-сообщений)
repositories/ — только SQL и маппинг строк в доменные типы, по репозиторию на таблицу
services/ — бизнес-логика; зависят от репозиториев, не знают про grammY
assistant/ — AI на Mastra: агент, промпты, tools
bot/ — grammY: сборка бота, общие хелперы ответа
handlers/ — тонкие Composer'ы: разбор команды → вызов сервиса → ответ
- Каждый модуль — фабрика
createX(deps), тип экспортируется какReturnType<typeof createX>. - Хендлеры не ходят в репозитории напрямую — только через сервисы.
- Правила доступа (только админы) — в
bot/create-bot.tsчерезbot.filter.
Стиль кода
- Пиши функционально: стрелочные функции и фабрики (
const createX = (...) => ({ ... })), без классов. - Не используй ключевое слово
function— толькоconst fn = (...) => .... - Не используй
let(иvar) — толькоconst; вместо циклов с мутацией —map/filter/reduce/рекурсия. - Отделяй пустой строкой объявления констант и логические блоки друг от друга.
- Импорты локальных файлов — с расширением
.js(ESM,module: NodeNext). - Тексты для пользователей бота и комментарии — на русском.