from __future__ import annotations import logging from typing import Any from control_plane.events.models import Event, EventType from control_plane.projects.models import Project, Task logger = logging.getLogger(__name__) class EventBus: """Persisted event bus for control-plane state changes.""" def publish( self, event_type: EventType | str, *, project: Project | None = None, task: Task | None = None, actor: str = "system", payload: dict[str, Any] | None = None, ) -> Event: event = Event.objects.create( event_type=str(event_type), project=project, task=task, actor=actor, payload=payload or {} ) logger.info( "event_published", extra={"event_id": str(event.id), "event_type": event.event_type, "project_id": str(project.id) if project else None}, ) return event