#[derive(Debug, Clone)]
pub struct SofosConfig {
pub max_messages: usize,
pub max_context_tokens: usize,
pub max_tool_iterations: u32,
pub auto_compact_token_limit: usize,
pub compaction_preserve_recent: usize,
pub tool_result_truncate_threshold: usize,
}
impl Default for SofosConfig {
fn default() -> Self {
let info = crate::api::ModelInfo::default();
Self {
max_messages: 500,
max_context_tokens: info.effective_window() as usize,
max_tool_iterations: 200,
auto_compact_token_limit: info.auto_compact_at() as usize,
compaction_preserve_recent: 20,
tool_result_truncate_threshold: 2000,
}
}
}
#[derive(Clone)]
pub struct ModelConfig {
pub model: String,
pub max_tokens: u32,
pub reasoning_effort: crate::api::ReasoningEffort,
}
impl ModelConfig {
pub fn new(
model: String,
max_tokens: u32,
reasoning_effort: crate::api::ReasoningEffort,
) -> Self {
Self {
model,
max_tokens,
reasoning_effort,
}
}
pub fn set_reasoning_effort(&mut self, effort: crate::api::ReasoningEffort) {
self.reasoning_effort = effort;
}
}
pub fn max_context_tokens_for(model: &str) -> usize {
crate::api::model_info::lookup(model).effective_window() as usize
}
pub fn auto_compact_token_limit_for(model: &str) -> usize {
crate::api::model_info::lookup(model).auto_compact_at() as usize
}
pub const SAFE_MODE_MESSAGE: &str = "[SYSTEM: Safe (read-only) mode has been enabled. \
No file modifications or bash commands are allowed. \
Available tools: list_directory, read_file, glob_files, \
search_code (when ripgrep is installed), web_fetch, web_search.]";
pub const NORMAL_MODE_MESSAGE: &str = "[SYSTEM: Normal (unrestricted) mode has been enabled. \
File modifications and bash commands are now allowed.\
All tools are available]";
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config_matches_fallback_model_info() {
let config = SofosConfig::default();
let info = crate::api::ModelInfo::default();
assert_eq!(config.max_messages, 500);
assert_eq!(config.max_context_tokens, info.effective_window() as usize);
assert_eq!(config.max_tool_iterations, 200);
assert_eq!(
config.auto_compact_token_limit,
info.auto_compact_at() as usize
);
assert_eq!(config.compaction_preserve_recent, 20);
assert_eq!(config.tool_result_truncate_threshold, 2000);
}
}