"""BDI runtime models using pure dataclasses.""" from dataclasses import dataclass, field from datetime import datetime from enum import Enum from typing import List, Optional class BeliefStatus(Enum): ACTIVE = "active" ARCHIVED = "archived" CHALLENGED = "challenged" STALE = "stale" class DesireStatus(Enum): ACTIVE = "active" ACHIEVED = "achieved" SUSPENDED = "suspended" ABANDONED = "abandoned" class IntentionStatus(Enum): ACTIVE = "active" COMPLETED = "completed" SUSPENDED = "suspended" FAILED = "failed" @dataclass class BDIBelief: id: str content: str confidence: float status: BeliefStatus source: str tags: List[str] created_at: datetime last_reviewed: Optional[datetime] = None version: int = 1 evidence: List[str] = field(default_factory=list) def __post_init__(self) -> None: if not (0.0 <= self.confidence <= 1.0): raise ValueError(f"confidence must be 0-1, got {self.confidence}") if self.version < 1: raise ValueError(f"version must be >= 1, got {self.version}") @dataclass class BDIDesire: id: str content: str priority: float status: DesireStatus related_tags: List[str] measurable: bool metric: Optional[str] created_at: datetime last_reviewed: Optional[datetime] = None version: int = 1 def __post_init__(self) -> None: if not (0.0 <= self.priority <= 1.0): raise ValueError(f"priority must be 0-1, got {self.priority}") if self.version < 1: raise ValueError(f"version must be >= 1, got {self.version}") @dataclass class BDIIntention: id: str goal: str status: IntentionStatus belief_ids: List[str] desire_ids: List[str] created_at: datetime last_reviewed: Optional[datetime] = None version: int = 1 progress: float = 0.0 def __post_init__(self) -> None: if not (0.0 <= self.progress <= 1.0): raise ValueError(f"progress must be 0-1, got {self.progress}") if self.version < 1: raise ValueError(f"version must be >= 1, got {self.version}") @dataclass class BDISnapshot: org_id: str beliefs: List[BDIBelief] desires: List[BDIDesire] intentions: List[BDIIntention] snapshot_at: datetime version: int = 1