hermes-hub/src/antigravity_provider
ochenstarik-ui 7136ab2878 fix(security): граница workspace держится одинаково на Windows и Linux
Оба красных Windows-джоба CI падали по причинам, воспроизведённым локально.

1. Инвариант A37 не держался на Windows. "rm -rf $HOME/.hermes" проходил
   мимо защиты: переменной HOME в окружении Windows нет, expandvars оставлял
   "$HOME" как есть, путь переставал быть абсолютным, склеивался с каталогом
   проекта и оказывался "внутри разрешённого корня". Зеркальная дыра на
   Linux: "%USERPROFILE%\.hermes" и "C:\Windows" проходили так же.

   Разбор пути сведён в один конвейер: классификация диалекта shell по самой
   команде (а не по системе-хозяину) -> раскрытие распознанных переменных, с
   разрешением HOME/USERPROFILE в домашний каталог даже когда их нет в
   окружении -> нормализация разделителей -> канонизация -> сравнение с
   защищёнными корнями. Каждый несостоявшийся шаг закрывает проход:
   непроверяемый путь не считается разрешённым. Через тот же конвейер
   пропущены validate_path, is_forbidden_path и is_inside_allowed_root.

2. UnicodeEncodeError ронял verify_multi_provider_router.py на cp1252-консоли
   Windows-раннера — падал вывод, не логика. Общий помощник
   console_encoding.force_utf8_output ставит UTF-8 на потоки и оставляет
   запасной путь, если перекодировать поток нельзя. Той же реализацией
   заменён самодельный блок в cli_commands.

Проверено: скрипт проходит 10/10 под PYTHONIOENCODING=cp1252 и ascii.
Новые тесты воспроизводят окружение обеих систем на любой из них и падают
на прежнем guard ровно на дефекте из CI (6 failed), проходят на новом.

Тесты: 739 -> 755 passed, 2 skipped, 4 deselected. ruff check . чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 19:01:30 +07:00
..
router fix(security): граница workspace держится одинаково на Windows и Linux 2026-09-03 19:01:30 +07:00
updater review(a59): обновление, которое видно, принято с исправлениями 2026-09-02 19:22:59 +07:00
__init__.py feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
agy_subprocess.py feat(agy): A58 read-only eligibility state detection and owner patcher controls 2026-09-02 01:26:46 +07:00
antigravity_client.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
cloudcode.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
console_encoding.py fix(security): граница workspace держится одинаково на Windows и Linux 2026-09-03 19:01:30 +07:00
credentials.py fix(windows): чёрные окна консоли выскакивали каждую минуту 2026-08-31 19:39:12 +07:00
errors.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
hermes_plugin.py feat(a51): hub controls hermes - full real routing, bypass telemetry and truthful status 2026-08-31 18:53:55 +07:00
hermes_provider.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
models.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
oauth.py fix(oauth): preserve complete credentials and sync oauth_creds.json for Antigravity profiles (A20) 2026-08-23 23:09:58 +07:00
openai_compat.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
paths.py fix(profiles): пустые слоты появлялись сами, потому что запрос пути создавал каталог 2026-09-01 15:27:33 +07:00
runtime.py fix(router): correct spare assignment and error presentation 2026-08-20 17:21:30 +07:00
sanitizer.py feat(release): recovery stabilization, built-in updater, release gate, and v0.1.1 release pipeline 2026-08-20 16:29:35 +07:00
transform.py feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00
version.py fix(antigravity): вход завершался успешно, а agy требовал войти снова 2026-09-01 10:37:27 +07:00