# 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`. - Хендлеры не ходят в репозитории напрямую — только через сервисы. - Правила доступа (только админы) — в `bot/create-bot.ts` через `bot.filter`. ## Стиль кода - Пиши функционально: стрелочные функции и фабрики (`const createX = (...) => ({ ... })`), без классов. - Не используй ключевое слово `function` — только `const fn = (...) => ...`. - Не используй `let` (и `var`) — только `const`; вместо циклов с мутацией — `map`/`filter`/`reduce`/рекурсия. - Отделяй пустой строкой объявления констант и логические блоки друг от друга. - Импорты локальных файлов — с расширением `.js` (ESM, `module: NodeNext`). - Тексты для пользователей бота и комментарии — на русском.