diff --git a/agent/context_references.py b/agent/context_references.py index 8222dc33a3..1b8ac9481a 100644 --- a/agent/context_references.py +++ b/agent/context_references.py @@ -343,10 +343,9 @@ def _resolve_path(cwd: Path, target: str, *, allowed_root: Path | None = None) - def _ensure_reference_path_allowed(path: Path) -> None: + from hermes_constants import get_hermes_home home = Path(os.path.expanduser("~")).resolve() - hermes_home = Path( - os.getenv("HERMES_HOME", str(home / ".hermes")) - ).expanduser().resolve() + hermes_home = get_hermes_home().resolve() blocked_exact = {home / rel for rel in _SENSITIVE_HOME_FILES} blocked_exact.add(hermes_home / ".env") diff --git a/agent/model_metadata.py b/agent/model_metadata.py index 62dfb2b822..50245a7c9c 100644 --- a/agent/model_metadata.py +++ b/agent/model_metadata.py @@ -510,8 +510,8 @@ def fetch_endpoint_model_metadata( def _get_context_cache_path() -> Path: """Return path to the persistent context length cache file.""" - hermes_home = Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes")) - return hermes_home / "context_length_cache.yaml" + from hermes_constants import get_hermes_home + return get_hermes_home() / "context_length_cache.yaml" def _load_context_cache() -> Dict[str, int]: diff --git a/agent/models_dev.py b/agent/models_dev.py index a23ce74b20..d3de506194 100644 --- a/agent/models_dev.py +++ b/agent/models_dev.py @@ -185,9 +185,8 @@ def _get_reverse_mapping() -> Dict[str, str]: def _get_cache_path() -> Path: """Return path to disk cache file.""" - env_val = os.environ.get("HERMES_HOME", "") - hermes_home = Path(env_val) if env_val else Path.home() / ".hermes" - return hermes_home / "models_dev_cache.json" + from hermes_constants import get_hermes_home + return get_hermes_home() / "models_dev_cache.json" def _load_disk_cache() -> Dict[str, Any]: diff --git a/gateway/builtin_hooks/boot_md.py b/gateway/builtin_hooks/boot_md.py index fced0b5e12..c4b6c2d46a 100644 --- a/gateway/builtin_hooks/boot_md.py +++ b/gateway/builtin_hooks/boot_md.py @@ -24,7 +24,8 @@ from pathlib import Path logger = logging.getLogger("hooks.boot-md") -HERMES_HOME = Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes")) +from hermes_constants import get_hermes_home +HERMES_HOME = get_hermes_home() BOOT_FILE = HERMES_HOME / "BOOT.md" diff --git a/gateway/platforms/webhook.py b/gateway/platforms/webhook.py index ae2e7f27af..daaf4f5dc3 100644 --- a/gateway/platforms/webhook.py +++ b/gateway/platforms/webhook.py @@ -203,10 +203,8 @@ class WebhookAdapter(BasePlatformAdapter): def _reload_dynamic_routes(self) -> None: """Reload agent-created subscriptions from disk if the file changed.""" - from pathlib import Path as _Path - hermes_home = _Path( - os.getenv("HERMES_HOME", str(_Path.home() / ".hermes")) - ).expanduser() + from hermes_constants import get_hermes_home + hermes_home = get_hermes_home() subs_path = hermes_home / _DYNAMIC_ROUTES_FILENAME if not subs_path.exists(): if self._dynamic_routes: diff --git a/hermes_cli/commands.py b/hermes_cli/commands.py index 9bce834d04..ecf4d0d6b6 100644 --- a/hermes_cli/commands.py +++ b/hermes_cli/commands.py @@ -294,10 +294,8 @@ def _resolve_config_gates() -> set[str]: return set() try: import yaml - config_path = os.path.join( - os.getenv("HERMES_HOME", os.path.expanduser("~/.hermes")), - "config.yaml", - ) + from hermes_constants import get_hermes_home + config_path = str(get_hermes_home() / "config.yaml") if os.path.exists(config_path): with open(config_path, encoding="utf-8") as f: cfg = yaml.safe_load(f) or {} diff --git a/hermes_cli/memory_setup.py b/hermes_cli/memory_setup.py index c174d2b4b9..2843f4f444 100644 --- a/hermes_cli/memory_setup.py +++ b/hermes_cli/memory_setup.py @@ -12,6 +12,8 @@ import os import sys from pathlib import Path +from hermes_constants import get_hermes_home + # --------------------------------------------------------------------------- # Curses-based interactive picker (same pattern as hermes tools) @@ -275,7 +277,7 @@ def cmd_setup_provider(provider_name: str) -> None: config["memory"] = {} if hasattr(provider, "post_setup"): - hermes_home = str(Path(os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes")))) + hermes_home = str(get_hermes_home()) provider.post_setup(hermes_home, config) return @@ -326,7 +328,7 @@ def cmd_setup(args) -> None: # If the provider has a post_setup hook, delegate entirely to it. # The hook handles its own config, connection test, and activation. if hasattr(provider, "post_setup"): - hermes_home = str(Path(os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes")))) + hermes_home = str(get_hermes_home()) provider.post_setup(hermes_home, config) return @@ -336,7 +338,7 @@ def cmd_setup(args) -> None: if not isinstance(provider_config, dict): provider_config = {} - env_path = Path(os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes"))) / ".env" + env_path = get_hermes_home() / ".env" env_writes = {} if schema: @@ -400,7 +402,7 @@ def cmd_setup(args) -> None: save_config(config) # Write non-secret config to provider's native location - hermes_home = str(Path(os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes")))) + hermes_home = str(get_hermes_home()) if provider_config and hasattr(provider, "save_config"): try: provider.save_config(provider_config, hermes_home) diff --git a/hermes_cli/plugins.py b/hermes_cli/plugins.py index ce57695fa0..23a655aa30 100644 --- a/hermes_cli/plugins.py +++ b/hermes_cli/plugins.py @@ -38,6 +38,7 @@ from dataclasses import dataclass, field from pathlib import Path from typing import Any, Callable, Dict, List, Optional, Set, Union +from hermes_constants import get_hermes_home from utils import env_var_enabled try: @@ -258,8 +259,7 @@ class PluginManager: manifests: List[PluginManifest] = [] # 1. User plugins (~/.hermes/plugins/) - hermes_home = os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes")) - user_dir = Path(hermes_home) / "plugins" + user_dir = get_hermes_home() / "plugins" manifests.extend(self._scan_directory(user_dir, source="user")) # 2. Project plugins (./.hermes/plugins/) diff --git a/hermes_cli/plugins_cmd.py b/hermes_cli/plugins_cmd.py index 5bfc488e3e..4727d4b713 100644 --- a/hermes_cli/plugins_cmd.py +++ b/hermes_cli/plugins_cmd.py @@ -16,6 +16,8 @@ import subprocess import sys from pathlib import Path +from hermes_constants import get_hermes_home + logger = logging.getLogger(__name__) # Minimum manifest version this installer understands. @@ -26,8 +28,7 @@ _SUPPORTED_MANIFEST_VERSION = 1 def _plugins_dir() -> Path: """Return the user plugins directory, creating it if needed.""" - hermes_home = os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes")) - plugins = Path(hermes_home) / "plugins" + plugins = get_hermes_home() / "plugins" plugins.mkdir(parents=True, exist_ok=True) return plugins diff --git a/hermes_cli/webhook.py b/hermes_cli/webhook.py index 15f5ec43ad..8ff135e29e 100644 --- a/hermes_cli/webhook.py +++ b/hermes_cli/webhook.py @@ -25,9 +25,8 @@ _SUBSCRIPTIONS_FILENAME = "webhook_subscriptions.json" def _hermes_home() -> Path: - return Path( - os.getenv("HERMES_HOME", str(Path.home() / ".hermes")) - ).expanduser() + from hermes_constants import get_hermes_home + return get_hermes_home() def _subscriptions_path() -> Path: diff --git a/plugins/memory/hindsight/__init__.py b/plugins/memory/hindsight/__init__.py index 140aa1ea03..e10a14a840 100644 --- a/plugins/memory/hindsight/__init__.py +++ b/plugins/memory/hindsight/__init__.py @@ -290,8 +290,7 @@ class HindsightMemoryProvider(MemoryProvider): if self._mode == "local": def _start_daemon(): import traceback - from pathlib import Path - log_dir = Path(os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes"))) / "logs" + log_dir = get_hermes_home() / "logs" log_dir.mkdir(parents=True, exist_ok=True) log_path = log_dir / "hindsight-embed.log" try: diff --git a/plugins/memory/retaindb/__init__.py b/plugins/memory/retaindb/__init__.py index 69b8a8cf5b..72ff9d77cf 100644 --- a/plugins/memory/retaindb/__init__.py +++ b/plugins/memory/retaindb/__init__.py @@ -504,7 +504,8 @@ class RetainDBMemoryProvider(MemoryProvider): self._user_id = kwargs.get("user_id", "default") or "default" self._agent_id = kwargs.get("agent_id", "hermes") or "hermes" - hermes_home_path = Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes")) + from hermes_constants import get_hermes_home + hermes_home_path = get_hermes_home() db_path = hermes_home_path / "retaindb_queue.db" self._queue = _WriteQueue(self._client, db_path) diff --git a/tools/credential_files.py b/tools/credential_files.py index 49768bff48..eafd5ea23d 100644 --- a/tools/credential_files.py +++ b/tools/credential_files.py @@ -48,7 +48,8 @@ _config_files: List[Dict[str, str]] | None = None def _resolve_hermes_home() -> Path: - return Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes")) + from hermes_constants import get_hermes_home + return get_hermes_home() def register_credential_file( diff --git a/tools/env_passthrough.py b/tools/env_passthrough.py index 1c70d518ff..0e883babde 100644 --- a/tools/env_passthrough.py +++ b/tools/env_passthrough.py @@ -66,8 +66,8 @@ def _load_config_passthrough() -> frozenset[str]: result: set[str] = set() try: - hermes_home = Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes")) - config_path = hermes_home / "config.yaml" + from hermes_constants import get_hermes_home + config_path = get_hermes_home() / "config.yaml" if config_path.exists(): import yaml