use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
#[expect(
clippy::struct_field_names,
reason = "every field is a window in days; the unit belongs in the name"
)]
pub struct RetentionConfig {
#[serde(default = "default_logs_days")]
pub logs_days: u32,
#[serde(default = "default_analytics_events_days")]
pub analytics_events_days: u32,
#[serde(default)]
pub ai_request_messages_days: Option<u32>,
#[serde(default = "default_mcp_tool_executions_days")]
pub mcp_tool_executions_days: u32,
#[serde(default = "default_outbox_processed_days")]
pub outbox_processed_days: u32,
#[serde(default = "default_ai_request_payload_raw_days")]
pub ai_request_payload_raw_days: u32,
#[serde(default = "default_governance_decisions_days")]
pub governance_decisions_days: u32,
}
impl Default for RetentionConfig {
fn default() -> Self {
Self {
logs_days: default_logs_days(),
analytics_events_days: default_analytics_events_days(),
ai_request_messages_days: None,
mcp_tool_executions_days: default_mcp_tool_executions_days(),
outbox_processed_days: default_outbox_processed_days(),
ai_request_payload_raw_days: default_ai_request_payload_raw_days(),
governance_decisions_days: default_governance_decisions_days(),
}
}
}
const fn default_logs_days() -> u32 {
30
}
const fn default_analytics_events_days() -> u32 {
90
}
const fn default_mcp_tool_executions_days() -> u32 {
365
}
const fn default_outbox_processed_days() -> u32 {
7
}
const fn default_ai_request_payload_raw_days() -> u32 {
7
}
const fn default_governance_decisions_days() -> u32 {
180
}