use crate::constants::{defaults, tools};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct AutomationConfig {
#[serde(default)]
pub full_auto: FullAutoConfig,
#[serde(default)]
pub scheduled_tasks: ScheduledTasksConfig,
#[serde(default)]
pub loop_engine: LoopEngineConfig,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ScheduledTasksConfig {
#[serde(default = "default_scheduled_tasks_enabled")]
pub enabled: bool,
}
impl Default for ScheduledTasksConfig {
fn default() -> Self {
Self {
enabled: default_scheduled_tasks_enabled(),
}
}
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FullAutoConfig {
#[serde(default = "default_full_auto_enabled")]
pub enabled: bool,
#[serde(default = "default_full_auto_max_turns")]
pub max_turns: usize,
#[serde(default = "default_full_auto_allowed_tools")]
pub allowed_tools: Vec<String>,
#[serde(default = "default_require_profile_ack")]
pub require_profile_ack: bool,
#[serde(default)]
pub profile_path: Option<PathBuf>,
#[serde(default)]
pub verify_mutations: bool,
}
impl Default for FullAutoConfig {
fn default() -> Self {
Self {
enabled: default_full_auto_enabled(),
max_turns: default_full_auto_max_turns(),
allowed_tools: default_full_auto_allowed_tools(),
require_profile_ack: default_require_profile_ack(),
profile_path: None,
verify_mutations: false,
}
}
}
fn default_full_auto_enabled() -> bool {
false
}
fn default_scheduled_tasks_enabled() -> bool {
false
}
fn default_full_auto_allowed_tools() -> Vec<String> {
vec![
tools::READ_FILE.to_string(),
tools::UNIFIED_SEARCH.to_string(),
]
}
fn default_require_profile_ack() -> bool {
true
}
fn default_full_auto_max_turns() -> usize {
defaults::DEFAULT_FULL_AUTO_MAX_TURNS
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct LoopEngineConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub max_iterations: Option<usize>,
#[serde(default = "default_reconcile_on_complete")]
pub reconcile_on_complete: bool,
#[serde(default)]
pub preload_skills: Vec<String>,
}
impl Default for LoopEngineConfig {
fn default() -> Self {
Self {
enabled: false,
max_iterations: None,
reconcile_on_complete: default_reconcile_on_complete(),
preload_skills: Vec::new(),
}
}
}
fn default_reconcile_on_complete() -> bool {
true
}
pub fn loop_engine_enabled(config: &AutomationConfig) -> bool {
if std::env::var("VTCODE_DISABLE_LOOP_ENGINE").is_ok() {
return false;
}
config.loop_engine.enabled
}