import threading import logging from pathlib import Path from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from tool_loader import load_tools from bot_loader import load_bots class ReloadableRegistry: def __init__(self, base_dir): self.base_dir = Path(base_dir) self.lock = threading.Lock() self.tools = {} self.bots = {} self.reload_all() def reload_all(self): with self.lock: logging.info("Reloading bots and tools...") self.tools = load_tools(self.base_dir / "tools") self.bots = load_bots(self.base_dir / "bots") def get_tools(self): with self.lock: return self.tools.copy() def get_bots(self): with self.lock: return self.bots.copy() class ReloadHandler(FileSystemEventHandler): def __init__(self, registry): self.registry = registry def on_any_event(self, event): if event.is_directory: return if event.src_path.endswith(".py"): logging.info(f"Detected change: {event.src_path}") self.registry.reload_all() def start_hot_reload(registry): observer = Observer() handler = ReloadHandler(registry) observer.schedule(handler, str(registry.base_dir / "tools"), recursive=True) observer.schedule(handler, str(registry.base_dir / "bots"), recursive=True) observer.daemon = True observer.start() logging.info("🔥 Hot reload enabled (tools + bots)")