use super::profiles;
use crate::{
agent::AgentSession,
agent::cancellation::AgentCancellation,
config::McPaths,
hooks::HookRuntime,
output::{ActivityId, ActivitySender},
providers::{Provider, ProviderSelection},
thinking::ThinkingCapabilityScope,
tools::ToolRuntime,
};
use std::{
collections::BTreeMap,
path::{Path, PathBuf},
sync::Arc,
time::Duration,
};
pub(crate) struct ResolvedProviderOverride {
pub provider: Arc<dyn Provider>,
pub scope: ThinkingCapabilityScope,
}
pub(crate) type SubagentProviderResolver = Arc<
dyn Fn(&ProviderSelection, &Path) -> anyhow::Result<ResolvedProviderOverride> + Send + Sync,
>;
#[derive(Clone)]
pub(crate) struct SubagentProviderOverride {
pub(super) paths: McPaths,
pub(super) resolve_provider: SubagentProviderResolver,
}
impl SubagentProviderOverride {
pub(crate) fn new(paths: McPaths, resolve_provider: SubagentProviderResolver) -> Self {
Self {
paths,
resolve_provider,
}
}
}
#[derive(Clone)]
pub struct SubagentRunConfig {
pub parent_agent: AgentSession,
pub provider: Arc<dyn Provider>,
pub provider_override: Option<SubagentProviderOverride>,
pub parent_tools: ToolRuntime,
pub parent_cwd: PathBuf,
pub cancellation: AgentCancellation,
pub profiles: BTreeMap<String, profiles::SubagentProfile>,
pub subagent_profiles_prompt: Option<String>,
pub sessions_root: Option<PathBuf>,
pub depth: usize,
pub parent_activity_id: Option<ActivityId>,
pub activity_sender: Option<ActivitySender>,
pub inherited_hooks: Option<HookRuntime>,
pub semantic_progress_timeout: Duration,
pub schema_validation_max_retries: u64,
}