From 26f7d2ce7339492edc03db172b6ccf9e4ff34ffa Mon Sep 17 00:00:00 2001 From: Hermes Team Date: Mon, 31 Aug 2026 23:22:08 +0700 Subject: [PATCH] =?UTF-8?q?fix(hermes):=20=C2=AB=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD=D0=B0=C2=BB=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B5=D0=BC=20Hermes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверялся ровно один путь — $HERMES_HOME/config.yaml. Hermes хранит конфигурацию по-разному в зависимости от версии и способа установки, и у владельца на Linux хаб писал «В Hermes: конфигурация не найдена» при работающем Hermes v0.20.6. Теперь проверяются семь известных мест, и в сообщении перечисляется, где именно искали, — владелец видит список и может назвать верный путь. Отдельно различаются «файла нет» и «нет доступа к каталогу»: закрытый правами каталог помечается как непроверенный, а не как отсутствующий. Это тот же класс ошибки, на котором я сам дважды ошибся в диагнозе, приняв отказ в доступе за отсутствие файла. 599 passed, ruff clean, релизный гейт 10/10. Co-Authored-By: Claude Opus 5 --- .../router/settings_service.py | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/antigravity_provider/router/settings_service.py b/src/antigravity_provider/router/settings_service.py index 9ad6ebb..c0ca054 100644 --- a/src/antigravity_provider/router/settings_service.py +++ b/src/antigravity_provider/router/settings_service.py @@ -277,8 +277,46 @@ def setup_memory_structure( def get_hermes_config_status(config_path: Optional[Path] = None) -> Dict[str, Any]: """Read Hermes configuration (~/.hermes/config.yaml) in read-only mode to provide status feedback.""" import yaml + checked: list = [] if config_path is None: - config_path = get_hermes_home() / "config.yaml" + # Hermes хранит конфигурацию не в одном месте: путь зависит от версии и + # способа установки. Раньше проверялся ровно один файл, и у владельца на + # Linux хаб писал «конфигурация не найдена» при работающем Hermes. + home = get_hermes_home() + candidates = [ + home / "config.yaml", + home / "config.yml", + home / "config.json", + home / "hermes-agent" / "config.yaml", + Path.home() / ".hermes" / "config.yaml", + Path.home() / ".config" / "hermes" / "config.yaml", + Path.home() / ".config" / "hermes-agent" / "config.yaml", + ] + seen = set() + for candidate in candidates: + key = str(candidate) + if key in seen: + continue + seen.add(key) + checked.append(key) + try: + if candidate.exists(): + config_path = candidate + break + except OSError as exc: + # Каталог может быть закрыт правами: это «не смогли проверить», + # а не «файла нет». Разница важна, иначе диагноз ложный. + checked[-1] = f"{key} (нет доступа: {exc.strerror or exc})" + else: + return { + "exists": False, + "model": None, + "provider": None, + "base_url": None, + "path": None, + "checked_paths": checked, + "message": "Конфигурация Hermes не найдена. Проверено: " + "; ".join(checked), + } if not config_path.exists(): return { @@ -287,7 +325,8 @@ def get_hermes_config_status(config_path: Optional[Path] = None) -> Dict[str, An "provider": None, "base_url": None, "path": str(config_path), - "message": "Конфигурационный файл ~/.hermes/config.yaml не найден", + "checked_paths": checked or [str(config_path)], + "message": f"Конфигурация Hermes не найдена по пути {config_path}", } try: