diff --git a/cli.py b/cli.py index a5ed551a..bb678e8f 100644 --- a/cli.py +++ b/cli.py @@ -70,7 +70,7 @@ _COMMAND_SPINNER_FRAMES = ("⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧ # Load .env from ~/.hermes/.env first, then project root as dev fallback. # User-managed env files should override stale shell exports on restart. -from hermes_constants import get_hermes_home, OPENROUTER_BASE_URL +from hermes_constants import get_hermes_home, display_hermes_home, OPENROUTER_BASE_URL from hermes_cli.env_loader import load_hermes_dotenv _hermes_home = get_hermes_home() @@ -3594,7 +3594,7 @@ class HermesCLI: print(" To start the gateway:") print(" python cli.py --gateway") print() - print(" Configuration file: ~/.hermes/config.yaml") + print(f" Configuration file: {display_hermes_home()}/config.yaml") print() except Exception as e: @@ -3604,7 +3604,7 @@ class HermesCLI: print(" 1. Set environment variables:") print(" TELEGRAM_BOT_TOKEN=your_token") print(" DISCORD_BOT_TOKEN=your_token") - print(" 2. Or configure settings in ~/.hermes/config.yaml") + print(f" 2. Or configure settings in {display_hermes_home()}/config.yaml") print() def process_command(self, command: str) -> bool: @@ -3811,7 +3811,7 @@ class HermesCLI: plugins = mgr.list_plugins() if not plugins: print("No plugins installed.") - print("Drop plugin directories into ~/.hermes/plugins/ to get started.") + print(f"Drop plugin directories into {display_hermes_home()}/plugins/ to get started.") else: print(f"Plugins ({len(plugins)}):") for p in plugins: @@ -4340,7 +4340,7 @@ class HermesCLI: source = f" ({s['source']})" if s["source"] == "user" else "" print(f" {marker} {s['name']}{source} — {s['description']}") print("\n Usage: /skin ") - print(" Custom skins: drop a YAML file in ~/.hermes/skins/\n") + print(f" Custom skins: drop a YAML file in {display_hermes_home()}/skins/\n") return new_skin = parts[1].strip().lower() diff --git a/hermes_cli/auth.py b/hermes_cli/auth.py index 149cbcaf..dd1e145a 100644 --- a/hermes_cli/auth.py +++ b/hermes_cli/auth.py @@ -38,7 +38,7 @@ import httpx import yaml from hermes_cli.config import get_hermes_home, get_config_path -from hermes_constants import OPENROUTER_BASE_URL +from hermes_constants import OPENROUTER_BASE_URL, display_hermes_home logger = logging.getLogger(__name__) @@ -2021,7 +2021,7 @@ def _login_openai_codex(args, pconfig: ProviderConfig) -> None: config_path = _update_config_for_provider("openai-codex", creds.get("base_url", DEFAULT_CODEX_BASE_URL)) print() print("Login successful!") - print(" Auth state: ~/.hermes/auth.json") + print(f" Auth state: {display_hermes_home()}/auth.json") print(f" Config updated: {config_path} (model.provider=openai-codex)") diff --git a/hermes_cli/callbacks.py b/hermes_cli/callbacks.py index 88a97511..fa51ee15 100644 --- a/hermes_cli/callbacks.py +++ b/hermes_cli/callbacks.py @@ -12,6 +12,7 @@ import getpass from hermes_cli.banner import cprint, _DIM, _RST from hermes_cli.config import save_env_value_secure +from hermes_constants import display_hermes_home def clarify_callback(cli, question, choices): @@ -131,7 +132,8 @@ def prompt_for_secret(cli, var_name: str, prompt: str, metadata=None) -> dict: } stored = save_env_value_secure(var_name, value) - cprint(f"\n{_DIM} ✓ Stored secret in ~/.hermes/.env as {var_name}{_RST}") + _dhh = display_hermes_home() + cprint(f"\n{_DIM} ✓ Stored secret in {_dhh}/.env as {var_name}{_RST}") return { **stored, "skipped": False, @@ -183,7 +185,8 @@ def prompt_for_secret(cli, var_name: str, prompt: str, metadata=None) -> dict: } stored = save_env_value_secure(var_name, value) - cprint(f"\n{_DIM} ✓ Stored secret in ~/.hermes/.env as {var_name}{_RST}") + _dhh = display_hermes_home() + cprint(f"\n{_DIM} ✓ Stored secret in {_dhh}/.env as {var_name}{_RST}") return { **stored, "skipped": False, diff --git a/hermes_cli/doctor.py b/hermes_cli/doctor.py index 8facb1c7..c5bb179a 100644 --- a/hermes_cli/doctor.py +++ b/hermes_cli/doctor.py @@ -10,9 +10,11 @@ import subprocess import shutil from hermes_cli.config import get_project_root, get_hermes_home, get_env_path +from hermes_constants import display_hermes_home PROJECT_ROOT = get_project_root() HERMES_HOME = get_hermes_home() +_DHH = display_hermes_home() # user-facing display path (e.g. ~/.hermes or ~/.hermes/profiles/coder) # Load environment variables from ~/.hermes/.env so API key checks work from dotenv import load_dotenv @@ -209,14 +211,14 @@ def run_doctor(args): # Check ~/.hermes/.env (primary location for user config) env_path = HERMES_HOME / '.env' if env_path.exists(): - check_ok("~/.hermes/.env file exists") + check_ok(f"{_DHH}/.env file exists") # Check for common issues content = env_path.read_text() if _has_provider_env_config(content): check_ok("API key or custom endpoint configured") else: - check_warn("No API key found in ~/.hermes/.env") + check_warn(f"No API key found in {_DHH}/.env") issues.append("Run 'hermes setup' to configure API keys") else: # Also check project root as fallback @@ -224,11 +226,11 @@ def run_doctor(args): if fallback_env.exists(): check_ok(".env file exists (in project directory)") else: - check_fail("~/.hermes/.env file missing") + check_fail(f"{_DHH}/.env file missing") if should_fix: env_path.parent.mkdir(parents=True, exist_ok=True) env_path.touch() - check_ok("Created empty ~/.hermes/.env") + check_ok(f"Created empty {_DHH}/.env") check_info("Run 'hermes setup' to configure API keys") fixed_count += 1 else: @@ -238,7 +240,7 @@ def run_doctor(args): # Check ~/.hermes/config.yaml (primary) or project cli-config.yaml (fallback) config_path = HERMES_HOME / 'config.yaml' if config_path.exists(): - check_ok("~/.hermes/config.yaml exists") + check_ok(f"{_DHH}/config.yaml exists") else: fallback_config = PROJECT_ROOT / 'cli-config.yaml' if fallback_config.exists(): @@ -248,11 +250,11 @@ def run_doctor(args): if should_fix and example_config.exists(): config_path.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(str(example_config), str(config_path)) - check_ok("Created ~/.hermes/config.yaml from cli-config.yaml.example") + check_ok(f"Created {_DHH}/config.yaml from cli-config.yaml.example") fixed_count += 1 elif should_fix: check_warn("config.yaml not found and no example to copy from") - manual_issues.append("Create ~/.hermes/config.yaml manually") + manual_issues.append(f"Create {_DHH}/config.yaml manually") else: check_warn("config.yaml not found", "(using defaults)") @@ -294,28 +296,28 @@ def run_doctor(args): hermes_home = HERMES_HOME if hermes_home.exists(): - check_ok("~/.hermes directory exists") + check_ok(f"{_DHH} directory exists") else: if should_fix: hermes_home.mkdir(parents=True, exist_ok=True) - check_ok("Created ~/.hermes directory") + check_ok(f"Created {_DHH} directory") fixed_count += 1 else: - check_warn("~/.hermes not found", "(will be created on first use)") + check_warn(f"{_DHH} not found", "(will be created on first use)") # Check expected subdirectories expected_subdirs = ["cron", "sessions", "logs", "skills", "memories"] for subdir_name in expected_subdirs: subdir_path = hermes_home / subdir_name if subdir_path.exists(): - check_ok(f"~/.hermes/{subdir_name}/ exists") + check_ok(f"{_DHH}/{subdir_name}/ exists") else: if should_fix: subdir_path.mkdir(parents=True, exist_ok=True) - check_ok(f"Created ~/.hermes/{subdir_name}/") + check_ok(f"Created {_DHH}/{subdir_name}/") fixed_count += 1 else: - check_warn(f"~/.hermes/{subdir_name}/ not found", "(will be created on first use)") + check_warn(f"{_DHH}/{subdir_name}/ not found", "(will be created on first use)") # Check for SOUL.md persona file soul_path = hermes_home / "SOUL.md" @@ -324,11 +326,11 @@ def run_doctor(args): # Check if it's just the template comments (no real content) lines = [l for l in content.splitlines() if l.strip() and not l.strip().startswith(("", "#"))] if lines: - check_ok("~/.hermes/SOUL.md exists (persona configured)") + check_ok(f"{_DHH}/SOUL.md exists (persona configured)") else: - check_info("~/.hermes/SOUL.md exists but is empty — edit it to customize personality") + check_info(f"{_DHH}/SOUL.md exists but is empty — edit it to customize personality") else: - check_warn("~/.hermes/SOUL.md not found", "(create it to give Hermes a custom personality)") + check_warn(f"{_DHH}/SOUL.md not found", "(create it to give Hermes a custom personality)") if should_fix: soul_path.parent.mkdir(parents=True, exist_ok=True) soul_path.write_text( @@ -337,13 +339,13 @@ def run_doctor(args): "You are Hermes, a helpful AI assistant.\n", encoding="utf-8", ) - check_ok("Created ~/.hermes/SOUL.md with basic template") + check_ok(f"Created {_DHH}/SOUL.md with basic template") fixed_count += 1 # Check memory directory memories_dir = hermes_home / "memories" if memories_dir.exists(): - check_ok("~/.hermes/memories/ directory exists") + check_ok(f"{_DHH}/memories/ directory exists") memory_file = memories_dir / "MEMORY.md" user_file = memories_dir / "USER.md" if memory_file.exists(): @@ -357,10 +359,10 @@ def run_doctor(args): else: check_info("USER.md not created yet (will be created when the agent first writes a memory)") else: - check_warn("~/.hermes/memories/ not found", "(will be created on first use)") + check_warn(f"{_DHH}/memories/ not found", "(will be created on first use)") if should_fix: memories_dir.mkdir(parents=True, exist_ok=True) - check_ok("Created ~/.hermes/memories/") + check_ok(f"Created {_DHH}/memories/") fixed_count += 1 # Check SQLite session store @@ -372,11 +374,11 @@ def run_doctor(args): cursor = conn.execute("SELECT COUNT(*) FROM sessions") count = cursor.fetchone()[0] conn.close() - check_ok(f"~/.hermes/state.db exists ({count} sessions)") + check_ok(f"{_DHH}/state.db exists ({count} sessions)") except Exception as e: - check_warn(f"~/.hermes/state.db exists but has issues: {e}") + check_warn(f"{_DHH}/state.db exists but has issues: {e}") else: - check_info("~/.hermes/state.db not created yet (will be created on first session)") + check_info(f"{_DHH}/state.db not created yet (will be created on first session)") _check_gateway_service_linger(issues) @@ -691,7 +693,7 @@ def run_doctor(args): if github_token: check_ok("GitHub token configured (authenticated API access)") else: - check_warn("No GITHUB_TOKEN", "(60 req/hr rate limit — set in ~/.hermes/.env for better rates)") + check_warn("No GITHUB_TOKEN", f"(60 req/hr rate limit — set in {_DHH}/.env for better rates)") # ========================================================================= # Honcho memory diff --git a/hermes_cli/gateway.py b/hermes_cli/gateway.py index 197c0574..8e6bcc35 100644 --- a/hermes_cli/gateway.py +++ b/hermes_cli/gateway.py @@ -15,6 +15,7 @@ from pathlib import Path PROJECT_ROOT = Path(__file__).parent.parent.resolve() from hermes_cli.config import get_env_value, get_hermes_home, save_env_value, is_managed, managed_error +from hermes_constants import display_hermes_home from hermes_cli.setup import ( print_header, print_info, print_success, print_warning, print_error, prompt, prompt_choice, prompt_yes_no, @@ -935,7 +936,7 @@ def launchd_install(force: bool = False): print() print("Next steps:") print(" hermes gateway status # Check status") - print(" tail -f ~/.hermes/logs/gateway.log # View logs") + print(f" tail -f {display_hermes_home()}/logs/gateway.log # View logs") def launchd_uninstall(): plist_path = get_launchd_plist_path() diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 1f2750b3..867b8db4 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -2121,7 +2121,8 @@ def _run_anthropic_oauth_flow(save_env_value): ): use_anthropic_claude_code_credentials(save_fn=save_env_value) print(" ✓ Claude Code credentials linked.") - print(" Hermes will use Claude's credential store directly instead of copying a setup-token into ~/.hermes/.env.") + from hermes_constants import display_hermes_home as _dhh_fn + print(f" Hermes will use Claude's credential store directly instead of copying a setup-token into {_dhh_fn()}/.env.") return True return False diff --git a/hermes_cli/mcp_config.py b/hermes_cli/mcp_config.py index 025bfd62..05eb088a 100644 --- a/hermes_cli/mcp_config.py +++ b/hermes_cli/mcp_config.py @@ -24,6 +24,7 @@ from hermes_cli.config import ( get_hermes_home, # noqa: F401 — used by test mocks ) from hermes_cli.colors import Colors, color +from hermes_constants import display_hermes_home logger = logging.getLogger(__name__) @@ -244,7 +245,7 @@ def cmd_mcp_add(args): api_key = _prompt("API key / Bearer token", password=True) if api_key: save_env_value(env_key, api_key) - _success(f"Saved to ~/.hermes/.env as {env_key}") + _success(f"Saved to {display_hermes_home()}/.env as {env_key}") # Set header with env var interpolation if api_key or existing_key: @@ -332,7 +333,7 @@ def cmd_mcp_add(args): _save_mcp_server(name, server_config) print() - _success(f"Saved '{name}' to ~/.hermes/config.yaml ({tool_count}/{total} tools enabled)") + _success(f"Saved '{name}' to {display_hermes_home()}/config.yaml ({tool_count}/{total} tools enabled)") _info("Start a new session to use these tools.") diff --git a/hermes_cli/setup.py b/hermes_cli/setup.py index e021e837..0b74d226 100644 --- a/hermes_cli/setup.py +++ b/hermes_cli/setup.py @@ -289,6 +289,7 @@ from hermes_cli.config import ( get_env_value, ensure_hermes_home, ) +from hermes_constants import display_hermes_home from hermes_cli.colors import Colors, color @@ -683,7 +684,7 @@ def _print_setup_summary(config: dict, hermes_home): print_warning( "Some tools are disabled. Run 'hermes setup tools' to configure them," ) - print_warning("or edit ~/.hermes/.env directly to add the missing API keys.") + print_warning(f"or edit {display_hermes_home()}/.env directly to add the missing API keys.") print() # Done banner @@ -706,7 +707,7 @@ def _print_setup_summary(config: dict, hermes_home): print() # Show file locations prominently - print(color("📁 All your files are in ~/.hermes/:", Colors.CYAN, Colors.BOLD)) + print(color(f"📁 All your files are in {display_hermes_home()}/:", Colors.CYAN, Colors.BOLD)) print() print(f" {color('Settings:', Colors.YELLOW)} {get_config_path()}") print(f" {color('API Keys:', Colors.YELLOW)} {get_env_path()}") @@ -2837,7 +2838,7 @@ def setup_gateway(config: dict): save_env_value("WEBHOOK_ENABLED", "true") print() print_success("Webhooks enabled! Next steps:") - print_info(" 1. Define webhook routes in ~/.hermes/config.yaml") + print_info(f" 1. Define webhook routes in {display_hermes_home()}/config.yaml") print_info(" 2. Point your service (GitHub, GitLab, etc.) at:") print_info(" http://your-server:8644/webhooks/") print() diff --git a/hermes_cli/skills_hub.py b/hermes_cli/skills_hub.py index a1f15f86..359e8b91 100644 --- a/hermes_cli/skills_hub.py +++ b/hermes_cli/skills_hub.py @@ -21,6 +21,7 @@ from rich.table import Table # Lazy imports to avoid circular dependencies and slow startup. # tools.skills_hub and tools.skills_guard are imported inside functions. +from hermes_constants import display_hermes_home _console = Console() @@ -388,7 +389,7 @@ def do_install(identifier: str, category: str = "", force: bool = False, "[bold bright_cyan]This is an official optional skill maintained by Nous Research.[/]\n\n" "It ships with hermes-agent but is not activated by default.\n" "Installing will copy it to your skills directory where the agent can use it.\n\n" - f"Files will be at: [cyan]~/.hermes/skills/{category + '/' if category else ''}{bundle.name}/[/]", + f"Files will be at: [cyan]{display_hermes_home()}/skills/{category + '/' if category else ''}{bundle.name}/[/]", title="Official Skill", border_style="bright_cyan", )) @@ -398,7 +399,7 @@ def do_install(identifier: str, category: str = "", force: bool = False, "External skills can contain instructions that influence agent behavior,\n" "shell commands, and scripts. Even after automated scanning, you should\n" "review the installed files before use.\n\n" - f"Files will be at: [cyan]~/.hermes/skills/{category + '/' if category else ''}{bundle.name}/[/]", + f"Files will be at: [cyan]{display_hermes_home()}/skills/{category + '/' if category else ''}{bundle.name}/[/]", title="Disclaimer", border_style="yellow", )) @@ -744,7 +745,7 @@ def do_publish(skill_path: str, target: str = "github", repo: str = "", auth = GitHubAuth() if not auth.is_authenticated(): c.print("[bold red]Error:[/] GitHub authentication required.\n" - "Set GITHUB_TOKEN in ~/.hermes/.env or run 'gh auth login'.\n") + f"Set GITHUB_TOKEN in {display_hermes_home()}/.env or run 'gh auth login'.\n") return c.print(f"[bold]Publishing '{name}' to {repo}...[/]") diff --git a/hermes_cli/tools_config.py b/hermes_cli/tools_config.py index 6cea5ca7..f6ad9d5f 100644 --- a/hermes_cli/tools_config.py +++ b/hermes_cli/tools_config.py @@ -326,7 +326,8 @@ def _run_post_setup(post_setup_key: str): if result.returncode == 0: _print_success(" Node.js dependencies installed") else: - _print_warning(" npm install failed - run manually: cd ~/.hermes/hermes-agent && npm install") + from hermes_constants import display_hermes_home + _print_warning(f" npm install failed - run manually: cd {display_hermes_home()}/hermes-agent && npm install") elif not node_modules.exists(): _print_warning(" Node.js not found - browser tools require: npm install (in hermes-agent directory)") @@ -1264,7 +1265,8 @@ def tools_command(args=None, first_install: bool = False, config: dict = None): platform_choices[idx] = f"Configure {pinfo['label']} ({new_count}/{total} enabled)" print() - print(color(" Tool configuration saved to ~/.hermes/config.yaml", Colors.DIM)) + from hermes_constants import display_hermes_home + print(color(f" Tool configuration saved to {display_hermes_home()}/config.yaml", Colors.DIM)) print(color(" Changes take effect on next 'hermes' or gateway restart.", Colors.DIM)) print() diff --git a/hermes_cli/webhook.py b/hermes_cli/webhook.py index 7514ddd1..264e7f84 100644 --- a/hermes_cli/webhook.py +++ b/hermes_cli/webhook.py @@ -18,6 +18,8 @@ import time from pathlib import Path from typing import Dict, Optional +from hermes_constants import display_hermes_home + _SUBSCRIPTIONS_FILENAME = "webhook_subscriptions.json" @@ -76,13 +78,15 @@ def _get_webhook_base_url() -> str: return f"http://{display_host}:{port}" -_SETUP_HINT = """ +def _setup_hint() -> str: + _dhh = display_hermes_home() + return f""" Webhook platform is not enabled. To set it up: 1. Run the gateway setup wizard: hermes gateway setup - 2. Or manually add to ~/.hermes/config.yaml: + 2. Or manually add to {_dhh}/config.yaml: platforms: webhook: enabled: true @@ -91,7 +95,7 @@ _SETUP_HINT = """ port: 8644 secret: "your-global-hmac-secret" - 3. Or set environment variables in ~/.hermes/.env: + 3. Or set environment variables in {_dhh}/.env: WEBHOOK_ENABLED=true WEBHOOK_PORT=8644 WEBHOOK_SECRET=your-global-secret @@ -104,7 +108,7 @@ def _require_webhook_enabled() -> bool: """Check webhook is enabled. Print setup guide and return False if not.""" if _is_webhook_enabled(): return True - print(_SETUP_HINT) + print(_setup_hint()) return False diff --git a/hermes_constants.py b/hermes_constants.py index a55914b5..2bfc0a8c 100644 --- a/hermes_constants.py +++ b/hermes_constants.py @@ -38,6 +38,26 @@ def get_hermes_dir(new_subpath: str, old_name: str) -> Path: return home / new_subpath +def display_hermes_home() -> str: + """Return a user-friendly display string for the current HERMES_HOME. + + Uses ``~/`` shorthand for readability:: + + default: ``~/.hermes`` + profile: ``~/.hermes/profiles/coder`` + custom: ``/opt/hermes-custom`` + + Use this in **user-facing** print/log messages instead of hardcoding + ``~/.hermes``. For code that needs a real ``Path``, use + :func:`get_hermes_home` instead. + """ + home = get_hermes_home() + try: + return "~/" + str(home.relative_to(Path.home())) + except ValueError: + return str(home) + + VALID_REASONING_EFFORTS = ("xhigh", "high", "medium", "low", "minimal") diff --git a/run_agent.py b/run_agent.py index cac9f5ec..8bafb5b6 100644 --- a/run_agent.py +++ b/run_agent.py @@ -45,7 +45,7 @@ import fire from datetime import datetime from pathlib import Path -from hermes_constants import get_hermes_home +from hermes_constants import get_hermes_home, display_hermes_home # Load .env from ~/.hermes/.env first, then project root as dev fallback. # User-managed env files should override stale shell exports on restart. @@ -6924,8 +6924,9 @@ class AIAgent: print(f"{self.log_prefix} Auth method: {auth_method}") print(f"{self.log_prefix} Token prefix: {key[:12]}..." if key and len(key) > 12 else f"{self.log_prefix} Token: (empty or short)") print(f"{self.log_prefix} Troubleshooting:") - print(f"{self.log_prefix} • Check ANTHROPIC_TOKEN in ~/.hermes/.env for Hermes-managed OAuth/setup tokens") - print(f"{self.log_prefix} • Check ANTHROPIC_API_KEY in ~/.hermes/.env for API keys or legacy token values") + _dhh = display_hermes_home() + print(f"{self.log_prefix} • Check ANTHROPIC_TOKEN in {_dhh}/.env for Hermes-managed OAuth/setup tokens") + print(f"{self.log_prefix} • Check ANTHROPIC_API_KEY in {_dhh}/.env for API keys or legacy token values") print(f"{self.log_prefix} • For API keys: verify at https://console.anthropic.com/settings/keys") print(f"{self.log_prefix} • For Claude Code: run 'claude /login' to refresh, then retry") print(f"{self.log_prefix} • Clear stale keys: hermes config set ANTHROPIC_TOKEN \"\"") diff --git a/tools/terminal_tool.py b/tools/terminal_tool.py index 222632f6..53a5e9b4 100644 --- a/tools/terminal_tool.py +++ b/tools/terminal_tool.py @@ -48,6 +48,7 @@ logger = logging.getLogger(__name__) # long-running subprocesses immediately instead of blocking until timeout. # --------------------------------------------------------------------------- from tools.interrupt import is_interrupted, _interrupt_event # noqa: F401 — re-exported +from hermes_constants import display_hermes_home # ============================================================================= @@ -157,7 +158,7 @@ def _handle_sudo_failure(output: str, env_type: str) -> str: for failure in sudo_failures: if failure in output: - return output + "\n\n💡 Tip: To enable sudo over messaging, add SUDO_PASSWORD to ~/.hermes/.env on the agent machine." + return output + f"\n\n💡 Tip: To enable sudo over messaging, add SUDO_PASSWORD to {display_hermes_home()}/.env on the agent machine." return output @@ -443,7 +444,7 @@ def _parse_env_var(name: str, default: str, converter=int, type_label: str = "in except (ValueError, json.JSONDecodeError): raise ValueError( f"Invalid value for {name}: {raw!r} (expected {type_label}). " - f"Check ~/.hermes/.env or environment variables." + f"Check {display_hermes_home()}/.env or environment variables." ) @@ -1283,7 +1284,7 @@ if __name__ == "__main__": print(f" TERMINAL_MODAL_IMAGE: {os.getenv('TERMINAL_MODAL_IMAGE', default_img)}") print(f" TERMINAL_DAYTONA_IMAGE: {os.getenv('TERMINAL_DAYTONA_IMAGE', default_img)}") print(f" TERMINAL_CWD: {os.getenv('TERMINAL_CWD', os.getcwd())}") - print(f" TERMINAL_SANDBOX_DIR: {os.getenv('TERMINAL_SANDBOX_DIR', '~/.hermes/sandboxes')}") + print(f" TERMINAL_SANDBOX_DIR: {os.getenv('TERMINAL_SANDBOX_DIR', f'{display_hermes_home()}/sandboxes')}") print(f" TERMINAL_TIMEOUT: {os.getenv('TERMINAL_TIMEOUT', '60')}") print(f" TERMINAL_LIFETIME_SECONDS: {os.getenv('TERMINAL_LIFETIME_SECONDS', '300')}") diff --git a/tools/tts_tool.py b/tools/tts_tool.py index 0f25fc66..b9251fe7 100644 --- a/tools/tts_tool.py +++ b/tools/tts_tool.py @@ -33,7 +33,7 @@ import subprocess import tempfile import threading from pathlib import Path -from hermes_constants import get_hermes_home +from hermes_constants import get_hermes_home, display_hermes_home from typing import Callable, Dict, Any, Optional logger = logging.getLogger(__name__) @@ -832,7 +832,7 @@ TTS_SCHEMA = { }, "output_path": { "type": "string", - "description": "Optional custom file path to save the audio. Defaults to ~/.hermes/cache/audio/.mp3" + "description": f"Optional custom file path to save the audio. Defaults to {display_hermes_home()}/cache/audio/.mp3" } }, "required": ["text"]