1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
8#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
9#[serde(default)]
10pub struct IncidentConfig {
11 pub storage: IncidentStorageConfig,
13 pub external_integrations: crate::incidents::integrations::ExternalIntegrationConfig,
15 pub webhooks: Vec<crate::incidents::integrations::WebhookConfig>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
21#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
22pub struct IncidentStorageConfig {
23 pub use_cache: bool,
25 pub use_database: bool,
27 pub retention_days: u32,
29}
30
31impl Default for IncidentStorageConfig {
32 fn default() -> Self {
33 Self {
34 use_cache: true,
35 use_database: true,
36 retention_days: 90,
37 }
38 }
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize, Default)]
43#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
44#[serde(default)]
45pub struct ConsumerContractsConfig {
46 pub enabled: bool,
48 pub auto_register: bool,
50 pub track_usage: bool,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, Default)]
56#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
57#[serde(default)]
58pub struct ContractsConfig {
59 pub fitness_rules: Vec<FitnessRuleConfig>,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, Default)]
65#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
66#[serde(default)]
67pub struct BehavioralEconomicsConfig {
68 pub enabled: bool,
70 #[serde(default)]
72 pub rules: Vec<crate::behavioral_economics::BehaviorRule>,
73 #[serde(default = "default_behavioral_sensitivity")]
76 pub global_sensitivity: f64,
77 #[serde(default = "default_evaluation_interval_ms")]
79 pub evaluation_interval_ms: u64,
80}
81
82fn default_behavioral_sensitivity() -> f64 {
83 0.5
84}
85
86fn default_evaluation_interval_ms() -> u64 {
87 1000 }
89
90#[derive(Debug, Clone, Serialize, Deserialize, Default)]
92#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
93#[serde(default)]
94pub struct DriftLearningConfig {
95 pub enabled: bool,
97 #[serde(default)]
99 pub mode: DriftLearningMode,
100 #[serde(default = "default_learning_sensitivity")]
102 pub sensitivity: f64,
103 #[serde(default = "default_learning_decay")]
105 pub decay: f64,
106 #[serde(default = "default_min_samples")]
108 pub min_samples: u64,
109 #[serde(default)]
111 pub persona_adaptation: bool,
112 #[serde(default)]
114 pub persona_learning: HashMap<String, bool>, #[serde(default)]
117 pub endpoint_learning: HashMap<String, bool>, }
119
120#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
122#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
123#[serde(rename_all = "snake_case")]
124pub enum DriftLearningMode {
125 #[default]
127 Behavioral,
128 Statistical,
130 Hybrid,
132}
133
134fn default_learning_sensitivity() -> f64 {
135 0.2
136}
137
138fn default_learning_decay() -> f64 {
139 0.05
140}
141
142fn default_min_samples() -> u64 {
143 10
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
149pub struct FitnessRuleConfig {
150 pub name: String,
152 pub scope: String,
154 #[serde(rename = "type")]
156 pub rule_type: FitnessRuleType,
157 #[serde(skip_serializing_if = "Option::is_none")]
159 pub max_percent_increase: Option<f64>,
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub max_fields: Option<u32>,
163 #[serde(skip_serializing_if = "Option::is_none")]
165 pub max_depth: Option<u32>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
170#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
171#[serde(rename_all = "snake_case")]
172pub enum FitnessRuleType {
173 ResponseSizeDelta,
175 NoNewRequiredFields,
177 FieldCount,
179 SchemaComplexity,
181}
182
183#[derive(Debug, Clone, Serialize, Deserialize)]
185#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
186#[serde(default)]
187pub struct BehavioralCloningConfig {
188 pub enabled: bool,
190 pub database_path: Option<String>,
192 pub enable_middleware: bool,
194 pub min_sequence_frequency: f64,
196 pub min_requests_per_trace: Option<i32>,
198 #[serde(default)]
200 pub flow_recording: FlowRecordingConfig,
201 #[serde(default)]
203 pub scenario_replay: ScenarioReplayConfig,
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize)]
208#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
209#[serde(default)]
210pub struct FlowRecordingConfig {
211 pub enabled: bool,
213 pub group_by: String,
215 pub time_window_seconds: u64,
217}
218
219impl Default for FlowRecordingConfig {
220 fn default() -> Self {
221 Self {
222 enabled: true,
223 group_by: "trace_id".to_string(),
224 time_window_seconds: 300, }
226 }
227}
228
229#[derive(Debug, Clone, Serialize, Deserialize)]
231#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
232#[serde(default)]
233pub struct ScenarioReplayConfig {
234 pub enabled: bool,
236 pub default_mode: String,
238 pub active_scenarios: Vec<String>,
240}
241
242impl Default for ScenarioReplayConfig {
243 fn default() -> Self {
244 Self {
245 enabled: true,
246 default_mode: "strict".to_string(),
247 active_scenarios: Vec::new(),
248 }
249 }
250}
251
252impl Default for BehavioralCloningConfig {
253 fn default() -> Self {
254 Self {
255 enabled: false,
256 database_path: None,
257 enable_middleware: false,
258 min_sequence_frequency: 0.1, min_requests_per_trace: None,
260 flow_recording: FlowRecordingConfig::default(),
261 scenario_replay: ScenarioReplayConfig::default(),
262 }
263 }
264}