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

10 KiB
Raw Permalink Blame History

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