diff --git a/gateway/hooks.py b/gateway/hooks.py index 15ecd3fee6..113c5f9654 100644 --- a/gateway/hooks.py +++ b/gateway/hooks.py @@ -21,6 +21,7 @@ import asyncio import importlib.util +import logging from typing import Any, Callable, Dict, List, Optional import yaml @@ -30,6 +31,8 @@ HOOKS_DIR = get_hermes_home() / "hooks" +logger = logging.getLogger(__name__) + class HookRegistry: """ @@ -75,13 +78,13 @@ def discover_and_load(self) -> None: try: manifest = yaml.safe_load(manifest_path.read_text(encoding="utf-8")) if not manifest or not isinstance(manifest, dict): - print(f"[hooks] Skipping {hook_dir.name}: invalid HOOK.yaml", flush=True) + logger.warning("[hooks] Skipping %s: invalid HOOK.yaml", hook_dir.name) continue hook_name = manifest.get("name", hook_dir.name) events = manifest.get("events", []) if not events: - print(f"[hooks] Skipping {hook_name}: no events declared", flush=True) + logger.warning("[hooks] Skipping %s: no events declared", hook_name) continue # Dynamically load the handler module @@ -89,7 +92,7 @@ def discover_and_load(self) -> None: f"hermes_hook_{hook_name}", handler_path ) if spec is None or spec.loader is None: - print(f"[hooks] Skipping {hook_name}: could not load handler.py", flush=True) + logger.warning("[hooks] Skipping %s: could not load handler.py", hook_name) continue module = importlib.util.module_from_spec(spec) @@ -97,7 +100,7 @@ def discover_and_load(self) -> None: handle_fn = getattr(module, "handle", None) if handle_fn is None: - print(f"[hooks] Skipping {hook_name}: no 'handle' function found", flush=True) + logger.warning("[hooks] Skipping %s: no 'handle' function found", hook_name) continue # Register the handler for each declared event @@ -111,10 +114,10 @@ def discover_and_load(self) -> None: "path": str(hook_dir), }) - print(f"[hooks] Loaded hook '{hook_name}' for events: {events}", flush=True) + logger.info("[hooks] Loaded hook '%s' for events: %s", hook_name, events) except Exception as e: - print(f"[hooks] Error loading hook {hook_dir.name}: {e}", flush=True) + logger.error("[hooks] Error loading hook %s: %s", hook_dir.name, e, exc_info=True) async def emit(self, event_type: str, context: Optional[Dict[str, Any]] = None) -> None: """ @@ -148,4 +151,4 @@ async def emit(self, event_type: str, context: Optional[Dict[str, Any]] = None) if asyncio.iscoroutine(result): await result except Exception as e: - print(f"[hooks] Error in handler for '{event_type}': {e}", flush=True) + logger.exception("[hooks] Error in handler for '%s'", event_type)