pub mod meta_learning;
pub mod adaptive;
pub mod mitigations;
pub mod audit;
pub mod rollback;
pub mod error;
use std::sync::Arc;
use tokio::sync::RwLock;
use crate::meta_learning::ThreatIncident;
pub use meta_learning::MetaLearningEngine;
pub use adaptive::{AdaptiveMitigator, MitigationStrategy};
pub use mitigations::{MitigationAction, MitigationOutcome, ThreatContext};
pub use audit::AuditLogger;
pub use rollback::RollbackManager;
pub use error::{ResponseError, Result};
#[derive(Clone)]
pub struct ResponseSystem {
meta_learner: Arc<RwLock<MetaLearningEngine>>,
mitigator: Arc<RwLock<AdaptiveMitigator>>,
audit_logger: Arc<AuditLogger>,
rollback_manager: Arc<RollbackManager>,
}
impl ResponseSystem {
pub async fn new() -> Result<Self> {
Ok(Self {
meta_learner: Arc::new(RwLock::new(MetaLearningEngine::new())),
mitigator: Arc::new(RwLock::new(AdaptiveMitigator::new())),
audit_logger: Arc::new(AuditLogger::new()),
rollback_manager: Arc::new(RollbackManager::new()),
})
}
pub async fn mitigate(&self, threat: &ThreatIncident) -> Result<MitigationOutcome> {
let context = ThreatContext::from_incident(threat);
self.audit_logger.log_mitigation_start(&context).await;
let mitigator = self.mitigator.read().await;
let result = mitigator.apply_mitigation(threat).await;
match &result {
Ok(outcome) => {
self.audit_logger.log_mitigation_success(&context, outcome).await;
drop(mitigator);
let mut mitigator = self.mitigator.write().await;
mitigator.update_effectiveness(&outcome.strategy_id, true);
}
Err(e) => {
self.audit_logger.log_mitigation_failure(&context, e).await;
self.rollback_manager.rollback_last().await?;
}
}
result
}
pub async fn learn_from_result(&self, outcome: &MitigationOutcome) -> Result<()> {
let mut meta_learner = self.meta_learner.write().await;
meta_learner.learn_from_outcome(outcome).await;
Ok(())
}
pub async fn optimize(&self, feedback: &[FeedbackSignal]) -> Result<()> {
let mut meta_learner = self.meta_learner.write().await;
meta_learner.optimize_strategy(feedback);
Ok(())
}
pub async fn metrics(&self) -> ResponseMetrics {
let meta_learner = self.meta_learner.read().await;
let mitigator = self.mitigator.read().await;
ResponseMetrics {
learned_patterns: meta_learner.learned_patterns_count(),
active_strategies: mitigator.active_strategies_count(),
total_mitigations: self.audit_logger.total_mitigations(),
successful_mitigations: self.audit_logger.successful_mitigations(),
optimization_level: meta_learner.current_optimization_level(),
}
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct FeedbackSignal {
pub strategy_id: String,
pub success: bool,
pub effectiveness_score: f64,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub context: Option<String>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ResponseMetrics {
pub learned_patterns: usize,
pub active_strategies: usize,
pub total_mitigations: u64,
pub successful_mitigations: u64,
pub optimization_level: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_response_system_creation() {
let system = ResponseSystem::new().await;
assert!(system.is_ok());
}
#[tokio::test]
async fn test_metrics_collection() {
let system = ResponseSystem::new().await.unwrap();
let metrics = system.metrics().await;
assert_eq!(metrics.learned_patterns, 0);
assert_eq!(metrics.total_mitigations, 0);
}
}