"""Data models for the Debug Oracle."""
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import Optional
class Severity(str, Enum):
INFO = "info"
WARNING = "warning"
ERROR = "error"
CRITICAL = "critical"
class SourceType(str, Enum):
DOCKER = "docker"
SYSTEMD = "systemd"
GIT = "git"
METRICS = "metrics"
CONFIG = "config"
FILESYSTEM = "filesystem"
@dataclass
class LogEntry:
"""A single log entry from any source."""
timestamp: datetime
source: SourceType
source_name: str # Container name, unit name, etc.
severity: Severity
message: str
raw: str = "" # Full raw line
@dataclass
class MetricSnapshot:
"""System metrics at a point in time."""
timestamp: datetime
cpu_percent: float = 0.0
memory_percent: float = 0.0
disk_percent: float = 0.0
load_avg: tuple = () # (1m, 5m, 15m)
network_bytes_in: int = 0
network_bytes_out: int = 0
# Per-process if available
top_processes: list[dict] = field(default_factory=list)
@dataclass
class GitChange:
"""Recent git change."""
timestamp: datetime
repo_path: str
commit_hash: str
message: str
author: str
files_changed: list[str] = field(default_factory=list)
@dataclass
class EvidenceItem:
"""A piece of evidence collected during investigation."""
source_type: SourceType
source_name: str
timestamp: Optional[datetime]
content: str
relevance: str = "" # Why this matters (filled by reasoning)
@dataclass
class CausalChain:
"""A causal chain explaining a failure."""
# The observable symptom
symptom: str
# The likely root cause
root_cause: str
# The chain of events: A caused B caused C
chain: list[str] = field(default_factory=list)
# Confidence in this analysis (0-1)
confidence: float = 0.0
# Supporting evidence
evidence: list[str] = field(default_factory=list)
# Recommended action
recommendation: str = ""
@dataclass
class Investigation:
"""Complete investigation result."""
query: str
timestamp: datetime = field(default_factory=datetime.now)
# Collected data
logs: list[LogEntry] = field(default_factory=list)
metrics: list[MetricSnapshot] = field(default_factory=list)
git_changes: list[GitChange] = field(default_factory=list)
evidence: list[EvidenceItem] = field(default_factory=list)
# Analysis
causal_chains: list[CausalChain] = field(default_factory=list)
# Summary
summary: str = ""
# Raw LLM response (for debugging)
raw_response: str = ""