169 lines
No EOL
15 KiB
Markdown
169 lines
No EOL
15 KiB
Markdown
# Задание 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`. |