Хаб сейчас записывает чужой файл учётных данных своим кодом: формат восстановлен по рабочему профилю владельца и по строкам в бинарнике. Работает, но до следующего обновления agy — и отказ будет молчаливым. Проверено запуском: подкоманд login или auth у agy нет, вход только запуском CLI без аргументов. Значит вход переносится в терминал с HOME на каталог профиля, а браузерный путь остаётся запасным для удалённого случая. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
14 KiB
Задание A57: вход в Antigravity через сам agy, а не через сочинённый файл
Дата поступления
2026-09-01
База
origin/main (f188a18).
git fetch origin --prune
git checkout -b antigravity/a57-agy-native-login origin/main
В main напрямую не пушить.
Порядок исполнения
Два прохода: Flash реализует, Pro проводит аудит. Пункт P0-8 написан для аудитора.
Зона: подключение аккаунтов Antigravity. С A56 (сжатие контекста) не пересекается.
Задача
Сейчас хаб проводит вход сам: получает токены по OAuth и записывает чужой файл учётных данных своим кодом. Формат этого файла ревьюер восстановил по рабочему профилю владельца и по строкам в бинарнике agy. Сегодня это работает. Но agy обновляется, и формат может измениться молча: файл останется на месте, вход перестанет засчитываться, а владелец увидит ровно ту необъяснимую картину, которую ловили полдня — «Авторизация успешно завершена» и тут же «Please sign in to view available models».
Правильный ответ — дать войти самому agy, с HOME, указывающим на каталог профиля. Тогда он пишет свои файлы своим форматом, сам обновляет токен по истечении часа, и гадать не о чем.
Что проверено ревьюером — заново не выяснять
Неинтерактивного входа у agy нет
agy --help (проверено запуском) даёт подкоманды: agent, agents, changelog, help, install, mcp, mic-serve, models, plugin, plugins, update. Подкоманд login или auth нет. Вход один: запустить CLI без аргументов и пройти его в терминале. Это же говорит текст ошибки самого agy:
Error: Please sign in to view available models.
Launch the CLI without arguments to sign in.
Искать скрытый флаг входа не надо — его нет.
Что agy держит в каталоге профиля
Рабочий профиль владельца ag-orch-fallback (11 моделей):
.gemini/oauth_creds.json 1949 байт формат Gemini CLI
.gemini/antigravity-cli/antigravity-oauth-token 505 байт {"auth_method":"consumer","token":{...}}
.gemini/antigravity-cli/settings.json 107 байт enableTelemetry, trustedWorkspaces
.gemini/antigravity-cli/installation_id 36 байт
.gemini/antigravity-cli/jetski_state.pbtxt
.gemini/antigravity-cli/history.jsonl
.gemini/antigravity-cli/conversation_summaries.db
auth.json файл хаба, не agy
Вход agy читает из antigravity-oauth-token, а не из oauth_creds.json. Это установлено сравнением рабочего профиля с неработающим и подтверждено исполнением: файл создали руками для ag-4 — agy models тут же выдал 11 моделей.
Изоляция по HOME уже работает
get_profile_env_dir, build_safe_subprocess_env и hidden_process_kwargs существуют и применяются: agy models вызывается с HOME/USERPROFILE, указывающими на каталог профиля. Заново это писать не надо.
Заготовка уже есть
launch_native_agy_login в agy_subprocess.py запускает agy с CREATE_NEW_CONSOLE. Её никто не вызывает — числится мёртвым кодом с A54. Это отправная точка, а не мусор.
Рост номеров профилей починен
Слот выбирался до входа, когда почта ещё неизвестна, и повторный вход тем же аккаунтом занимал очередной свободный номер: один аккаунт владельца расползся на ag-2, ag-3, ag-4. В 9641957 после опознания почты учётные данные возвращаются в слот, который этот аккаунт уже занимает. Не переделывать.
Среда владельца
Сервер: Ubuntu 24.04, рабочий стол на месте (Chrome запускается), владелец сидит за машиной. Вторая машина — Windows 11. Хаб работает на обеих.
P0-1. Вход выполняет сам agy
- Запуск
agyв настоящем терминале сHOMEиUSERPROFILE, указывающими на каталог выбранного профиля. Владелец проходит вход глазами и руками — это единственный доступный способ. - Терминал не подразумевать, а искать. На Linux проверить наличие эмулятора (
x-terminal-emulator,gnome-terminal,konsole,xfce4-terminal,xterm) и назвать в отказе, что именно искали. Отсутствие терминала — честный отказ с перечнем проверенного, а не молчание. - Файл учётных данных хаб больше не сочиняет.
write_agy_oauth_credsи записьantigravity-oauth-tokenостаются только для запасного браузерного пути (P0-4). - Ждать окончания входа по появлению файла, а не по коду возврата терминала: эмулятор часто отсоединяется сразу. Ждать
antigravity-oauth-tokenв каталоге профиля с разумным пределом и внятным сообщением по его истечении.
P0-2. Слот выбирается до входа и не меняется
- Каталог профиля определяется заранее и передаётся через
HOME. Вход физически не может уйти в чужой каталог — в этом весь смысл. - Занятый слот не перезаписывать. Если в каталоге уже лежит рабочий вход другого аккаунта, предупредить и потребовать подтверждения.
- Каталоги существующих аккаунтов не трогать. Их два десятка, повторный вход руками стоит владельцу часов.
P0-3. Почта берётся из профиля, а не выдумывается
- После входа опознать аккаунт, прочитав то, что записал agy. Если почту установить не удалось — показать
Н/Дс причиной, а не подставить правдоподобное. - Проверить двойников уже существующим
AutoAssigner.check_duplicate_identityи вернуть учётные данные в занятый этим аккаунтом слот, если он есть. - Число и время получения моделей показывать рядом со списком.
P0-4. Браузерный путь остаётся запасным
- Не удалять существующий OAuth. С другой машины через браузер это единственный способ, и он работает.
- Владелец выбирает способ в мастере: вход в терминале на этой машине или по ссылке из браузера. Предлагать первым тот, который на текущей машине выполним.
- Текст объясняет разницу: терминал доступен только там, где стоит хаб.
P0-5. Отказ доходит до владельца
- Причина отказа — текстом.
agyпишет её в stderr; она обязана попадать в интерфейс вместе с указаниемHOME, с которым шёл запуск. - Пустых сообщений быть не должно. Запасной текст «Отказ выполнения действия» означает потерянную причину.
- Проверка после входа не блокирует ответ. Действие возвращается сразу, опрос провайдера идёт в фоне — это сделано в
0ad946e, не откатывать.
P0-6. Безопасность
- Токены и коды в интерфейс не выводить и в журнал не писать. В сообщениях допустимы пути и имена файлов, но не содержимое.
- Права на каталог и файлы —
0700и0600. ~/.hermes/agy_profiles/не чистить и не трогать чужие профили.
P0-7. Проверка исполнением
Тестами это не ловится: все прежние дефекты входа прошли через зелёный прогон.
- Подключить аккаунт через терминал на сервере и приложить вывод
agy modelsдля этого профиля. - Подключить второй аккаунт и убедиться, что первый не задет: у обоих свои каталоги и свои почты.
- Повторить вход тем же аккаунтом и убедиться, что новый слот не создаётся.
- Проверить отказ при отсутствии терминала: сообщение перечисляет, что искали.
- Проверить, что браузерный путь по-прежнему работает с другой машины.
P0-8. Аудит вторым проходом
- Пройти вход целиком на обеих машинах, скриншоты приложить.
- Убедиться, что хаб не пишет
antigravity-oauth-tokenна пути через CLI: файл создаёт agy. - Проверить, что при отказе входа профиль не остаётся наполовину заполненным и не числится подключённым.
- Различать «нет доступа» и «не найдено» — не повторять ошибку ложного диагноза.
- Побочные изменения объяснить.
- Пропущенный пункт назвать пропущенным.
Ограничения
- Учётные данные и каталоги существующих аккаунтов не трогать.
- Правки ревьюера из
mainне откатывать:9641957(запись токена и слоты),0ad946e(проверка в фоне),f188a18(устаревший вердикт). - Фронтенд без npm, без сборки, без фреймворков — по
docs/web-api/CONTRACT.md§1. - Адреса, пути и имена терминалов в код не зашивать вслепую: искать и сообщать, что искали.
- Версию
0.1.3не понижать. - Правило честности без исключений: неизмеренное —
Н/Дс причиной; отсутствие прав — не то же самое, что отсутствие файла.
Критерии приёмки
- Ветка в
origin,git statusчист. - Вход через
agyв терминале работает на Linux и на Windows; выводagy modelsприложен. - Файл
antigravity-oauth-tokenна этом пути создаёт agy, а не хаб. - Слот задаётся до входа через
HOME; чужой каталог затронуть невозможно. - Повторный вход тем же аккаунтом не создаёт новый слот.
- Почта берётся из профиля; неустановленная показывается как
Н/Дс причиной. - Браузерный путь сохранён и проверен с другой машины.
- Отсутствие терминала даёт отказ с перечнем проверенного.
- Токены не попадают ни в интерфейс, ни в журнал.
ruff check .чисто; релизный гейт 10/10; тестов не меньше 626.- Отчёт:
START_HEAD,FINAL_HEAD,origin/main,git status,X passed / Y skipped / Z failed.
Главное
Хаб сегодня подделывает чужой формат учётных данных. Это работает ровно до следующего обновления agy, и отказ будет молчаливым: файл на месте, вход не засчитан, причина неочевидна. Владелец уже потерял на этом день.
agy умеет входить сам и делает это правильно по определению. Задание переносит вход туда, где ему место, оставляя браузерный путь для удалённого случая.
Порядок сдачи
Передать точный FINAL_COMMIT_SHA.