Files
ajarbot/hooks.py

112 lines
3.2 KiB
Python
Raw Normal View History

"""Simple Hooks System - Event-driven automation."""
from datetime import datetime
from pathlib import Path
from typing import Any, Callable, Dict, List
class HookEvent:
"""Event passed to hook handlers."""
def __init__(
self,
event_type: str,
action: str,
context: Dict[str, Any] = None,
) -> None:
self.type = event_type
self.action = action
self.timestamp = datetime.now()
self.context = context or {}
self.messages: List[str] = []
class HooksSystem:
"""Simple hooks system for event-driven automation."""
def __init__(self) -> None:
self.handlers: Dict[str, List[Callable]] = {}
def register(
self, event_key: str, handler: Callable[[HookEvent], None]
) -> None:
"""Register a handler for an event."""
if event_key not in self.handlers:
self.handlers[event_key] = []
self.handlers[event_key].append(handler)
print(f"Registered hook: {handler.__name__} -> {event_key}")
def trigger(
self,
event_type: str,
action: str,
context: Dict = None,
) -> List[str]:
"""Trigger event and run all registered handlers."""
event = HookEvent(event_type, action, context)
event_key = f"{event_type}:{action}"
handlers = self.handlers.get(event_key, [])
handlers += self.handlers.get(event_type, [])
if handlers:
print(
f"Triggering {len(handlers)} hook(s) for {event_key}"
)
for handler in handlers:
try:
handler(event)
except Exception as e:
print(f"Hook error ({handler.__name__}): {e}")
return event.messages
def on_task_created(event: HookEvent) -> None:
"""Hook: When task is created."""
if event.type != "task" or event.action != "created":
return
task_title = event.context.get("title", "Unknown")
print(f"Task created: {task_title}")
event.messages.append(f"Task '{task_title}' logged")
def on_memory_sync(event: HookEvent) -> None:
"""Hook: When memory syncs."""
if event.type != "memory" or event.action != "synced":
return
files_count = event.context.get("files", 0)
print(f"Memory synced: {files_count} files")
def on_agent_startup(event: HookEvent) -> None:
"""Hook: When agent starts."""
if event.type != "agent" or event.action != "startup":
return
print("Agent started - loading BOOT.md if exists")
workspace_dir = event.context.get("workspace_dir")
if workspace_dir:
boot_path = Path(workspace_dir) / "BOOT.md"
if boot_path.exists():
print("Found BOOT.md - would execute startup tasks")
event.messages.append("Executed BOOT.md startup tasks")
if __name__ == "__main__":
hooks = HooksSystem()
hooks.register("task:created", on_task_created)
hooks.register("memory:synced", on_memory_sync)
hooks.register("agent:startup", on_agent_startup)
hooks.trigger("task", "created", {"title": "Implement feature X"})
hooks.trigger("memory", "synced", {"files": 15})
hooks.trigger(
"agent", "startup", {"workspace_dir": "./memory_workspace"}
)