import asyncio from dataclasses import dataclass, field from enum import Enum from typing import Callable class Status(str, Enum): IDLE = "idle" RECORDING = "recording" PROCESSING = "processing" AWAITING_SPEAKERS = "awaiting_speakers" ERROR = "error" @dataclass class AppState: status: Status = Status.IDLE recording_user: str | None = None last_error: str | None = None _listeners: list[Callable] = field(default_factory=list, repr=False) # Diarization pipeline pause _speakers_event: asyncio.Event | None = None _pending_aligned_segments: list[tuple[str, str]] | None = None _speaker_names: dict[str, str] | None = None def subscribe(self, callback: Callable): self._listeners.append(callback) async def notify(self): for cb in self._listeners: if asyncio.iscoroutinefunction(cb): await cb(self) else: cb(self) async def set_status(self, status: Status): self.status = status await self.notify() state = AppState()