hermes-hub/src/antigravity_provider/router
Hermes Team 7e83c38340 perf(antigravity): из десяти аккаунтов одновременно работал один
В adapters/antigravity_adapter.py жил модульный _AGY_INVOCATION_LOCK, общий
для ВСЕХ профилей Antigravity. Он брался при каждом вызове, у которого есть
учётные данные, то есть при каждом рабочем. Ветка без мьютекса срабатывала
только у профиля без учётки — у вызова, который и так упадёт.

Измерено на живом адаптере: три параллельных вызова по одной секунде
занимали 3.01 с. При десяти подключённых аккаунтах одновременно работал ровно
один, чем обесценивалась вся мультиаккаунтность — то, ради чего хаб и делался.

Мьютекс охранял пустоту. Он был введён в 50fde5f со словами «guarded global
gemini:antigravity credential swap ... to eliminate concurrent subprocess
race», когда подмена учётных данных была ГЛОБАЛЬНОЙ. С тех пор она стала
попрофильной: agy_subprocess пишет в profile_dir/.gemini/oauth_creds.json, а
HOME, USERPROFILE, HOMEPATH и HOMEDRIVE подменяются на каталог профиля.
Общего состояния между профилями не осталось — проверено поиском глобальных
путей и обращений к keyring, их нет.

После снятия: те же три вызова занимают 1.00 с, и каждый идёт со своим HOME
(ag-w1, ag-w2, ag-w3) — изоляция не пострадала.

Ограничение одновременности остаётся за LeaseManager: он считает лизы по
профилю и настраивается через max_concurrency, в том числе значением 1 для
локальных моделей с --parallel 1.

Добавлен тест, удерживающий это свойство: он падает, если вызовы разных
профилей снова начнут сериализоваться. Существующий тест изоляции учётных
данных проходит без изменений.

Найдено при разборе анализа, который Antigravity провёл на сервере владельца
(hermes-muliacount). 459 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 20:04:52 +07:00
..
adapters perf(antigravity): из десяти аккаунтов одновременно работал один 2026-08-30 20:04:52 +07:00
scheduler feat(hub): product stabilization, native windows ux v3, provider icons, and architecture roadmap 2026-08-20 11:01:52 +07:00
supervisor feat(state): harden snapshots quotas and routing 2026-08-21 00:03:50 +07:00
ui feat(router): integrate local LLM provider (llama.cpp/vLLM/Ollama) with zero quotas (A25) 2026-08-24 14:00:25 +07:00
web fix(security): любой сайт во вкладке рядом мог управлять хабом 2026-08-25 19:57:05 +07:00
__init__.py feat(dashboard): expose telemetry breakdown, provider call_share, host metrics, and active leases 2026-08-21 17:44:56 +07:00
account_identity.py feat(router): integrate local LLM provider (llama.cpp/vLLM/Ollama) with zero quotas (A25) 2026-08-24 14:00:25 +07:00
action_handler.py fix(updater): проверка обновлений не доходила до интерфейса; непроверенный файл запускался 2026-08-25 18:31:52 +07:00
auto_assigner.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +07:00
claude_oauth.py merge: complete antigravity state layer 2026-08-21 00:10:56 +07:00
cli_commands.py feat(router): A9 — миграция конфигурации, квоты провайдеров, реальные модели, перехват Hermes и токены Codex 2026-08-23 12:45:08 +07:00
codex_oauth.py feat(A11): интеграция с Hermes, токены Codex, честное обнаружение моделей 2026-08-23 15:27:28 +07:00
event_bus.py feat(state): close contract gaps v1.1, canonical event publishers, and view model enrichment 2026-08-21 08:20:56 +07:00
exceptions.py fix: close P0 release blockers 2026-08-20 16:25:11 +07:00
grok_oauth.py fix(grok): опрос device-flow не различал отказ, просрочку и ожидание 2026-08-24 15:11:54 +07:00
health_tracker.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +07:00
hermes_hub_app.py Merge A17 (честный статус) и A18 (выбор модели) 2026-08-23 22:24:22 +07:00
host_metrics.py fix(dashboard): unify LeaseManager, warm up initial CPU measurement, add live network speed, and clarify YAML comment support 2026-08-21 22:18:59 +07:00
launcher_bootstrap.py feat(A15): веб-API, общий ActionExecutor и порт путей на Linux 2026-08-23 19:45:13 +07:00
model_discovery.py Merge antigravity/quotas-models-migration (A9) 2026-08-23 12:57:49 +07:00
model_discovery_service.py feat(grok): подписка вместо кредитов — квота и модели заработали 2026-08-24 20:29:08 +07:00
model_registry.py feat(router): profile auth self-healing, honest model validation, and manual model refresh (A23) 2026-08-24 02:02:28 +07:00
profile_manager.py feat(router): integrate local LLM provider (llama.cpp/vLLM/Ollama) with zero quotas (A25) 2026-08-24 14:00:25 +07:00
profile_oauth.py fix(web): кнопка копирования молча не работала по сети, а возврат вёл в тупик 2026-08-25 11:06:08 +07:00
quota_collector.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +07:00
router_config.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +07:00
router_engine.py feat(router): A9 — миграция конфигурации, квоты провайдеров, реальные модели, перехват Hermes и токены Codex 2026-08-23 12:45:08 +07:00
scheduler.py feat(state): close contract gaps v1.1, canonical event publishers, and view model enrichment 2026-08-21 08:20:56 +07:00
session_affinity.py feat(dashboard): expose telemetry breakdown, provider call_share, host metrics, and active leases 2026-08-21 17:44:56 +07:00
settings_service.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +07:00
state_store.py fix(dashboard): unify LeaseManager, warm up initial CPU measurement, add live network speed, and clarify YAML comment support 2026-08-21 22:18:59 +07:00
telemetry_service.py feat(dashboard): expose telemetry breakdown, provider call_share, host metrics, and active leases 2026-08-21 17:44:56 +07:00
unified_health.py feat(router): accounts without slots, overview role assignment and quota thresholds (A26) 2026-08-25 16:36:59 +07:00