mockforge_intelligence/ai_studio/
debug_context.rs1use crate::reality::{RealityConfig, RealityLevel};
8use chrono::{DateTime, Utc};
9use serde::{Deserialize, Serialize};
10use serde_json::Value;
11use std::collections::HashMap;
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct DebugContext {
16 pub reality: RealityContext,
18 pub contract: ContractContext,
20 pub scenario: ScenarioContext,
22 pub persona: PersonaContext,
24 pub chaos: ChaosContext,
26 pub collected_at: DateTime<Utc>,
28}
29
30impl DebugContext {
31 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#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct RealityContext {
53 pub level: Option<RealityLevel>,
55 pub level_name: Option<String>,
57 pub chaos_enabled: bool,
59 pub chaos_error_rate: f64,
61 pub chaos_delay_rate: f64,
63 pub latency_base_ms: u64,
65 pub latency_jitter_ms: u64,
67 pub mockai_enabled: bool,
69 #[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 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#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct ContractContext {
110 pub validation_enabled: bool,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub validation_result: Option<ContractValidationResult>,
115 pub enforcement_mode: String,
117 pub drift_history: Vec<DriftHistoryEntry>,
119 pub active_contracts: Vec<String>,
121 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#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct ContractValidationResult {
141 pub passed: bool,
143 pub errors: Vec<String>,
145 pub warnings: Vec<String>,
147 pub contract_details: Value,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct DriftHistoryEntry {
154 pub detected_at: DateTime<Utc>,
156 pub endpoint: String,
158 pub drift_type: String,
160 pub description: String,
162 pub details: Value,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize, Default)]
168pub struct ScenarioContext {
169 #[serde(skip_serializing_if = "Option::is_none")]
171 pub active_scenario: Option<String>,
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub current_state: Option<String>,
175 pub available_transitions: Vec<String>,
177 #[serde(skip_serializing_if = "Option::is_none")]
179 pub scenario_config: Option<Value>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize, Default)]
184pub struct PersonaContext {
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub active_persona_id: Option<String>,
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub active_persona_name: Option<String>,
191 pub traits: HashMap<String, String>,
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub domain: Option<String>,
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub backstory: Option<String>,
199 pub relationships: HashMap<String, Vec<String>>,
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub lifecycle_state: Option<String>,
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize, Default)]
208pub struct ChaosContext {
209 pub enabled: bool,
211 pub active_rules: Vec<ChaosRule>,
213 #[serde(skip_serializing_if = "Option::is_none")]
215 pub failure_injection: Option<FailureInjectionConfig>,
216 pub tags: Vec<String>,
218}
219
220#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct ChaosRule {
223 pub name: String,
225 pub rule_type: String,
227 pub enabled: bool,
229 pub config: Value,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
235pub struct FailureInjectionConfig {
236 pub enabled: bool,
238 pub http_error_probability: f64,
240 pub timeout_errors: bool,
242 pub timeout_ms: u64,
244 pub tag_configs: HashMap<String, Value>,
246}