Files
agent-news/bot/lib/lexicon.dart
matt2dev 7bfe0dfe0c Fix HOME volume mount, genericize topic, add progress statuses, extract lexicon
- Volume was mounted at ~/.claude only, but claude-code writes auth to
  ~/.claude.json too — that file lived on the ephemeral container layer and
  was lost on every recreate. Now the whole $HOME is on the named volume,
  and claude-config moved outside HOME (/app) so it isn't shadowed by it.
- Default /news topic was hardcoded to AI; now it's a configurable
  DEFAULT_TOPIC (plain "главные новости дня"), topic is fully free-form.
- Prompt now instructs Claude to send interim " ..." progress updates via
  send_to_telegram while researching, not just the final digest — a bare
  request like "call this tool" was already taking 3+ minutes end-to-end,
  so silence read as broken.
- All user-facing/prompt text moved into bot/lib/lexicon.dart.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-21 21:53:38 +03:00

41 lines
3.0 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Все тексты, которые бот показывает пользователю или подставляет в промпт
// Claude — в одном месте, чтобы менять формулировки не по всему коду.
class Lexicon {
static const welcome =
'Привет! Я agent-news. Команда /news <тема> — сделаю ресёрч и пришлю '
'выжимку с источниками. Без темы — возьму главные новости дня. '
'Ресёрч ведёт Claude Code, обычно несколько минут — по ходу буду '
'присылать статусы, что происходит.';
static const alreadyBusy = 'Уже выполняю другой запрос, подожди.';
static String starting(String topic) =>
'🔎 Начинаю ресёрч по теме «$topic». Пришлю статусы по ходу и выжимку в конце.';
static const timedOut = 'Не успел уложиться по времени, попробуй позже.';
static const failed = 'Не получилось выполнить ресёрч, попробуй позже.';
// Тема по умолчанию для /news без аргумента — просто «главные новости»,
// без привязки к конкретной сфере: тема запроса задаётся пользователем.
static const defaultTopic = 'главные новости дня';
static String researchInstruction(String topic) =>
'Проведи ресёрч по теме "$topic" за последние 7 дней. Используй поиск '
'в интернете. Составь выжимку: 5-8 пунктов, у каждого — суть в 1-2 '
'предложениях и ссылка на источник.';
static String progressInstruction(int chatId) =>
'По ходу работы присылай короткие статусы через инструмент '
'send_to_telegram (chat_id=$chatId, text="⏳ <что делаешь сейчас>") — '
'например сразу после того как определишь план поиска, и ещё раз '
'после того как соберёшь основные источники. Это нужно, чтобы '
'пользователь видел, что процесс идёт, а не просто ждал молча.';
static String finalDeliveryInstruction(int chatId) =>
'В конце ОБЯЗАТЕЛЬНО вызови send_to_telegram ещё раз с параметрами '
'chat_id=$chatId и text=<готовая выжимка в Markdown, с заголовком>. Это '
'единственный способ доставить результат — не выводи финальный ответ '
'никак иначе, только через вызов этого инструмента.';
}