use crate::providers::ProviderName;
use serde::{Deserialize, Serialize};
fn default_episodic_consolidation_interval_secs() -> u64 {
1800
}
fn default_episodic_consolidation_batch_size() -> usize {
30
}
fn default_episodic_consolidation_min_age_secs() -> u64 {
300
}
fn default_episodic_consolidation_dedup_jaccard_threshold() -> f32 {
0.6
}
fn default_five_signal_w_recency() -> f64 {
0.35
}
fn default_five_signal_w_relevance() -> f64 {
0.35
}
fn default_causal_bfs_max_depth() -> u32 {
10
}
fn default_neutral_causal_distance() -> u32 {
5
}
fn default_novelty_decay_rate() -> f64 {
0.1
}
fn default_five_signal_interval_seconds() -> u64 {
7200
}
fn default_five_signal_batch_size() -> usize {
500
}
fn default_five_signal_daemon_max_runtime_ms() -> u64 {
30_000
}
fn default_five_signal_promotion_score_threshold() -> f64 {
0.70
}
fn default_five_signal_demotion_score_threshold() -> f64 {
0.20
}
fn default_five_signal_top_k_per_run() -> usize {
500
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FiveSignalConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_five_signal_w_recency")]
pub w_recency: f64,
#[serde(default = "default_five_signal_w_relevance")]
pub w_relevance: f64,
#[serde(default)]
pub w_frequency: f64,
#[serde(default)]
pub w_causal: f64,
#[serde(default)]
pub w_novelty: f64,
#[serde(default = "default_causal_bfs_max_depth")]
pub causal_bfs_max_depth: u32,
#[serde(default = "default_neutral_causal_distance")]
pub neutral_causal_distance: u32,
#[serde(default = "default_novelty_decay_rate")]
pub novelty_decay_rate: f64,
#[serde(default)]
pub consolidation_daemon: FiveSignalConsolidationConfig,
}
impl Default for FiveSignalConfig {
fn default() -> Self {
Self {
enabled: false,
w_recency: default_five_signal_w_recency(),
w_relevance: default_five_signal_w_relevance(),
w_frequency: 0.0,
w_causal: 0.0,
w_novelty: 0.0,
causal_bfs_max_depth: default_causal_bfs_max_depth(),
neutral_causal_distance: default_neutral_causal_distance(),
novelty_decay_rate: default_novelty_decay_rate(),
consolidation_daemon: FiveSignalConsolidationConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FiveSignalConsolidationConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_five_signal_interval_seconds")]
pub interval_seconds: u64,
#[serde(default = "default_five_signal_batch_size")]
pub batch_size: usize,
#[serde(default = "default_five_signal_daemon_max_runtime_ms")]
pub daemon_max_runtime_ms: u64,
#[serde(default = "default_five_signal_promotion_score_threshold")]
pub promotion_score_threshold: f64,
#[serde(default = "default_five_signal_demotion_score_threshold")]
pub demotion_score_threshold: f64,
#[serde(default = "default_five_signal_top_k_per_run")]
pub top_k_per_run: usize,
}
impl Default for FiveSignalConsolidationConfig {
fn default() -> Self {
Self {
enabled: false,
interval_seconds: default_five_signal_interval_seconds(),
batch_size: default_five_signal_batch_size(),
daemon_max_runtime_ms: default_five_signal_daemon_max_runtime_ms(),
promotion_score_threshold: default_five_signal_promotion_score_threshold(),
demotion_score_threshold: default_five_signal_demotion_score_threshold(),
top_k_per_run: default_five_signal_top_k_per_run(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct EpisodicConsolidationConfig {
pub enabled: bool,
pub consolidation_provider: ProviderName,
#[serde(default = "default_episodic_consolidation_interval_secs")]
pub interval_secs: u64,
#[serde(default = "default_episodic_consolidation_batch_size")]
pub batch_size: usize,
#[serde(default = "default_episodic_consolidation_min_age_secs")]
pub min_age_secs: u64,
#[serde(default = "default_episodic_consolidation_dedup_jaccard_threshold")]
pub dedup_jaccard_threshold: f32,
}
impl Default for EpisodicConsolidationConfig {
fn default() -> Self {
Self {
enabled: false,
consolidation_provider: ProviderName::default(),
interval_secs: default_episodic_consolidation_interval_secs(),
batch_size: default_episodic_consolidation_batch_size(),
min_age_secs: default_episodic_consolidation_min_age_secs(),
dedup_jaccard_threshold: default_episodic_consolidation_dedup_jaccard_threshold(),
}
}
}