export default { login: { title: 'Hermes Studio', description: 'Введите имя пользователя и пароль для продолжения.', placeholder: 'Токен доступа', submit: 'Войти', tokenRequired: 'Введите токен доступа', invalidToken: 'Недействительный токен', connectionFailed: 'Не удалось подключиться к серверу', passwordLogin: 'Вход по паролю', tokenLogin: 'Вход по токену', usernamePlaceholder: 'Имя пользователя', passwordPlaceholder: 'Пароль', defaultCredentialsHint: 'Логин по умолчанию: admin, пароль по умолчанию: 123456', credentialsRequired: 'Введите имя пользователя и пароль', invalidCredentials: 'Неверное имя пользователя или пароль', tooManyAttempts: 'Слишком много неудачных попыток входа, повторите попытку позже', desktopLockResetHint: 'Too many failed login attempts. Open the system tray menu and choose Reset Login to reset the password.', sessionExpired: 'Сеанс истёк, войдите снова', accessDenied: 'У вас нет прав доступа к этому ресурсу', passwordMismatch: 'Пароли не совпадают', passwordTooShort: 'Длина пароля должна быть не менее 6 символов', setupSuccess: 'Настройка входа по паролю выполнена успешно', passwordChanged: 'Пароль успешно изменён', passwordRemoved: 'Вход по паролю удалён', setupPassword: 'Настроить вход по паролю', changePassword: 'Изменить пароль', changeUsername: 'Изменить имя пользователя', removePasswordLogin: 'Удалить', username: 'Имя пользователя', currentPassword: 'Текущий пароль', newPassword: 'Новый пароль', confirmPassword: 'Подтвердите пароль', newUsername: 'Новое имя пользователя', usernameChanged: 'Имя пользователя успешно изменено', usernameTooShort: 'Имя пользователя должно содержать не менее 2 символов', setupDescription: 'Управление именем пользователя и паролем для входа.', removeConfirm: 'Учётная запись пользователя должна сохранять вход по паролю.', passwordLoginNotConfigured: 'Вход по паролю не настроен', passwordLoginConfigured: 'Текущая учётная запись: {username}', defaultCredentialTitle: 'Измените учётные данные по умолчанию', defaultCredentialMessage: 'Текущая учётная запись всё ещё использует имя пользователя или пароль по умолчанию. Во избежание несанкционированного доступа, как можно скорее измените имя пользователя и пароль для этой учётной записи.', defaultCredentialAction: 'Изменить', defaultCredentialLater: 'Напомнить позже', }, users: { title: 'Управление учётными записями', description: 'Создавайте пользователей, назначайте роли и управляйте доступом к конфигурациям для обычных администраторов.', create: 'Создать пользователя', edit: 'Редактировать пользователя', username: 'Имя пользователя', role: 'Роль', statusLabel: 'Статус', profiles: 'Доступные конфигурации', profilesPlaceholder: 'Выберите доступные конфигурации', allProfiles: 'Все конфигурации', noProfiles: 'Нет связанных конфигураций', lastLogin: 'Последний вход', newPasswordOptional: 'Новый пароль (оставьте пустым, чтобы не менять)', loadFailed: 'Не удалось загрузить список пользователей', deleteConfirm: 'Подтвердите удаление этого пользователя?', enable: 'Включить', disable: 'Отключить', roles: { superAdmin: 'Суперадминистратор', admin: 'Администратор', }, status: { active: 'Включён', disabled: 'Отключён', }, }, common: { loading: 'Загрузка...', cancel: 'Отмена', delete: 'Удалить', retry: 'Повторить', reset: 'Сбросить', edit: 'Редактировать', save: 'Сохранить', saved: 'Сохранено', saveFailed: 'Ошибка сохранения', deleteFailed: 'Ошибка удаления', ok: 'ОК', copied: 'Скопировано', copy: 'Копировать', update: 'Обновить', create: 'Создать', noData: 'Нет данных', expired: 'Истёк', fetch: 'Получить', add: 'Добавить', enable: 'Включить', disable: 'Отключить', configured: 'Настроено', notConfigured: 'Не настроено', confirm: 'Подтвердить', expand: 'Развернуть', collapse: 'Свернуть', start: 'Запустить', stop: 'Остановить', }, sidebar: { chat: 'Чат', backToChat: 'Назад', search: 'Поиск', apiRelay: 'Ретранслятор API', history: 'История', jobs: 'Задачи', kanban: 'Канбан', workflow: 'Рабочий процесс', models: 'Модели', profiles: 'Пользователи', plugins: 'Плагины', petdex: 'Pets', skills: 'Навыки', memory: 'Память', logs: 'Логи', usage: 'Использование', performance: 'Мониторинг производительности', journey: 'Путь обучения', skillsUsage: 'Использование навыков', channels: 'Каналы', gateways: 'Шлюзы', terminal: 'Терминал', singleChat: 'Чат', globalAgent: 'Global Agent', groupChat: 'Групповой чат', files: 'Файлы', devices: 'Устройства', groupConversation: 'Диалог', groupConversationShort: 'Диалог', groupPlatform: 'Платформа', groupAgent: 'Агент', groupAgentShort: 'Агент', groupSystem: 'Система', groupSystemShort: 'Система', groupMonitoring: 'Мониторинг', groupMonitoringShort: 'Мониторинг', groupTools: 'Инструменты', settings: 'Настройки', connected: 'Подключено', disconnected: 'Отключено', collapse: 'Свернуть меню', expand: 'Развернуть меню', updateTip: 'Для обновления выполните в терминале "hermes-web-ui update"', updateVersion: 'Обновить до версии v{version}', reloadClientVersion: 'Обновить клиент до v{version}', updating: 'Обновление...', updateSuccess: 'Обновление успешно. Обновите страницу. Если долго не запускается, запустите вручную.', updateFailed: 'Ошибка обновления', logout: 'Выйти', nodeVersionWarning: 'Обнаружена Node.js v{version}. Пожалуйста, обновитесь до версии 23 или выше.', changelog: 'Список изменений', noChangelog: 'Нет списка изменений', versionManagement: 'Управление версиями', updateAvailableLabel: '(Новая версия)', dockerUpdateTitle: 'Обновление Docker', dockerUpdateGuide: 'В среде Docker, пожалуйста, загрузите последний образ и пересоздайте контейнер:', dockerUpdateNote: 'Ваши данные сохранятся после пересоздания контейнера.', }, runtimeVersions: { title: 'Управление версиями', runtimeTitle: 'Hermes Runtime', webUiTitle: 'Web UI', platform: 'Платформа', currentWebUi: 'Текущий Web UI', activeVersion: 'Активная версия', active: 'Активна', installed: 'Установлена', download: 'Скачать', downloadGithub: 'Скачать с GitHub', downloadCf: 'Скачать с Cloudflare', github: 'GitHub', cf: 'Cloudflare', useVersion: 'Использовать при следующем запуске', deleteVersion: 'Удалить', deleteRuntimeConfirm: 'Удалить Hermes Runtime {version}?', deleteWebUiConfirm: 'Удалить Web UI {version}?', deleteRuntimeSuccess: 'Runtime удален', deleteWebUiSuccess: 'Web UI удален', refresh: 'Обновить', noVersions: 'Нет доступных версий', remoteLoadFailed: 'Не удалось загрузить удаленные версии', downloadTasks: 'Задачи загрузки', downloadStarted: 'Загрузка начата', activateSuccess: 'Выбор версии сохранен. Перезапустите Hermes Studio, чтобы применить его.', jobStatus: { queued: 'В очереди', running: 'Выполняется', completed: 'Завершено', failed: 'Ошибка', }, jobStageStatus: { queued: 'В очереди', resolve: 'Определение', download: 'Загрузка', verify: 'Проверка', extract: 'Распаковка', install: 'Установка', completed: 'Завершено', failed: 'Ошибка', }, jobStage: { queued: 'В очереди', download: 'Загрузка', resolveRuntime: 'Определение пакета Runtime', verifyRuntime: 'Проверка архива Runtime', extractRuntime: 'Распаковка архива Runtime', installRuntime: 'Установка Runtime', resolveWebUi: 'Определение пакета Web UI', verifyWebUi: 'Проверка архива Web UI', extractWebUi: 'Распаковка архива Web UI', installWebUi: 'Установка Web UI', completed: 'Завершено', failed: 'Ошибка', }, }, codingAgents: { installFailedHermesHint: 'Installation failed. Ask Hermes to install it for you.', installFailureReason: 'Reason', }, mcuDevices: { title: 'Little Box', subtitle: 'View device link status', name: 'Name', nameOptional: 'Name is optional', deviceCode: 'Device code', deviceCodePlaceholder: 'Enter device code', deviceCodeRequired: 'Enter device code', channel: 'Channel', official: 'Official', unofficial: 'Unofficial', createdAt: 'Added at', lanStatus: 'LAN', remoteStatus: 'Удаленно', connected: 'Подключено', disconnected: 'Не подключено', remoteConnect: 'Удаленное подключение', remoteConnected: 'Удаленно подключено', remoteConnectFailed: 'Не удалось подключиться удаленно', remoteDisconnect: 'Отключить', remoteDisconnected: 'Удаленно отключено', remoteDisconnectFailed: 'Не удалось отключить удаленно', actions: 'Actions', add: 'Add', addTitle: 'Add MCU device', added: 'MCU device added', addFailed: 'Failed to add MCU device', purchase: 'Buy', edit: 'Edit', editNameTitle: 'Edit name', nameUpdated: 'Name updated', nameUpdateFailed: 'Failed to update name', delete: 'Delete', deleteTitle: 'Delete MCU device', deleteConfirm: 'Delete "{name}"?', deleted: 'MCU device deleted', deleteFailed: 'Failed to delete MCU device', loadFailed: 'Failed to load MCU devices', close: 'Close', }, devices: { title: 'Устройства', count: 'Устройств: {count}', lastScanned: 'Последнее сканирование: {time}', refresh: 'Обновить', empty: 'Устройства не найдены', computer: 'Компьютер', endpointLabel: 'Точка доступа', statusLabel: 'Статус', online: 'Online', offline: 'Offline', address: 'Адрес', os: 'ОС', agentVersion: 'Agent', webUiVersion: 'Web UI', responseMs: 'Задержка', lastSeen: 'Последний раз обнаружено', open: 'Открыть', never: 'Никогда', unknown: 'Неизвестно', loadFailed: 'Не удалось загрузить устройства', scanFailed: 'Не удалось просканировать устройства', updateFailed: 'Не удалось обновить устройство', duplicateRequest: 'Уже есть ожидающий запрос на сопряжение', manualPairing: 'Pair by URL', copyPairingLink: 'Copy pairing link', manualUrlPlaceholder: 'https://device.example.com', manualUrlRequired: 'Enter a device URL', manualRequestSent: 'Pairing request sent', manualRequestFailed: 'Failed to request remote pairing', pairingLinkCopied: 'Pairing link copied', pairingLinkCopyFailed: 'Failed to copy pairing link', pairingCodeTitle: 'Enter pairing code', pairingCodePlaceholder: 'Pairing code', pairingCodeRequired: 'Enter the pairing code', submitPairingRequest: 'Submit request', processed: 'Обработано', unprocessed: 'Не обработано', deleteHistory: 'Удалить запись', deleteHistoryConfirm: 'Удалить эту запись запроса и отозвать доступ подключения для этого устройства?', requests: 'Запросы', requestsWithCount: 'Запросы ({count})', noRequests: 'Запросов нет', requestPairing: 'Запросить сопряжение', paired: 'Сопряжено', approve: 'Одобрить', reject: 'Отклонить', block: 'Заблокировать', unblock: 'Разблокировать', inboundStatus: { none: 'Запрос разрешен', pending: 'Ожидает', approved: 'Одобрено', rejected: 'Отклонено', blocked: 'Заблокировано', }, outboundStatus: { none: 'Не сопряжено', pending: 'Запрошено', approved: 'Сопряжено', rejected: 'Отклонено', blocked: 'Заблокировано', }, endpoint: { web: 'Web', desktop: 'Настольное приложение', custom: 'Пользовательский', }, }, performance: { title: 'Мониторинг производительности', subtitle: 'Просмотр системных ресурсов, Bridge Broker, воркеров и активных сеансов', refresh: 'Обновить', autoRefreshOn: 'Автообновление', autoRefreshOff: 'Ручное обновление', loadFailed: 'Ошибка загрузки данных производительности', systemCpu: 'ЦП системы', systemMemory: 'Память системы', activeSessions: 'Активные сеансы', runningSessions: 'Запущено {count}', workers: 'Воркеры', totalWorkerMemory: 'Общая память воркеров', processes: 'Процессы', uptime: 'Время работы', running: 'Запущен', stopped: 'Остановлен', workerMemory: 'Память воркера', lastUpdated: 'Время обновления', profile: 'Профиль', memory: 'Память', sessions: 'Сеансы', runningActiveSessions: 'Запущено / Активно', lastUsed: 'Последнее использование', status: 'Статус', noWorkers: 'Нет воркеров', sessionsByProfile: 'Сеансы по профилям', noActiveSessions: 'Нет активных сеансов', }, journey: { title: 'Путь обучения', play: 'Воспроизвести путь', pause: 'Приостановить путь', refresh: 'Обновить', loadFailed: 'Не удалось загрузить путь обучения', nodes: 'Узлы', edges: 'Связи', skills: 'Навыки', memories: 'Воспоминания', clusters: 'Кластеры', profile: 'Профиль', source: 'Источник', learnedSkills: 'Изученные навыки', memorySkillEdges: 'Связи памяти', allKinds: 'Все типы', allCategories: 'Все категории', searchPlaceholder: 'Поиск узлов', noClusters: 'Кластеров нет', noNodes: 'Узлов пути нет', noCategory: 'Без категории', category: 'Категория', useCount: 'Использований', createdBy: 'Создано', timestamp: 'Время', pinned: 'Закреплено', }, drawer: { terminal: 'Терминал', files: 'Рабочая область', }, chat: { contextRemaining: 'Осталось', contextClickToEdit: 'Нажмите, чтобы изменить размер контекста', contextEditTitle: 'Изменить размер контекста', contextEditDesc: 'Установите лимит размера контекста для текущей модели (в токенах)', contextEditPlaceholder: 'Введите размер контекста', contextEditHint: 'Типовые значения: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Сохранить', contextEditCancel: 'Отмена', contextEditInvalid: 'Введите корректный размер контекста', contextEditSuccess: 'Размер контекста обновлён', contextEditFailed: 'Ошибка обновления', emptyState: 'Начните диалог с Hermes Agent', viewOlderInHistory: 'Посмотреть более ранние сообщения в истории', scrollToBottom: 'Прокрутить вниз', cliEmptyState: 'Начните CLI-диалог', outlineTitle: 'План беседы', outlineEmpty: 'Нет содержимого беседы', outlineUserQuestion: 'Вопрос пользователя', inputPlaceholder: 'Введите сообщение... (Enter — отправить, Shift+Enter — новая строка)', inputHeightResizeHint: 'Перетащите, чтобы изменить высоту поля ввода, и дважды щелкните для сброса.', slashCommandArgs: { message: '<сообщение>', title: '<заголовок>', text: '<текст>', }, slashCommands: { usage: 'Рассчитать использование текущего сеанса', status: 'Показать статус сеанса и очередь', abort: 'Остановить текущий запуск Bridge', queue: 'Добавить сообщение в очередь после текущего запуска', learn: 'Создать переиспользуемый навык из описанных источников', clear: 'Очистить текущее отображение', clearHistory: 'Удалить сохранённую историю сообщений текущего сеанса', title: 'Переименовать текущий сеанс', compress: 'Запустить сжатие контекста в простое', steer: 'Отправить направляющий текст текущему запуску Bridge', destroy: 'Освободить Bridge Agent текущего сеанса', reloadMcp: 'Перезагрузить серверы MCP', reloadSkills: 'Перезагрузить команды skills', }, attachFiles: 'Прикрепить файлы', reasoningEffort: { tooltip: 'Глубина рассуждений', defaultLabel: 'По умолчанию', options: { default: 'По умолчанию (config.yaml)', none: 'Нет', minimal: 'Минимум', low: 'Низкая', medium: 'Средняя', high: 'Высокая', xhigh: 'Очень высокая', }, }, autoPlaySpeech: 'Автовоспроизведение речи', voiceInput: { startCapture: 'Начать голосовой ввод', stopCaptureAndInsert: 'Остановить голосовой ввод и вставить текст в поле ввода', cancelCapture: 'Отменить голосовой ввод', statusLabel: 'Статус: {status}', transcriptLabel: 'Транскрипт: {text}', errorLabel: 'Ошибка: {error}', recentEvents: 'Последние события', status: { idle: 'Ожидание', capturing: 'Слушаю', transcribing: 'Расшифровка', sending: 'Вставка в поле ввода', error: 'Ошибка', }, browserSpeechUnsupported: 'Распознавание речи браузером не поддерживается в этом браузере.', browserSpeechFailed: 'Распознавание речи браузером не удалось.', browserSpeechFailedWithReason: 'Распознавание речи браузером не удалось: {error}.', microphoneUnsupported: 'Запись с микрофона не поддерживается в этом браузере.', microphoneRecordingFailed: 'Запись с микрофона не удалась.', }, showToolCalls: 'Показать вызовы инструментов', hideToolCalls: 'Скрыть вызовы инструментов', messageQueue: 'Очередь сообщений', removeQueuedMessage: 'Удалить сообщение из очереди', stop: 'Остановить', start: 'Запустить', stopGateway: 'Остановить шлюз', send: 'Отправить', contextUsed: 'Контекст использован:', sessions: 'Сеансы', webUiSessions: 'Сеансы', allProfiles: 'Все профили', profileMissingModelsTip: 'У профиля «{profile}», к которому относится этот сеанс, нет доступных провайдеров или моделей', sessionScopeHint: 'Здесь отображаются только текущие сеансы; сеансы CLI, Telegram, Discord, Cron и других каналов доступны в истории только для чтения.', openHistory: 'Открыть историю', hermesHistory: 'История Hermes', historyScopeHint: 'Здесь для чтения отображаются исторические сеансы Hermes текущего профиля с разбивкой по источникам.', noSessions: 'Нет сеансов', searchTitle: 'Поиск сеансов', searchSubtitle: 'Поиск по заголовку или содержимому сообщений', searchScope: 'Область поиска: только локальная библиотека сеансов Web UI; сеансы истории Hermes только для чтения не включаются.', searchHint: 'Cmd/Ctrl+K', searchPlaceholder: 'Поиск сеансов...', searchEmpty: 'Недавние сеансы', searchRecent: 'Недавние сеансы', searchNoResults: 'Нет подходящих сеансов', searchNoSnippet: 'Нет отображаемого фрагмента', searchEnterHint: 'Enter — открыть · Esc — закрыть', searchFailed: 'Ошибка поиска сеансов', newChat: 'Новый диалог', agent: 'Agent', approvalKicker: 'Авторизация в терминале', approvalTitle: 'Подтвердите команду перед выполнением', approvalAgree: 'Согласиться', approvalAllowOnce: 'Разрешить однократно', approvalAllowSession: 'Разрешить для этого сеанса', approvalAlways: 'Разрешить всегда', approvalDeny: 'Отказать', newCliChat: 'Новый CLI', deleteSession: 'Удалить этот сеанс?', sessionDeleted: 'Сеанс удалён', toggleBatchMode: 'Пакетный выбор', selectAll: 'Выбрать всё', confirmBatchDelete: 'Удалить выбранные сеансы ({count})?', batchDeleteSuccess: 'Удалено сеансов: {count}', batchDeletePartial: 'Не удалось удалить сеансов: {failed}', batchDeleteFailed: 'Ошибка пакетного удаления', rename: 'Переименовать', archiveSession: 'Архивировать', unarchiveSession: 'Вернуть из архива', pin: 'Закрепить', unpin: 'Открепить', pinned: 'Закреплено', chatMode: 'Чат', liveMode: 'В реальном времени', liveSessions: 'Сеансы в реальном времени', recentBadge: 'Недавние', linkedSessions: 'Связано сеансов: {count}', noVisibleMessages: 'Нет видимых человеку сообщений.', monitorRoleUser: 'Пользователь', monitorRoleAssistant: 'Ассистент', copySessionLink: 'Копировать ссылку на сеанс', copySessionId: 'Копировать ID сеанса', export: 'Экспорт', editConfig: 'Редактировать конфигурацию', exportFull: 'Полный экспорт (JSON)', exportCompressed: 'Сжатый экспорт (TXT)', exportCompressing: 'Сжатие контекста, подождите...', exportSuccess: 'Сеанс экспортирован', exportFailed: 'Ошибка экспорта', renamed: 'Переименовано', renameFailed: 'Ошибка переименования', sessionArchived: 'Сеанс архивирован', archiveSessionFailed: 'Не удалось архивировать сеанс', sessionUnarchived: 'Сеанс возвращён из архива', unarchiveSessionFailed: 'Не удалось вернуть сеанс из архива', renameSession: 'Переименовать сеанс', sessionNotFound: 'Сеанс не найден', enterNewTitle: 'Введите новый заголовок', workspace: 'Рабочая область', setWorkspace: 'Установить рабочую область', setWorkspaceTitle: 'Установить рабочую область сеанса', workspacePlaceholder: 'Введите путь к проекту, например /home/user/project', folderPickerEmpty: '(Пусто)', folderPickerNoFolders: 'Нет папок рабочей области', folderPickerSelected: 'Выбрано:', workspaceDefault: 'По умолчанию', workspaceDefaultTooltip: 'Эта рабочая область задана по умолчанию и будет автоматически подставляться в новых чатах', workspacePin: 'Сделать рабочей областью по умолчанию', workspaceUnpin: 'Убрать рабочую область по умолчанию', workspaceRecent: 'Недавние', defaultWorkspace: 'Рабочая область по умолчанию', more: 'Ещё', workspaceSet: 'Рабочая область установлена', workspaceSetFailed: 'Ошибка установки рабочей области', setModel: 'Установить модель', setModelTitle: 'Установить модель сеанса', modelSet: 'Модель установлена', modelSetFailed: 'Ошибка установки модели', other: 'Другое', runFailed: 'Ошибка выполнения', error: 'Ошибка', tool: 'Инструмент', arguments: 'Аргументы', result: 'Результат', workspaceChanges: 'Изменения workspace', changedFiles: 'Изменено файлов: {files}', diffUnavailable: 'Diff недоступен', binaryFileDiffUnavailable: 'Diff для бинарного файла недоступен', truncated: '... (обрезано)', unchangedLines: '{count} строк без изменений', executionDuration: 'Длительность выполнения', thinkingLabel: 'Процесс размышления', thinkingInProgress: 'Размышление', thinkingShow: 'Развернуть процесс размышления', thinkingHide: 'Свернуть процесс размышления', thinkingDuration: 'Наблюдается {duration}', thinkingChars: '{count} зн.', copyBubble: 'Копировать сообщение', copiedBubble: 'Скопировано', copyFailed: 'Ошибка копирования', playSpeech: 'Воспроизвести речь', pauseSpeech: 'Пауза', resumeSpeech: 'Продолжить', stopSpeech: 'Остановить', speechNotSupported: 'Этот браузер не поддерживает воспроизведение речи', }, workflow: { title: 'Рабочий процесс', profile: 'Профиль', namePlaceholder: 'Название рабочего процесса', workspace: { title: 'Выбрать рабочую область', select: 'Выбрать рабочую область', clear: 'Очистить рабочую область', }, actions: { newWorkflow: 'Новый workflow', addNode: 'Добавить узел', createWorkflowFirst: 'Сначала создайте workflow', reset: 'Сбросить', startExecution: 'Запустить выполнение', executionPending: 'Выполнение workflow пока не подключено', executionStarted: 'Выполнение workflow началось', executionCompleted: 'Выполнение workflow завершено', executionFailed: 'Выполнение workflow не удалось', rerunDownstreamKeepNode: 'Сохранить этот узел и запустить ниже', rerunDownstreamClearNode: 'Очистить этот узел и запустить ниже', rerunDownstreamStarted: 'Повторный запуск нижних узлов начат', rerunFromNodeStarted: 'Повторный запуск с этого узла начат', rerunFailed: 'Не удалось повторно запустить workflow', deleteNode: 'Удалить узел', deleteEdge: 'Удалить соединение', }, batch: { toggle: 'Массовый выбор', selectAll: 'Выбрать все', confirmDelete: 'Удалить выбранные workflow: {count}?', deleteSuccess: 'Удалено workflow: {count}', deletePartial: 'Не удалось удалить workflow: {failed}', deleteFailed: 'Массовое удаление не удалось', }, validation: { nodesRequired: 'Add at least one node', nodeNameRequired: 'Node {node} needs a name', providerRequired: 'Node {node} needs a provider', modelRequired: 'Node {node} needs a model', apiModeRequired: 'Node {node} needs an API mode', inputRequired: 'Node {node} needs input', invalidEdge: 'A connection references a missing node', invalidConnectionDirection: 'Connections must go from the right output to the left input', orphanNode: 'Node {node} is not connected to the workflow', disconnectedFlow: 'The workflow cannot be split into multiple disconnected flows', cycle: 'The workflow contains a cycle. Adjust the connections before saving.', }, node: { title: 'Название узла', agent: 'Agent', model: 'Модель', apiMode: 'Режим API', input: 'Ввод', approvalRequired: 'Одобрение после узла', promptPlaceholder: 'Опишите, что должен сделать этот Agent...', skillsPlaceholder: 'Skills, Enter для добавления', uploadImages: 'Загрузить изображения', }, status: { idle: 'Бездействует', queued: 'В очереди', running: 'Выполняется', pending_approval: 'Ожидает одобрения', completed: 'Завершено', failed: 'Ошибка', approval_rejected: 'Одобрение отклонено', canceled: 'Отменено', }, runs: { title: 'Run Records', refresh: 'Refresh', empty: 'No run records', startNodes: '{count} start nodes', show: 'Show run records', hide: 'Hide run records', nodeSessionTitle: 'Node Session - {node}', noNodeSession: 'This node has no session record yet', loadNodeSessionFailed: 'Failed to load node session', stop: 'Stop run', stopRequested: 'Stop requested', stopFailed: 'Failed to stop run', delete: 'Delete record', deleteSuccess: 'Run record deleted', }, inspector: { selected: 'Выбранный узел', none: 'Узел не выбран', }, stats: { nodes: 'Узлы', edges: 'Связи', }, agents: { planner: 'Planner', researcher: 'Researcher', builder: 'Builder', reviewer: 'Reviewer', }, models: { default: 'Модель по умолчанию', fast: 'Быстрая модель', reasoning: 'Модель рассуждений', }, initialNodes: { node1: 'Node 1', node2: 'Node 2', node3: 'Node 3', plan: 'Plan', execute: 'Execute', review: 'Review', }, initialPrompts: { node1: 'Введите данные для этого узла.', node2: 'Введите данные для этого узла.', node3: 'Введите данные для этого узла.', plan: 'Разбейте запрос на выполнимые шаги.', execute: 'Выполните шаги реализации и создайте артефакты.', review: 'Проверьте качество результата и определите дальнейшую работу.', }, newNodeTitle: 'Node {count}', }, kanban: { title: 'Канбан', createTask: 'Создать задачу', noTasks: 'Нет задач', allStatuses: 'Все статусы', allAssignees: 'Все ответственные', board: { create: 'Создать канбан', archive: 'Архивировать канбан', slugPlaceholder: 'Идентификатор канбана, например project-a', namePlaceholder: 'Отображаемое имя (необязательно)', slugRequired: 'Идентификатор канбана не может быть пустым', created: 'Канбан создан', archived: 'Канбан архивирован', archiveConfirm: 'Архивировать текущий канбан?', }, columns: { triage: 'На сортировку', todo: 'К выполнению', scheduled: 'Запланировано', ready: 'Готово', running: 'В работе', blocked: 'Заблокировано', review: 'Проверка', done: 'Выполнено', archived: 'В архиве', }, form: { title: 'Заголовок', titlePlaceholder: 'Заголовок задачи', titleRequired: 'Заголовок не может быть пустым', body: 'Описание', bodyPlaceholder: 'Описание задачи (необязательно)', assignee: 'Ответственный', selectAssignee: 'Выберите ответственного...', priority: 'Приоритет', selectPriority: 'Выберите приоритет...', tenant: 'Арендатор', tenantPlaceholder: 'Арендатор (необязательно)', workspace: 'Рабочая область', workspaceScratch: 'Временная рабочая область', workspaceDir: 'Использовать каталог', workspaceWorktree: 'Использовать worktree', workspacePath: 'Путь рабочей области', workspacePathPlaceholder: 'Абсолютный путь (необязательно)', branch: 'Ветка', branchPlaceholder: 'Ветка worktree', skills: 'Навыки', skillsPlaceholder: 'Выберите навыки...', triage: 'Создать в сортировке', goalMode: 'Режим цели', maxRuntime: 'Макс. время выполнения', maxRuntimePlaceholder: 'например 30m, 2h', maxRetries: 'Макс. повторов', maxRetriesPlaceholder: 'Количество повторов', goalMaxTurns: 'Макс. ходов цели', goalMaxTurnsPlaceholder: 'Максимум ходов', }, card: { assigneeTooltip: 'Ответственный', priority: { low: 'Низкий', medium: 'Средний', high: 'Высокий', }, timeAgo: { justNow: 'Только что', minutes: '{count} мин. назад', hours: '{count} ч. назад', days: '{count} дн. назад', }, }, detail: { status: 'Статус', assignee: 'Ответственный', priority: 'Приоритет', tenant: 'Арендатор', createdAt: 'Дата создания', startedAt: 'Дата начала', completedAt: 'Дата завершения', comments: 'Комментарии', events: 'События', runs: 'Записи выполнения', result: 'Результат выполнения', sessions: 'Связанные сеансы', sessionMessages: 'Журнал сеанса', noSessions: 'Связанные сеансы не найдены.', artifacts: 'Выходные файлы', sources: 'Источники данных', highlights: 'Ключевая информация', noLog: 'Журнал для этой задачи не найден.', addComment: 'Добавить комментарий', commentPlaceholder: 'Напишите комментарий к задаче...', operations: 'Операции', }, action: { title: 'Действие', complete: 'Завершить', completeSummary: 'Краткое описание завершения (необязательно)', block: 'Заблокировать', blockReason: 'Причина блокировки', unblock: 'Разблокировать', assign: 'Назначить', assignTo: 'Назначить...', dispatch: 'Запустить диспетчер', recoveryReason: 'Причина восстановления (необязательно)', reclaim: 'Вернуть', reassign: 'Переназначить', specify: 'Уточнить', loadLog: 'Загрузить журнал', loadDiagnostics: 'Загрузить диагностику', }, message: { taskCreated: 'Задача создана', taskCompleted: 'Задача завершена', taskBlocked: 'Задача заблокирована', taskUnblocked: 'Задача разблокирована', taskAssigned: 'Задача назначена', dispatchNudged: 'Диспетчер запущен', commentAdded: 'Комментарий добавлен', taskReclaimed: 'Задача возвращена', taskReassigned: 'Задача переназначена', taskSpecified: 'Задача уточнена', loadFailed: 'Ошибка загрузки задач', }, stats: { total: 'Всего', tasks: 'задач', }, }, jobs: { title: 'Периодические задачи', createJob: 'Создать задачу', editJob: 'Редактировать задачу', noJobs: 'Нет периодических задач. Создайте первую.', sortBy: 'Сортировка', sortByName: 'По имени', sortByTime: 'По дате', sortByNameHint: 'Сортировать по имени', sortByTimeHint: 'Сортировать по дате', sortAsc: 'По возрастанию', sortDesc: 'По убыванию', name: 'Название', namePlaceholder: 'Название задачи', schedule: 'Выражение расписания (Cron)', schedulePlaceholder: 'Например, 0 9 * * *', quickPresets: 'Быстрые предустановки', selectPreset: 'Выберите предустановку...', presetEveryMinute: 'Каждую минуту', presetEvery5Min: 'Каждые 5 минут', presetEveryHour: 'Каждый час', presetEveryDay: 'Каждый день в 00:00', presetEveryDay9: 'Каждый день в 09:00', presetEveryMonday: 'Каждый понедельник в 09:00', presetEveryMonth: '1-го числа каждого месяца в 09:00', prompt: 'Подсказка (промпт)', promptPlaceholder: 'Содержимое для выполнения', skills: 'Навыки', skillsPlaceholder: 'Выберите навыки...', provider: 'Provider', model: 'Model', defaultProvider: 'Default provider', defaultModel: 'Default model', deliverTarget: 'Цель доставки', origin: 'Источник', local: 'Локально', repeatCount: 'Количество повторений (необязательно)', modelPlaceholder: 'Модель по умолчанию', repeatPlaceholder: 'Оставьте пустым для бесконечного повторения', jobCreated: 'Задача создана', jobUpdated: 'Задача обновлена', nameRequired: 'Название обязательно для заполнения', scheduleRequired: 'Выражение расписания обязательно для заполнения', loadFailed: 'Ошибка загрузки задач', jobPaused: 'Задача приостановлена', jobResumed: 'Задача возобновлена', jobTriggered: 'Задача запущена', modelUpdated: 'Модель обновлена', jobDeleted: 'Задача удалена', status: { running: 'Выполняется', paused: 'Приостановлена', disabled: 'Отключена', scheduled: 'Запланирована', }, info: { model: 'Модель', provider: 'Provider', schedule: 'Расписание', lastRun: 'Последний запуск', nextRun: 'Следующий запуск', deliver: 'Доставка', repeat: 'Повторение', }, action: { pause: 'Приостановить', pauseJob: 'Приостановить задачу', resume: 'Возобновить', resumeJob: 'Возобновить задачу', runNow: 'Выполнить сейчас', triggerImmediately: 'Запустить немедленно', }, runHistory: { title: 'История выполнения', runs: 'запусков', noRuns: 'Нет истории выполнения.', }, }, skills: { title: 'Навыки', targetFilter: 'Среда', targets: { hermes: 'Hermes', claude: 'Claude', codex: 'Codex', }, searchPlaceholder: 'Поиск навыков...', noMatch: 'Нет подходящих навыков', noSkills: 'Нет навыков', backTo: 'Назад', attachedFiles: 'Прикреплённые файлы', loadFailed: 'Ошибка загрузки навыков', fileLoadFailed: 'Ошибка загрузки файла', modified: 'Пользователь изменил', archived: 'В архиве', pinned: 'Закреплено', pin: 'Закрепить навык', unpin: 'Открепить', pinFailed: 'Ошибка изменения статуса закрепления', edit: 'Редактировать', saving: 'Сохранение...', editorLabel: 'Редактор skill', saveSuccess: 'Skill сохранён', saveFailed: 'Ошибка сохранения skill', toggleFailed: 'Ошибка переключения статуса навыка', source: { builtin: 'Встроенный', hub: 'Установленный из Hub', local: 'Локально установленный', }, writeApprovalButton: 'Ожидает {count}', writeApprovalTitle: 'Ожидающие подтверждения записи', writeApprovalDescription: 'Подтвердите или отклоните записи памяти и skills, подготовленные Hermes Agent.', writeApprovalRefresh: 'Обновить', writeApprovalEmpty: 'Нет ожидающих записей.', writeApprovalUnsupported: 'Эта версия Hermes Agent не поддерживает подтверждение записей. Обновите Hermes Agent, чтобы использовать эту функцию.', writeApprovalMemory: 'Память', writeApprovalSkills: 'Skills', writeApprovalViewDiff: 'Проверить', writeApprovalHideDiff: 'Скрыть', writeApprovalNoDiff: 'Нет доступных изменений.', writeApprovalLoadFailed: 'Не удалось загрузить ожидающие записи', writeApprovalDiffFailed: 'Не удалось загрузить детали записи', writeApprovalActionFailed: 'Не удалось обработать ожидающую запись', writeApprovalApproved: 'Запись подтверждена', writeApprovalRejected: 'Запись отклонена', writeApprovalApprove: 'Подтвердить', writeApprovalReject: 'Отклонить', writeApprovalPendingMemoryWrite: 'Ожидающая запись памяти', writeApprovalCurrentFile: 'Текущий файл {file}', writeApprovalProposedFile: 'Предлагаемый файл {file}', writeApprovalDiffSection: 'Изменения', writeApprovalPatchOldStringMissing: 'old_string патча не найден в текущем файле {file}; подтверждение не изменит файл.', writeApprovalRequestedOldString: 'Запрошенный old_string', writeApprovalCurrentReadFailed: 'Текущий файл {file} не удалось прочитать как текст UTF-8.', writeApprovalDeleteSkill: 'Это подтверждение удалит skill {skill}.', writeApprovalRemoveFile: 'Это подтверждение удалит {file} из skill {skill}.', }, plugins: { title: 'Плагины', refresh: 'Обновить', notice: 'Отображаются манифесты обнаруживаемых плагинов Hermes. Чтение метаданных не загружает код плагинов. Пользовательские standalone-плагины можно включать или отключать здесь; изменения вступают в силу в новых сеансах Hermes.', loadFailed: 'Ошибка загрузки плагинов', updateFailed: 'Не удалось обновить плагин', enableSuccess: '{name} включён', disableSuccess: '{name} отключён', commandCopied: 'Команда скопирована', searchPlaceholder: 'Поиск по ключу, имени, описанию, пути...', source: 'Источник', kind: 'Тип', statusTitle: 'Статус', configStatus: 'Конфигурация: {status}', notAvailable: 'Нет', copyCommand: 'Копировать команду', managedElsewhere: 'Управляется из другого места', noMatch: 'Нет плагинов, соответствующих текущим критериям фильтрации', enabled: 'Включён', disabled: 'Отключён', summary: { total: 'Всего', active: 'Включено / Авто', inactive: 'Не включено', disabled: 'Отключено', providerManaged: 'Управляется провайдером', }, status: { enabled: 'Включён', 'auto-active': 'Автовключение', inactive: 'Не включён', disabled: 'Отключён', 'provider-managed': 'Управляется провайдером', }, statusLabel: { enabled: 'Включён конфигурацией', 'auto-active': 'Автовключение', inactive: 'Не включён', disabled: 'Отключён', 'provider-managed': 'Управляется провайдером', }, configStatuses: { enabled: 'Включён', disabled: 'Отключён', 'not-enabled': 'Не включён', auto: 'Авто', 'provider-managed': 'Управляется провайдером', }, table: { plugin: 'Плагин', status: 'Статус', source: 'Источник', kind: 'Тип', capabilities: 'Возможности', path: 'Путь / Точка входа', manage: 'Управление', }, capabilities: { tools: '{count} инструментов', hooks: '{count} хуков', env: '{count} переменных окружения', }, metadata: { agentRoot: 'Корневая директория агента', python: 'Python', scanCwd: 'Сканировать cwd', projectPlugins: 'Плагины проекта', }, }, petdex: { title: 'Petdex Pets', subtitle: 'Browse the public petdex catalog used by Hermes desktop pets.', refresh: 'Refresh', adopt: 'Adopt', active: 'Active', adopted: 'Adopted {name}', adoptFailed: 'Failed to adopt pet', loadFailed: 'Failed to load petdex catalog', searchPlaceholder: 'Search by name, slug, author, or kind', kindFilter: 'Kind', spritesheet: 'Spritesheet', submittedBy: 'By {name}', empty: 'No pets match the current filters.', showMore: 'Show {count} more', summary: { total: 'Catalog total', visible: 'Matching', kinds: 'Kinds', generatedAt: 'Generated at', }, }, memory: { title: 'Память', refresh: 'Обновить', loadFailed: 'Ошибка загрузки памяти', myNotes: 'Мои заметки', noNotes: 'Нет заметок.', notesPlaceholder: 'Введите текст заметки...', userProfile: 'Профиль пользователя', noProfile: 'Нет профиля.', profilePlaceholder: 'Введите профиль пользователя...', soul: 'Душа', noSoul: 'Нет конфигурации души.', soulPlaceholder: 'Введите конфигурацию души...', }, models: { title: 'Модели', searchPlaceholder: 'Поиск моделей...', noResults: 'Нет результатов', noModels: 'Нет моделей', addProvider: 'Добавить провайдера', refreshModelCache: 'Обновить кеш моделей', refreshModelCacheLoading: 'Обновление кеша моделей...', refreshModelCacheSuccess: 'Кеш моделей обновлен', refreshModelCacheFailed: 'Не удалось обновить кеш моделей', providerType: 'Тип провайдера', preset: 'Предустановка', custom: 'Пользовательский', selectProvider: 'Выбрать провайдера', chooseProvider: 'Выберите провайдера...', getApiKey: 'Получить API-ключ', name: 'Название', autoGeneratedName: 'Генерируется автоматически на основе базового URL', baseUrl: 'Базовый URL', region: 'Регион', regionIntl: 'Международный', regionCn: 'Китай', baseUrlPlaceholder: 'Например, https://api.example.com/v1', apiKey: 'API-ключ', apiKeyPlaceholder: 'sk-...', defaultModel: 'Модель по умолчанию', selectOrInput: 'Выберите или введите название модели...', selectModel: 'Выберите модель...', providerAdded: 'Провайдер добавлен', providerDeleted: 'Провайдер удалён', providerCredentialsCleared: 'Учётные данные провайдера очищены', clearProviderCredentials: 'Очистить учётные данные', clearCredentialsConfirm: 'Очистить сохранённые учётные данные для «{name}»? Этот встроенный провайдер останется в списке и снова заработает после настройки учётных данных.', disableProvider: 'Отключить провайдера', disableProviderConfirm: 'Отключить встроенного провайдера «{name}»? Он останется встроенным и его можно будет включить позже.', providerDisabled: 'Провайдер отключён', defaultProviderUpdated: 'Провайдер по умолчанию обновлён', defaultProviderUpdateFailed: 'Не удалось обновить провайдера по умолчанию', defaultModelUpdated: 'Модель по умолчанию обновлена', defaultModelUpdateFailed: 'Не удалось обновить модель по умолчанию', deleteProvider: 'Удалить провайдера', deleteConfirm: 'Удалить "{name}"?', codexLoginTitle: 'Вход в OpenAI Codex', codexWaiting: 'Введите следующий код на странице авторизации:', codexCopyCode: 'Код скопирован', codexOpenLink: 'Открыть страницу авторизации', codexApproved: 'Вход выполнен', codexExpired: 'Авторизация истекла. Повторите попытку.', nousLoginTitle: 'Вход в Nous Portal', nousWaiting: 'Введите этот код на странице авторизации:', nousCopyCode: 'Код скопирован', nousOpenLink: 'Открыть страницу авторизации', nousApproved: 'Вход выполнен', nousDenied: 'Авторизация отклонена. Повторите попытку.', nousExpired: 'Авторизация истекла. Повторите попытку.', copilotLoginTitle: 'Вход в GitHub Copilot', copilotWaiting: 'Перейдите на GitHub и введите код устройства для авторизации. Окно закроется автоматически после завершения.', copilotCopyCode: 'Код скопирован', copilotOpenLink: 'Открыть страницу авторизации GitHub', copilotApproved: 'Вход выполнен!', copilotDenied: 'Авторизация отклонена.', copilotExpired: 'Срок действия ссылки истёк. Повторите попытку.', copilotAddDetectedTitle: 'Обнаружен GitHub Copilot', copilotAddDetected: 'На этом компьютере найдены учётные данные OAuth GitHub Copilot. Нажмите «Добавить», чтобы включить Copilot в Hermes.', copilotAddSourceEnv: 'Источник: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)', copilotAddSourceGhCli: 'Источник: gh CLI (gh auth token)', copilotAddSourceAppsJson: 'Источник: плагин Copilot для VS Code (apps.json)', copilotDeleteHintEnv: 'Это действие удалит COPILOT_GITHUB_TOKEN из ~/.hermes/.env, не затрагивая другие инструменты.', copilotDeleteHintGhCli: 'Copilot будет удалён из списка Hermes. Это не повлияет на gh CLI — `gh auth status` по-прежнему будет показывать вход.', copilotDeleteHintAppsJson: 'Copilot будет удалён из списка Hermes. Это не повлияет на вход в плагин Copilot для VS Code.', xaiLoginTitle: 'Вход через OAuth xAI Grok', xaiWaiting: 'Авторизуйтесь на открывшейся странице xAI. Окно закроется автоматически.', xaiOpenLink: 'Открыть страницу авторизации xAI', xaiCopyLink: 'Копировать ссылку авторизации', xaiApproved: 'Вход выполнен!', xaiExpired: 'Срок действия ссылки истёк. Повторите попытку.', anthropicLoginTitle: 'Вход Claude OAuth', anthropicWaiting: 'Завершите авторизацию на странице Claude и вставьте полученный код здесь.', anthropicOpenLink: 'Открыть страницу авторизации Claude', anthropicCopyLink: 'Копировать ссылку авторизации', anthropicCodePlaceholder: 'Вставьте код авторизации...', anthropicSubmitCode: 'Отправить код', anthropicApproved: 'Вход выполнен!', anthropicExpired: 'Авторизация истекла. Повторите попытку.', geminiLoginTitle: 'Вход Google Gemini OAuth', geminiWaiting: 'Завершите авторизацию на открытой странице Google. Окно закроется автоматически.', geminiOpenLink: 'Открыть страницу авторизации Google', geminiCopyLink: 'Копировать ссылку авторизации', geminiApproved: 'Вход выполнен!', geminiExpired: 'Срок действия ссылки истёк. Повторите попытку.', customBadge: 'Пользовательская', previewBadge: 'Предварительная', disabledBadge: 'Недоступна', disabledTooltip: 'Эта модель недоступна для текущей учётной записи', customModelPlaceholder: 'ID модели, отсутствующей в списке', customModelHint: 'Используйте, если провайдер поддерживает модель, но она не возвращена. Не переименование. Нажмите Enter для загрузки.', removeCustomModel: 'Удалить эту модель из списка', refresh: 'Обновить список моделей (перезагрузить config.yaml)', noProviders: 'Нет провайдеров. Добавьте первого.', models: 'Список моделей', count: 'моделей', more: 'ещё', aliasEdit: 'Переименовать', aliasTitle: 'Отображаемое имя модели', aliasTitleFor: 'Отображаемое имя для {model}', aliasPlaceholder: 'Оставьте пустым для использования исходного ID модели', aliasHint: 'Изменяет только отображаемое имя в Web UI. В Hermes отправляется исходный ID модели.', aliasCanonical: 'Исходный ID: {model}', aliasUseOriginal: 'Восстановить исходный ID', aliasManage: 'Отображаемые имена', aliasManageFor: 'Отображаемые имена для {provider}', aliasSaveFailed: 'Не удалось сохранить отображаемое имя', manageVisibleModels: 'Управлять видимыми моделями', manageVisibleModelsFor: 'Управление видимыми моделями для {name}', visibilityHint: 'Влияет только на отображение в выборе моделей Web UI и на странице моделей. Не изменяет конфигурацию provider/model в Hermes CLI. Вызовы используют исходный ID модели.', visibilitySelectOne: 'Оставьте хотя бы одну видимую модель', visibilitySaved: 'Видимые модели сохранены', visibilitySaveFailed: 'Не удалось сохранить видимые модели', showAllModels: 'Показать все модели', clearVisibleModels: 'Снять все', generalTitle: 'Основные модели', combinationTitle: 'Ансамбли моделей', combinationSubtitle: 'Настройте пресеты MoA: reference-модели сначала дают варианты, затем одна aggregator-модель формирует финальный ответ и вызовы инструментов.', combinationPreset: 'Пресет', combinationName: 'Название', combinationAddModel: 'Добавить ансамбль моделей', combinationEditModel: 'Изменить ансамбль моделей', combinationNewPreset: 'Новый пресет', combinationPresetPlaceholder: 'например review', combinationAddPreset: 'Добавить пресет', combinationSetDefault: 'Сделать стандартным', combinationEnabled: 'Включить reference-модели', combinationReferenceModels: 'Reference-модели', combinationReferenceModel: 'Reference-модель', combinationAddReference: 'Добавить reference-модель', combinationAggregator: 'Aggregator-модель', combinationReferenceTemperature: 'Температура reference', combinationAggregatorTemperature: 'Температура aggregator', combinationMaxTokens: 'Макс. токенов', combinationNotSet: 'Не задано', combinationSaved: 'Ансамбль моделей сохранен', combinationLoadFailed: 'Не удалось загрузить ансамбль моделей', combinationSaveFailed: 'Не удалось сохранить ансамбль моделей', combinationPresetExists: 'Пресет уже существует', combinationNameRequired: 'Введите название ансамбля моделей', combinationNameInvalid: 'Название может содержать только буквы, цифры, подчеркивания, дефисы и точки', combinationReferenceRequired: 'Добавьте хотя бы одну reference-модель', combinationAggregatorRequired: 'Выберите aggregator-модель', auxiliaryTitle: 'Вспомогательные модели', auxiliarySubtitle: 'Переопределения моделей для фоновых задач: сжатия, зрения, подтверждений, MCP и обслуживания.', auxiliaryRefresh: 'Обновить', auxiliaryTask: 'Задача', auxiliaryTimeout: 'Тайм-аут', auxiliaryDownloadTimeout: 'Тайм-аут загрузки', auxiliaryActions: 'Действия', auxiliaryDefault: 'По умолчанию', auxiliaryCustomEndpoint: 'Пользовательский endpoint', auxiliaryProviderAuto: 'Авто', auxiliaryProviderMain: 'Основная модель', auxiliaryProviderPlaceholder: 'auto, main или ключ провайдера', auxiliaryDownloadShort: 'загрузка', auxiliaryExtraBody: 'JSON дополнительного тела', auxiliaryClear: 'Сбросить', auxiliarySaved: 'Вспомогательные модели сохранены', auxiliaryLoadFailed: 'Не удалось загрузить вспомогательные модели', auxiliarySaveFailed: 'Не удалось сохранить вспомогательные модели', auxiliaryInvalidExtraBody: 'Дополнительное тело должно быть JSON-объектом', auxiliaryTaskCompression: 'Сжатие', auxiliaryTaskVision: 'Зрение', auxiliaryTaskWebExtract: 'Извлечение из веб-страниц', auxiliaryTaskSkillsHub: 'Центр навыков', auxiliaryTaskApproval: 'Подтверждение', auxiliaryTaskMcp: 'MCP', auxiliaryTaskTitleGeneration: 'Генерация заголовков', auxiliaryTaskTriageSpecifier: 'Уточнение triage', auxiliaryTaskKanbanDecomposer: 'Разбиение Kanban', auxiliaryTaskProfileDescriber: 'Описание профиля', auxiliaryTaskCurator: 'Куратор', auxiliaryTaskSessionSearch: 'Поиск сессий', auxiliaryTaskFlushMemories: 'Запись воспоминаний', currentDefault: 'Текущая по умолчанию', defaultShort: 'По умолч.', setDefaultProvider: 'Сделать провайдером по умолчанию', setDefault: 'Сделать по умолчанию', builtIn: 'Встроенный', customType: 'Пользовательский', provider: 'Провайдер', contextLength: 'Длина контекста', contextLengthPlaceholder: 'Например, 200000 (необязательно)', apiMode: 'Режим API', local: 'Локальный ({host})', selectProviderRequired: 'Выберите провайдера', baseUrlRequired: 'Базовый URL обязателен', apiKeyRequired: 'API-ключ обязателен', modelRequired: 'Модель по умолчанию обязательна', enterBaseUrl: 'Сначала введите базовый URL', unexpectedFormat: 'Неожиданный формат ответа', foundModels: 'Найдено моделей: {count}', fetchFailed: 'Не удалось получить модели', }, profiles: { title: 'Профили', create: 'Создать профиль', import: 'Импорт', export: 'Экспорт', rename: 'Переименовать', delete: 'Удалить', switchTo: 'Переключить профиль Hermes', switchConfirm: 'Будет выполнено `hermes profile use {name}` и активный профиль Hermes CLI переключится. Продолжить?', switchSuccess: 'Активный профиль Hermes переключён на "{name}"', switchFailed: 'Не удалось переключить профиль Hermes. Возможно, требуется ручной перезапуск шлюза.', createSuccess: 'Профиль "{name}" создан', createFailed: 'Ошибка создания профиля', renameSuccess: 'Профиль переименован', renameFailed: 'Ошибка переименования профиля', deleteConfirm: 'Удалить профиль "{name}"?', deleteSuccess: 'Профиль удалён', deleteFailed: 'Ошибка удаления профиля', exportSuccess: 'Профиль экспортирован', exportFailed: 'Ошибка экспорта профиля', importSuccess: 'Профиль импортирован', importFailed: 'Ошибка импорта профиля', importSelectFile: 'Выберите архивный файл', importInvalidFile: 'Выберите корректный архивный файл (.tar.gz, .tgz, .gz, .zip)', name: 'Название профиля', namePlaceholder: 'Только строчные буквы, цифры, дефисы', nameValidation: 'Название профиля может содержать только строчные буквы, цифры, символы подчёркивания и дефисы', newName: 'Новое название', newNamePlaceholder: 'Строчные буквы, цифры, дефис', cloneFromCurrent: 'Клонировать из текущего профиля', cloneCleanupNotice: 'При клонировании автоматически пропускаются эксклюзивные учётные данные платформ (Weixin / Telegram / Slack и др.), чтобы избежать конфликта с исходным профилем', cloneStrippedCredentials: 'Очищено {count} эксклюзивных учётных данных: {list}', cloneDisabledPlatforms: 'Отключено платформ: {count} — {list}', cloneStrippedConfigCredentials: 'Очищено встроенных учётных данных в config.yaml: {count} — {list}', archivePath: 'Путь к архиву', archivePathPlaceholder: 'Путь к архивному файлу на сервере', importName: 'Название профиля (необязательно)', importNamePlaceholder: 'Оставьте пустым для использования имени архива', active: 'Активен', model: 'Модель', gateway: 'Шлюз', alias: 'Псевдоним', provider: 'Провайдер', path: 'Путь', skills: 'Навыки', hasEnv: 'Есть .env', hasSoulMd: 'Есть soul.md', noProfiles: 'Нет профилей. Создайте первый.', avatar: { title: 'Пользовательский аватар', customize: 'Аватар', upload: 'Загрузить изображение', random: 'Случайный', reset: 'Сбросить на стандартный', hint: 'Поддерживаются PNG, JPEG, WebP, максимум 1 МБ', invalidType: 'Выберите изображение в формате PNG, JPEG или WebP', tooLarge: 'Аватар не может превышать 1 МБ', saveSuccess: 'Аватар сохранён', saveFailed: 'Ошибка сохранения аватара', resetSuccess: 'Стандартный аватар восстановлен', resetFailed: 'Ошибка восстановления стандартного аватара', }, runtime: { activeProfile: 'Текущий: {name}', bridgeWorker: 'Состояние моста', gateway: 'Шлюз', active: 'Активен', activeTag: 'Текущий', idle: 'Простой', running: 'Работает', stopped: 'Остановлен', restartGateway: 'Перезапустить шлюз', restartProfile: 'Перезапустить профиль', switchProfile: 'Переключить профиль интерфейса', gatewayRestarted: 'Шлюз перезапущен: {name}', gatewayRestartFailed: 'Ошибка перезапуска шлюза', profileRestarted: 'Профиль перезапущен: {name}', profileRestartFailed: 'Ошибка перезапуска профиля', }, }, logs: { title: 'Логи', all: 'Все', searchPlaceholder: 'Поиск...', refresh: 'Обновить', noEntries: 'Нет записей', }, settings: { title: 'Настройки', saved: 'Сохранено', saveFailed: 'Ошибка сохранения', tabs: { display: 'Отображение', account: 'Текущий аккаунт', users: 'Управление аккаунтами', agent: 'Агент', proxy: 'Прокси', memory: 'Память', compression: 'Сжатие контекста', session: 'Сеанс', privacy: 'Конфиденциальность', apiServer: 'API-сервер', models: 'Модели', voice: 'Голос', }, models: { apiKey: 'API-ключ', apiKeyPlaceholder: 'Введите API-ключ', save: 'Сохранить', saved: 'Сохранено', saveFailed: 'Ошибка сохранения', noProviders: 'Нет настроенных моделей', }, display: { streaming: 'Потоковый ответ', streamingHint: 'Отображать ответ AI по мере генерации', compact: 'Компактный режим', compactHint: 'Уменьшить отступы между сообщениями', showReasoning: 'Показывать процесс рассуждения', showReasoningHint: 'Отображать ход мыслей модели', showCost: 'Показывать стоимость', showCostHint: 'Отображать количество использованных токенов в ответе', inlineDiffs: 'Встроенные различия', inlineDiffsHint: 'Отображать изменения в коде внутри строки', bellOnComplete: 'Звук завершения', bellOnCompleteHint: 'Воспроизводить звук по окончании ответа AI', notifyOnComplete: 'Уведомление о завершении', notifyOnCompleteHint: 'Показывать системное уведомление по окончании ответа AI', notifyOnCompleteMacHint: 'В macOS разрешите уведомления браузера в системных настройках.', notifyOnCompleteDenied: 'Разрешение на уведомления отклонено', notifyOnCompleteInsecure: 'Для уведомлений браузера требуется HTTPS или localhost', notifyOnCompleteUnsupported: 'Этот браузер не поддерживает уведомления', notifyOnCompleteTest: 'Уведомления включены.', notifyOnCompleteTestButton: 'Тест', notifyOnCompleteTesting: 'Отправка тестового уведомления...', notifyOnCompleteTestSent: 'Тестовое уведомление отправлено', notifyOnCompleteTestFailed: 'Не удалось отправить тестовое уведомление', busyInputMode: 'Режим ввода во время занятости', busyInputModeHint: 'Разрешить ввод, пока AI обрабатывает запрос', theme: 'Тема', themeHint: 'Выберите светлую, тёмную или системную тему', themeLight: 'Светлая', themeDark: 'Тёмная', themeSystem: 'Системная', chatInputHeight: 'Высота поля ввода чата', chatInputHeightHint: 'Высота поля ввода чата на рабочем столе в пикселях. На мобильных остается авто.' }, agent: { maxTurns: 'Максимум ходов', maxTurnsHint: 'Максимальное количество ходов в одном диалоге', gatewayTimeout: 'Таймаут шлюза', gatewayTimeoutHint: 'Таймаут одного запроса (секунды)', restartDrainTimeout: 'Таймаут слива при перезапуске', restartDrainTimeoutHint: 'Время ожидания завершения запросов перед перезапуском (секунды)', toolEnforcement: 'Стратегия выполнения инструментов', toolEnforcementHint: 'Управление режимом вызова инструментов', auto: 'Автоматически', always: 'Всегда', never: 'Никогда', }, gatewayAutoStart: { title: 'Автозапуск gateway', description: 'Управляет тем, какие локальные gateway профилей Hermes Web UI запускает при старте. Настройка хранится в конфигурации Web UI, а не в profile config.yaml.', enabled: 'Автоматически запускать gateway', enabledHint: 'Если выключено, при старте не будет автоматически запущен ни один gateway профиля.', management: 'Единый gateway', managementHint: 'Требуется Hermes Agent 0.17.0 или новее. Если включено, Web UI записывает multiplex_profiles, чтобы default gateway обслуживал все профили; другие профили не могут отдельно настраивать точки входа сообщений, такие как Feishu, Weixin или QQBot. При выключении эта настройка удаляется.', managementAuto: 'Автоматически', managementPerProfile: 'Один gateway на профиль', managementUnified: 'Единый default gateway', mode: 'Политика профилей', modeHint: 'Запускать все найденные профили или только явный список включения.', modeAll: 'Все найденные профили', modeInclude: 'Только включенные профили', include: 'Включенные профили', includeHint: 'Имена профилей через запятую. В режиме включения пустой список не запускает ничего.', exclude: 'Исключенные профили', excludeHint: 'Имена профилей через запятую, которые нужно пропустить после применения политики.', profileListPlaceholder: 'default, reviewer', }, proxy: { title: 'Прокси gateway', description: 'Задаёт переменные окружения прокси для gateway выбранного профиля. После изменений gateway перезапускается, чтобы платформы сообщений использовали новые сетевые настройки.', httpsProxy: 'HTTPS_PROXY', httpsProxyHint: 'Прокси для HTTPS-запросов. Обычно это основной параметр.', httpProxy: 'HTTP_PROXY', httpProxyHint: 'Прокси для обычных HTTP-запросов.', allProxy: 'ALL_PROXY', allProxyHint: 'Резервный прокси, если прокси для конкретного протокола не задан.', noProxy: 'NO_PROXY', noProxyHint: 'Хосты или домены через запятую, которые должны обходить прокси.', save: 'Сохранить настройки прокси', }, memory: { enabled: 'Включить память', enabledHint: 'Разрешить AI запоминать контекст диалога', userProfile: 'Профиль пользователя', userProfileHint: 'Разрешить AI запоминать предпочтения пользователя', charLimit: 'Лимит символов памяти', charLimitHint: 'Максимальное количество символов в MEMORY.md', userCharLimit: 'Лимит символов профиля пользователя', userCharLimitHint: 'Максимальное количество символов в USER.md', }, compression: { enabled: 'Включить сжатие', enabledHint: 'Автоматически сжимать историю перед достижением лимита контекста модели', threshold: 'Порог сжатия', thresholdHint: 'Начинать сжатие, когда ожидаемое количество токенов превышает указанную долю контекста', targetRatio: 'Целевая доля', targetRatioHint: 'После сжатия история должна занимать указанную долю контекста', protectLastN: 'Защищать последние сообщения', protectLastNHint: 'Сколько последних сообщений не участвуют в сжатии', protectFirstN: 'Защищать первые сообщения', protectFirstNHint: 'Сколько первых сообщений не участвуют в сжатии', }, session: { mode: 'Режим сброса', modeHint: 'Условия для сброса сеанса', modeBoth: 'По бездействию + по расписанию', modeIdle: 'Только по бездействию', modeDaily: 'Только по расписанию', modeNone: 'Никогда (только вручную)', idleMinutes: 'Таймаут бездействия', idleMinutesHint: 'Время бездействия (минуты) перед автоматическим сбросом', atHour: 'Время сброса по расписанию', humanOnly: 'Показывать только сеансы с человеком', humanOnlyHint: 'По умолчанию скрывать шум от подчинённых агентов и мониторинга сеансов', liveMonitorHumanOnly: 'В мониторинге в реальном времени: только сеансы с человеком', liveMonitorHumanOnlyHint: 'По умолчанию скрывать шум от подчинённых агентов и мониторинга сеансов в просмотре в реальном времени', atHourHint: 'Сбрасывать сеанс каждый день в указанный час', requireAuth: 'Авторизация сеанса', requireAuthHint: 'Требовать авторизацию для операций сеанса', memoryWriteApproval: 'Проверять записи памяти', memoryWriteApprovalHint: 'Отправлять записи памяти Hermes Agent на подтверждение перед сохранением.', skillsWriteApproval: 'Проверять записи skills', skillsWriteApprovalHint: 'Отправлять изменения skills от Hermes Agent на подтверждение перед сохранением.', writeApprovalTitle: 'Ожидающие подтверждения записи', writeApprovalDescription: 'Подтвердите или отклоните записи памяти и skills, подготовленные Hermes Agent.', writeApprovalRefresh: 'Обновить', writeApprovalEmpty: 'Нет ожидающих записей.', writeApprovalMemory: 'Память', writeApprovalSkills: 'Skills', writeApprovalViewDiff: 'Проверить', writeApprovalHideDiff: 'Скрыть', writeApprovalNoDiff: 'Нет доступных изменений.', writeApprovalLoadFailed: 'Не удалось загрузить ожидающие записи', writeApprovalDiffFailed: 'Не удалось загрузить детали записи', writeApprovalActionFailed: 'Не удалось обработать ожидающую запись', writeApprovalApproved: 'Запись подтверждена', writeApprovalRejected: 'Запись отклонена', writeApprovalApprove: 'Подтвердить', writeApprovalReject: 'Отклонить', writeApprovalPendingMemoryWrite: 'Ожидающая запись памяти', writeApprovalCurrentFile: 'Текущий файл {file}', writeApprovalProposedFile: 'Предлагаемый файл {file}', writeApprovalDiffSection: 'Изменения', writeApprovalPatchOldStringMissing: 'old_string патча не найден в текущем файле {file}; подтверждение не изменит файл.', writeApprovalRequestedOldString: 'Запрошенный old_string', writeApprovalCurrentReadFailed: 'Текущий файл {file} не удалось прочитать как текст UTF-8.', writeApprovalDeleteSkill: 'Это подтверждение удалит skill {skill}.', writeApprovalRemoveFile: 'Это подтверждение удалит {file} из skill {skill}.', }, privacy: { redactPii: 'Скрывать PII', redactPiiHint: 'Автоматически обнаруживать и скрывать чувствительную информацию (пароли, ключи и т.д.)', }, apiServer: { enable: 'Включить', enableHint: 'Включить API-сервер', host: 'Хост', hostHint: 'Адрес для прослушивания', port: 'Порт', portHint: 'Порт для прослушивания', key: 'Ключ', keyHint: 'Ключ доступа к API', cors: 'Источник CORS', corsHint: 'Разрешённые источники для кросс-доменных запросов', }, lockedIps: { title: 'Управление заблокированными IP', count: 'Заблокировано IP: {count}', empty: 'Нет заблокированных IP', unlock: 'Разблокировать', unlockAll: 'Разблокировать все', unlockAllConfirm: 'Подтвердите разблокировку всех IP?', unlocked: 'IP разблокирован', allUnlocked: 'Разблокировано IP: {count}', type: { password: 'Password', token: 'API token', pairing: 'Device pairing', }, }, userAvatar: { title: 'Аватар пользователя', upload: 'Загрузить изображение', random: 'Сгенерировать случайный', reset: 'Сбросить по умолчанию', hint: 'Поддерживаются PNG, JPEG и WebP до 1 МБ; автоматически сжимается до менее 500 КБ.', invalidType: 'Выберите изображение PNG, JPEG или WebP', tooLarge: 'Изображение аватара должно быть не больше 1 МБ', saveSuccess: 'Аватар сохранён', saveFailed: 'Не удалось сохранить аватар', resetSuccess: 'Аватар сброшен', resetFailed: 'Не удалось сбросить аватар', }, voice: { activeTtsApi: 'Активная TTS API', activeSttApi: 'Активная STT API', ttsProvidersTitle: 'Провайдеры TTS', ttsProvidersDescription: 'Управление интеграциями преобразования текста в речь для озвучивания ответов ассистента и предпросмотра голоса.', sttProvidersTitle: 'Провайдеры STT', sttProvidersDescription: 'Управление интеграциями распознавания речи, используемыми микрофоном и голосовым вводом.', noneSelected: 'Ничего не выбрано', keyStored: 'Сохранен', keyMissing: 'Отсутствует', customApi: 'API', localBuiltin: 'Локальный встроенный', ttsCardHint: 'Провайдер синтеза речи', sttCardHint: 'Провайдер распознавания речи', setActive: 'Сделать активным', testAction: 'Тест', connect: 'Подключить', presetEdgeTtsLabel: 'Edge TTS', presetEdgeTtsDescription: 'Бесплатные облачные голоса высокого качества от Microsoft Edge.', presetOpenaiTtsLabel: 'OpenAI TTS', presetMimoTtsLabel: 'MiMo TTS', presetDoubaoTtsLabel: 'Volcengine Doubao TTS', presetCustomTtsLabel: 'Пользовательский TTS', presetBrowserSttLabel: 'STT браузера', presetBrowserSttDescription: 'Нативная API распознавания речи браузера.', presetOpenaiWhisperLabel: 'OpenAI Whisper', presetGroqSttLabel: 'Groq STT', presetDoubaoSttLabel: 'Volcengine Doubao STT', presetCustomSttLabel: 'Пользовательский STT', apiCompatibility: 'Совместимость API', openaiCompatible: 'Совместимо с OpenAI', manualCustomEndpoint: 'Ручной пользовательский endpoint', connectionStep: 'Подключение', discoveryManualHint: 'Выбран ручной пользовательский endpoint. Автообнаружение моделей недоступно; введите имя модели вручную.', discoveryCredentialHint: 'Введите Base URL и API key, затем подключитесь, чтобы получить доступные модели.', discoveryNoAutoProbeHint: 'При вводе запросы не отправляются. Нажмите Connect, когда данные готовы.', apiKeyConnectPlaceholder: 'Вставьте API key для подключения; сохранённые ключи никогда не показываются', connectFetchModels: 'Подключить и получить модели', modelRecommendedSuffix: 'рекомендуется', modelConnectManualHint: 'Подключитесь для автозаполнения или введите вручную.', modelRequiredConnectManual: 'Модель обязательна. Подключитесь для автозаполнения или введите вручную.', apiKeyRequired: 'API key обязателен.', apiKeyRequiredForDiscovery: 'API key обязателен для получения моделей.', baseUrlRequired: 'Base URL обязателен.', baseUrlHttpsRequired: 'Используйте http:// или https://.', baseUrlInvalid: 'Введите корректный Base URL, включая https://.', discoveryFailedManualFallback: 'Не удалось получить модели. Вы всё ещё можете ввести имя модели вручную.', completeRequiredProviderFields: 'Заполните обязательные поля provider перед сохранением.', fetchingModels: 'Получение моделей...', recommendedModel: 'Рекомендуется: {model}.', useRecommendedModel: 'Использовать эту.', modelsDiscovered: 'Найдено моделей: {count}. Если поле пустое, выбирается рекомендуемая модель.', remove: 'Удалить', testSuccess: 'Тест завершен', testTextRequired: 'Введите текст перед тестом.', keyMissingForTest: 'Добавьте API-ключ перед тестом этого провайдера.', testing: 'Тестирование...', transcribing: 'Распознавание...', browserSttTestHint: 'STT браузера тестируется через микрофон чата.', sttEmptyAudio: 'Аудио не было записано. Попробуйте еще раз.', sttTestSuccess: 'Распознавание завершено', sttRecordingHint: 'Запись... нажмите Остановить, чтобы распознать.', keepStoredKeyPlaceholder: 'Оставьте пустым, чтобы сохранить текущий ключ', apiKeyPlaceholder: 'Введите API-ключ', lastTest: 'Последний тест', notTested: '—', recording: 'Запись', testFailedShort: 'Ошибка', testFailedSummary: 'Тест не удался. Проверьте настройки провайдера и повторите попытку.', showDetails: 'Показать детали', hideDetails: 'Скрыть детали', moreActions: 'Еще', moreActionsFor: 'Дополнительные действия для {provider}', addTtsApi: 'Добавить TTS API', addSttApi: 'Добавить STT API', active: 'Активно', builtin: 'Встроенный', connected: 'Подключено', disconnected: 'Отключено', source: 'Источник', model: 'Модель', voice: 'Голос', doubaoVoiceHint: 'Выберите голос Seed TTS 2.0; поле ресурса обновится автоматически.', apiKey: 'API-ключ', confirmDeleteSecret: 'Удалить сохраненный API-ключ для этой голосовой API?', ttsTitle: 'Текст в речь', ttsSaved: 'Настройки TTS сохранены на сервере', ttsSaveFailed: 'Не удалось сохранить настройки TTS', ttsTestSaved: 'Прослушивание успешно; настройки TTS сохранены на сервере', ttsTestSaving: 'Сохранение настроек TTS перед прослушиванием...', ttsMissingBaseUrl: 'Base URL требуется перед тестом. Введите endpoint провайдера и повторите тест.', ttsMissingApiKey: 'API-ключ требуется перед тестом. Вставьте ключ или сначала сохраните серверный ключ.', ttsCleared: 'Сохраненный TTS-ключ удален', ttsClearFailed: 'Не удалось удалить сохраненный TTS-ключ', storedBaseUrlsTitle: 'Сохранённые Base URLs', storedBaseUrlsHint: 'Сохранённые endpoint голосовых providers. Поля выше только очищают текущее значение; сохранённые URL удаляются здесь.', storedBaseUrlsEmpty: 'На сервере нет сохранённых пользовательских голосовых Base URL.', storedBaseUrlDelete: 'Удалить URL', storedApiKeysTitle: 'Сохранённые API keys', storedApiKeysHint: 'Список голосовых API key, сохранённых на сервере. Показываются только назначение и источник; полный key не отображается.', storedApiKeysEmpty: 'На сервере нет сохранённых голосовых API key.', storedKeyKindTts: 'TTS', storedKeyKindStt: 'STT', storedApiKeyMasked: '[stored]', storedApiKeyDelete: 'Удалить key', baseUrlPresetClear: 'Очистить URL', baseUrlPresetCleared: 'Base URL очищен в поле.', baseUrlPresetDelete: 'Удалить URL', baseUrlPresetDeleted: 'Base URL удалён из сохранённого списка.', baseUrlPresetDeleteFailed: 'Не удалось удалить сохранённый Base URL.', ttsPendingSecret: 'Новый ключ будет сохранен', ttsStoredSecret: 'На сервере сохранен ключ: {value}', ttsClearKey: 'Удалить сохраненный ключ', sttTitle: 'Речь в текст', sttProvider: 'Провайдер STT', sttProviderHint: 'Выберите способ распознавания голосового ввода', sttProviderBrowser: 'Браузер', sttProviderOpenai: 'Совместимо с OpenAI', sttProviderCustom: 'Пользовательский', sttBrowserHint: 'Использовать встроенное распознавание речи браузера, если доступно.', sttApiKey: 'API-ключ', sttApiKeyHint: 'Сохраняется на сервере для STT-провайдеров, которым нужна аутентификация.', sttStoredSecret: 'Сохраненный серверный ключ: {value}', sttPendingSecret: 'Сохраненный серверный ключ: будет обновлен при сохранении', sttClearKey: 'Удалить сохраненный ключ', sttModel: 'Модель', sttModelHint: 'Модель распознавания речи для использования.', sttLanguage: 'Язык', sttLanguageHint: 'Необязательная подсказка языка, например en или zh.', sttPrompt: 'Промпт', sttPromptHint: 'Необязательный промпт для распознавания.', sttAudioTranscode: 'Перекодирование аудио', sttAudioTranscodeNone: 'Отправлять исходное аудио', sttAudioTranscodeFfmpeg: 'Конвертировать в WAV через ffmpeg', sttBaseUrl: 'Base URL', sttBaseUrlHint: 'Пользовательский OpenAI-совместимый endpoint распознавания речи.', sttSave: 'Сохранить настройки STT', sttSaved: 'Настройки STT сохранены на сервере.', sttSaveFailed: 'Не удалось сохранить настройки STT.', sttCleared: 'Сохраненный STT-секрет удален с сервера.', sttClearFailed: 'Не удалось удалить сохраненный STT-секрет.', sttActiveSaved: 'Активный STT-провайдер сохранен на сервере.', sttSaveActive: 'Сохранить активный STT-провайдер', sttEndpointHint: 'Итоговый endpoint распознавания: {endpoint}', sttTestTitle: 'Тест речи в текст', sttTestButton: 'Тестировать STT API', sttTestStopButton: 'Остановить и распознать', sttTestBackendOnly: 'Тест STT API доступен для OpenAI-совместимых и пользовательских провайдеров.', sttTestRecording: 'Запись тестового образца... нажмите Остановить и распознать, когда закончите.', sttTestTranscribing: 'Распознавание тестового образца...', sttTestEmpty: 'Для STT-теста не было записано аудио.', sttTestSucceeded: 'STT-тест успешен.', sttTestFailed: 'STT-тест не удался: {error} — {hint}', sttFailureHintMissingConfig: 'Перед тестом проверьте, что провайдер сохранен с Base URL/моделью и API-ключом.', sttFailureHintAuth: 'Проверьте API-ключ. Если ключ уже был сохранен, вставьте текущий ключ снова и сохраните перед тестом.', sttFailureHintForbidden: 'Ключ дошел до провайдера, но не имеет разрешения для этой STT-модели или аккаунта. Проверьте доступ/оплату у провайдера.', sttFailureHintEndpointModel: 'Проверьте Base URL и модель. Для Groq используйте {endpoint} с whisper-large-v3-turbo или другой STT-моделью Groq.', sttFailureHintModel: 'Проверьте, что выбранная STT-модель существует и включена для этого аккаунта.', sttFailureHintQuota: 'Провайдер сообщает о проблемах с квотой, оплатой или лимитом запросов. Проверьте квоту/оплату или повторите позже.', sttFailureHintNetworkCustom: 'Сервер не смог обратиться к пользовательскому STT endpoint. Проверьте, что {endpoint} доступен с сервера Web UI и совместим с OpenAI.', sttFailureHintNetwork: 'Сервер Web UI не смог обратиться к STT-провайдеру. Проверьте сеть/прокси/фаервол и повторите.', sttFailureHintAudio: 'Записанное аудио пустое или отклонено. Попробуйте короткий четкий образец, разрешите доступ к микрофону или повторите в Chrome.', sttFailureHintGenericCustom: 'Проверьте API-ключ, Base URL, модель и итоговый endpoint {endpoint}.', sttFailureHintGeneric: 'Проверьте API-ключ, модель и доступ аккаунта провайдера, затем повторите.', sttTestRecordFailed: 'Не удалось начать запись микрофона: {error}', sttTestTranscript: 'Текст: {text}', ttsProvider: 'Провайдер TTS', ttsProviderHint: 'Выберите движок для озвучивания сообщений', providerWebSpeech: 'WebSpeech API (встроенный в браузер)', providerOpenai: 'OpenAI TTS', providerCustom: 'Пользовательская конечная точка (совместимая с OpenAI)', providerEdge: 'Edge TTS (бесплатно, не требует API-ключа)', providerMimo: 'MiMo TTS', webspeechVoice: 'Тембр', webspeechVoiceHint: 'Выберите голос из предложенных браузером или системой', webspeechVoicePlaceholder: 'Автоматический (голос по умолчанию)', openaiKey: 'API-ключ', openaiKeyHint: 'API-ключ OpenAI с правами TTS', openaiUrl: 'Базовый URL API', openaiUrlHint: 'Например, https://api.openai.com/v1/audio/speech', openaiModel: 'Модель', openaiModelHint: 'tts-1 (быстрая) / tts-1-hd (высокое качество)', openaiVoice: 'Тембр', openaiVoiceHint: 'Тембр для синтеза речи', customHint: 'Поддерживается любая служба TTS, совместимая с OpenAI, включая GPT-SoVITS, CosyVoice и т.п.', customUrl: 'URL API', customUrlHint: 'Полный базовый URL службы TTS', customUrlPlaceholder: 'Адрес, указанный в локальном адаптере, например http://127.0.0.1:9880', customApiKey: 'API-ключ (необязательно)', customApiKeyHint: 'Некоторые саморазвёрнутые службы требуют аутентификации', customApiKeyPlaceholder: 'Оставьте пустым, если не требуется', edgeHint: 'Работает на движке Microsoft Edge TTS (node-edge-tts).', edgeUrl: 'Адрес адаптера', edgeUrlHint: 'Адрес адаптера Edge TTS, например http://127.0.0.1:9882', edgeUrlPlaceholder: 'http://127.0.0.1:9882', edgeVoice: 'Тембр', edgeVoiceHint: 'Выберите тембр для синтеза речи', edgeRate: 'Скорость речи', edgeRateHint: 'Регулировка скорости речи (0.5–2.0)', edgePitch: 'Высота тона', edgePitchHint: 'Регулировка высоты тона (–20 … +20 Гц)', testTitle: 'Тестовое прослушивание', testText: 'Тестовый текст', testTextPlaceholder: 'Введите тестовый текст...', testTextDefault: 'Здравствуйте, это тест голоса.', testButton: 'Прослушать', testButtonPlaying: 'Воспроизведение...', testFailed: 'Ошибка теста: {error}', mimoHint: 'MiMo TTS от Xiaomi. Поддерживает три режима: предустановленные тембры, дизайн тембра и клонирование тембра.', mimoApiKey: 'API-ключ', mimoApiKeyHint: 'Получите его на platform.xiaomimimo.com', mimoApiKeyPlaceholder: 'API-ключ MiMo', mimoBaseUrl: 'Базовый URL', mimoBaseUrlHint: 'Конечная точка API MiMo', mimoModel: 'Модель', mimoModelHint: 'Выберите модель синтеза речи', mimoModelPreset: 'Предустановленный тембр', mimoModelVoiceDesign: 'Дизайн тембра', mimoModelVoiceClone: 'Клонирование тембра', mimoVoice: 'Тембр', mimoVoiceHint: 'Выберите предустановленный тембр', mimoVoiceDesignPrompt: 'Описание тембра', mimoVoiceDesignPromptHint: 'Опишите желаемые характеристики тембра', mimoVoiceDesignPromptPlaceholder: 'Например: мягкий молодой женский голос, слегка замедленный, с хрипотцой', mimoCloneAudio: 'Загрузить аудио', mimoCloneAudioHint: 'Загрузите аудиообразец для клонирования тембра. Поддерживаются mp3/wav, максимум 10 МБ', mimoCloneAudioUpload: 'Выбрать файл', mimoCloneAudioClear: 'Очистить аудио', mimoStylePrompt: 'Стилевая инструкция', mimoStylePromptHint: 'Необязательно. Опишите желаемый стиль речи естественным языком', mimoStylePromptPlaceholder: 'Например: используйте лёгкий, приподнятый тон, темп речи чуть выше среднего', }, }, platform: { requireMention: "Требуется упоминание {'@'}", requireMentionGroup: "В группе требуется упоминание {'@'}бота для ответа", requireMentionChannel: "В канале требуется упоминание {'@'}бота для ответа", requireMentionRoom: "В комнате требуется упоминание {'@'}бота для ответа", reactions: 'Реакции', reactionsHint: 'Добавлять реакции на сообщения', freeResponseChats: 'Чаты со свободным ответом', freeResponseChatsHint: "ID чатов, в которых не требуется упоминание {'@'} (через запятую)", freeResponseChannels: 'Каналы со свободным ответом', freeResponseChannelsHint: "ID каналов, в которых не требуется упоминание {'@'} (через запятую)", freeResponseRooms: 'Комнаты со свободным ответом', freeResponseRoomsHint: "ID комнат, в которых не требуется упоминание {'@'} (через запятую)", mentionPatterns: 'Пользовательские шаблоны упоминаний', mentionPatternsHint: 'Дополнительные шаблоны для срабатывания', autoThread: 'Автоматически создавать ветку', autoThreadHint: "Автоматически создавать ветку для ответа после упоминания {'@'}", autoThreadHintRoom: 'Автоматически создавать ветку для ответа в комнате', dmMentionThreads: 'Ветки для упоминаний в ЛС', dmMentionThreadsHint: 'Использовать ветки для ответов на упоминания в личных сообщениях', allowBots: 'Разрешить сообщения ботов', allowBotsHint: 'Отвечать на сообщения от других ботов', allowedChannels: 'Разрешённые каналы', allowedChannelsHint: 'Белый список ID каналов (через запятую)', ignoredChannels: 'Игнорируемые каналы', ignoredChannelsHint: 'Каналы, на которые не отвечать (через запятую)', noThreadChannels: 'Каналы без веток', noThreadChannelsHint: 'Каналы, в которых не создавать ветки (через запятую)', exclusiveTokenWarning: 'Эта платформа использует эксклюзивную блокировку токенов. Каждый профиль должен использовать свой токен, иначе возникнут конфликты с другими профилями, и шлюз не запустится.', botToken: 'Токен бота', botTokenHint: 'Токен бота, полученный на портале разработчика', proxyUrl: 'URL прокси', proxyUrlHint: 'Необязательный прокси для платформы. Поддерживает http://, https:// и socks5://', accessToken: 'Токен доступа', accessTokenHint: 'Токен доступа Matrix', homeserver: 'URL домашнего сервера', homeserverHint: 'Адрес сервера Matrix', matrixUserId: 'ID пользователя Matrix', matrixUserIdHint: 'Обязателен для входа по паролю, необязателен с токеном', matrixPassword: 'Пароль Matrix', matrixPasswordHint: 'Альтернатива токену доступа', appId: 'ID приложения', appIdHint: 'ID приложения Feishu', appSecret: 'Секрет приложения', appSecretHint: 'Секрет приложения Feishu', encryptKey: 'Ключ шифрования', encryptKeyHint: 'Ключ шифрования Feishu', verificationToken: 'Токен проверки', verificationTokenHint: 'Токен проверки Feishu', clientId: 'ID клиента', clientIdHint: 'ID клиента DingTalk', clientSecret: 'Секрет клиента', clientSecretHint: 'Секрет клиента DingTalk', cardTemplateId: 'ID шаблона AI-карточки', cardTemplateIdHint: 'ID шаблона AI-карточки DingTalk; оставьте пустым, чтобы отключить AI-карточки', allowedUsers: 'Разрешённые пользователи', allowedUsersHint: 'Белый список ID пользователей или OpenID (через запятую)', allowAllUsers: 'Разрешить всех пользователей', allowAllUsersHint: 'Разрешить любым пользователям отправлять сообщения; при отключении используется белый список', botId: 'ID бота', botIdHint: 'ID бота WeCom', wecomSecretHint: 'Секрет бота WeCom', waEnabled: 'Включить WhatsApp', waEnabledHint: 'Включить WhatsApp с помощью пары по QR-коду', weixinToken: 'Токен Weixin', weixinTokenHint: 'Получите с помощью CLI (hermes weixin) при входе по QR-коду', accountId: 'ID учётной записи', accountIdHint: 'ID учётной записи Weixin', qrLogin: 'Вход по QR-коду', qrRelogin: 'Войти снова', qrFetching: 'Получение QR-кода...', qrScanHint: 'Отсканируйте QR-код с помощью WeChat для входа', qrScanedHint: 'QR-код отсканирован. Подтвердите на телефоне...', qqAppId: 'ID приложения', qqAppIdHint: 'ID приложения бота QQ Open Platform', qqAppSecret: 'Секрет приложения', qqAppSecretHint: 'Секрет приложения бота QQ Open Platform', qqMarkdown: 'Поддержка Markdown', qqMarkdownHint: 'Включить сообщения в формате Markdown (может не поддерживаться некоторыми клиентами)', qqSandbox: 'Режим песочницы', qqSandboxHint: 'Включить песочницу (для тестирования)', qqQrScanHint: 'Отсканируйте QR-код с помощью QQ или откройте ссылку на телефоне, чтобы завершить привязку', }, gateways: { title: 'Шлюзы', running: 'Работает', stopped: 'Остановлен', started: 'Запущен', startFailed: 'Ошибка запуска', stopFailed: 'Ошибка остановки', }, language: { label: 'Язык', zh: 'Китайский', en: 'Английский', ru: 'Русский', }, terminal: { sessions: 'Сеансы', newTab: 'Новая вкладка терминала', closeSession: 'Завершить этот сеанс?', sessionExited: 'Выход выполнен', processExited: 'Процесс завершён с кодом {code}', noSessions: 'Нет активных сеансов терминала', connectionFailed: 'Не удалось подключиться к службе терминала', connectionClosed: 'Соединение с терминалом закрыто', connectionError: 'Ошибка соединения с терминалом', }, groupChat: { title: 'Групповой чат', createRoom: 'Создать комнату', joinByCode: 'Присоединиться по коду-приглашению', roomName: 'Название комнаты', roomNamePlaceholder: 'Введите название комнаты', inviteCode: 'Код-приглашение', autoGenerate: 'Сгенерировать автоматически', noRooms: 'Нет комнат', selectOrCreate: 'Выберите или создайте комнату, чтобы начать чат', agents: 'Агенты', addAgent: 'Добавить агента', selectProfile: 'Выберите профиль', agentAdded: 'Агент добавлен', selectRoomFirst: 'Сначала выберите комнату', agentAlreadyInRoom: 'Агент уже в комнате', agentAddFailedCount: 'Не добавлено агентов: {count} — {details}', noAgents: 'В комнате нет агентов', members: 'Участники', roomCreated: 'Комната создана', roomDeleted: 'Комната удалена', roomCloned: 'Комната клонирована', cloneRoom: 'Клонировать комнату', copyRoomLink: 'Копировать ссылку на комнату', deleteRoomConfirm: 'Удалить эту комнату?', clearContext: 'Очистить контекст', clearContextConfirm: 'Очистить контекст текущей комнаты? Сообщения и сжатые снимки будут удалены, агенты и участники останутся.', contextCleared: 'Контекст очищен', you: 'Вы', joined: 'Вы присоединились к комнате', joinFailed: 'Не удалось присоединиться к комнате', inputPlaceholder: 'Введите сообщение... (Enter — отправить)', messageDisplayLimit: 'Групповой чат показывает не более 600 сообщений', enterCode: 'Введите код-приглашение', yourName: 'Ваше имя', yourNamePlaceholder: 'Введите ваш ник в групповом чате', yourDescription: 'Самоописание (необязательно)', yourDescriptionPlaceholder: 'Расскажите о себе...', agentName: 'Имя агента', agentNamePlaceholder: 'Пользовательское имя (оставьте пустым для использования имени профиля)', agentDesc: 'Описание агента', agentDescPlaceholder: 'Опишите роль этого агента...', agentReplying: 'Ответ агента...', agentCompressing: 'Сжатие контекста...', compressionSettings: 'Настройки сжатия', triggerTokens: 'Количество токенов для запуска сжатия', triggerTokensDesc: 'Сжатие контекста запускается, когда количество токенов в сообщениях превышает это значение', maxHistoryTokens: 'Максимум токенов в истории', maxHistoryTokensDesc: 'Максимальное количество токенов, отправляемое LLM после сжатия', tailMessageCount: 'Количество последних сохраняемых сообщений', tailMessageCountDesc: 'Количество последних исходных сообщений, сохраняемых после сжатия', compressionConfig: 'Конфигурация сжатия', compressionSaved: 'Конфигурация сжатия сохранена', compressNow: 'Сжать сейчас', compressingInProgress: 'Выполняется сжатие, пожалуйста, подождите', }, usage: { title: 'Статистика использования', refresh: 'Обновить', totalTokens: 'Всего токенов', inputTokens: 'Входящие', outputTokens: 'Исходящие', totalSessions: 'Всего сеансов', avgPerDay: 'В среднем за день ~{n}', estimatedCost: 'Примерная стоимость', cacheHitRate: 'Попадания в кэш', modelBreakdown: 'Распределение по моделям', agentBreakdown: 'Распределение по агентам', agents: { hermes: 'Hermes Agent', claudeCode: 'Claude Code', codex: 'Codex', ekkoAgent: 'Ekko Agent', unknown: 'Неизвестно' }, dailyTrend: 'Ежедневная динамика', date: 'Дата', tokens: 'Токены', cache: 'Кэш', cacheRead: 'Чтение из кэша', cacheWrite: 'Запись в кэш', sessions: 'Сеансы', cost: 'Стоимость', noData: 'Нет данных об использовании', }, skillsUsage: { title: 'Использование навыков', subtitle: 'Отслеживание загрузки и редактирования навыков в сеансах Hermes', refresh: 'Обновить', periodSelector: 'Период использования навыков', periodLabel: '{days} дн.', summary: 'Обзор', totalActions: 'Действий', loads: 'Загрузок', edits: 'Правки', distinctSkills: 'Навыков', topSkills: 'Популярные', dailyTrend: 'Динамика по дням', periodSummary: 'За последние {days} дн.', skill: 'Навык', share: 'Доля', lastUsed: 'Последний', noData: 'Нет данных об использовании навыков', loadFailed: 'Ошибка загрузки данных об использовании навыков', otherSkills: 'Другие навыки', }, files: { title: 'Файлы', fileTree: 'Древо файлов', tree: 'Древо каталогов', list: 'Список файлов', breadcrumbRoot: 'Корневая директория', newFile: 'Новый файл', newFolder: 'Новая папка', upload: 'Загрузить', refresh: 'Обновить', open: 'Открыть', edit: 'Редактировать', preview: 'Предпросмотр', download: 'Скачать', copyPath: 'Копировать путь', rename: 'Переименовать', delete: 'Удалить', name: 'Имя', size: 'Размер', modified: 'Время изменения', actions: 'Действия', emptyDir: 'Папка пуста', loading: 'Загрузка...', confirmDelete: 'Удалить «{name}»?', confirmDeleteDir: 'Удалить папку «{name}» со всем содержимым?', deleteFailed: 'Ошибка удаления', deleted: 'Удалено', renameTo: 'Переименовать в', newFileName: 'Имя файла', newFolderName: 'Имя папки', created: 'Создано', createFailed: 'Ошибка создания', renamed: 'Переименовано', renameFailed: 'Ошибка переименования', uploadSuccess: 'Загружено файлов: {count}', uploadFailed: 'Ошибка загрузки', saveFailed: 'Ошибка сохранения', saved: 'Сохранено', unsavedChanges: 'Есть несохранённые изменения. Отменить?', pathCopied: 'Путь скопирован', fileTooLarge: 'Файл слишком большой (максимум 10 МБ)', permissionDenied: 'Невозможно изменить защищённый файл', notFound: 'Файл или папка не найдены', backendError: 'Ошибка файловой операции', dragDropHint: 'Перетащите файлы сюда для загрузки', closeEditor: 'Закрыть редактор', closePreview: 'Закрыть', saveFile: 'Сохранить', }, download: { downloading: 'Скачивание...', downloadFailed: 'Ошибка скачивания', fileNotFound: 'Файл не существует или был удалён', fileTooLarge: 'Файл слишком большой (превышает лимит)', backendError: 'Не удалось прочитать файл. Возможно, удалённое окружение недоступно', backendTimeout: 'Таймаут чтения файла', unsupportedBackend: 'Текущий терминальный бэкенд не поддерживает загрузку файлов', invalidPath: 'Недействительный путь к файлу', contentDisplay: 'Отображение содержимого', download: 'Скачать', downloadFile: 'Скачать файл', }, changelog: { new_0_6_29_1: 'В выпуск вошли все 14 PR после 0.6.28: единый интерфейс, звук MCU и оборудование v2, workspace diff, аналитика использования, обновления Docker и клонирование голоса MiMo', new_0_6_29_2: 'Заголовки страниц, тёмные поверхности и скругления объединены в одну визуальную систему, а предпросмотр версий сортирует допустимые теги по semver (#2014, #2015)', new_0_6_29_3: 'Страница продукта ESP32 получила адаптивный дизайн, а селектор версий сайта теперь включает Hermes Agent 0.18.2 (#2020, #2042)', new_0_6_29_4: 'ESP32-C3 v1 использует IMA-ADPCM и примерно четверть прежней полосы, записывает до двух минут, а OLED возвращается к LAN IP после временных статусов (#2024, #2025)', new_0_6_29_5: 'Workspace diff изначально свёрнуты и скрывают изменения с нулём строк; восстановлен стандартный тёмный фон поля чата (#2032)', new_0_6_29_6: 'Экспорт сессий обрабатывает некорректные знаки процента в именах; обновление Docker показывает команды pull/recreate вместо изменения npm внутри контейнера (#2026, #2033)', new_0_6_29_7: 'Результаты Bridge сохраняются полностью, но в контексте модели ограничены сводкой начала и конца на 5 500 символов (#2036)', new_0_6_29_8: 'Аналитика объединяет вызовы Hermes Agent, Claude Code, Codex и Ekko Agent и добавляет распределение по агентам (#2039)', new_0_6_29_9: 'Отдельная прошивка ESP32-C3 v2 добавляет новую распиновку без влияния на v1; v2 использует 80% громкости по умолчанию, усиление PCM 1,5x и мягкий лимитер (#2044, #2045)', new_0_6_29_10: 'Клонирование голоса MiMo снова поддерживает загрузку WAV/MP3 и передаёт образец через audio.voice по требованиям текущего API (#2046)', new_0_6_28_1: 'Этот релиз включает все PR после 0.6.27: управление MCU, workspace diff для Group Chat, исправления Coding Agent, approvals в Workflow, фильтрацию workspace diff, выбор модели для scheduled jobs и desktop-индикатор новой версии', new_0_6_28_2: 'MCU получил управление устройствами, API-token авторизацию для global-agent events, обновленную прошивку ESP32-C3 и более стабильный remote relay login', new_0_6_28_3: 'Изменения workspace в Group Chat сохраняются как workspace diff runs, чтобы активность agent в комнате можно было проверить после завершения сессии', new_0_6_28_4: 'Coding Agents наследуют scoped external MCP servers, правильно направляют workflow agent aborts и best-effort экспортируют завершенные native sessions Codex и Claude Code', new_0_6_28_5: 'Исправлен workspace file drawer, удалены сломанные starred-history embeds, а bridge sessions теперь записывают ended_at и end_reason metadata', new_0_6_28_6: 'Workflow nodes поддерживают approval gates после завершения node, а состояния approval при повторном запуске workflow исправлены', new_0_6_28_7: 'Workspace diff фильтрует SQLite WAL/SHM sidecars и продолжает scan после неизмененных файлов, чтобы новые обычные файлы оставались видимыми', new_0_6_28_8: 'Scheduled jobs могут выбирать и сохранять provider/model, не передавая неподдерживаемые model flags в текущую Hermes cron CLI', new_0_6_28_9: 'Desktop version management показывает локализованный индикатор новой версии на кнопке, а public version manifest включает 0.6.28', new_0_6_27_1: 'Этот релиз включает все PR, объединенные после 0.6.26: fallback запуска desktop, исправления Windows runtime, remote MCU relay, workspace для группового чата, доработки workspace по умолчанию и фильтрацию пустых diff', new_0_6_27_2: 'Запуск desktop теперь откатывается к встроенному Web UI, если каталог active Web UI отсутствует или неполный, при этом закрепленный runtime сохраняется', new_0_6_27_3: 'Windows desktop runtime теперь использует переносимые wrappers hermes.cmd вместо хрупких .exe trampolines для вызовов Web UI server', new_0_6_27_4: 'Remote MCU traffic теперь использует Socket.IO /global-agent relay, с более стабильными login и discovery для ESP32-C3, очередью voice playback, сохранением Wi-Fi credential и обновленным firmware', new_0_6_27_5: 'Комнаты Group Chat теперь могут иметь проверенный workspace, который передается в group-agent runs; участники только для чтения не видят workspace, invite code и элементы управления', new_0_6_27_6: 'Favorites для workspace по умолчанию теперь находятся в строке выбранного path в folder picker, а locale coverage для labels workspace picker завершено', new_0_6_27_7: 'Workspace diff cards теперь пропускают изменения 0 byte без patch или line delta, чтобы не показывать бессмысленные карточки changed-file +0/-0', new_0_6_26_1: 'Этот релиз включает PR, объединенные после 0.6.25, с фокусом на Ekko Agent, отображение context в Coding Agent, Journey, baseline для группового чата, исправления desktop и размер MCP payload', new_0_6_26_2: 'Ekko Agent теперь доступен в чате с обработкой runtime context, browser tools, более стабильными tool events и восстановленной tool-result history для учета context usage', new_0_6_26_3: 'Сессии Coding Agent теперь яснее показывают reasoning и настройки context, сохраняют API mode, избегают неверного Codex app-server mode и не допускают скачков context usage после follow-up turns', new_0_6_26_4: 'В Journey добавлена view learning graph с более аккуратными graph interactions, а групповой чат получил baseline coverage для новой линейки функций', new_0_6_26_5: 'Надежность desktop улучшена за счет исправлений login persistence и reset flow, fallback динамического порта Windows worker, обработки stdout/stderr EPIPE и отдельной упаковки firmware ESP32-C3 v1', new_0_6_26_6: 'Hermes Studio MCP теперь по умолчанию возвращает компактный summary available-models, с фильтрами и явной option full-detail, чтобы не перегружать agent context данными моделей', new_0_6_25_1: 'Исправлен сбой execute_code с Hermes Agent 0.18.0: Agent Bridge теперь передает новый параметр has_host_access через wrapper памяти подтверждений', new_0_6_24_1: 'Этот релиз включает PR после 0.6.23 и улучшает ввод чата, видимость workspace, управление plugins, модели по умолчанию и просмотр workspace diff', new_0_6_24_2: 'Поля ввода одиночного и группового чата получили встроенную панель, компактные элементы модели, сгруппированные настройки ввода, более понятное использование context, мобильную полировку и восстановленный ручной resize одиночного чата', new_0_6_24_3: 'Изменения workspace run теперь показываются как устойчивые chat diff cards с правым drawer для просмотра diff и редактирования файлов, восстанавливаются после resume session и лучше работают на mobile', new_0_6_24_4: 'Workspace folder picker надежнее обходит Windows drives и junctions и показывает dot-prefixed folders вроде .hermes, .config и .codex, сохраняя проверки WORKSPACE_BASE', new_0_6_24_5: 'Страница Plugins позволяет включать и отключать управляемые user plugins и точнее показывает состояние из базовой конфигурации Hermes и текущего profile', new_0_6_24_6: 'Страница Models получила действия default provider и default model; bridge terminal error detection дает меньше ложных ошибок, Hermes Agent runtime packaging обновлен до 0.18.0, а website version manifest освежен', }, }