use std::{collections::BTreeMap, path::PathBuf};
use serde::{Deserialize, Serialize};
pub use zeph_config::{AcpSubagentsConfig, SubagentPresetConfig};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SubagentConfig {
pub command: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub process_cwd: Option<PathBuf>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_cwd: Option<PathBuf>,
#[serde(default)]
pub env: BTreeMap<String, String>,
#[serde(default)]
pub inherit_env: Vec<String>,
#[serde(default = "default_handshake_timeout_secs")]
pub handshake_timeout_secs: u64,
#[serde(default = "default_session_timeout_secs")]
pub session_timeout_secs: u64,
#[serde(default = "default_prompt_timeout_secs")]
pub prompt_timeout_secs: u64,
#[serde(default)]
pub auto_approve_permissions: bool,
}
impl Default for SubagentConfig {
fn default() -> Self {
Self {
command: String::new(),
process_cwd: None,
session_cwd: None,
env: BTreeMap::new(),
inherit_env: Vec::new(),
handshake_timeout_secs: default_handshake_timeout_secs(),
session_timeout_secs: default_session_timeout_secs(),
prompt_timeout_secs: default_prompt_timeout_secs(),
auto_approve_permissions: false,
}
}
}
impl SubagentConfig {
#[must_use]
pub fn effective_process_cwd(&self) -> PathBuf {
self.process_cwd
.clone()
.unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")))
}
#[must_use]
pub fn effective_session_cwd(&self) -> PathBuf {
self.session_cwd
.clone()
.or_else(|| self.process_cwd.clone())
.unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")))
}
}
fn default_handshake_timeout_secs() -> u64 {
30
}
fn default_session_timeout_secs() -> u64 {
1800
}
fn default_prompt_timeout_secs() -> u64 {
600
}