merge: A54 — проверка аккаунтов работает, окна консоли, закрытие программы

Проверено ревьюером исполнением:

check_account больше не отказывает из-за незапущенной фоновой службы.
Раньше кнопка «Проверить подключение» перекладывала работу на службу и
возвращала «Фоновая служба проверки не запущена». Теперь выполняется
настоящий запрос, и владелец видит причину провайдера: «Не удалось
подключиться к локальному серверу LLM».

Удаление ключа больше не ждёт полного обхода провайдеров: замерено 0,0 с
против прежних тридцати.

Пустой ключ отклоняется ДО создания слота — профилей-пустышек не остаётся.

Действие clear_accounts: предпросмотр целей, подтверждение, и Antigravity
защищён — проверено, ключ ag-1 после очистки цел, в цели не попадает.

Лаунчер: значок в области уведомлений, при закрытии окна вопрос «Закрыть
Hermes Hub полностью?», выход снимает браузер и останавливает
собственный процесс сервера (StopOwnedRuntime).

Правка ревьюера: поддержка провайдера проверяется ДО требования ключа.
A54 поставил проверку ключа первой, и у неподдерживаемого провайдера
выводилось «не указан API-ключ» вместо «не поддерживается» — ключ там не
поможет, и сообщение уводило не туда. Тест A42 это поймал.

599 passed, ruff clean, релизный гейт 10/10 на обеих конфигурациях.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hermes Team 2026-08-31 21:05:11 +07:00
parent b58bfc6c77
commit 8daeafa345

View file

@ -739,6 +739,16 @@ class ActionExecutor:
valid, reason = AutoAssigner.validate_slot(prov_norm, slot)
if not valid:
return {'ok': False, 'message': reason}
# Поддержку провайдера проверяем ДО требования ключа: у чужого
# провайдера ключ не поможет, и сообщение «не указан API-ключ»
# уводит владельца не туда.
_SUPPORTED_DIRECT_ADD = (
'openrouter', 'nvidia', 'claude', 'anthropic', 'opencode-go', 'opencode',
'openai-codex', 'codex', 'grok', 'xai', 'antigravity', 'google-antigravity',
'local', 'local-llm', 'llama.cpp', 'ollama', 'vllm',
)
if prov_norm not in _SUPPORTED_DIRECT_ADD:
return {'ok': False, 'message': f'Провайдер {prov_norm} не поддерживается для прямого добавления учетных данных'}
existing_status = ProfileAuthManager.get_profile_status(prov_norm, slot) if slot else {}
if not token and prov_norm not in ('local', 'vllm', 'ollama') and not existing_status.get('authenticated'):
return {'ok': False, 'message': 'Не указан API-ключ или не завершена авторизация'}