use crate::agent::AgentConfig;
use crate::hitl::ConfirmationProvider;
use crate::hooks::HookExecutor;
use crate::security::SecurityProvider;
use crate::skills::SkillRegistry;
use std::sync::Arc;
pub struct ChildRunContext {
pub security_provider: Option<Arc<dyn SecurityProvider>>,
pub hook_engine: Option<Arc<dyn HookExecutor>>,
pub skill_registry: Option<Arc<SkillRegistry>>,
pub tool_timeout_ms: Option<u64>,
pub max_parallel_tasks: Option<usize>,
pub max_execution_time_ms: Option<u64>,
pub circuit_breaker_threshold: Option<u32>,
pub confirmation_manager: Option<Arc<dyn ConfirmationProvider>>,
pub workspace_services: Option<Arc<crate::workspace::WorkspaceServices>>,
}
impl ChildRunContext {
pub(crate) fn apply_to(&self, config: &mut AgentConfig) {
if config.security_provider.is_none() {
config.security_provider = self.security_provider.clone();
}
if config.hook_engine.is_none() {
config.hook_engine = self.hook_engine.clone();
}
if config.skill_registry.is_none() {
config.skill_registry = self.skill_registry.clone();
}
if config.tool_timeout_ms.is_none() {
config.tool_timeout_ms = self.tool_timeout_ms;
}
if let Some(max_parallel_tasks) = self.max_parallel_tasks {
config.max_parallel_tasks = max_parallel_tasks.max(1);
}
if config.max_execution_time_ms.is_none() {
config.max_execution_time_ms = self.max_execution_time_ms;
}
if let Some(threshold) = self.circuit_breaker_threshold {
config.circuit_breaker_threshold = threshold;
}
if config.confirmation_manager.is_none() {
config.confirmation_manager = self.confirmation_manager.clone();
}
}
}