Skip to main content

mockforge_intelligence/ai_studio/
debug_context.rs

1//! Debug context types for AI-guided debugging
2//!
3//! This module defines the context structures that collect information from
4//! various subsystems (Reality, Contracts, Scenarios, Personas, Chaos) to
5//! provide comprehensive debugging context.
6
7use crate::reality::{RealityConfig, RealityLevel};
8use chrono::{DateTime, Utc};
9use serde::{Deserialize, Serialize};
10use serde_json::Value;
11use std::collections::HashMap;
12
13/// Unified debug context combining all subsystem contexts
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct DebugContext {
16    /// Reality subsystem context
17    pub reality: RealityContext,
18    /// Contract subsystem context
19    pub contract: ContractContext,
20    /// Scenario subsystem context
21    pub scenario: ScenarioContext,
22    /// Persona subsystem context
23    pub persona: PersonaContext,
24    /// Chaos subsystem context
25    pub chaos: ChaosContext,
26    /// Timestamp when context was collected
27    pub collected_at: DateTime<Utc>,
28}
29
30impl DebugContext {
31    /// Create a new empty debug context
32    pub fn new() -> Self {
33        Self {
34            reality: RealityContext::default(),
35            contract: ContractContext::default(),
36            scenario: ScenarioContext::default(),
37            persona: PersonaContext::default(),
38            chaos: ChaosContext::default(),
39            collected_at: Utc::now(),
40        }
41    }
42}
43
44impl Default for DebugContext {
45    fn default() -> Self {
46        Self::new()
47    }
48}
49
50/// Reality subsystem context
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct RealityContext {
53    /// Current reality level (1-5)
54    pub level: Option<RealityLevel>,
55    /// Reality level name
56    pub level_name: Option<String>,
57    /// Whether chaos is enabled
58    pub chaos_enabled: bool,
59    /// Chaos error rate (0.0-1.0)
60    pub chaos_error_rate: f64,
61    /// Chaos delay rate (0.0-1.0)
62    pub chaos_delay_rate: f64,
63    /// Base latency in milliseconds
64    pub latency_base_ms: u64,
65    /// Latency jitter in milliseconds
66    pub latency_jitter_ms: u64,
67    /// Whether MockAI is enabled
68    pub mockai_enabled: bool,
69    /// Full reality configuration (if available)
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub full_config: Option<RealityConfig>,
72}
73
74impl Default for RealityContext {
75    fn default() -> Self {
76        Self {
77            level: None,
78            level_name: None,
79            chaos_enabled: false,
80            chaos_error_rate: 0.0,
81            chaos_delay_rate: 0.0,
82            latency_base_ms: 0,
83            latency_jitter_ms: 0,
84            mockai_enabled: false,
85            full_config: None,
86        }
87    }
88}
89
90impl RealityContext {
91    /// Create from RealityConfig
92    pub fn from_config(config: &RealityConfig) -> Self {
93        Self {
94            level: Some(config.level),
95            level_name: Some(config.level.name().to_string()),
96            chaos_enabled: config.chaos.enabled,
97            chaos_error_rate: config.chaos.error_rate,
98            chaos_delay_rate: config.chaos.delay_rate,
99            latency_base_ms: config.latency.base_ms,
100            latency_jitter_ms: config.latency.jitter_ms,
101            mockai_enabled: config.mockai.enabled,
102            full_config: Some(config.clone()),
103        }
104    }
105}
106
107/// Contract subsystem context
108#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct ContractContext {
110    /// Whether contract validation is enabled
111    pub validation_enabled: bool,
112    /// Contract validation results (if available)
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub validation_result: Option<ContractValidationResult>,
115    /// Contract enforcement mode (strict, lenient, disabled)
116    pub enforcement_mode: String,
117    /// Recent contract drift history
118    pub drift_history: Vec<DriftHistoryEntry>,
119    /// Active contract paths/specs
120    pub active_contracts: Vec<String>,
121    /// Contract validation errors (if any)
122    pub validation_errors: Vec<String>,
123}
124
125impl Default for ContractContext {
126    fn default() -> Self {
127        Self {
128            validation_enabled: false,
129            validation_result: None,
130            enforcement_mode: "disabled".to_string(),
131            drift_history: Vec::new(),
132            active_contracts: Vec::new(),
133            validation_errors: Vec::new(),
134        }
135    }
136}
137
138/// Contract validation result
139#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct ContractValidationResult {
141    /// Whether validation passed
142    pub passed: bool,
143    /// Validation errors
144    pub errors: Vec<String>,
145    /// Validation warnings
146    pub warnings: Vec<String>,
147    /// Contract details
148    pub contract_details: Value,
149}
150
151/// Contract drift history entry
152#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct DriftHistoryEntry {
154    /// Timestamp of drift detection
155    pub detected_at: DateTime<Utc>,
156    /// Endpoint/method where drift was detected
157    pub endpoint: String,
158    /// Type of drift (breaking, non-breaking, etc.)
159    pub drift_type: String,
160    /// Description of the drift
161    pub description: String,
162    /// Details (JSON)
163    pub details: Value,
164}
165
166/// Scenario subsystem context
167#[derive(Debug, Clone, Serialize, Deserialize, Default)]
168pub struct ScenarioContext {
169    /// Active scenario name/ID (if any)
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub active_scenario: Option<String>,
172    /// Current state machine state (if applicable)
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub current_state: Option<String>,
175    /// Available state transitions
176    pub available_transitions: Vec<String>,
177    /// Scenario configuration
178    #[serde(skip_serializing_if = "Option::is_none")]
179    pub scenario_config: Option<Value>,
180}
181
182/// Persona subsystem context
183#[derive(Debug, Clone, Serialize, Deserialize, Default)]
184pub struct PersonaContext {
185    /// Active persona ID (if any)
186    #[serde(skip_serializing_if = "Option::is_none")]
187    pub active_persona_id: Option<String>,
188    /// Active persona name
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub active_persona_name: Option<String>,
191    /// Persona traits
192    pub traits: HashMap<String, String>,
193    /// Persona domain
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub domain: Option<String>,
196    /// Persona backstory
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub backstory: Option<String>,
199    /// Persona relationships
200    pub relationships: HashMap<String, Vec<String>>,
201    /// Persona lifecycle state (if applicable)
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub lifecycle_state: Option<String>,
204}
205
206/// Chaos subsystem context
207#[derive(Debug, Clone, Serialize, Deserialize, Default)]
208pub struct ChaosContext {
209    /// Whether chaos is enabled
210    pub enabled: bool,
211    /// Active chaos rules
212    pub active_rules: Vec<ChaosRule>,
213    /// Failure injection configuration
214    #[serde(skip_serializing_if = "Option::is_none")]
215    pub failure_injection: Option<FailureInjectionConfig>,
216    /// Chaos tags/patterns
217    pub tags: Vec<String>,
218}
219
220/// Chaos rule information
221#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct ChaosRule {
223    /// Rule name/identifier
224    pub name: String,
225    /// Rule type (error, delay, timeout, etc.)
226    pub rule_type: String,
227    /// Whether rule is enabled
228    pub enabled: bool,
229    /// Rule configuration
230    pub config: Value,
231}
232
233/// Failure injection configuration
234#[derive(Debug, Clone, Serialize, Deserialize)]
235pub struct FailureInjectionConfig {
236    /// Whether failure injection is enabled
237    pub enabled: bool,
238    /// HTTP error probability (0.0-1.0)
239    pub http_error_probability: f64,
240    /// Whether timeout errors are injected
241    pub timeout_errors: bool,
242    /// Timeout duration in milliseconds
243    pub timeout_ms: u64,
244    /// Tag-based failure configs
245    pub tag_configs: HashMap<String, Value>,
246}