use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct IncidentConfig {
pub storage: IncidentStorageConfig,
pub external_integrations: crate::incidents::integrations::ExternalIntegrationConfig,
pub webhooks: Vec<crate::incidents::integrations::WebhookConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct IncidentStorageConfig {
pub use_cache: bool,
pub use_database: bool,
pub retention_days: u32,
}
impl Default for IncidentStorageConfig {
fn default() -> Self {
Self {
use_cache: true,
use_database: true,
retention_days: 90,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct ConsumerContractsConfig {
pub enabled: bool,
pub auto_register: bool,
pub track_usage: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct ContractsConfig {
pub fitness_rules: Vec<FitnessRuleConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct BehavioralEconomicsConfig {
pub enabled: bool,
#[serde(default)]
pub rules: Vec<crate::behavioral_economics::BehaviorRule>,
#[serde(default = "default_behavioral_sensitivity")]
pub global_sensitivity: f64,
#[serde(default = "default_evaluation_interval_ms")]
pub evaluation_interval_ms: u64,
}
fn default_behavioral_sensitivity() -> f64 {
0.5
}
fn default_evaluation_interval_ms() -> u64 {
1000 }
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct DriftLearningConfig {
pub enabled: bool,
#[serde(default)]
pub mode: DriftLearningMode,
#[serde(default = "default_learning_sensitivity")]
pub sensitivity: f64,
#[serde(default = "default_learning_decay")]
pub decay: f64,
#[serde(default = "default_min_samples")]
pub min_samples: u64,
#[serde(default)]
pub persona_adaptation: bool,
#[serde(default)]
pub persona_learning: HashMap<String, bool>, #[serde(default)]
pub endpoint_learning: HashMap<String, bool>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum DriftLearningMode {
#[default]
Behavioral,
Statistical,
Hybrid,
}
fn default_learning_sensitivity() -> f64 {
0.2
}
fn default_learning_decay() -> f64 {
0.05
}
fn default_min_samples() -> u64 {
10
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct FitnessRuleConfig {
pub name: String,
pub scope: String,
#[serde(rename = "type")]
pub rule_type: FitnessRuleType,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_percent_increase: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_fields: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_depth: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum FitnessRuleType {
ResponseSizeDelta,
NoNewRequiredFields,
FieldCount,
SchemaComplexity,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct BehavioralCloningConfig {
pub enabled: bool,
pub database_path: Option<String>,
pub enable_middleware: bool,
pub min_sequence_frequency: f64,
pub min_requests_per_trace: Option<i32>,
#[serde(default)]
pub flow_recording: FlowRecordingConfig,
#[serde(default)]
pub scenario_replay: ScenarioReplayConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct FlowRecordingConfig {
pub enabled: bool,
pub group_by: String,
pub time_window_seconds: u64,
}
impl Default for FlowRecordingConfig {
fn default() -> Self {
Self {
enabled: true,
group_by: "trace_id".to_string(),
time_window_seconds: 300, }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct ScenarioReplayConfig {
pub enabled: bool,
pub default_mode: String,
pub active_scenarios: Vec<String>,
}
impl Default for ScenarioReplayConfig {
fn default() -> Self {
Self {
enabled: true,
default_mode: "strict".to_string(),
active_scenarios: Vec::new(),
}
}
}
impl Default for BehavioralCloningConfig {
fn default() -> Self {
Self {
enabled: false,
database_path: None,
enable_middleware: false,
min_sequence_frequency: 0.1, min_requests_per_trace: None,
flow_recording: FlowRecordingConfig::default(),
scenario_replay: ScenarioReplayConfig::default(),
}
}
}