opencode-telegram-group-topics-bot 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.env.example +74 -0
  2. package/LICENSE +21 -0
  3. package/README.md +305 -0
  4. package/dist/agent/manager.js +60 -0
  5. package/dist/agent/types.js +26 -0
  6. package/dist/app/start-bot-app.js +47 -0
  7. package/dist/bot/commands/abort.js +116 -0
  8. package/dist/bot/commands/commands.js +389 -0
  9. package/dist/bot/commands/constants.js +20 -0
  10. package/dist/bot/commands/definitions.js +25 -0
  11. package/dist/bot/commands/help.js +27 -0
  12. package/dist/bot/commands/models.js +38 -0
  13. package/dist/bot/commands/new.js +247 -0
  14. package/dist/bot/commands/opencode-start.js +85 -0
  15. package/dist/bot/commands/opencode-stop.js +44 -0
  16. package/dist/bot/commands/projects.js +304 -0
  17. package/dist/bot/commands/rename.js +173 -0
  18. package/dist/bot/commands/sessions.js +491 -0
  19. package/dist/bot/commands/start.js +67 -0
  20. package/dist/bot/commands/status.js +138 -0
  21. package/dist/bot/constants.js +49 -0
  22. package/dist/bot/handlers/agent.js +127 -0
  23. package/dist/bot/handlers/context.js +125 -0
  24. package/dist/bot/handlers/document.js +65 -0
  25. package/dist/bot/handlers/inline-menu.js +124 -0
  26. package/dist/bot/handlers/model.js +152 -0
  27. package/dist/bot/handlers/permission.js +281 -0
  28. package/dist/bot/handlers/prompt.js +263 -0
  29. package/dist/bot/handlers/question.js +285 -0
  30. package/dist/bot/handlers/variant.js +147 -0
  31. package/dist/bot/handlers/voice.js +173 -0
  32. package/dist/bot/index.js +945 -0
  33. package/dist/bot/message-patterns.js +4 -0
  34. package/dist/bot/middleware/auth.js +30 -0
  35. package/dist/bot/middleware/interaction-guard.js +80 -0
  36. package/dist/bot/middleware/unknown-command.js +22 -0
  37. package/dist/bot/scope.js +222 -0
  38. package/dist/bot/telegram-constants.js +3 -0
  39. package/dist/bot/telegram-rate-limiter.js +263 -0
  40. package/dist/bot/utils/commands.js +21 -0
  41. package/dist/bot/utils/file-download.js +91 -0
  42. package/dist/bot/utils/keyboard.js +85 -0
  43. package/dist/bot/utils/send-with-markdown-fallback.js +57 -0
  44. package/dist/bot/utils/session-error-filter.js +34 -0
  45. package/dist/bot/utils/topic-link.js +29 -0
  46. package/dist/cli/args.js +98 -0
  47. package/dist/cli.js +80 -0
  48. package/dist/config.js +103 -0
  49. package/dist/i18n/de.js +330 -0
  50. package/dist/i18n/en.js +330 -0
  51. package/dist/i18n/es.js +330 -0
  52. package/dist/i18n/index.js +102 -0
  53. package/dist/i18n/ru.js +330 -0
  54. package/dist/i18n/zh.js +330 -0
  55. package/dist/index.js +28 -0
  56. package/dist/interaction/cleanup.js +24 -0
  57. package/dist/interaction/constants.js +25 -0
  58. package/dist/interaction/guard.js +100 -0
  59. package/dist/interaction/manager.js +113 -0
  60. package/dist/interaction/types.js +1 -0
  61. package/dist/keyboard/manager.js +115 -0
  62. package/dist/keyboard/types.js +1 -0
  63. package/dist/model/capabilities.js +62 -0
  64. package/dist/model/manager.js +257 -0
  65. package/dist/model/types.js +24 -0
  66. package/dist/opencode/client.js +13 -0
  67. package/dist/opencode/events.js +159 -0
  68. package/dist/opencode/prompt-submit-error.js +101 -0
  69. package/dist/permission/manager.js +92 -0
  70. package/dist/permission/types.js +1 -0
  71. package/dist/pinned/manager.js +405 -0
  72. package/dist/pinned/types.js +1 -0
  73. package/dist/process/manager.js +273 -0
  74. package/dist/process/types.js +1 -0
  75. package/dist/project/manager.js +88 -0
  76. package/dist/question/manager.js +186 -0
  77. package/dist/question/types.js +1 -0
  78. package/dist/rename/manager.js +64 -0
  79. package/dist/runtime/bootstrap.js +350 -0
  80. package/dist/runtime/mode.js +74 -0
  81. package/dist/runtime/paths.js +37 -0
  82. package/dist/runtime/process-error-handlers.js +24 -0
  83. package/dist/session/cache-manager.js +455 -0
  84. package/dist/session/manager.js +87 -0
  85. package/dist/settings/manager.js +283 -0
  86. package/dist/stt/client.js +64 -0
  87. package/dist/summary/aggregator.js +625 -0
  88. package/dist/summary/formatter.js +417 -0
  89. package/dist/summary/tool-message-batcher.js +277 -0
  90. package/dist/topic/colors.js +8 -0
  91. package/dist/topic/constants.js +10 -0
  92. package/dist/topic/manager.js +161 -0
  93. package/dist/topic/title-constants.js +2 -0
  94. package/dist/topic/title-format.js +10 -0
  95. package/dist/topic/title-sync.js +17 -0
  96. package/dist/utils/error-format.js +29 -0
  97. package/dist/utils/logger.js +175 -0
  98. package/dist/utils/safe-background-task.js +33 -0
  99. package/dist/variant/manager.js +103 -0
  100. package/dist/variant/types.js +1 -0
  101. package/package.json +76 -0
@@ -0,0 +1,330 @@
1
+ export const ru = {
2
+ "cmd.description.status": "Статус сервера и сессии",
3
+ "cmd.description.new": "Создать новую сессию",
4
+ "cmd.description.abort": "Прервать текущее действие",
5
+ "cmd.description.stop": "Прервать текущее действие",
6
+ "cmd.description.sessions": "Список сессий",
7
+ "cmd.description.projects": "Список проектов",
8
+ "cmd.description.commands": "Пользовательские команды",
9
+ "cmd.description.model": "Выбрать модель",
10
+ "cmd.description.agent": "Выбрать режим агента",
11
+ "cmd.description.cleanup": "Закрыть устаревшие темы",
12
+ "cmd.description.opencode_start": "Запустить OpenCode сервер",
13
+ "cmd.description.opencode_stop": "Остановить OpenCode сервер",
14
+ "cmd.description.help": "Справка",
15
+ "callback.unknown_command": "Неизвестная команда",
16
+ "callback.processing_error": "Ошибка обработки",
17
+ "error.load_agents": "❌ Ошибка при загрузке списка агентов",
18
+ "error.load_models": "❌ Ошибка при загрузке списка моделей",
19
+ "error.load_variants": "❌ Ошибка при загрузке списка вариантов",
20
+ "error.context_button": "❌ Ошибка при обработке кнопки контекста",
21
+ "error.generic": "🔴 Произошла ошибка.",
22
+ "interaction.blocked.expired": "⚠️ Текущая интеракция устарела. Запустите ее снова.",
23
+ "interaction.blocked.expected_callback": "⚠️ Для этого шага используйте inline-кнопки или нажмите Отмена.",
24
+ "interaction.blocked.expected_text": "⚠️ Для этого шага отправьте текстовое сообщение.",
25
+ "interaction.blocked.expected_command": "⚠️ Для этого шага отправьте команду.",
26
+ "interaction.blocked.command_not_allowed": "⚠️ Эта команда недоступна на текущем шаге.",
27
+ "interaction.blocked.finish_current": "⚠️ Сначала завершите текущую интеракцию (ответьте или отмените), затем откройте другое меню.",
28
+ "inline.blocked.expected_choice": "⚠️ Выберите вариант через inline-кнопки или нажмите Отмена.",
29
+ "inline.blocked.command_not_allowed": "⚠️ Эта команда недоступна, пока активно inline-меню.",
30
+ "question.blocked.expected_answer": "⚠️ Ответьте на текущий вопрос кнопками, через Свой ответ, или нажмите Отмена.",
31
+ "question.blocked.command_not_allowed": "⚠️ Эта команда недоступна, пока не завершен текущий опрос.",
32
+ "inline.button.cancel": "❌ Отмена",
33
+ "inline.inactive_callback": "Это меню уже неактивно",
34
+ "inline.cancelled_callback": "Отменено",
35
+ "common.unknown": "неизвестна",
36
+ "common.unknown_error": "неизвестная ошибка",
37
+ "start.welcome": "👋 Добро пожаловать в OpenCode Telegram Group Topics Bot!\n\nИспользуйте команды:\n/projects — выбрать проект\n/sessions — список сессий\n/new — новая сессия\n/status — статус\n/help — справка\n\nРежим, модель и вариант выбираются кнопками внизу.",
38
+ "help.keyboard_hint": "💡 Режим, модель, вариант и действия с контекстом доступны через нижние кнопки клавиатуры.",
39
+ "help.text": "📖 **Справка**\n\n/status - Проверить статус сервера\n/sessions - Список сессий\n/new - Создать новую сессию\n/help - Справка",
40
+ "bot.thinking": "💭 Думаю...",
41
+ "bot.project_not_selected": "🏗 Проект не выбран.\n\nСначала выберите проект командой /projects.",
42
+ "bot.creating_session": "🔄 Создаю новую сессию...",
43
+ "bot.create_session_error": "🔴 Не удалось создать сессию. Попробуйте команду /new или проверьте статус сервера /status.",
44
+ "bot.session_created": "✅ Сессия создана: {title}",
45
+ "bot.session_busy": "⏳ Предыдущий запрос все еще выполняется, поэтому новый не был запущен.\n\nПочему так: в одной сессии OpenCode обрабатывает только один активный запуск одновременно.\nЧто делать: дождитесь ответа, либо используйте /abort, если процесс завис, и отправьте сообщение снова.",
46
+ "bot.session_reset_project_mismatch": "⚠️ Активная сессия не соответствует выбранному проекту, поэтому была сброшена. Используйте /sessions для выбора или /new для создания новой сессии.",
47
+ "bot.prompt_send_error": "⚠️ Не удалось передать это сообщение в OpenCode.\n\nВозможная причина: временный сбой соединения между ботом и сервером OpenCode.\nЧто делать: отправьте сообщение еще раз. Если ошибка повторяется, выполните /status и проверьте доступность OpenCode.",
48
+ "bot.prompt_send_error_session_not_found": "⚠️ Не удалось передать сообщение, потому что активная сессия больше недоступна.\n\nПочему так: сессия могла быть сброшена, переключена или удалена.\nЧто делать: выберите сессию через /sessions или создайте новую через /new, затем отправьте сообщение снова.",
49
+ "bot.session_error": "🔴 OpenCode вернул ошибку: {message}",
50
+ "bot.session_retry": "🔁 {message}\n\nПровайдер возвращает одну и ту же ошибку при повторных запросах. Используйте /abort для остановки.",
51
+ "bot.unknown_command": "⚠️ Неизвестная команда: {command}. Используйте /help для списка команд.",
52
+ "bot.photo_downloading": "⏳ Скачиваю фото...",
53
+ "bot.photo_too_large": "⚠️ Фото слишком большое (макс. {maxSizeMb}МБ)",
54
+ "bot.photo_model_no_image": "⚠️ Текущая модель не поддерживает изображения. Отправляю только текст.",
55
+ "bot.photo_download_error": "🔴 Не удалось скачать фото",
56
+ "bot.photo_no_caption": "💡 Совет: Добавьте подпись, чтобы описать, что делать с этим фото.",
57
+ "bot.file_downloading": "⏳ Скачиваю файл...",
58
+ "bot.file_too_large": "⚠️ Файл слишком большой (макс. {maxSizeMb}МБ)",
59
+ "bot.file_download_error": "🔴 Не удалось скачать файл",
60
+ "bot.model_no_pdf": "⚠️ Текущая модель не поддерживает PDF. Отправляю только текст.",
61
+ "bot.text_file_too_large": "⚠️ Текстовый файл слишком большой (макс. {maxSizeKb}КБ)",
62
+ "status.header_running": "🟢 **OpenCode Server запущен**",
63
+ "status.health.healthy": "Healthy",
64
+ "status.health.unhealthy": "Unhealthy",
65
+ "status.line.health": "Статус: {health}",
66
+ "status.line.version": "Версия: {version}",
67
+ "status.line.managed_yes": "Управляется ботом: Да",
68
+ "status.line.managed_no": "Управляется ботом: Нет",
69
+ "status.line.pid": "PID: {pid}",
70
+ "status.line.uptime_sec": "Uptime: {seconds} сек",
71
+ "status.line.mode": "Режим: {mode}",
72
+ "status.line.model": "Модель: {model}",
73
+ "status.agent_not_set": "не установлен",
74
+ "status.project_selected": "🏗 Проект: {project}",
75
+ "status.project_not_selected": "🏗 Проект: не выбран",
76
+ "status.project_hint": "Используйте /projects для выбора проекта",
77
+ "status.session_selected": "📋 Текущая сессия: {title}",
78
+ "status.session_not_selected": "📋 Текущая сессия: не выбрана",
79
+ "status.session_hint": "Используйте /sessions для выбора или /new для создания",
80
+ "status.server_unavailable": "🔴 OpenCode Server недоступен\n\nИспользуйте /opencode_start для запуска сервера.",
81
+ "projects.empty": "📭 Проектов нет.\n\nОткройте директорию в OpenCode и создайте хотя бы одну сессию, после этого она появится здесь.",
82
+ "projects.select": "Выберите проект:",
83
+ "projects.select_with_current": "Выберите проект:\n\nТекущий: 🏗 {project}",
84
+ "projects.page_indicator": "Страница {current}/{total}",
85
+ "projects.prev_page": "⬅️ Назад",
86
+ "projects.next_page": "Вперёд ➡️",
87
+ "projects.fetch_error": "🔴 OpenCode Server недоступен или произошла ошибка при получении списка проектов.",
88
+ "projects.page_load_error": "Не удалось загрузить эту страницу. Попробуйте снова.",
89
+ "projects.selected": "✅ Проект выбран: {project}\n\n📋 Сессия сброшена. Используйте /sessions или /new для работы с этим проектом.",
90
+ "projects.select_error": "🔴 Ошибка при выборе проекта.",
91
+ "projects.locked.topic_scope": "⚠️ Этот топик привязан к собственному контексту проекта/сессии. Переключайте проекты только из General до создания топиков.",
92
+ "projects.locked.group_project": "⚠️ Эта группа уже настроена для проекта: {project}. Создайте новую группу, если хотите работать с другим репозиторием.",
93
+ "projects.locked.callback": "Смена проекта для этой группы заблокирована.",
94
+ "sessions.project_not_selected": "🏗 Проект не выбран.\n\nСначала выберите проект командой /projects.",
95
+ "sessions.empty": "📭 Сессий нет.\n\nСоздайте новую сессию командой /new.",
96
+ "sessions.select": "Выберите сессию:",
97
+ "sessions.select_page": "Выберите сессию (страница {page}):",
98
+ "sessions.fetch_error": "🔴 OpenCode Server недоступен или произошла ошибка при получении списка сессий.",
99
+ "sessions.select_project_first": "🔴 Проект не выбран. Используйте /projects.",
100
+ "sessions.page_empty_callback": "На этой странице нет сессий",
101
+ "sessions.page_load_error_callback": "Не удалось загрузить эту страницу. Пожалуйста, попробуйте снова.",
102
+ "sessions.button.prev_page": "⬅️ Назад",
103
+ "sessions.button.next_page": "Вперёд ➡️",
104
+ "sessions.topic_locked": "⚠️ Эта тема привязана к текущей сессии. Используйте /new в General, чтобы создать новую тему.",
105
+ "sessions.general_overview": "Обзор сессий по темам:",
106
+ "sessions.general_item": "• {topic} (тред #{thread}) - {status}",
107
+ "sessions.general_empty": "Тем сессий пока нет. Используйте /new для создания.",
108
+ "sessions.bound_topic_link": "🔗 Топик для этой сессии: {url}",
109
+ "sessions.created_topic_link": "✅ Топик для этой сессии создан: {url}",
110
+ "sessions.loading_context": "⏳ Загружаю контекст и последние сообщения...",
111
+ "sessions.selected": "✅ Сессия выбрана: {title}",
112
+ "sessions.select_error": "🔴 Ошибка при выборе сессии.",
113
+ "sessions.preview.empty": "Последних сообщений нет.",
114
+ "sessions.preview.title": "Последние сообщения:",
115
+ "sessions.preview.you": "Вы:",
116
+ "sessions.preview.agent": "Агент:",
117
+ "new.project_not_selected": "🏗 Проект не выбран.\n\nСначала выберите проект командой /projects.",
118
+ "new.created": "✅ Создана новая сессия: {title}",
119
+ "new.topic_only_in_general": "⚠️ Запустите /new в теме General, чтобы создать отдельную тему сессии.",
120
+ "new.requires_forum_general": "⚠️ /new требует тему General в супергруппе с включёнными форумами.",
121
+ "new.topic_created": "✅ Тема сессии готова: {title}",
122
+ "new.general_created": "✅ Созданы новая сессия OpenCode и тема группы.",
123
+ "new.topic_create_error": "🔴 Не удалось создать тему сессии. Проверьте права форума и попробуйте снова.",
124
+ "new.topic_create_no_rights": '🔴 Я не могу создавать темы форума в этой группе. Выдайте боту право "Управление темами" и повторите /new.',
125
+ "new.general_open_link": "🔗 Открыть тему: {url}",
126
+ "new.create_error": "🔴 OpenCode Server недоступен или произошла ошибка при создании сессии.",
127
+ "cleanup.topic_use_general": "⚠️ Выполните /cleanup из темы General.",
128
+ "cleanup.requires_forum_general": "⚠️ /cleanup доступен только в теме General супергруппы с включёнными форумами.",
129
+ "cleanup.no_topics": "✅ Нет тем сессий для очистки.",
130
+ "cleanup.result": "🧹 Очистка завершена. Проверено: {inspected}, закрыто: {closed}, пропущено: {skipped}, ошибок: {failed}.",
131
+ "stop.no_active_session": "🛑 Агент не был запущен\n\nСначала создайте сессию командой /new или выберите существующую через /sessions.",
132
+ "stop.in_progress": "🛑 Отключил поток событий и отправляю сигнал прерывания...\n\nОжидание остановки агента.",
133
+ "stop.warn_unconfirmed": "⚠️ Поток событий остановлен, но сервер не подтвердил прерывание.\n\nПроверьте /status и повторите /abort через пару секунд.",
134
+ "stop.warn_maybe_finished": "⚠️ Поток событий остановлен, но агент мог уже завершиться к моменту запроса.",
135
+ "stop.success": "✅ Действие агента прервано. Новые сообщения от текущего запуска больше не придут.",
136
+ "stop.warn_still_busy": "⚠️ Сигнал отправлен, но агент еще busy.\n\nПоток событий уже отключен, поэтому бот не будет присылать промежуточные сообщения.",
137
+ "stop.warn_timeout": "⚠️ Таймаут запроса на прерывание.\n\nПоток событий уже отключен, повторите /abort через пару секунд.",
138
+ "stop.warn_local_only": "⚠️ Поток событий остановлен локально, но при прерывании на сервере произошла ошибка.",
139
+ "stop.error": "🔴 Ошибка при прерывании действия.\n\nПоток событий остановлен, попробуйте /abort еще раз.",
140
+ "opencode_start.already_running_managed": "⚠️ OpenCode Server уже запущен\n\nPID: {pid}\nUptime: {seconds} секунд",
141
+ "opencode_start.already_running_external": "✅ OpenCode Server уже запущен внешним процессом\n\nВерсия: {version}\n\nЭтот сервер не был запущен через бота, поэтому команда /opencode-stop не сможет его остановить.",
142
+ "opencode_start.starting": "🔄 Запускаю OpenCode Server...",
143
+ "opencode_start.start_error": "🔴 Не удалось запустить OpenCode Server\n\nОшибка: {error}\n\nПроверьте, что OpenCode CLI установлен и доступен в PATH:\n`opencode --version`\n`npm install -g @opencode-ai/cli`",
144
+ "opencode_start.started_not_ready": "⚠️ OpenCode Server запущен, но не отвечает\n\nPID: {pid}\n\nСервер может запускаться. Попробуйте /status через несколько секунд.",
145
+ "opencode_start.success": "✅ OpenCode Server успешно запущен\n\nPID: {pid}\nВерсия: {version}",
146
+ "opencode_start.error": "🔴 Произошла ошибка при запуске сервера.\n\nПроверьте логи приложения для подробностей.",
147
+ "opencode_stop.external_running": "⚠️ OpenCode Server запущен внешним процессом\n\nЭтот сервер не был запущен через /opencode-start.\nОстановите его вручную или используйте /status для проверки состояния.",
148
+ "opencode_stop.not_running": "⚠️ OpenCode Server не запущен",
149
+ "opencode_stop.stopping": "🛑 Останавливаю OpenCode Server...\n\nPID: {pid}",
150
+ "opencode_stop.stop_error": "🔴 Не удалось остановить OpenCode Server\n\nОшибка: {error}",
151
+ "opencode_stop.success": "✅ OpenCode Server успешно остановлен",
152
+ "opencode_stop.error": "🔴 Произошла ошибка при остановке сервера.\n\nПроверьте логи приложения для подробностей.",
153
+ "agent.changed_callback": "Режим изменен: {name}",
154
+ "agent.changed_message": "✅ Режим изменен на: {name}",
155
+ "agent.change_error_callback": "Ошибка при смене режима",
156
+ "agent.menu.current": "Текущий режим: {name}\n\nВыберите режим:",
157
+ "agent.menu.select": "Выберите режим работы:",
158
+ "agent.menu.empty": "⚠️ Нет доступных агентов",
159
+ "agent.menu.error": "🔴 Не удалось получить список агентов",
160
+ "model.changed_callback": "Модель изменена: {name}",
161
+ "model.changed_message": "✅ Модель изменена на: {name}",
162
+ "model.change_error_callback": "Ошибка при смене модели",
163
+ "model.menu.empty": "⚠️ Нет доступных моделей",
164
+ "model.menu.select": "Выберите модель:",
165
+ "model.menu.current": "Текущая модель: {name}\n\nВыберите модель:",
166
+ "model.menu.favorites_title": "⭐ Избранное (Добавляйте модели в избранное через OpenCode CLI)",
167
+ "model.menu.favorites_empty": "— Список пуст.",
168
+ "model.menu.recent_title": "🕘 Недавние",
169
+ "model.menu.recent_empty": "— Список пуст.",
170
+ "model.menu.favorites_hint": "ℹ️ Добавляйте модели в избранное через OpenCode CLI, чтобы они были вверху списка.",
171
+ "model.menu.error": "🔴 Не удалось получить список моделей",
172
+ "variant.model_not_selected_callback": "Ошибка: модель не выбрана",
173
+ "variant.changed_callback": "Вариант изменен: {name}",
174
+ "variant.changed_message": "✅ Вариант изменен на: {name}",
175
+ "variant.change_error_callback": "Ошибка при смене варианта",
176
+ "variant.select_model_first": "⚠️ Сначала выберите модель",
177
+ "variant.menu.empty": "⚠️ Нет доступных вариантов",
178
+ "variant.menu.current": "Текущий вариант: {name}\n\nВыберите вариант:",
179
+ "variant.menu.error": "🔴 Не удалось получить список вариантов",
180
+ "context.button.confirm": "✅ Да, сжать контекст",
181
+ "context.no_active_session": "⚠️ Нет активной сессии. Создайте сессию командой /new",
182
+ "context.confirm_text": '📊 Сжатие контекста для сессии "{title}"\n\nЭто уменьшит использование контекста, удалив старые сообщения из истории. Текущая задача не будет прервана.\n\nПродолжить?',
183
+ "context.general_not_available": "⚠️ Сжатие контекста доступно только внутри топика сессии, а не в General.",
184
+ "context.general_not_available_callback": "Сначала откройте топик сессии.",
185
+ "context.callback_session_not_found": "Сессия не найдена",
186
+ "context.callback_compacting": "Сжатие контекста...",
187
+ "context.progress": "⏳ Сжимаю контекст...",
188
+ "context.error": "❌ Ошибка при сжатии контекста",
189
+ "context.success": "✅ Контекст успешно сжат",
190
+ "permission.inactive_callback": "Запрос разрешения неактивен",
191
+ "permission.processing_error_callback": "Ошибка при обработке",
192
+ "permission.no_active_request_callback": "Ошибка: нет активного запроса",
193
+ "permission.reply.once": "Разрешено однократно",
194
+ "permission.reply.always": "Разрешено всегда",
195
+ "permission.reply.reject": "Отклонено",
196
+ "permission.send_reply_error": "❌ Не удалось отправить ответ на запрос разрешения",
197
+ "permission.blocked.expected_reply": "⚠️ Сначала ответьте на запрос разрешения кнопками выше.",
198
+ "permission.blocked.command_not_allowed": "⚠️ Эта команда недоступна, пока вы не ответите на запрос разрешения.",
199
+ "permission.header": "{emoji} **Запрос разрешения: {name}**\n\n",
200
+ "permission.button.allow": "✅ Разрешить один раз",
201
+ "permission.button.always": "🔓 Разрешить всегда",
202
+ "permission.button.reject": "❌ Отклонить",
203
+ "permission.name.bash": "Bash",
204
+ "permission.name.edit": "Edit",
205
+ "permission.name.write": "Write",
206
+ "permission.name.read": "Read",
207
+ "permission.name.webfetch": "Web Fetch",
208
+ "permission.name.websearch": "Web Search",
209
+ "permission.name.glob": "File Search",
210
+ "permission.name.grep": "Content Search",
211
+ "permission.name.list": "List Directory",
212
+ "permission.name.task": "Task",
213
+ "permission.name.lsp": "LSP",
214
+ "question.inactive_callback": "Опрос неактивен",
215
+ "question.processing_error_callback": "Ошибка при обработке",
216
+ "question.select_one_required_callback": "Выберите хотя бы один вариант",
217
+ "question.enter_custom_callback": "Введите свой ответ сообщением",
218
+ "question.cancelled": "❌ Опрос отменен",
219
+ "question.answer_already_received": "Ответ уже получен, подождите...",
220
+ "question.completed_no_answers": "✅ Опрос завершен (без ответов)",
221
+ "question.no_active_project": "❌ Нет активного проекта",
222
+ "question.no_active_request": "❌ Нет активного запроса",
223
+ "question.send_answers_error": "❌ Не удалось отправить ответы агенту",
224
+ "question.multi_hint": "\n*Можно выбрать несколько вариантов*",
225
+ "question.button.submit": "✅ Готово",
226
+ "question.button.custom": "🔤 Свой ответ",
227
+ "question.button.cancel": "❌ Отмена",
228
+ "question.use_custom_button_first": '⚠️ Чтобы отправить текст, сначала нажмите кнопку "Свой ответ" для текущего вопроса.',
229
+ "question.summary.title": "✅ Опрос завершен!\n\n",
230
+ "question.summary.question": "Вопрос {index}:\n{question}\n\n",
231
+ "question.summary.answer": "Ответ:\n{answer}\n\n",
232
+ "keyboard.agent_mode": "{emoji} {name} Mode",
233
+ "keyboard.context": "📊 {used} / {limit} ({percent}%)",
234
+ "keyboard.context_empty": "📊 Управление",
235
+ "keyboard.general_defaults": "Параметры новой сессии:",
236
+ "keyboard.general_defaults_info": "Эти значения будут применяться к новым сессиям, созданным в этой группе:\n• Агент\n• Модель\n• Вариант",
237
+ "keyboard.variant": "💭 {name}",
238
+ "keyboard.variant_default": "💡 Default",
239
+ "keyboard.updated": "⌨️ Клавиатура обновлена",
240
+ "keyboard.dm.status": "/status",
241
+ "keyboard.dm.help": "/help",
242
+ "keyboard.dm.opencode_start": "/opencode_start",
243
+ "keyboard.dm.opencode_stop": "/opencode_stop",
244
+ "pinned.default_session_title": "new session",
245
+ "pinned.unknown": "Unknown",
246
+ "pinned.line.project": "Project: {project}",
247
+ "pinned.line.model": "Model: {model}",
248
+ "pinned.line.context": "Context: {used} / {limit} ({percent}%)",
249
+ "pinned.files.title": "Files ({count}):",
250
+ "pinned.files.item": " {path}{diff}",
251
+ "pinned.files.more": " ... and {count} more",
252
+ "tool.todo.overflow": "*(ещё {count} задач)*",
253
+ "tool.file_header.write": "Write File/Path: {path}\n============================================================\n\n",
254
+ "tool.file_header.edit": "Edit File/Path: {path}\n============================================================\n\n",
255
+ "runtime.wizard.ask_token": "Введите токен Telegram-бота (получить у @BotFather).\n> ",
256
+ "runtime.wizard.ask_language": "Выберите язык интерфейса.\nВведите номер языка из списка или код локали.\nНажмите Enter, чтобы оставить язык по умолчанию: {defaultLocale}\n{options}\n> ",
257
+ "runtime.wizard.language_invalid": "Введите номер языка из списка или поддерживаемый код локали.\n",
258
+ "runtime.wizard.language_selected": "Выбран язык: {language}\n",
259
+ "runtime.wizard.token_required": "Токен обязателен. Попробуйте еще раз.\n",
260
+ "runtime.wizard.token_invalid": "Похоже на невалидный токен (ожидается формат <id>:<secret>). Попробуйте еще раз.\n",
261
+ "runtime.wizard.ask_user_id": "Введите ваш Telegram User ID (можно узнать у @userinfobot).\n> ",
262
+ "runtime.wizard.user_id_invalid": "Введите положительное целое число (> 0).\n",
263
+ "runtime.wizard.ask_api_url": "Введите URL OpenCode API (опционально).\nНажмите Enter для значения по умолчанию: {defaultUrl}\n> ",
264
+ "runtime.wizard.ask_server_username": "Введите имя пользователя сервера OpenCode (опционально).\nНажмите Enter для значения по умолчанию: {defaultUsername}\n> ",
265
+ "runtime.wizard.ask_server_password": "Введите пароль сервера OpenCode (опционально, ввод скрыт).\nНажмите Enter, чтобы пропустить.\n> ",
266
+ "runtime.wizard.api_url_invalid": "Введите корректный URL (http/https) или нажмите Enter для значения по умолчанию.\n",
267
+ "runtime.wizard.start": "Настройка OpenCode Telegram Group Topics Bot.\n",
268
+ "runtime.wizard.saved": "Конфигурация сохранена:\n- {envPath}\n- {settingsPath}\n",
269
+ "runtime.wizard.not_configured_starting": "Приложение еще не сконфигурировано. Запускаю wizard...\n",
270
+ "runtime.wizard.tty_required": "Интерактивный wizard требует TTY-терминал. Запустите `opencode-telegram-group-topics-bot config` в интерактивной оболочке.",
271
+ "rename.no_session": "⚠️ Нет активной сессии. Сначала создайте или выберите сессию.",
272
+ "rename.prompt": "📝 Введите новое название сессии:\n\nТекущее: {title}",
273
+ "rename.empty_title": "⚠️ Название не может быть пустым.",
274
+ "rename.success": "✅ Сессия переименована в: {title}",
275
+ "rename.error": "🔴 Не удалось переименовать сессию.",
276
+ "rename.cancelled": "❌ Переименование отменено.",
277
+ "rename.inactive_callback": "Запрос переименования неактивен",
278
+ "rename.inactive": "⚠️ Запрос переименования неактивен. Выполните /rename снова.",
279
+ "rename.blocked.expected_name": "⚠️ Введите новое название текстом или нажмите Отмена в сообщении переименования.",
280
+ "rename.blocked.command_not_allowed": "⚠️ Эта команда недоступна, пока ожидается новое название сессии.",
281
+ "rename.button.cancel": "❌ Отмена",
282
+ "commands.select": "Выберите команду OpenCode:",
283
+ "commands.empty": "📭 Для этого проекта нет доступных команд OpenCode.",
284
+ "commands.fetch_error": "🔴 Не удалось загрузить список команд OpenCode.",
285
+ "commands.no_description": "Без описания",
286
+ "commands.button.execute": "✅ Выполнить",
287
+ "commands.button.cancel": "❌ Отмена",
288
+ "commands.confirm": "Подтвердите выполнение команды {command}. Для выполнения с аргументами отправьте аргументы отдельным сообщением.",
289
+ "commands.inactive_callback": "Это меню команд уже неактивно",
290
+ "commands.cancelled_callback": "Отменено",
291
+ "commands.execute_callback": "Запускаю команду...",
292
+ "commands.executing_prefix": "⚡ Выполнение команды:",
293
+ "commands.arguments_empty": "⚠️ Аргументы не могут быть пустыми. Отправьте текст или нажмите Выполнить.",
294
+ "commands.execute_error": "🔴 Не удалось выполнить команду OpenCode.",
295
+ "cmd.description.rename": "Переименовать текущую сессию",
296
+ "cli.usage": "Использование:\n opencode-telegram-group-topics-bot [start] [--mode sources|installed]\n opencode-telegram-group-topics-bot status\n opencode-telegram-group-topics-bot stop\n opencode-telegram-group-topics-bot config [--mode sources|installed]\n\nЗаметки:\n - Без команды по умолчанию используется `start`\n - Для `config` по умолчанию используется режим `installed`, если не указан `--mode sources`",
297
+ "cli.placeholder.status": "Команда `status` пока работает как заглушка. Реальная проверка статуса появится на этапе service-слоя (Этап 5).",
298
+ "cli.placeholder.stop": "Команда `stop` пока работает как заглушка. Реальная остановка фонового процесса появится на этапе service-слоя (Этап 5).",
299
+ "cli.placeholder.unavailable": "Команда недоступна.",
300
+ "cli.error.prefix": "CLI error: {message}",
301
+ "cli.args.unknown_command": "Неизвестная команда: {value}",
302
+ "cli.args.mode_requires_value": "Опция --mode требует значение: sources|installed",
303
+ "cli.args.invalid_mode": "Некорректное значение --mode: {value}. Ожидается sources|installed",
304
+ "cli.args.unknown_option": "Неизвестная опция: {value}",
305
+ "cli.args.mode_only_start": "Опция --mode поддерживается только для команд start и config",
306
+ "legacy.models.fetch_error": "🔴 Не удалось получить список моделей. Проверьте статус сервера /status.",
307
+ "legacy.models.empty": "📋 Нет доступных моделей. Настройте провайдеры через OpenCode.",
308
+ "legacy.models.header": "📋 **Доступные модели:**\n\n",
309
+ "legacy.models.no_provider_models": " ⚠️ Нет доступных моделей\n",
310
+ "legacy.models.env_hint": "💡 Для использования модели в .env:\n",
311
+ "legacy.models.error": "🔴 Произошла ошибка при получении списка моделей.",
312
+ "stt.recognizing": "🎤 Распознаю аудио...",
313
+ "stt.recognized": "🎤 Распознано:\n{text}",
314
+ "stt.not_configured": "🎤 Распознавание голоса не настроено.\n\nУстановите STT_API_URL и STT_API_KEY в .env для включения.",
315
+ "stt.error": "🔴 Не удалось распознать аудио: {error}",
316
+ "stt.empty_result": "🎤 В аудиосообщении не обнаружена речь.",
317
+ "start.welcome_dm": "👋 В режиме ЛС доступны только команды статуса/управления ботом и сервером.\n\nДля работы с проектами и сессиями используйте топик в группе.",
318
+ "status.global_overview": "📈 Глобальный обзор",
319
+ "status.global_projects": "Проекты: {count}",
320
+ "status.global_sessions": "Сессии: {count}",
321
+ "dm.restricted.command": "⚠️ Команды управления сессией отключены в ЛС. Используйте топик в группе для работы с проектами/сессиями.",
322
+ "dm.restricted.prompt": "⚠️ Промпты отключены в ЛС. Используйте топик в группе для запуска задач OpenCode.",
323
+ "help.dm.title": "Команды управления в ЛС",
324
+ "help.dm.command_start": "показать подсказки режима ЛС",
325
+ "help.dm.hint": "Используйте топики в группе для работы с проектами/сессиями.",
326
+ "status.dm.title": "Обзор статуса в ЛС",
327
+ "status.dm.hint": "Используйте топики в группе для запуска сессий OpenCode.",
328
+ "group.general.prompts_disabled": "⚠️ Промпты отключены в теме General. Используйте /new, чтобы создать отдельную тему сессии.",
329
+ "topic.unbound": "⚠️ Эта тема не связана ни с одной сессией. Перейдите в тему General и выполните /new.",
330
+ };