1pub mod meta_learning;
29pub mod adaptive;
30pub mod mitigations;
31pub mod audit;
32pub mod rollback;
33pub mod error;
34
35use std::sync::Arc;
36use tokio::sync::RwLock;
37use crate::meta_learning::ThreatIncident;
38
39pub use meta_learning::MetaLearningEngine;
40pub use adaptive::{AdaptiveMitigator, MitigationStrategy};
41pub use mitigations::{MitigationAction, MitigationOutcome, ThreatContext};
42pub use audit::AuditLogger;
43pub use rollback::RollbackManager;
44pub use error::{ResponseError, Result};
45
46#[derive(Clone)]
48pub struct ResponseSystem {
49 meta_learner: Arc<RwLock<MetaLearningEngine>>,
50 mitigator: Arc<RwLock<AdaptiveMitigator>>,
51 audit_logger: Arc<AuditLogger>,
52 rollback_manager: Arc<RollbackManager>,
53}
54
55impl ResponseSystem {
56 pub async fn new() -> Result<Self> {
58 Ok(Self {
59 meta_learner: Arc::new(RwLock::new(MetaLearningEngine::new())),
60 mitigator: Arc::new(RwLock::new(AdaptiveMitigator::new())),
61 audit_logger: Arc::new(AuditLogger::new()),
62 rollback_manager: Arc::new(RollbackManager::new()),
63 })
64 }
65
66 pub async fn mitigate(&self, threat: &ThreatIncident) -> Result<MitigationOutcome> {
68 let context = ThreatContext::from_incident(threat);
69
70 self.audit_logger.log_mitigation_start(&context).await;
72
73 let mitigator = self.mitigator.read().await;
75 let result = mitigator.apply_mitigation(threat).await;
76
77 match &result {
78 Ok(outcome) => {
79 self.audit_logger.log_mitigation_success(&context, outcome).await;
80
81 drop(mitigator);
83 let mut mitigator = self.mitigator.write().await;
84 mitigator.update_effectiveness(&outcome.strategy_id, true);
85 }
86 Err(e) => {
87 self.audit_logger.log_mitigation_failure(&context, e).await;
88
89 self.rollback_manager.rollback_last().await?;
91 }
92 }
93
94 result
95 }
96
97 pub async fn learn_from_result(&self, outcome: &MitigationOutcome) -> Result<()> {
99 let mut meta_learner = self.meta_learner.write().await;
100 meta_learner.learn_from_outcome(outcome).await;
101 Ok(())
102 }
103
104 pub async fn optimize(&self, feedback: &[FeedbackSignal]) -> Result<()> {
106 let mut meta_learner = self.meta_learner.write().await;
107 meta_learner.optimize_strategy(feedback);
108 Ok(())
109 }
110
111 pub async fn metrics(&self) -> ResponseMetrics {
113 let meta_learner = self.meta_learner.read().await;
114 let mitigator = self.mitigator.read().await;
115
116 ResponseMetrics {
117 learned_patterns: meta_learner.learned_patterns_count(),
118 active_strategies: mitigator.active_strategies_count(),
119 total_mitigations: self.audit_logger.total_mitigations(),
120 successful_mitigations: self.audit_logger.successful_mitigations(),
121 optimization_level: meta_learner.current_optimization_level(),
122 }
123 }
124}
125
126#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
128pub struct FeedbackSignal {
129 pub strategy_id: String,
130 pub success: bool,
131 pub effectiveness_score: f64,
132 pub timestamp: chrono::DateTime<chrono::Utc>,
133 pub context: Option<String>,
134}
135
136#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
138pub struct ResponseMetrics {
139 pub learned_patterns: usize,
140 pub active_strategies: usize,
141 pub total_mitigations: u64,
142 pub successful_mitigations: u64,
143 pub optimization_level: usize,
144}
145
146#[cfg(test)]
147mod tests {
148 use super::*;
149
150 #[tokio::test]
151 async fn test_response_system_creation() {
152 let system = ResponseSystem::new().await;
153 assert!(system.is_ok());
154 }
155
156 #[tokio::test]
157 async fn test_metrics_collection() {
158 let system = ResponseSystem::new().await.unwrap();
159 let metrics = system.metrics().await;
160
161 assert_eq!(metrics.learned_patterns, 0);
162 assert_eq!(metrics.total_mitigations, 0);
163 }
164}