vv-agent 0.4.8

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use std::collections::BTreeSet;
use std::fmt;
use std::path::PathBuf;
use std::sync::Arc;

use crate::memory::session::SessionMemory;

pub type SummaryCallback =
    Arc<dyn Fn(&str, Option<&str>, Option<&str>) -> Option<String> + Send + Sync + 'static>;

#[derive(Clone)]
pub struct MemoryManagerConfig {
    pub compact_threshold: u64,
    pub keep_recent_messages: usize,
    pub model: String,
    pub model_context_window: u64,
    pub reserved_output_tokens: u64,
    pub autocompact_buffer_tokens: u64,
    pub language: String,
    pub warning_threshold_percentage: u8,
    pub include_memory_warning: bool,
    pub summary_event_limit: usize,
    pub summary_backend: Option<String>,
    pub summary_model: Option<String>,
    pub summary_callback: Option<SummaryCallback>,
    pub tool_result_compact_threshold: usize,
    pub tool_result_keep_last: usize,
    pub tool_result_excerpt_head: usize,
    pub tool_result_excerpt_tail: usize,
    pub tool_calls_keep_last: usize,
    pub assistant_no_tool_keep_last: usize,
    pub tool_result_artifact_dir: PathBuf,
    pub microcompact_trigger_ratio: f64,
    pub microcompact_keep_recent_cycles: usize,
    pub microcompact_min_result_length: usize,
    pub microcompact_compactable_tools: Option<BTreeSet<String>>,
    pub workspace: Option<PathBuf>,
    pub session_memory: Option<SessionMemory>,
}

impl fmt::Debug for MemoryManagerConfig {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        formatter
            .debug_struct("MemoryManagerConfig")
            .field("compact_threshold", &self.compact_threshold)
            .field("keep_recent_messages", &self.keep_recent_messages)
            .field("model", &self.model)
            .field("model_context_window", &self.model_context_window)
            .field("reserved_output_tokens", &self.reserved_output_tokens)
            .field("autocompact_buffer_tokens", &self.autocompact_buffer_tokens)
            .field("language", &self.language)
            .field(
                "warning_threshold_percentage",
                &self.warning_threshold_percentage,
            )
            .field("include_memory_warning", &self.include_memory_warning)
            .field("summary_event_limit", &self.summary_event_limit)
            .field("summary_backend", &self.summary_backend)
            .field("summary_model", &self.summary_model)
            .field(
                "summary_callback",
                &self.summary_callback.as_ref().map(|_| "<callback>"),
            )
            .field(
                "tool_result_compact_threshold",
                &self.tool_result_compact_threshold,
            )
            .field("tool_result_keep_last", &self.tool_result_keep_last)
            .field("tool_result_excerpt_head", &self.tool_result_excerpt_head)
            .field("tool_result_excerpt_tail", &self.tool_result_excerpt_tail)
            .field("tool_calls_keep_last", &self.tool_calls_keep_last)
            .field(
                "assistant_no_tool_keep_last",
                &self.assistant_no_tool_keep_last,
            )
            .field("tool_result_artifact_dir", &self.tool_result_artifact_dir)
            .field(
                "microcompact_trigger_ratio",
                &self.microcompact_trigger_ratio,
            )
            .field(
                "microcompact_keep_recent_cycles",
                &self.microcompact_keep_recent_cycles,
            )
            .field(
                "microcompact_min_result_length",
                &self.microcompact_min_result_length,
            )
            .field(
                "microcompact_compactable_tools",
                &self.microcompact_compactable_tools,
            )
            .field("workspace", &self.workspace)
            .field("session_memory", &self.session_memory)
            .finish()
    }
}

impl Default for MemoryManagerConfig {
    fn default() -> Self {
        Self {
            compact_threshold: 128_000,
            keep_recent_messages: 10,
            model: String::new(),
            model_context_window: 200_000,
            reserved_output_tokens: 16_000,
            autocompact_buffer_tokens: 13_000,
            language: "zh-CN".to_string(),
            warning_threshold_percentage: 90,
            include_memory_warning: false,
            summary_event_limit: 40,
            summary_backend: None,
            summary_model: None,
            summary_callback: None,
            tool_result_compact_threshold: 2_000,
            tool_result_keep_last: 3,
            tool_result_excerpt_head: 200,
            tool_result_excerpt_tail: 200,
            tool_calls_keep_last: 3,
            assistant_no_tool_keep_last: 1,
            tool_result_artifact_dir: PathBuf::from(".memory/tool_results"),
            microcompact_trigger_ratio: 0.75,
            microcompact_keep_recent_cycles: 3,
            microcompact_min_result_length: 500,
            microcompact_compactable_tools: None,
            workspace: None,
            session_memory: None,
        }
    }
}