use crate::providers::ProviderName;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct AutoDreamConfig {
pub enabled: bool,
pub min_sessions: u32,
pub min_hours: u32,
pub consolidation_provider: ProviderName,
pub max_iterations: u8,
#[serde(default = "default_autodream_llm_timeout_secs")]
pub llm_timeout_secs: u64,
}
impl Default for AutoDreamConfig {
fn default() -> Self {
Self {
enabled: false,
min_sessions: 3,
min_hours: 24,
consolidation_provider: ProviderName::default(),
max_iterations: 8,
llm_timeout_secs: default_autodream_llm_timeout_secs(),
}
}
}
fn default_autodream_llm_timeout_secs() -> u64 {
30
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct MagicDocsConfig {
pub enabled: bool,
pub min_turns_between_updates: u32,
pub update_provider: ProviderName,
pub max_iterations: u8,
}
impl Default for MagicDocsConfig {
fn default() -> Self {
Self {
enabled: false,
min_turns_between_updates: 5,
update_provider: ProviderName::default(),
max_iterations: 4,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct ReasoningConfig {
pub enabled: bool,
pub extract_provider: ProviderName,
pub distill_provider: ProviderName,
pub top_k: usize,
pub store_limit: usize,
pub max_messages: usize,
pub max_message_chars: usize,
pub context_budget_tokens: usize,
pub min_messages: usize,
pub extraction_timeout_secs: u64,
pub distill_timeout_secs: u64,
pub self_judge_window: usize,
pub min_assistant_chars: usize,
}
impl Default for ReasoningConfig {
fn default() -> Self {
Self {
enabled: false,
extract_provider: ProviderName::default(),
distill_provider: ProviderName::default(),
top_k: 3,
store_limit: 1000,
max_messages: 6,
max_message_chars: 2000,
context_budget_tokens: 500,
min_messages: 2,
extraction_timeout_secs: 30,
distill_timeout_secs: 30,
self_judge_window: 2,
min_assistant_chars: 50,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum ProbeCategory {
Recall,
Artifact,
Continuation,
Decision,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct CompactionProbeConfig {
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub probe_provider: Option<ProviderName>,
pub threshold: f32,
pub hard_fail_threshold: f32,
pub max_questions: usize,
pub timeout_secs: u64,
#[serde(default)]
pub category_weights: Option<HashMap<ProbeCategory, f32>>,
}
impl Default for CompactionProbeConfig {
fn default() -> Self {
Self {
enabled: false,
probe_provider: None,
threshold: 0.6,
hard_fail_threshold: 0.35,
max_questions: 5,
timeout_secs: 15,
category_weights: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct MemCotConfig {
pub enabled: bool,
pub distill_provider: ProviderName,
pub distill_timeout_secs: u64,
pub min_assistant_chars: usize,
pub min_distill_interval_secs: u64,
pub max_distills_per_session: u64,
pub max_state_chars: usize,
pub recall_view: RecallViewConfig,
pub zoom_out_neighbor_cap: usize,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub fast_tier_models: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RecallViewConfig {
#[default]
Head,
ZoomIn,
ZoomOut,
}
impl Default for MemCotConfig {
fn default() -> Self {
Self {
enabled: false,
distill_provider: ProviderName::default(),
distill_timeout_secs: 5,
min_assistant_chars: 200,
min_distill_interval_secs: 30,
max_distills_per_session: 50,
max_state_chars: 800,
recall_view: RecallViewConfig::Head,
zoom_out_neighbor_cap: 3,
fast_tier_models: Vec::new(),
}
}
}