"""Task queue model for protocol_muse.""" from dataclasses import dataclass, field from typing import List, Dict, Any, Optional @dataclass class TaskItem: name: str queue: str # "pending", "claimed", "done" owner: Optional[str] = None age_s: Optional[float] = None @dataclass class QueueSnapshot: ok: bool tasks: List[TaskItem] = field(default_factory=list) counts: Dict[str, int] = field(default_factory=lambda: {"pending": 0, "claimed": 0, "done": 0}) @property def pending_count(self) -> int: return self.counts.get("pending", 0) @property def claimed_count(self) -> int: return self.counts.get("claimed", 0) @property def done_count(self) -> int: return self.counts.get("done", 0) @classmethod def from_dict(cls, data: Dict[str, Any]) -> "QueueSnapshot": tasks = [] for t in data.get("tasks", []): tasks.append(TaskItem( name=t.get("name", ""), queue=t.get("queue", "pending"), owner=t.get("owner"), age_s=t.get("age_s"), )) counts = data.get("counts", { "pending": sum(1 for t in tasks if t.queue == "pending"), "claimed": sum(1 for t in tasks if t.queue == "claimed"), "done": sum(1 for t in tasks if t.queue == "done"), }) return cls(ok=bool(data.get("ok", True)), tasks=tasks, counts=counts)