use super::{ToolResult, args::SubagentsArgs};
use crate::output::ToolDispatchContext;
use serde_json::Value;
pub(super) type SubagentsRunner = dyn Fn(Value, ToolDispatchContext) -> ToolResult + Send + Sync;
pub(super) struct SubagentsContext<'a> {
pub(super) runner: Option<&'a SubagentsRunner>,
}
impl SubagentsContext<'_> {
pub(super) fn run(
&self,
arguments: Value,
context: ToolDispatchContext,
) -> anyhow::Result<ToolResult> {
let tool_args: SubagentsArgs = serde_json::from_value(arguments)?;
let runtime_args = crate::subagents::SubagentsArgs::try_from(tool_args)?;
let arguments = serde_json::to_value(runtime_args)?;
self.runner
.map(|runner| runner(arguments, context))
.ok_or_else(|| anyhow::anyhow!("subagents runtime is not configured"))
}
}