use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use crate::subagent::{HookDef, MemoryScope, PermissionMode};
fn default_max_tool_iterations() -> usize {
10
}
fn default_auto_update_check() -> bool {
true
}
fn default_focus_compression_interval() -> usize {
12
}
fn default_focus_reminder_interval() -> usize {
15
}
fn default_focus_min_messages_per_focus() -> usize {
8
}
fn default_focus_max_knowledge_tokens() -> usize {
4096
}
fn default_max_tool_retries() -> usize {
2
}
fn default_max_retry_duration_secs() -> u64 {
30
}
fn default_tool_repeat_threshold() -> usize {
2
}
fn default_tool_filter_top_k() -> usize {
6
}
fn default_tool_filter_min_description_words() -> usize {
5
}
fn default_tool_filter_always_on() -> Vec<String> {
vec![
"memory_search".into(),
"memory_save".into(),
"load_skill".into(),
"bash".into(),
"read".into(),
"edit".into(),
]
}
fn default_instruction_auto_detect() -> bool {
true
}
fn default_max_concurrent() -> usize {
5
}
fn default_transcript_enabled() -> bool {
true
}
fn default_transcript_max_files() -> usize {
50
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct FocusConfig {
pub enabled: bool,
#[serde(default = "default_focus_compression_interval")]
pub compression_interval: usize,
#[serde(default = "default_focus_reminder_interval")]
pub reminder_interval: usize,
#[serde(default = "default_focus_min_messages_per_focus")]
pub min_messages_per_focus: usize,
#[serde(default = "default_focus_max_knowledge_tokens")]
pub max_knowledge_tokens: usize,
}
impl Default for FocusConfig {
fn default() -> Self {
Self {
enabled: false,
compression_interval: default_focus_compression_interval(),
reminder_interval: default_focus_reminder_interval(),
min_messages_per_focus: default_focus_min_messages_per_focus(),
max_knowledge_tokens: default_focus_max_knowledge_tokens(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct ToolFilterConfig {
pub enabled: bool,
#[serde(default = "default_tool_filter_top_k")]
pub top_k: usize,
#[serde(default = "default_tool_filter_always_on")]
pub always_on: Vec<String>,
#[serde(default = "default_tool_filter_min_description_words")]
pub min_description_words: usize,
}
impl Default for ToolFilterConfig {
fn default() -> Self {
Self {
enabled: false,
top_k: default_tool_filter_top_k(),
always_on: default_tool_filter_always_on(),
min_description_words: default_tool_filter_min_description_words(),
}
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct AgentConfig {
pub name: String,
#[serde(default = "default_max_tool_iterations")]
pub max_tool_iterations: usize,
#[serde(default = "default_auto_update_check")]
pub auto_update_check: bool,
#[serde(default)]
pub instruction_files: Vec<std::path::PathBuf>,
#[serde(default = "default_instruction_auto_detect")]
pub instruction_auto_detect: bool,
#[serde(default = "default_max_tool_retries")]
pub max_tool_retries: usize,
#[serde(default = "default_tool_repeat_threshold")]
pub tool_repeat_threshold: usize,
#[serde(default = "default_max_retry_duration_secs")]
pub max_retry_duration_secs: u64,
#[serde(default)]
pub focus: FocusConfig,
#[serde(default)]
pub tool_filter: ToolFilterConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct SubAgentConfig {
pub enabled: bool,
#[serde(default = "default_max_concurrent")]
pub max_concurrent: usize,
pub extra_dirs: Vec<PathBuf>,
#[serde(default)]
pub user_agents_dir: Option<PathBuf>,
pub default_permission_mode: Option<PermissionMode>,
#[serde(default)]
pub default_disallowed_tools: Vec<String>,
#[serde(default)]
pub allow_bypass_permissions: bool,
#[serde(default)]
pub default_memory_scope: Option<MemoryScope>,
#[serde(default)]
pub hooks: SubAgentLifecycleHooks,
#[serde(default)]
pub transcript_dir: Option<PathBuf>,
#[serde(default = "default_transcript_enabled")]
pub transcript_enabled: bool,
#[serde(default = "default_transcript_max_files")]
pub transcript_max_files: usize,
}
impl Default for SubAgentConfig {
fn default() -> Self {
Self {
enabled: false,
max_concurrent: default_max_concurrent(),
extra_dirs: Vec::new(),
user_agents_dir: None,
default_permission_mode: None,
default_disallowed_tools: Vec::new(),
allow_bypass_permissions: false,
default_memory_scope: None,
hooks: SubAgentLifecycleHooks::default(),
transcript_dir: None,
transcript_enabled: default_transcript_enabled(),
transcript_max_files: default_transcript_max_files(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(default)]
pub struct SubAgentLifecycleHooks {
pub start: Vec<HookDef>,
pub stop: Vec<HookDef>,
}