hermes-hub/agents/inbox/2026-08-25-A32-remove-desktop.md
Hermes Team 1b03f03ea5 docs(agents): задания A32 и A34 — восстановление подключения аккаунтов, OpenRouter и NVIDIA, удаление десктопа
Проверка кандидата A28-A31 в браузере вскрыла блокирующую регрессию: при
переписывании клиента в A29 функции удалили, а вызовы в разметке оставили.
Консоль на живой сборке:

    openAddAccountWizard is not defined     «+ Добавить аккаунт» не работает
    checkUpdates is not defined             падает при каждой загрузке
    handleNodeAccountChange                 не сменить аккаунт у агента
    handleNodeModelChange                   не сменить модель
    handleRefreshProviderModels             не обновить список моделей

Подключить аккаунт в новой сборке невозможно, назначить агенту тоже. При этом
startDeviceAuth и startRedirectAuth в коде остались, но не вызываются ниоткуда.

A34 собирает в один порядок: восстановление подключения (блокирует остальное),
адаптеры OpenRouter и NVIDIA с несколькими аккаунтами, интерфейс автопоиска
локальных серверов поверх готовой серверной части, и удаление десктопа по A32.

Задание опирается на ветку review/a28-a31-fixes, где лежат исправления
ревьюера, и перечисляет их отдельным разделом, чтобы не переделывались.

A32 добавлен в репозиторий: он был написан ранее, но остался только локально.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 20:48:11 +07:00

137 lines
10 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.

# Задание A32: удаление десктопного приложения
## Дата поступления
2026-08-25
## База
Проверочный HEAD на момент выдачи: **`c35bc48`**.
## Ветка
`antigravity/remove-desktop`
## Когда выполнять
**После A29 и A30.** Оба работают в веб-слое, и удалять десктоп раньше, чем веб доберёт остаток паритета, нельзя. Пункт P0-1 — проверка этого паритета, и он выполняется первым.
Два прохода: **Flash** реализует, **Pro** проводит аудит.
---
## Порядок работы с git
```
cd <каталог репозитория>; git fetch origin --prune; git status
git checkout main; git pull --ff-only origin main
git checkout -b antigravity/remove-desktop
git commit -m "..." <- сначала коммит
git push -u origin antigravity/remove-desktop
```
В `main` напрямую не пушить.
---
## Задача
Владелец решил перейти на веб полностью: «десктоп надо вообще вырезать и удалить, он не нужен». Решение принято давно, но удаление ни разу не назначалось: в заданиях стояло «десктоп не трогать, он выводится из обращения», и это защищало его от правок, а не убирало.
## Что осталось — снято исполнением на `c35bc48`
```
src/antigravity_provider/router/ui/ 20 файлов, ~6 910 строк
hermes_hub_app.py ~1 345 строк, CustomTkinter
cli_commands.py:481 команда запуска десктопа
```
Виндовый установщик:
```
HermesHubSetup.cs:288-289 копирует HermesHub.exe в каталог установки и в hermes home
HermesHubSetup.cs:575 создаёт ярлык «Hermes Hub (Desktop).lnk» рядом с «Hermes Hub (Web).lnk»
HermesHubSetup.cs:140 проверка зависимостей ТРЕБУЕТ customtkinter, иначе установка не считается успешной
HermesHubSetup.cs:188 ставит customtkinter и pillow в venv
pyproject.toml:40 customtkinter>=6.0.0 в зависимостях
```
Линуксовый установщик десктоп уже не ставит: там только `fastapi uvicorn pydantic psutil pyyaml`, а `.desktop` ведёт на веб-лаунчер. **Сервер фактически уже без десктопа.**
Последствия, не сводящиеся к лишнему весу: на Windows GUI-библиотека ставится ради программы, которой не пользуются, и её отсутствие ломает установку. Два ярлыка в меню «Пуск» — прямой путь снова открыть старое окно вместо веба; у владельца это уже случалось, он жаловался, что «открывается старая программа и тормозит при передвижении окна».
## P0-1. Сначала паритет, потом удаление
**Выполняется первым и является условием остального.**
Составить список того, что десктоп умеет, и сверить с вебом по каждому пункту. Особое внимание тому, что исторически жило только в десктопе:
- мастер подключения аккаунтов (`router/ui/add_account_wizard.py`) — в вебе есть свой, но состав шагов сверить;
- вход Antigravity и Claude по ссылке — сделан в вебе, проверить на всех провайдерах;
- каталог моделей (`router/ui/model_catalog.py`);
- граф маршрутизации (`router/ui/routing_graph.py`);
- всё из `router/ui/views/`.
**Результат — таблица «умение → где в вебе → проверено».** Непокрытое умение удалять нельзя: сначала оно появляется в вебе, и только потом удаляется десктоп. Если что-то не покрыто, а A29 и A30 его не закрывают, — назвать это в отчёте и остановиться, а не удалять молча.
## P0-2. Удаление кода
После пройденного P0-1:
1. `src/antigravity_provider/router/ui/**` целиком.
2. `hermes_hub_app.py`.
3. Команду запуска десктопа из `cli_commands.py` и проверку `customtkinter` там же.
4. Тесты, проверявшие десктоп. **Тесты, проверяющие общую логику, не выбрасывать** — перенести на веб-поверхность, если они там применимы.
Осторожно: часть общего кода могла переехать в `router/ui/` исторически. Перед удалением проверить, не импортирует ли что-то из веба или из маршрутизатора модули оттуда. Импорт, обёрнутый в `except ImportError`, — отдельная опасность: он не даст ошибки, просто тихо отключит функцию. Такое в проекте уже было и стоило раунда.
## P0-3. Зависимости и установщики
1. `customtkinter` и `pillow` убрать из `pyproject.toml`, из установки в `HermesHubSetup.cs` и из проверки зависимостей. **Проверить, не нужен ли `pillow` чему-то ещё** — он используется не только GUI.
2. Копирование `HermesHub.exe` убрать; сам `launcher/HermesHub.cs` и `launcher/HermesHub.exe` удалить.
3. Ярлык «Hermes Hub (Desktop)» убрать. Оставшийся ярлык переименовать в просто «Hermes Hub» — скобка «(Web)» теряет смысл, когда вариант один.
4. **Удаление старой установки должно убирать и старый ярлык.** Иначе у владельца в меню «Пуск» останется ярлык на несуществующую программу — это хуже, чем два рабочих.
## P0-4. Проверка на живой установке
Мало собрать — надо поставить.
1. Собрать оба установщика, поставить на Windows, убедиться: ярлык один, он открывает веб, `customtkinter` не требуется, установка проходит без него.
2. Проверить обновление **поверх старой установки** с десктопом: старые файлы и ярлык убираются, учётные данные и настройки уцелевают.
3. Линуксовый установщик не сломан.
Пункт 2 обязателен: у владельца на трёх машинах стоит версия с десктопом, и обновление пойдёт именно поверх неё.
## P0-5. Аудит вторым проходом
1. **Таблица паритета из P0-1 проверена выборочно**, а не принята на слово.
2. **Тихие импорты.** Поиском убедиться, что не осталось `from ...router.ui` под `except ImportError`.
3. **Установить и запустить**, а не только собрать.
4. **Обновление поверх старой установки** проверено на самом деле.
5. **Побочные изменения** объяснить.
6. **Пропущенный пункт назвать пропущенным.**
---
## Ограничения
- Ничего, кроме десктопа, не удалять. Общая логика, маршрутизатор, адаптеры, обновлятор остаются.
- Веб-слой не переписывать: он зона A29 и A30.
- Правило честности без исключений.
- Тег `v0.1.1` не создавать.
## Критерии приёмки
1. Ветка в `origin`, `git status` чист.
2. Таблица паритета приложена; непокрытых умений нет либо они названы, и удаление по ним не проводилось.
3. `router/ui/**` и `hermes_hub_app.py` удалены; `from ...router.ui` в коде не встречается.
4. `customtkinter` отсутствует в зависимостях, в установке и в проверке; установка проходит без него.
5. Ярлык один, ведёт на веб; ярлык на десктоп удаляется при обновлении поверх старой установки.
6. Обновление поверх версии с десктопом проверено: аккаунты, настройки и цепочки ролей уцелели.
7. Линуксовый установщик работает.
8. `ruff check .` чисто; релизный гейт не ухудшен.
9. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`. На `main` сейчас **451 passed, 2 skipped**.
## Главное
Владелец работает только в вебе. Десктоп тянет за собой GUI-зависимость, второй ярлык и восемь тысяч строк, которые никто не открывает, — и время от времени запускается вместо веба.
## Порядок сдачи
Передать точный `FINAL_COMMIT_SHA`.