Telegram-бот Boltun AI на grammY + Mastra

- Отвечает только администраторам из 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>
This commit is contained in:
yunogasai
2026-09-24 18:31:44 +02:00
commit 99c4660da9
32 changed files with 3173 additions and 0 deletions

41
CLAUDE.md Normal file
View File

@@ -0,0 +1,41 @@
# 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`).
- Тексты для пользователей бота и комментарии — на русском.