Skip to main content

rustyclaw_core/mnemo/
config.rs

1//! Mnemo configuration.
2
3use serde::{Deserialize, Serialize};
4use std::path::PathBuf;
5
6/// Configuration for the memory coprocessor.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct MnemoConfig {
9    /// Whether mnemo is enabled.
10    #[serde(default)]
11    pub enabled: bool,
12    
13    /// Path to the SQLite database.
14    /// Default: `<settings_dir>/mnemo.sqlite3`
15    #[serde(default)]
16    pub db_path: Option<PathBuf>,
17    
18    /// Number of recent messages to keep verbatim (not summarized).
19    /// Default: 6
20    #[serde(default = "default_fresh_tail")]
21    pub fresh_tail_messages: usize,
22    
23    /// Number of messages per leaf compaction chunk.
24    /// Default: 8
25    #[serde(default = "default_leaf_chunk")]
26    pub leaf_chunk_size: usize,
27    
28    /// Number of summaries per condensed compaction chunk.
29    /// Default: 4
30    #[serde(default = "default_condensed_chunk")]
31    pub condensed_chunk_size: usize,
32    
33    /// Trigger compaction when context items exceed this count.
34    /// Default: 24
35    #[serde(default = "default_threshold")]
36    pub threshold_items: usize,
37    
38    /// Summarization configuration.
39    #[serde(default)]
40    pub summarization: SummarizationConfig,
41}
42
43impl Default for MnemoConfig {
44    fn default() -> Self {
45        Self {
46            enabled: false,
47            db_path: None,
48            fresh_tail_messages: default_fresh_tail(),
49            leaf_chunk_size: default_leaf_chunk(),
50            condensed_chunk_size: default_condensed_chunk(),
51            threshold_items: default_threshold(),
52            summarization: SummarizationConfig::default(),
53        }
54    }
55}
56
57/// Summarization backend configuration.
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct SummarizationConfig {
60    /// Whether to use the main model for summarization.
61    /// If true, uses the same provider/model as the agent.
62    /// If false, uses the configured provider/model below.
63    #[serde(default = "default_use_main_model")]
64    pub use_main_model: bool,
65    
66    /// Provider for summarization (if not using main model).
67    /// Default: "openrouter"
68    #[serde(default)]
69    pub provider: Option<String>,
70    
71    /// Model for summarization (if not using main model).
72    /// Default: "google/gemini-2.5-flash"
73    #[serde(default)]
74    pub model: Option<String>,
75    
76    /// Fallback strategy when LLM is unavailable.
77    /// Options: "truncate", "disabled"
78    /// Default: "truncate"
79    #[serde(default = "default_fallback")]
80    pub fallback: String,
81    
82    /// Max characters per message in truncate fallback.
83    #[serde(default = "default_truncate_chars")]
84    pub truncate_chars: usize,
85    
86    /// Max total characters in truncate fallback.
87    #[serde(default = "default_truncate_total")]
88    pub truncate_total: usize,
89}
90
91impl Default for SummarizationConfig {
92    fn default() -> Self {
93        Self {
94            use_main_model: true,
95            provider: None,
96            model: None,
97            fallback: default_fallback(),
98            truncate_chars: default_truncate_chars(),
99            truncate_total: default_truncate_total(),
100        }
101    }
102}
103
104fn default_fresh_tail() -> usize { 6 }
105fn default_leaf_chunk() -> usize { 8 }
106fn default_condensed_chunk() -> usize { 4 }
107fn default_threshold() -> usize { 24 }
108fn default_use_main_model() -> bool { true }
109fn default_fallback() -> String { "truncate".to_string() }
110fn default_truncate_chars() -> usize { 180 }
111fn default_truncate_total() -> usize { 900 }