| """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 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) |
|
|
| |
| 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") |
|
|
| |
| 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() |
|
|