Участники чата, промпты в файлах, личности только из кода

- Бот запоминает участников (имя, фамилия, ник, активность) и ID автора каждого сообщения
- Упоминания в вопросе (@ник и по имени-ссылке) передаются модели с данными участника
- Новые инструменты агента: list_chat_members, read_member_messages (поиск по нику/имени)
- Бот обращается к людям по имени
- Промпты вынесены в prompts/system.md и prompts/personas/<id>.md
- Личности больше не редактируются из чата: скрипт seed синхронизирует их с БД при старте
- Оставлена одна личность boltun (Dirty D)
- Миграция старых баз: колонка messages.user_id

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yunogasai
2026-09-24 18:42:23 +02:00
parent 99c4660da9
commit 26da4bb5ee
35 changed files with 567 additions and 241 deletions

View File

@@ -1,16 +1,34 @@
/** Личность бота. Список задаётся в `constants/personas.ts` и заливается в БД скриптом `seed`. */
export interface Persona {
/** Латиница, цифры, _ и -: id попадает в callback_data (лимит 64 байта). */
id: string;
name: string;
prompt: string;
builtin: boolean;
}
export interface ChatMessage {
chatId: number;
messageId: number;
/** Telegram ID автора; null — для сообщений от имени канала/группы и старых записей. */
userId: number | null;
/** Unix-время в секундах, как в Telegram. */
date: number;
author: string;
text: string;
replyToMessageId: number | null;
}
/** Участник чата, которого бот видел: писал сам или был упомянут по имени-ссылке. */
export interface ChatMember {
chatId: number;
userId: number;
username: string | null;
firstName: string;
lastName: string | null;
messageCount: number;
/** Unix-время последнего сообщения; 0 — ещё не писал (только упоминали). */
lastSeen: number;
}
/** Данные пользователя Telegram, которые бот запоминает об участнике. */
export type MemberProfile = Pick<ChatMember, "userId" | "username" | "firstName" | "lastName">;