From e8aa60b982ff564ee84fe08751db200054222e5f Mon Sep 17 00:00:00 2001 From: Hermes Team Date: Tue, 25 Aug 2026 10:14:04 +0700 Subject: [PATCH] =?UTF-8?q?fix(web):=20=D0=BF=D1=80=D0=B8=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D0=BE=D0=BC=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B5=20=D0=BF=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=D0=B2=D0=B0=D0=BB=D1=81=D1=8F=20=D1=87=D1=83=D0=B6?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=BA=20=D0=B6=D0=B8=D0=B2=D1=8B=D0=B5=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Если /api/snapshot не отвечал, клиент молча загружал snapshot.example.json — 63 профиля с почтами user@example.test — и ставил индикатор источника в зелёное через setSourceIndicator(true, ...). На экране появлялась полная здоровая панель, не имеющая отношения к этому серверу. Дефект становится опасным ровно в том сценарии, ради которого делался вход с другой машины: при работе через SSH-туннель достаточно промахнуться портом или потерять туннель, чтобы принять пример за собственные данные и, например, решать по нему, у какого аккаунта кончилась квота. Осознанная работа с фикстурой сохранена: ?fixture=1 и открытие страницы файлом. Подстановка вместо ответа сервера убрана — отсутствие данных теперь читается как отсутствие данных. Co-Authored-By: Claude Opus 5 --- .../router/web/static/app.js | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/antigravity_provider/router/web/static/app.js b/src/antigravity_provider/router/web/static/app.js index e496292..ea5b56d 100644 --- a/src/antigravity_provider/router/web/static/app.js +++ b/src/antigravity_provider/router/web/static/app.js @@ -198,18 +198,17 @@ async function fetchSnapshot() { setSourceIndicator(true, 'Live API (/api/snapshot)'); applySnapshot(data); } catch (err) { - console.warn('Live API unavailable, attempting snapshot.example.json fallback:', err); - try { - const fallbackRes = await fetch('snapshot.example.json'); - if (fallbackRes.ok) { - const fallbackData = await fallbackRes.json(); - setSourceIndicator(true, 'Фикстура (fallback)'); - applySnapshot(fallbackData); - return; - } - } catch (e) {} - + // Раньше здесь при недоступном API молча подставлялась + // snapshot.example.json — 63 чужих профиля с почтами user@example.test — + // и индикатор ставился в зелёное. Экран выглядел здоровой панелью, + // которая не имеет отношения к этому серверу: при работе через SSH-туннель + // достаточно промахнуться портом или потерять туннель, чтобы принять + // пример за свои данные. Осознанная работа с фикстурой осталась — + // ?fixture=1 и открытие файлом, — но подставлять её вместо ответа сервера + // нельзя: отсутствие данных должно читаться как отсутствие данных. + console.warn('Live API unavailable:', err); setSourceIndicator(false, 'Сервер недоступен'); + showToast('Сервер не отвечает. Данные на экране могут быть устаревшими.', 'error'); } }