Skip to main content

vtcode_config/
agent_teams.rs

1//! Agent teams configuration schema and parsing.
2
3use serde::{Deserialize, Serialize};
4
5/// Execution mode for agent teammates
6#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
7#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
8#[serde(rename_all = "snake_case")]
9#[derive(Default)]
10pub enum TeammateMode {
11    /// Auto-detect based on environment
12    #[default]
13    Auto,
14    /// Run teammates in separate tmux panes
15    Tmux,
16    /// Run teammates within the same process
17    InProcess,
18}
19
20#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
21#[derive(Debug, Clone, Deserialize, Serialize)]
22pub struct AgentTeamsConfig {
23    /// Enable agent teams (experimental)
24    #[serde(default)]
25    pub enabled: bool,
26
27    /// Maximum number of teammates in a team
28    #[serde(default = "default_max_teammates")]
29    pub max_teammates: usize,
30
31    /// Default model for agent team subagents
32    #[serde(default)]
33    pub default_model: Option<String>,
34
35    /// Teammate display mode (auto, tmux, in_process)
36    #[serde(default)]
37    pub teammate_mode: TeammateMode,
38
39    /// Override storage directory for team data
40    #[serde(default)]
41    pub storage_dir: Option<String>,
42}
43
44impl Default for AgentTeamsConfig {
45    fn default() -> Self {
46        Self {
47            enabled: false,
48            max_teammates: default_max_teammates(),
49            default_model: None,
50            teammate_mode: TeammateMode::default(),
51            storage_dir: None,
52        }
53    }
54}
55
56fn default_max_teammates() -> usize {
57    4
58}
59
60#[cfg(test)]
61mod tests {
62    use super::{AgentTeamsConfig, TeammateMode};
63
64    #[test]
65    fn defaults() {
66        let config = AgentTeamsConfig::default();
67        assert!(!config.enabled);
68        assert_eq!(config.max_teammates, 4);
69        assert_eq!(config.teammate_mode, TeammateMode::Auto);
70    }
71}