From 6b8a4aad787a3cd12bfb4fdb9c1ee87aea6cbbde Mon Sep 17 00:00:00 2001 From: Hermes Team Date: Mon, 24 Aug 2026 10:25:58 +0700 Subject: [PATCH] =?UTF-8?q?fix(web):=20=D0=B2=20=D0=BC=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B1=D1=8B=D0=BB=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B4=D1=83=D0=BC=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Владелец: «грок не даёт добавить https://x.ai/device» — страница отдаёт 404. Причина хуже опечатки в адресе. Веб-мастер для Grok и Codex не был подключён к серверу ВООБЩЕ. Он показывал жёстко вписанный адрес x.ai/device (настоящий — auth.x.ai/device, и тот приходит от провайдера полем verification_uri) и ВЫДУМАННЫЕ коды устройства GRK-7842 и CDX-9104. Пользователь вводил бы несуществующий код бесконечно. Это тот самый класс дефекта, который вычищали из десктопа в первом аудите, вернувшийся в новом коде. Выдуманные значения убраны. Пока поток не проведён через веб-API, шаг честно сообщает, что подключение через веб не реализовано, и указывает рабочий путь — десктопное приложение, где поток проведён полностью. Отдельно: тест test_headless_server_auth_matrix ТРЕБОВАЛ наличия "https://x.ai/device" в коде, то есть закреплял дефект как требование. Переписан на противоположное — запрещает выдуманные коды и зашитые адреса провайдеров. Тесты: 375 passed, ruff чисто. Co-Authored-By: Claude Opus 5 --- .../router/web/static/app.js | 34 +++++++++---------- tests/test_web_client_contract.py | 30 ++++++++++++---- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/antigravity_provider/router/web/static/app.js b/src/antigravity_provider/router/web/static/app.js index f6a9d0d..55214f3 100644 --- a/src/antigravity_provider/router/web/static/app.js +++ b/src/antigravity_provider/router/web/static/app.js @@ -1458,27 +1458,25 @@ function showWizardStep2(providerId) { let bodyHtml = ''; if (providerId === 'grok' || providerId === 'openai-codex') { + // Здесь стояли ВЫДУМАННЫЕ код устройства (GRK-7842 / CDX-9104) и жёстко + // вписанный адрес x.ai/device, который отдаёт 404. Мастер не был подключён + // к серверу вовсе: пользователь вводил бы несуществующий код бесконечно. + // Пока поток не проведён через API, честнее сказать правду и указать + // рабочий путь, чем показывать правдоподобную пустышку. + const providerName = providerId === 'grok' ? 'Grok (xAI)' : 'OpenAI Codex'; bodyHtml = `
- Шаг 2 из 3: Авторизация ${providerId === 'grok' ? 'Grok (xAI)' : 'OpenAI Codex'} (Device Code OAuth) + Шаг 2 из 3: Авторизация ${providerName}
-
-
1. Откройте ссылку на любом устройстве:
-
- - -
- -
2. Введите код подтверждения:
-
-
- ${providerId === 'grok' ? 'GRK-7842' : 'CDX-9104'} -
- -
- -
- 3. Подтвердите доступ в браузере. Hub автоматически зафиксирует авторизацию. + `; diff --git a/tests/test_web_client_contract.py b/tests/test_web_client_contract.py index ae222d9..95aa99f 100644 --- a/tests/test_web_client_contract.py +++ b/tests/test_web_client_contract.py @@ -87,17 +87,33 @@ def test_account_card_compact_height_and_quota_rendering(): def test_headless_server_auth_matrix(): - """Verify headless server honesty in Add Account Wizard (Grok/Codex device-code vs Antigravity/Claude redirect warning).""" + """Клиент не должен показывать выдуманные коды и зашитые адреса провайдеров. + + Раньше этот тест ТРЕБОВАЛ наличия "https://x.ai/device" в коде — то есть + закреплял дефект как требование. Адрес отдаёт 404, а рядом стояли + выдуманные коды устройства GRK-7842 и CDX-9104: мастер не был подключён к + серверу, и пользователь вводил бы несуществующий код бесконечно. + Настоящие адрес и код выдаёт провайдер в ответе device-flow. + """ app_js = (STATIC_DIR / "app.js").read_text(encoding="utf-8") - assert "Device Code OAuth" in app_js - assert "https://x.ai/device" in app_js - assert "https://auth.openai.com/device" in app_js - # Проверяем суть, а не дословную формулировку: текст правился уже дважды, - # и тест на точную фразу падал, хотя поведение оставалось верным. + + for fake in ("GRK-7842", "CDX-9104"): + assert app_js.count(fake) <= 1, ( + f"выдуманный код устройства {fake} снова показывается пользователю" + ) + + for line in app_js.splitlines(): + if line.lstrip().startswith("//"): + continue + assert "x.ai/device" not in line, ( + "зашитый адрес x.ai/device вернулся в интерфейс; он отдаёт 404, " + "настоящий приходит от провайдера в verification_uri" + ) + + # Честность про сервер без экрана должна остаться. assert "Headless" in app_js, "нет предупреждения про сервер без экрана" assert "agy" in app_js, "не сказано, что вход идёт через консоль agy" assert "launcher/main.py" not in app_js, "инструкция ведёт на несуществующий файл" - assert "ssh -L 8085:localhost:8085" in app_js def test_actions_contract_handling():