{
    "file.created": "Создан {path}",
    "file.deleted": "Удалён {path}",
    "file.updated": "Обновлён {path}",
    "file.written": "Записан {path}",
    "file.notfound": "Файл не найден: {path}",
    "file.dir_notfound": "Каталог не найден: {path}",
    "file.path_not_allowed": "Путь недопустим: {path}",
    "file.path_not_allowed_short": "Путь недопустим",
    "file.is_directory": "Это каталог, используйте rmdir: {path}",
    "file.replaced_in": "Заменено в {path}",
    "file.string_not_found": "Строка не найдена в файле:\n{str}",
    "file.moved": "Перемещён {from} → {to}",
    "file.not_found_short": "Не найдено: {path}",
    "file.empty": "(пусто)",
    "file.no_matches": "Нет совпадений",
    "file.truncated": "\n... (обрезано)",
    "file.read_header": "── {path} ({ext}, {total} строк, строки {from}-{to})",
    "file.read_truncated": "\n\n[Обрезано: ещё {remaining} строк. Продолжите чтение через read_file с offset={next}]",
    "file.empty_page": "(пустая страница)",
    "error.timeout": "Таймаут запроса",
    "error.unknown": "Неизвестная ошибка",
    "error.notfound": "Не найдено: {path}",
    "error.prefix": "Ошибка: ",
    "error.command_error": "Ошибка команды: {message}",
    "error.llm": "Ошибка LLM: {message}",
    "error.response_blocked": "Ответ заблокирован: {reason}",
    "error.max_iters": "Достигнут максимум итераций ({max})",
    "error.empty_response": "Модель вернула пустой ответ после повторных попыток",
    "error.audit_failed": "Задача не может быть подтверждена как выполненная: {summary}",
    "error.grep_failed": "Ошибка grep: {message}",
    "error.search_failed": "Ошибка поиска: {message}",
    "error.fetch_failed": "Ошибка загрузки: {message}",
    "error.fetch_url_failed": "Не удалось загрузить {url}: {message}",
    "error.http": "HTTP {status}: {statusText}",
    "error.llm_api": "Ошибка LLM API {status} ({statusText}): {errorText}",
    "error.llm_retries": "Запрос LLM не удался после повторов",
    "error.no_response_body": "Нет потока тела ответа",
    "session.started": "Сессия начата: {id}",
    "session.ended": "Сессия завершена: {id}",
    "session.not_found": "Сессия не найдена: {id}",
    "session.no_active": "Нет активной сессии",
    "session.deleted": "Сессия удалена: {id}",
    "session.renamed": "Сессия переименована в: {name}",
    "session.created": "Создана сессия: {name}",
    "session.resumed": "Возобновлена сессия: {name}",
    "session.chat_cleared": "Чат очищен. Начните вводить.",
    "session.chat_loaded": "История чата загружена. Продолжите с места остановки.",
    "session.chat_history": "История чата:",
    "session.user_label": "Пользователь",
    "session.assistant_label": "Ассистент",
    "session.no_history": "История чата пуста",
    "session.no_sessions": "Сессии не найдены",
    "session.no_sessions_hint": "Сессии не найдены. Создайте одну командой /new <имя>",
    "session.available": "Доступные сессии:",
    "session.no_match": "Нет сессии подходящей по \"{query}\"",
    "session.default_name": "Сессия {date}",
    "session.info": "[Сессия: \"{name}\" ({id}) — {count} сообщений]",
    "session.col_active": "",
    "session.col_id": "ID",
    "session.col_name": "Имя",
    "session.col_updated": "Обновлена",
    "session.col_msgs": "Сообщ.",
    "tool.executed": "Выполнен {name}",
    "tool.failed": "Инструмент {name} упал: {error}",
    "tool.unknown": "Неизвестный инструмент: {name}",
    "tool.blocked": "Заблокировано плагином: {plugin}",
    "tool.blocked_reason": "Заблокировано плагином: {plugin}. Причина: {reason}",
    "tool.using": "[{label}]",
    "tool.friendly.write_file": "Запись файла",
    "tool.friendly.read_file": "Чтение файла",
    "tool.friendly.edit_file": "Редактирование файла",
    "tool.friendly.create_dir": "Создание папки",
    "tool.friendly.delete_file": "Удаление файла",
    "tool.friendly.move_file": "Перемещение файла",
    "tool.friendly.list_dir": "Список файлов",
    "tool.friendly.file_info": "Информация о файле",
    "tool.friendly.glob": "Поиск файлов",
    "tool.friendly.grep": "Поиск по содержимому",
    "tool.friendly.bash": "Выполнение команды",
    "tool.friendly.load_skill": "Загрузка скилла",
    "tool.friendly.plan": "Планирование",
    "tool.friendly.todo": "Обновление задач",
    "tool.friendly.verify": "Проверка",
    "tool.friendly.web_search": "Поиск в интернете",
    "tool.friendly.web_fetch": "Загрузка страницы",
    "tool.friendly.web_browse": "Просмотр страницы",
    "tool.friendly.download_file": "Скачивание файла",
    "tool.web_fetch_result": "Загружена страница: {url} — {chars} симв., {lines} строк{truncated}",
    "tool.web_browse_result": "Просмотрена страница: {url} — {chars} симв., {lines} строк{truncated}",
    "tool.web_search_result": "Результаты поиска \"{query}\" — {count} результатов",
    "tool.downloaded": "Скачано {url} \u2192 {path} ({size} байт, {type})",
    "tool.download_too_large": "Скачивание заблокировано: файл превышает лимит {max} байт",
    "tool.friendly.browser": "Браузер",
    "tool.friendly.subagent": "Задача подагенту",
    "tool.friendly.question": "Вопрос пользователю",
    "tool.friendly.approve": "Запрос подтверждения",
    "tool.friendly.search_history": "Поиск в истории",
    "tool.friendly.pipeline_run": "Запуск пайплайна",
    "tool.friendly.mcp_call": "MCP вызов",
    "tool.friendly.lsp_check": "Проверка кода",
    "tool.truncated": "[Обрезано: удалено {tokens} токенов]",
    "tool.subagent_queued": "Задача подагенту добавлена: {task}",
    "tool.subagent_artifact": "Суб-агент завершён. Полный результат сохранён в артефакт: {path}\nИтераций: {iterations}\nСводка:\n{summary}",
    "tool.pipeline_started": "Пайплайн \"{name}\" запущен. Движок пайплайнов — заглушка, задача отправлена.",
    "tool.mcp_call": "MCP вызов: {server}/{tool} с {args}",
    "tool.action_required": "Требуется действие.",
    "tool.approve_prompt": "Одобрить? {action}",
    "tool.approve_yes": "Да",
    "tool.approve_yes_desc": "Одобрить действие",
    "tool.approve_no": "Нет",
    "tool.approve_no_desc": "Отклонить действие",
    "tool.approved": "Одобрено",
    "tool.rejected": "Отклонено пользователем",
    "tool.user_input.custom_option": "Свой вариант",
    "tool.user_input.choice_single": "Ваш выбор (1-{max}): ",
    "tool.user_input.choice_multiple": "Ваш выбор (через запятую, напр. 1,3): ",
    "tool.user_input.invalid": "Неверный выбор, попробуйте ещё раз.",
    "tool.user_input.custom_prompt": "Ваш ответ: ",
    "tool.question.progress": "Вопрос {current}/{total}",
    "tool.question.no_questions": "Вопросы не указаны",
    "tool.question.unanswered": "Без ответа",
    "tool.question.answered": "Пользователь ответил на ваши вопросы: {formatted}. Теперь продолжайте с учётом ответов.",
    "tool.name_or_task": "Укажите параметр \"name\" или \"task\"",
    "tool.chunk_query_no_query": "chunk_query: требуется строка запроса.",
    "tool.chunk_query_no_input": "chunk_query: укажите input_path или text.",
    "tool.invalid_params": "Неверные параметры",
    "tool.skill_budget": "Скилл \"{name}\" загружен ({tokens} токенов, осталось {remaining} в бюджете скиллов). Контент скилла теперь в системном промпте — перезагрузка после компрессии не нужна.",
    "tool.skill_available_hint": "Доступные скиллы",
    "tool.no_results": "Нет результатов по \"{query}\"",
    "tool.search_results": "Результаты поиска \"{query}\":\n{results}",
    "tool.history_results": "Результаты истории \"{query}\":\n{results}",
    "tool.no_history": "Нет записей истории по \"{query}\"",
    "tool.no_sessions_dir": "Каталог сессий не найден по {dir}",
    "tool.history_error": "Ошибка поиска истории: {error}",
    "tool.memory_error": "Ошибка памяти: {error}",
    "tool.screenshot_unavailable": "[Скриншот сделан — изображение недоступно для текстовой модели]",
    "tool.timeout": "Инструмент {name} превысил таймаут ({seconds} сек)",
    "tool.aborted": "Инструмент {name} прерван пользователем",
    "tool.interactive_disabled": "Интерактивный инструмент отключён в режиме exit-on-complete. Продолжай без вопроса пользователю.",
    "proc.started": "Фоновый процесс запущен: {id} (PID {pid}).\nКоманда: {command}",
    "proc.promoted_hint": "Команда всё ещё выполняется через {ms} мс — переведена в фоновый режим",
    "proc.manage_hint": "Проверить вывод: process_log id={id}. Остановить: process_kill id={id}. Список всех: process_list.",
    "proc.output_preview": "Первые строки вывода:\n{lines}",
    "proc.none": "Фоновых процессов нет.",
    "proc.not_found": "Процесс не найден: {id}",
    "proc.killed": "Процесс {id} (PID {pid}) остановлен.",
    "proc.kill_failed": "Не удалось остановить процесс {id}",
    "proc.list_header": "Фоновые процессы",
    "proc.log_header": "Вывод процесса {id} ({status}):",
    "proc.log_empty": "(вывода пока нет)",
    "proc.hint": "Управление: {list}, {log}, {kill}.",
    "proc.status_running": "работает",
    "proc.status_exited": "завершён",
    "proc.status_killed": "остановлен",
    "tool.friendly.process_list": "Список фоновых процессов",
    "tool.friendly.process_log": "Вывод процесса",
    "tool.friendly.process_kill": "Остановка процесса",
    "plan.no_steps": "Не указаны шаги плана. Укажите конкретные шаги с файлами и командами.",
    "plan.created": "План создан: {title} ({steps} шагов)",
    "plan.coverage_warning": "План может не покрывать требуемые файлы из постановки: {missing}. Добавьте шаги, покрывающие их.",
    "plan.step_done": "Шаг {n}/{total}: {description} ✓",
    "plan.complete": "Задача выполнена: {summary}",
    "plan.title_steps": "План \"{title}\" создан с {count} шагами",
    "plan.step_marked": "Шаг {step} отмечен как {status}",
    "plan.aborted": "План отменён",
    "plan.completed_archived": "План {id} завершён ({done}/{total} шагов) — архивирован. Для новой задачи создай новый план (plan create) или дай финальный ответ.",
    "plan.unknown_action": "Неизвестное действие плана: {action}",
    "plan.updated": "План обновлён: {title} ({steps} шагов)",
    "plan.acknowledged": "План {action}: принято",
    "plan.step_status": "Шаг {step}: {status}",
    "plan.no_active": "Нет активного плана",
    "plan.step_not_found": "Шаг не найден",
    "plan.step_already_done": "Шаг {step} уже выполнен — ничего делать не нужно. Прогресс плана:",
    "plan.order_blocked": "Нельзя отметить шаг {step} выполненным: шаг {first} («{desc}») ещё не завершён. Сначала завершите предыдущие шаги или отметьте шаг {first} status=skipped, если он не нужен.",
    "plan.deliverables_missing": "Нельзя отметить шаг {step} выполненным: указанные в нём файлы ещё не существуют: {files}. Сначала создайте эти файлы (или отметьте шаг status=skipped, если они на самом деле не нужны).",
    "plan.kinds_mismatch": "Длина kinds должна совпадать с числом шагов",
    "plan.kinds_invalid": "Недопустимый kind шага: {kinds}. Используй \"create\" или \"delete\".",
    "plan.kinds_not_array": "kinds должен быть массивом значений \"create\" или \"delete\"",
    "plan.deliverables_remain": "Нельзя пометить шаг {step} как выполненный: указанные файлы всё ещё существуют: {files}. Шаг имеет kind=delete — сначала удали их (или поставь status=skipped, если они должны остаться).",
    "plan.show_header": "Статус плана:",
    "plan.show_empty": "(в плане нет шагов)",
    "plan.list_header": "Планы:",
    "plan.list_empty": "Нет планов",
    "plan.switch_no_id": "Укажите id плана для переключения",
    "plan.not_found": "План не найден: {id}",
    "plan.switched": "Переключено на план {id}: {title}",
    "plan.replanned": "План перепланирован: {kept} выполненных шагов сохранено, {steps} новых шагов добавлено",
    "plan.replan_no_steps": "Укажите новые шаги для перепланирования",
    "plan.active_in_progress": "Нельзя создать новый план: активный план {id} уже имеет прогресс ({done}/{total} выполнено, текущий: шаг {current}). Продолжай его — вызови \"plan show\", чтобы увидеть, и продолжай работу. Чтобы заменить план, сначала вызови \"plan abort\", затем \"plan create\".",
    "plan.id_ignored": "примечание: id плана генерируется автоматически; используй \"plan switch\", чтобы активировать существующий план по id.",
    "plan.existing_fresh": "примечание: предыдущий активный план не имел прогресса и сохранён как черновик.",
    "todo.added": "Добавлено {count} задач: {items}",
    "todo.marked_done": "Отмечено выполненными: {count}",
    "todo.no_active": "Нет активных задач",
    "todo.no_items": "Не указаны подзадачи — укажите items для отметки выполненными",
    "todo.subtask_not_found": "Подзадачи не найдены: {items}",
    "todo.unknown_action": "Неизвестное действие todo: {action}",
    "todo.acknowledged": "Todo принято",
    "verify.passed": "Проверка пройдена",
    "verify.failed": "Проверка не пройдена: {details}",
    "verify.file_exists": "Файл существует: {path}",
    "verify.file_not_found": "Файл не найден: {path}",
    "verify.script_passed": "Скрипт '{script}' пройден",
    "verify.script_failed": "Скрипт '{script}' не пройден: {message}",
    "verify.syntax_error": "Синтаксическая ошибка в: {path}",
    "verify.no_files": "Шаг {step} не содержит именованных файлов для проверки — выполни реальную проверку (bun run build / bun test / lsp_check) и подтверди результат.",
    "lsp.unavailable": "статические проверки недоступны (сервер не найден). Проверяйте через собственный build/test проекта.",
    "lsp.check_disabled": "LSP-проверки отключены в конфигурации.",
    "lsp.check_no_path": "Укажите путь (файл или каталог) для проверки.",
    "lsp.check_notfound": "Путь не найден: {path}",
    "lsp.check_unsupported": "Для файла не настроен LSP-сервер: {path}",
    "lsp.check_clean": "Ошибок и предупреждений не обнаружено (проверено файлов: {count}).",
    "lsp.startup_header": "[Существующие ошибки проекта (проверено при старте сессии) — исправьте их перед продолжением]:",
    "cli.description": "Micro Models Agent — ИИ-агент для кодинга на малых моделях",
    "cli.init": "Запустить мастер настройки",
    "cli.config_saved": "Конфигурация сохранена в ~/.mma/config.json",
    "cli.manage_config": "Управление конфигурацией",
    "cli.config_key": "Ключ конфига (напр., model, provider.baseUrl)",
    "cli.set_value": "Установить значение",
    "cli.set_done": "Установлено {key}={value}",
    "cli.show_config": "Показать текущий конфиг",
    "cli.manage_models": "Управление моделями",
    "cli.list_models": "Список доступных моделей",
    "cli.current_model": "Текущая модель:",
    "cli.model_hint": "(Используйте /model use <имя> для смены)",
    "cli.model_fetch_failed": "Не удалось получить модели: {error}",
    "cli.available_models": "Доступные модели:",
    "cli.no_models_found": "Модели не найдены у провайдера",
    "cli.fetching_models": "Загрузка списка моделей...",
    "cli.manage_context": "Управление контекстным окном",
    "cli.invalid_context_size": "Некорректный размер контекста. Должно быть число >= 1024",
    "cli.context_set": "Контекстное окно установлено: {size} токенов",
    "cli.set_model": "Установить модель по умолчанию",
    "cli.model_set": "Модель установлена: {name}",
    "cli.certify": "Запустить сертификационный набор для модели",
    "cli.cert_provider_url": "Базовый URL провайдера для сертификации (по умолчанию — текущий конфиг)",
    "cli.cert_provider_key": "API-ключ провайдера (необязательно)",
    "cli.cert_context_window": "Размер контекстного окна в токенах",
    "cli.cert_tags": "Теги сценариев через запятую (core, security, image, network, browser)",
    "cli.cert_reps": "Повторов по умолчанию на сценарий (переопределяется сценарием)",
    "cli.cert_force": "Перепрогнать существующую сертификацию",
    "cli.cert_clean": "Удалить песочницы после успешного прогона",
    "cli.cert_security_required": "Безопасность отключена. Включите её (например `mma security set-policy balanced`), чтобы запустить security-сьют.",
    "cli.cert_no_scenarios": "Нет сценариев под теги: {tags}",
    "cli.cert_exists": "Сертификация {model} на этом провайдере уже существует.",
    "cli.cert_exists_hint": "Используйте --force для перепрогона.",
    "cli.cert_started": "Сертификация {model} на {provider}...",
    "cli.cert_done": "Сертификация завершена: {passed} pass, {failed} fail, {skipped} skipped ({total} всего)",
    "cli.cert_rep_pass": "pass",
    "cli.cert_rep_fail": "fail",
    "cli.cert_status": "Показать статус сертификации модели",
    "cli.cert_list": "Список всех сертификаций",
    "cli.cert_uncertify": "Удалить сертификацию",
    "cli.cert_not_found": "Сертификация {model} не найдена",
    "cli.cert_uncertified": "Сертификация {model} удалена",
    "cli.cert_empty": "Сертификаций пока нет. Запустите `mma model certify <модель>`.",
    "cli.cert_provider_col": "провайдер",
    "cli.cert_suite_col": "сьют",
    "cli.cert_date_col": "дата",
    "cli.cert_version_col": "версия MMA",
    "cli.cert_stale_hint": "Запустите `mma model certify --force` для обновления.",
    "cli.cert_fixture_missing": "Фикстура отсутствует для {id}: {path}",
    "cli.cert_marks_hint": "Маркеры: ✔ сертифицировано на этом провайдере, ○ сертифицировано на старой версии MMA, · не сертифицировано",
    "cli.manage_providers": "Управление провайдерами",
    "cli.list_providers": "Список провайдеров",
    "cli.current_provider": "Текущий провайдер:",
    "cli.base_url": "Базовый URL:",
    "cli.set_provider": "Установить активный провайдер",
    "cli.provider_set": "Провайдер установлен: {name}",
    "cli.manage_sessions": "Управление сессиями",
    "cli.list_sessions": "Список всех сессий",
    "cli.show_details": "Показать детали сессии",
    "cli.delete_session": "Удалить сессию",
    "cli.first_run": "Первый запуск. Запускаем мастер настройки...",
    "cli.unknown_cmd": "Неизвестная команда: {name}.",
    "cli.help_hint": "Введите /help для списка команд.",
    "cli.available_cmds": "\nДоступные команды:",
    "cli.no_output": "Агент завершил работу, но не выдал результата. Возможно, задача не выполнена до конца.",
    "cli.no_agents_md": "Отключить загрузку AGENTS.md в системный промпт",
    "cli.dir": "Рабочая директория агента (по умолчанию — текущая)",
    "cli.exit_on_complete": "Завершить сразу после выполнения задачи; интерактивные тулзы (question/approve) не блокируют stdin, а возвращают ошибку",
    "cli.json": "Вывести результат в формате JSON (режим однократного запуска)",
    "cli.security.description": "Управление настройками безопасности",
    "cli.security.status": "Показать текущую конфигурацию безопасности",
    "cli.security.policies": "Список доступных политик безопасности",
    "cli.security.set_policy": "Применить пресет политики безопасности",
    "cli.security.preset": "Пресет политики (strict, balanced, permissive)",
    "cli.security.invalid_preset": "Некорректный пресет. Доступные: {presets}",
    "cli.security.policy_applied": "Политика безопасности применена: {name}",
    "cli.security.policy_description": "Описание: {description}",
    "cli.security.enable_encryption": "Включить шифрование файлов сессий",
    "cli.security.disable_encryption": "Отключить шифрование файлов сессий",
    "cli.security.encryption_enabled": "Шифрование файлов сессий включено",
    "cli.security.encryption_disabled": "Шифрование файлов сессий отключено",
    "cli.security.enable_audit": "Включить уведомления аудита",
    "cli.security.disable_audit": "Отключить уведомления аудита",
    "cli.security.audit_enabled": "Уведомления аудита включены",
    "cli.security.audit_disabled": "Уведомления аудита отключены",
    "cli.security.audit_stats": "Показать статистику уведомлений аудита",
    "cli.security.audit_stats_title": "Статистика уведомлений аудита",
    "cli.security.total_notifications": "Всего уведомлений",
    "cli.security.by_severity": "По уровню серьезности",
    "cli.security.by_type": "По типу",
    "cli.security.low": "Низкий",
    "cli.security.medium": "Средний",
    "cli.security.high": "Высокий",
    "cli.security.critical": "Критический",
    "cli.security.current_policy": "Текущая конфигурация безопасности",
    "cli.security.bash_enabled": "Проверка команд bash",
    "cli.security.path_validation": "Проверка доступа к путям",
    "cli.security.network_validation": "Проверка сетевых запросов",
    "cli.security.content_scanning": "Сканирование содержимого",
    "cli.security.max_recursion": "Максимальная глубина рекурсии",
    "cli.security.max_file_ops": "Максимум операций с файлами",
    "cli.security.rate_limit": "Ограничение запросов",
    "cli.security.session_encryption": "Шифрование сессий",
    "cli.security.audit_notifier": "Уведомления аудита",
    "cli.security.available_policies": "Доступные политики безопасности",
    "cli.security.recommended_for": "Рекомендуется для",
    "cli.yes": "Да",
    "cli.no": "Нет",
    "cli.plugins.description": "Управление плагинами",
    "cli.plugins.list": "Список загруженных плагинов (имя, версия, источник)",
    "cli.plugins.all": "Включить встроенные плагины",
    "cli.plugins.only_external": "(встроенные плагины скрыты — используйте --all)",
    "cli.plugins.none": "Плагины не загружены",
    "cli.plugins.header": "Плагины: {count} загружено (MMA v{mma})",
    "cli.plugins.builtin_mark": "●",
    "repl.help": "Показать доступные команды",
    "repl.help_usage": "Использование: /help",
    "repl.exit": "Выйти из REPL",
    "repl.exit_usage": "Использование: /exit",
    "repl.clear": "Очистить экран",
    "repl.clear_usage": "Использование: /clear",
    "repl.run": "Выполнить запрос через агента",
    "repl.run_usage": "Использование: /run <запрос>",
    "repl.config": "Показать текущую конфигурацию",
    "repl.config_usage": "Использование: /config",
    "repl.reasoning": "Переключить показ рассуждений модели",
    "repl.reasoning_usage": "Использование: /reasoning",
    "repl.status": "Показать статус агента",
    "repl.status_usage": "Использование: /status",
    "repl.plugins": "Список загруженных плагинов",
    "repl.plugins_usage": "Использование: /plugins [--all]",
    "repl.sessions": "Список всех сессий (* активная)",
    "repl.sessions_usage": "Использование: /sessions",
    "repl.new": "Создать новую сессию",
    "repl.new_usage": "Использование: /new [имя]",
    "repl.resume": "Переключиться на сессию по id или имени",
    "repl.resume_usage": "Использование: /resume <id|имя>",
    "repl.rename": "Переименовать текущую сессию",
    "repl.rename_usage": "Использование: /rename <новое-имя>",
    "repl.delete": "Удалить сессию по id",
    "repl.delete_usage": "Использование: /delete <id-сессии>",
    "repl.skill": "Управление скиллами (list, loaded, load, unload, search)",
    "repl.no_skills": "Нет доступных скиллов",
    "repl.available_skills": "Доступные скиллы:",
    "repl.no_loaded": "Нет загруженных скиллов",
    "repl.loaded_skills": "Загруженные скиллы:",
    "repl.budget": "Бюджет: {used} / {total} токенов (осталось {remaining})",
    "repl.skill_load_usage": "Использование: /skill load <имя>",
    "repl.skill_unload_usage": "Использование: /skill unload <имя>",
    "repl.skill_unloaded": "Скилл \"{name}\" выгружен",
    "repl.skill_not_loaded": "Скилл \"{name}\" не загружен",
    "repl.skill_search_usage": "Использование: /skill search <запрос>",
    "repl.no_skill_match": "Нет скиллов по \"{query}\"",
    "repl.skills_matching": "Скиллы по \"{query}\":",
    "repl.skill_unknown_sub": "Неизвестная подкоманда скилла: {subcmd}",
    "repl.skill_usage": "Использование: /skill [list|loaded|load|unload|search]",
    "repl.agent": "Агент: ",
    "repl.you": "Вы: ",
    "repl.interrupt": "Прервано (Esc)",
    "repl.title": "MMA REPL v{version}",
    "repl.model": "Модель:",
    "repl.provider": "Провайдер:",
    "repl.context": "Контекст:",
    "repl.sysprompt_label": "Системный промпт:",
    "repl.sysprompt_size": "{used} / {budget} токенов",
    "repl.sysprompt_desc": "Показать системный промпт",
    "repl.max_iters": "Макс итераций:",
    "repl.stuck_thresh": "Порог зависания:",
    "repl.reasoning_label": "Рассуждения:",
    "repl.log_level": "Уровень лога:",
    "repl.locale": "Язык:",
    "repl.session_label": "Сессия:",
    "repl.skills_label": "Скиллы:",
    "repl.plugins_label": "Плагины:",
    "repl.mcp_label": "MCP:",
    "repl.lsp_label": "LSP:",
    "repl.lsp_timeout": "таймаут",
    "repl.lsp_failed": "не стартовал",
    "repl.lsp_unknown": "неизвестно",
    "repl.work_dir": "Директория:",
    "repl.agents_label": "Инструкции:",
    "repl.not_found": "не найден",
    "repl.disabled": "отключено (--no-agents-md)",
    "repl.show": "показ",
    "repl.hide": "скрыть",
    "repl.resume_hint": "Используйте /resume <id> или /resume <имя> для переключения между сессиями",
    "repl.reasoning_status": "Рассуждения: {status}",
    "repl.wizard": "Запустить мастер настройки",
    "repl.wizard_usage": "Использование: /wizard",
    "repl.wizard_running": "Запуск мастера настройки... (текущая конфигурация будет перезаписана)",
    "repl.provider_list": "Показать/сменить провайдер",
    "repl.provider_current": "Текущий провайдер",
    "repl.provider_set": "Провайдер установлен: {name}",
    "repl.provider_usage": "Использование: /provider list | /provider use <тип>",
    "repl.model_list": "Показать/сменить модель",
    "repl.model_current": "Текущая модель",
    "repl.model_set": "Модель установлена: {name}",
    "repl.model_usage": "Использование: /model list | /model use <имя>",
    "repl.reload": "Перезагрузить агента с текущим конфигом",
    "repl.reload_usage": "Использование: /reload",
    "repl.reloading": "Перезагрузка агента...",
    "repl.reloaded": "Агент перезагружен",
    "repl.group.general": "Общее",
    "repl.group.agent": "Агент",
    "repl.group.session": "Сессии",
    "repl.group.skill": "Скиллы",
    "setup.title": "\n  Мастер настройки MMA v2\n",
    "setup.select_provider": "\n  Выберите тип провайдера:",
    "setup.select_provider_num": "\n  Выберите провайдер (1-{max})",
    "setup.scanning": "  Сканирование локальных LLM-серверов...",
    "setup.found_servers": "  Найдено серверов: {count}",
    "setup.no_servers": "  Локальные серверы не найдены. Введите URL вручную.",
    "setup.api_base": "  API Base URL",
    "setup.provider_type": "  Тип провайдера",
    "setup.api_key": "  API ключ (нажмите Enter для пропуска)",
    "setup.fetching_models": "  Загрузка списка моделей...",
    "setup.available_models": "  Доступные модели:",
    "setup.select_model": "  Выберите модель (1-{max})",
    "setup.model_name": "  Имя модели",
    "setup.testing": "\n  Тестирование чата с моделью \"{model}\"...",
    "setup.ok": "  OK — соединение успешно",
    "setup.warning": "  ВНИМАНИЕ: не удалось подключиться — проверьте API endpoint и ключ",
    "setup.agent_settings": "\n  --- Настройки агента ---",
    "setup.context_window": "  Контекстное окно (токены)",
    "setup.max_iters": "  Макс итераций инструментов",
    "setup.language": "\n  --- Язык ---",
    "setup.ui_lang": "  Язык интерфейса (en/ru)",
    "setup.complete": "\n  Настройка завершена!\n",
    "setup.select_server": "\n  Выберите сервер (1-{max})",
    "setup.custom_url": "Свой URL",
    "setup.scanning_spinner": "Сканирование локальных LLM-серверов…",
    "setup.fetching_spinner": "Загрузка списка моделей…",
    "setup.testing_spinner": "Проверка чата с \"{model}\"…",
    "setup.summary_setting": "Параметр",
    "setup.summary_value": "Значение",
    "setup.security_header": "\n  --- Безопасность ---",
    "setup.security_status_off": "  Безопасность: ВЫКЛ (по умолчанию — все команды разрешены)",
    "setup.security_configure": "  Настроить безопасность? (y/N)",
    "setup.security_bash_block": "  Блокировать опасные команды (rm, sudo, ssh и т.д.)? (y/N)",
    "setup.security_flags_block": "  Блокировать опасные флаги (--force, -rf и т.д.)? (y/N)",
    "setup.security_paths_deny": "  Разрешить доступ к .git/, .env, node_modules/? (y/N)",
    "skill.already_loaded": "Скилл \"{name}\" уже загружен",
    "skill.not_found": "Скилл \"{name}\" не найден ни в одном каталоге",
    "skill.no_match": "Нет скиллов подходящих для: {task}",
    "skill.too_large": "Скилл \"{name}\" слишком большой ({tokens} токенов). Бюджет: {budget} токенов. Продолжайте задачу без этого скилла.",
    "skill.exceeds_budget": "Скилл \"{name}\" ({tokens} токенов) превышает остаток бюджета ({remaining} токенов). Сначала выгрузите другие скиллы.",
    "skill.loaded": "Скилл \"{name}\" загружен ({tokens} токенов, осталось {remaining})",
    "skill.auto_loaded": "[Автозагружен скилл: {name}]",
    "skill.prompt_hint": "НЕ загружайте скиллы автоматически. Загружайте скилл ТОЛЬКО когда пользователь явно об этом просит (например 'используй скилл X' или 'загрузи скилл Y'). Скиллы ниже перечислены только для справки — не угадывайте какой скилл подходит по описанию задачи.",
    "skill.prompt_fallback": "Если load_skill не удался из-за большого размера скилла, продолжайте задачу без него — не останавливайтесь.",
    "skill.loaded_content": "[Скилл загружен: {name}]\n{content}\n\nИспользуйте эти знания для ответа на вопрос пользователя.",
    "exec.stuck": "Нет прогресса на шаге {stepId} ({description}) — {iterations} итераций.",
    "exec.stuck_recovery": "Шаг {stepId} — \"{description}\" — без прогресса уже {iterations} итераций. Попробуйте другой подход: проверьте что нужно для этого шага, установлены ли зависимости, или создайте файлы напрямую через write_file вместо команд терминала. После завершения шага вызовите plan update step={stepId} status=done.",
    "exec.tool_errors": "Инструмент {tool} упал {count} раз. Попробуйте другой инструмент.",
    "exec.tool_errors_recovery": "Инструмент {tool} упал {count} раз подряд. Попробуйте альтернативу: создайте файлы напрямую через write_file, используйте другую команду, или пропустите этот шаг через plan update step=N status=skipped с пометкой почему.",
    "exec.repetitive_tool": "Инструмент {tool} вызван {count} раз с одинаковыми аргументами и результатом. Попробуйте другой подход — создайте файлы напрямую, измените аргументы или проверьте статус процесса через process_log.",
    "exec.consecutive_failures_recovery": "{count} инструментов подряд упали. Создавайте файлы напрямую через write_file вместо команд терминала. Проверьте что зависимости установлены (npm install). Не запускайте сборку/тесты пока не созданы все файлы.",
    "exec.read_only_loop": "Нет записи/выполнения за {count} вызовов — агент только читает/исследует.",
    "exec.read_only_loop_recovery": "{count} вызовов только для чтения подряд (read_file/glob/grep/browser) без записи. Хватит исследовать — внесите правку, которую требует задача: прочитайте файл, затем вызовите write_file или edit_file. Если не можете завершить задачу — спросите пользователя, а не перечитывайте одни и те же файлы.",
    "exec.plan_warning": "Текущий шаг плана {step} — \"{description}\", но вызывается {tool} для файлов вне этого шага. Завершите текущий шаг, вызовите plan update step={step} status=done, затем переходите к следующему.",
    "exec.plan_blocked": "{max} вызовов подряд вне текущего шага. Завершите шаг {step} — остальные шаги ждут пока этот не будет выполнен.",
    "exec.off_track": "Шаг {stepId} — \"{description}\", но используется {tool} для другого пути. Вернитесь к текущему шагу.",
    "exec.step_gate_deps": "[⚠ Шаг {step} \"{description}\": зависимости не установлены. Сначала выполните команду установки (npm install, pip install и т.д.). Проверьте что lock-файл или директория зависимостей существует. Если этот шаг на самом деле не нужен (внешних зависимостей нет) — пропусти его: plan update step={step} status=skipped note=\"зависимости не нужны\".]",
    "exec.step_gate_deps_force": "[⚠ Шаг {step}: зависимости всё ещё не установлены (нет lock-файла) — второе предупреждение. Если этот шаг НЕ нужен — НЕМЕДЛЕННО вызови: plan update step={step} status=skipped note=\"зависимости не нужны\". Если нужен — выполни установку прямо сейчас. Не делай других вызовов инструментов до обновления плана.]",
    "exec.step_gate_empty": "[⚠ Шаг {step}: файлы существуют, но выглядят пустыми: {files}. Добавьте реальный код в эти файлы перед тем как переходить к следующему шагу.]",
    "exec.step_gate_ok": "[✓] Шаг {step} завершён и проверен. ПЕРЕХОДИМ к шагу {nextStep}: \"{nextDesc}\". Работайте ТОЛЬКО над этим шагом.",
    "exec.step_gate_last": "[✓] Шаг {step} завершён — это был последний шаг. Проверьте всё вместе и предоставьте финальный ответ.]",
    "exec.audit_pass": "[✓] Задача выполнена: {done}/{total} шагов, {files} файлов проверено",
    "exec.audit_pending": "[✗] Задача не выполнена: {done}/{total} шагов — оставшиеся шаги не отмечены выполненными",
    "exec.audit_fail": "[✗] Задача не выполнена: {done}/{total} шагов, {files} файлов отсутствует",
    "exec.audit_leftovers": "[✗] Задача не выполнена: {done}/{total} шагов, {files} файлов из delete-шагов всё ещё существуют",
    "exec.audit_fail_tests": "[✗] Задача не выполнена: {done}/{total} шагов, тесты ПАДАЮТ: {failed} failed / {passed} passed — {detail}",
    "exec.audit_fail_typecheck": "[✗] Задача не выполнена: {done}/{total} шагов, {missing} файлов отсутствует, ошибка typecheck: {typeError}",
    "exec.audit_incomplete": "[⚠ Финальная проверка не пройдена: {summary}. Задача НЕ завершена — продолжайте работу. Оставшиеся шаги: {steps}]",
    "exec.mass_edit_warning": "⚠️ План затрагивает {count} файлов — проверьте полный список перед продолжением.",
    "exec.escalation": "\n\n⚠️ Агент застрял на шаге {stepId} ({description}). Эскалация к пользователю — пожалуйста, подскажите как действовать.",
    "exec.hints": "\n[Подсказки]\n{hints}",
    "exec.file_rewrite_warning": "⚠️ Файл {file} был перезаписан {count} раз. Попробуйте другой подход — текущая стратегия исправлений не работает.",
    "exec.forbidden_cmd": "ПРЕКРАТИ использовать \"{cmd}\" через bash — это не команда Windows cmd.exe, и она уже неоднократно падала в этой сессии. Используй предназначенный тул: grep → тул grep, ls/dir → list_dir, find → glob, rm → delete_file, sed → edit_file, touch → write_file, which → `where`, cp/mv → move_file, diff → read_file. Больше не вызывай bash для этого.",
    "exec.npm_exec_hint": "\"could not determine executable to run\" — у пакета/скрипта нет \"bin\". Используй \"npm run <script>\" (скрипт должен быть в package.json) или \"bunx <pkg>\" для пакета с объявленным bin.",
    "hall.max_retries_exhausted": "Модель вернула пустой или недостаточный ответ после нескольких попыток",
    "hall.short_response": "Слишком короткий или пустой ответ",
    "hall.repetitive": "Слишком повторяющийся ответ ({pct}% совпадение)",
    "hall.uncertainty": "Маркеры неопределённости: {markers}",
    "hall.unknown_paths": "Упомянутые файлы не найдены: {paths}",
    "hall.contradiction_llm": "Противоречит ранее принятому решению{reason}",
    "hall.uncertainty_prefix": "\n\n[⚠️ Неопределённость] ",
    "browser.repeated_action": "Вы повторили то же действие ({action}) {threshold} раз. Попробуйте другой подход: используйте \"snapshot\" для перечитки страницы, другие номера элементов или другой URL.",
    "browser.unknown_action": "Неизвестное действие: {action}",
    "browser.error": "Ошибка браузера: {message}",
    "browser.no_page": "Нет открытой страницы. Сначала выполните \"open\".",
    "browser.url_required": "Требуется URL",
    "browser.create_page_failed": "Не удалось создать страницу",
    "browser.nav_failed": "Ошибка навигации: {message}",
    "browser.invalid_target": "Неверный таргет. Укажите номер элемента из snapshot.",
    "browser.click_failed": "Ошибка клика: {message}. Проверьте номер элемента.",
    "browser.invalid_target_short": "Неверный таргет.",
    "browser.text_required": "Требуется текст.",
    "browser.type_failed": "Ошибка ввода: {message}",
    "browser.direction_invalid": "Направление должно быть: up, down, top, bottom",
    "browser.scroll_failed": "Ошибка прокрутки: {message}",
    "browser.closed": "Браузер закрыт.",
    "browser.no_page_short": "Нет страницы",
    "browser.no_elements": "(нет интерактивных элементов на странице)",
    "browser.more_elements": "... и другие элементы не показаны. Используйте прокрутку или поиск.",
    "browser.content_header": "Содержимое:",
    "browser.console_header": "Консоль:",
    "browser.network_errors_header": "Сетевые ошибки:",
    "browser.truncated": "... (обрезано)",
    "pipeline.invalid": "Невалидный пайплайн: требуются name и steps",
    "pipeline.step_missing_fields": "Шаг не содержит обязательных полей (id, agent, prompt): {step}",
    "pipeline.circular": "Циклическая зависимость: {stepId}",
    "plugin.loaded": "Загружен плагин: {name}",
    "plugin.skipped": "Пропущен несовместимый плагин: {entry} ({message})",
    "plugin.incompatible": "Пропущен плагин {name}: требуется MMA v{min}, текущая v{current}",
    "plugin.dedup_older": "Плагин {name} v{version} пропущен: уже загружена более новая версия",
    "migration.detected": "[MMA] Обнаружен старый конфиг. {summary}",
    "migration.summary": "[MMA] {summary}",
    "migration.config_bak": "- config → config.json.bak",
    "migration.dir_bak": "- .mma/ → .mma.bak/ ({count} файлов)",
    "migration.migrated": "Мигрировано:",
    "migration.not_needed": "Миграция не требуется",
    "ui.error_prefix": "Ошибка: ",
    "ui.success_prefix": "✓ ",
    "ui.warning_prefix": "⚠ ",
    "ui.thinking": "Думаю…",
    "ui.step_context": "шаг {id}: {desc}",
    "indexer.map_header": "Карта проекта",
    "indexer.top_directories": "Основные директории",
    "indexer.files": "Файлы",
    "indexer.empty": "Нет проиндексированных файлов",
    "indexer.and_more": "... и ещё {count} файлов",
    "indexer.project_map_desc": "Получить карту проекта: сводка по файлам, языкам и экспортам. Используйте действие 'find' для поиска файлов по пути или экспорту, 'refresh' для перестроения индекса.",
    "indexer.project_map_action_desc": "Действие: summary, refresh или find",
    "indexer.project_map_query_desc": "Строка поиска для действия find (совпадение по пути или экспортированным именам)",
    "indexer.summary": "Карта проекта: {summary}",
    "indexer.refreshed": "Карта проекта обновлена: {summary}",
    "indexer.not_indexed": "Проект ещё не проиндексирован",
    "indexer.find_results": "Найдено {count} совпадающих файлов:\n{results}",
    "indexer.no_matches": "Нет совпадающих файлов для \"{query}\"",
    "indexer.duplicates": "Дубликаты basename (проверьте, какой файл реально используется): {names}",
    "indexer.stack_deps": "зависимости",
    "indexer.stack_dev": "dev",
    "indexer.stack_scripts": "скрипты",
    "tool.friendly.project_map": "Карта проекта",
    "config.decryption_warning": "Предупреждение: не удалось расшифровать конфигурацию: {error}",
    "config.encryption_warning": "Предупреждение: не удалось зашифровать конфигурацию: {error}",
    "image.source_required": "Укажите источник изображения: путь к файлу, URL или \"clipboard\".",
    "image.clipboard_empty": "Буфер обмена не содержит изображение. Скопируйте изображение (например, скриншот через Win+Shift+S).",
    "image.not_found": "Файл изображения не найден: {path}",
    "image.no_context": "Менеджер контекста недоступен. Изображение можно прикрепить только во время активной сессии.",
    "image.attached": "Изображение прикреплено из {source} ({size}). Оно будет включено в следующее сообщение.",
    "image.error": "Не удалось загрузить изображение: {message}",
    "tool.friendly.attach_image": "Прикрепить изображение",
    "repl.image": "Прикрепить изображение",
    "repl.image_usage": "/image <путь|URL|clipboard> — прикрепить изображение к следующему сообщению",
    "tool.friendly.remember": "Запомнить",
    "tool.friendly.recall": "Вспомнить",
    "tool.remember.preference": "Запомнено: {key} = {value}",
    "tool.remember.entry": "Запомнено: {category} — \"{entry}\"",
    "tool.remember.key_required": "Для preferences требуется ключ (key)",
    "tool.remember.entry_required": "Требуется текст записи",
    "tool.recall.empty": "Ничего не найдено по \"{query}\"",
    "tool.recall.no_memory": "Память пуста",
    "tool.recall.search_results": "Результаты {category}:\n{results}",
    "ctx.compactions": "сжатий: {count}",
    "ctx.quality": "качество: {percent}%",
    "ctx.delta_pos": "контекст +{tokens}",
    "ctx.delta_neg": "контекст -{tokens} ↓",
    "ctx.delta_zero": "контекст ±0",
    "file.notfound_resolved": "Файл не найден: {path} (резолвится в {resolved})",
    "bash.echo_write_blocked": "Запись файлов через echo/printf ненадёжна в Windows cmd.exe (кавычки и многострочность ломаются). Используй инструмент write_file вместо этого (цель: {path}).",
    "updater.check_error": "[updater] Ошибка проверки обновления: {error}",
    "updater.available": "[updater] Доступно обновление: {current} → {latest}. Выполните `npm install -g micro-models-agent` для обновления.",
    "updater.installing": "[updater] Установка {latest} глобально (текущая: {current})…",
    "updater.installed": "[updater] Установлена {latest}. Перезапустите MMA для применения (была {current}).",
    "updater.install_failed": "[updater] Не удалось установить {latest}: {error}. Обновите вручную: `npm install -g micro-models-agent`.",
    "tools.enable_no_tags": "enable_tools требует хотя бы один тег в массиве \"tags\".",
    "tools.enable_no_executor": "Исполнитель тулов недоступен — невозможно перечислить включённые тулы.",
    "tools.enable_already_active": "Теги тулов уже активны: {tags}.",
    "tools.enable_added": "Включены теги тулов: {tags}. Теперь доступны тулы: {tools}",
    "tools.hidden_header": "Дополнительные тулы (включите по требованию через enable_tools или маршрутизируйте через subagent tool_tags):",
    "tool.friendly.enable_tools": "Включить тулы"
}
