# Задание 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`.