File size: 2,359 Bytes
4554903
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
"""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