hermes-hub/agents/inbox/A54-accounts-fix.md

169 lines
No EOL
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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

# Задание A54: проверка аккаунтов не работает, окна консоли, закрытие программы
## Дата поступления
2026-08-31
## База
`origin/main` (`f0d06e4`).
```
git fetch origin --prune
git checkout -b antigravity/a54-accounts-fix origin/main
```
В `main` напрямую не пушить.
## Порядок исполнения
Два прохода: **Flash** реализует, **Pro** проводит аудит. Пункт **P0-8** написан для аудитора.
**Задание срочное.** После установки сборки `f0d06e4` владелец не может пользоваться программой: ни один аккаунт не проверяется, модели не подтягиваются, поверх окна выскакивают чёрные консоли.
---
## Задача
Владелец, дословно: «я так понял ни один аккаунт не подключается. Все проверки проходят с ошибкой, модели перестали нормально подтягиваться. Даже на локальных моделях». И отдельно: «в чём сложность-то?» — про OpenRouter и NVIDIA, которые не подключаются третье задание подряд.
---
## Что проверено ревьюером — заново не выяснять
### Кнопка «Проверить подключение» ничего не проверяет
Воспроизведено вызовом:
```
check_account profile_id=local-1
→ ok=False
→ «Фоновая служба проверки не запущена. Перезапустите веб-сервер.»
```
Действие **перекладывает работу на фоновую службу** вместо того, чтобы выполнить проверку. Если служба не поднялась, владелец получает отказ на каждом аккаунте. В интерфейсе это выглядит как «Тест завершился с ошибкой» и «Отказ выполнения действия» — второе вообще запасной текст на случай пустого сообщения, то есть причина до владельца не доходит.
Служба включается в `web/server.py:496` внутри фонового потока. Любой сбой этого потока оставляет все проверки нерабочими, и узнать об этом нельзя.
### Удаление аккаунта занимает полминуты
Причина найдена: `_rescan_after_auth()` вызывает
```python
HubStateStore.get().refresh(force_scan=True)
AccountProbeService.get().schedule_all()
```
то есть **принудительный полный пересбор всех провайдеров** с сетевыми запросами. Таймауты в сборщике квот — 15, 20 и 30 секунд, у Antigravity через CLI — 60. Удаление одного ключа ждёт опроса всех.
### Окна консоли
В `f0d06e4` скрытие окна добавлено к двум живым запускам `agy` и к остальным фоновым вызовам. Проверено, что `hidden_process_kwargs()` на Windows возвращает `CREATE_NO_WINDOW` и `SW_HIDE`.
Окна у владельца остались. Наиболее вероятная причина: **старый процесс сервера пережил обновление**. Закрытие окна браузера сервер не останавливает, и после установки продолжает работать прежний код. Проверить это первым делом.
`launch_native_agy_login` с `CREATE_NEW_CONSOLE` — мёртвый код, его никто не вызывает. Либо удалить, либо подключить к входу.
### OpenRouter и NVIDIA
Сохранение работает — проверено вызовом `add_account`, профиль создаётся с верным идентификатором, чужой слот отклоняется. Значит дело не в сохранении, а в том, что **после ввода ключа ничего не проверяется и модели не запрашиваются**, и владелец остаётся с пустым списком.
---
## P0-1. Проверка выполняется, а не делегируется
1. **«Проверить подключение» делает настоящий запрос к провайдеру здесь и сейчас** и возвращает результат. Фоновая служба — для периодической проверки, а не для ручной.
2. **Отказ невозможен из-за незапущенной службы.** Если фоновая служба нужна, но не работает, ручная проверка всё равно обязана отработать.
3. **Причина доходит до владельца.** Запасной текст «Отказ выполнения действия» означает пустое сообщение — таких путей быть не должно.
4. **Состояние службы видно** в «Состоянии системы»: работает или нет, когда был последний обход.
## P0-2. Удаление и очистка
1. **Удаление ключа не запускает полный пересбор.** Обновлять только затронутый профиль; полный обход — в фон, не блокируя ответ.
2. **Кнопка «Очистить все аккаунты»** с подтверждением и перечислением того, что будет удалено.
3. **Учётные данные Antigravity — под защитой A37.** Массовое удаление не должно затрагивать `~/.hermes/agy_profiles/` без явного отдельного подтверждения: повторный вход в два десятка аккаунтов делается вручную и стоит владельцу часов.
## P0-3. Закрытие программы на Windows
Владелец: «при нажатии на крестик спрашивать, закрыть программу или свернуть в фон. При закрытии полностью всё закрывает».
1. **Диалог при закрытии**: закрыть полностью или свернуть в фон.
2. **Закрытие останавливает всё**: веб-сервер, фоновые опросы, дочерние процессы. После этого окон появляться не должно.
3. **Свёрнутое состояние видно** — значок в области уведомлений с пунктами «Открыть» и «Выход».
4. **Обновление не должно оставлять старый процесс**: перед установкой прежний сервер останавливается. Это вероятная причина того, что окна не исчезли после установки исправления.
## P0-4. Подключение по ключу проверяется сразу
Для `openrouter`, `nvidia`, `nvidia-nim` и прочих провайдеров с ключом:
1. **После ввода ключа — немедленная проверка**: запрос к провайдеру, и его ответ показывается владельцу.
2. **Ключ неверен — сказать сразу**, не создавая профиль-пустышку.
3. **Ключ верен — тут же запросить модели** и дать выбрать предпочитаемую в том же окне.
4. **Не «сохранено», а «подключено и проверено»** — сообщение должно отражать, что именно произошло.
## P0-5. Модели у локальных и Ollama
1. **«Запросить список моделей» у локального профиля возвращает ошибку** — разобраться и починить. Локальный путь не требует ключа, отказ там означает дефект, а не отсутствие доступа.
2. **Ollama: список не грузится.** Локальные модели через `/api/tags` по адресу профиля; облачный каталог уже работает — не сломать.
3. **Отличать «сервер не отвечает» от «моделей нет»**: у владельца на Windows Ollama не запущена, и `WinError 10061` — это честный ответ, его надо показывать именно так, а не как ошибку обновления.
## P0-6. Antigravity: было 14 моделей, стало 3
На прошлой сборке у аккаунтов Antigravity значилось «Получено 14 моделей» с перечнем. Сейчас в карточке три, статус «Не проверялся», а проверка завершается ошибкой.
1. **Найти, где список сузился.** Проверить, не подменяется ли обнаруженный список предпочтениями профиля — эта ошибка уже была в инспекторе агента и чинилась в правках ревьюера.
2. **Число и время получения показывать** рядом со списком, как было.
## P0-7. Проверка исполнением
Тестов недостаточно: все перечисленные дефекты прошли через зелёный прогон.
1. **Открыть хаб и нажать «Проверить подключение»** на локальном профиле, на Ollama и на Antigravity. Результат приложить скриншотами.
2. **Подключить OpenRouter с заведомо неверным ключом** и убедиться, что ошибка видна сразу; затем убедиться, что при верном ключе подтягиваются модели.
3. **Удалить аккаунт и замерить время** — должно быть быстро, без ожидания опроса всех провайдеров.
4. **Закрыть программу крестиком**, выбрать «закрыть», и убедиться, что процессов не осталось и окна не появляются.
5. **Проверить, что после обновления старый процесс не остаётся.**
## P0-8. Аудит вторым проходом
1. **Проверить, что ручная проверка работает при остановленной фоновой службе.**
2. **Искать оставшиеся пути с пустым сообщением об ошибке** — их не должно быть.
3. **Замерить удаление аккаунта** независимо.
4. **Проверить, что массовая очистка не трогает `~/.hermes/agy_profiles/`.**
5. **Проверить, что окна консоли не появляются** при работающей автопроверке.
6. **Побочные изменения** объяснить.
7. **Пропущенный пункт назвать пропущенным.**
---
## Ограничения
- Учётные данные и `~/.hermes/agy_profiles/` не трогать; массовое удаление — только с отдельным подтверждением.
- Автоматическую проверку не отключать ради тишины: чинить, а не убирать.
- Вёрстку A48 не ломать.
- Версию `0.1.1` не поднимать.
- Правило честности без исключений: причина отказа доходит до владельца текстом.
## Критерии приёмки
1. Ветка в `origin`, `git status` чист.
2. Ручная проверка выполняет запрос и возвращает результат даже при незапущенной фоновой службе; проверено.
3. Путей с пустым сообщением об ошибке не осталось.
4. Удаление аккаунта не ждёт полного обхода провайдеров; время замерено до и после.
5. Есть кнопка очистки всех аккаунтов с подтверждением; учётные данные Antigravity не затрагиваются без отдельного согласия.
6. Крестик спрашивает «закрыть или свернуть»; закрытие останавливает сервер и фоновые опросы; проверено отсутствием процессов.
7. Обновление не оставляет старый процесс.
8. Ввод ключа сразу проверяется, модели подтягиваются в том же окне.
9. Список моделей у локального профиля и Ollama работает; «сервер не отвечает» отличается от «моделей нет».
10. У Antigravity список моделей вернулся к полному; показано число и время получения.
11. Скриншоты проверок приложены.
12. `ruff check .` чисто; релизный гейт 10/10; тестов не меньше **574**.
13. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`.
## Главное
Владелец поставил сборку и не может ей пользоваться: проверка отказывает на каждом аккаунте, модели не грузятся даже у локальных, удаление ключа занимает полминуты, а поверх окна выскакивают консоли.
Общее у большинства этих дефектов одно: **действие не делает работу само, а перекладывает её на фоновую службу или на полный обход всех провайдеров**. Отсюда и отказы, и задержки. Чинить надо это, а не симптомы.
## Порядок сдачи
Передать точный `FINAL_COMMIT_SHA`.