"""CLI entry point for the hermes-agent ACP adapter. Loads environment variables from ``~/.hermes/.env``, configures logging to write to stderr (so stdout is reserved for ACP JSON-RPC transport), and starts the ACP agent server. Usage:: python -m acp_adapter.entry # or hermes acp # or hermes-acp """ import asyncio import logging import os import sys from pathlib import Path from hermes_constants import get_hermes_home def _setup_logging() -> None: """Route all logging to stderr so stdout stays clean for ACP stdio.""" handler = logging.StreamHandler(sys.stderr) handler.setFormatter( logging.Formatter( "%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) ) root = logging.getLogger() root.handlers.clear() root.addHandler(handler) root.setLevel(logging.INFO) # Quiet down noisy libraries logging.getLogger("httpx").setLevel(logging.WARNING) logging.getLogger("httpcore").setLevel(logging.WARNING) logging.getLogger("openai").setLevel(logging.WARNING) def _load_env() -> None: """Load .env from HERMES_HOME (default ``~/.hermes``).""" from hermes_cli.env_loader import load_hermes_dotenv hermes_home = get_hermes_home() loaded = load_hermes_dotenv(hermes_home=hermes_home) if loaded: for env_file in loaded: logging.getLogger(__name__).info("Loaded env from %s", env_file) else: logging.getLogger(__name__).info( "No .env found at %s, using system env", hermes_home / ".env" ) def main() -> None: """Entry point: load env, configure logging, run the ACP agent.""" _setup_logging() _load_env() logger = logging.getLogger(__name__) logger.info("Starting hermes-agent ACP adapter") # Ensure the project root is on sys.path so ``from run_agent import AIAgent`` works project_root = str(Path(__file__).resolve().parent.parent) if project_root not in sys.path: sys.path.insert(0, project_root) import acp from .server import HermesACPAgent agent = HermesACPAgent() try: asyncio.run(acp.run_agent(agent, use_unstable_protocol=True)) except KeyboardInterrupt: logger.info("Shutting down (KeyboardInterrupt)") except Exception: logger.exception("ACP agent crashed") sys.exit(1) if __name__ == "__main__": main()