use crate::function_tool::FunctionCallError; use crate::session::session::Session; use crate::session::turn_context::TurnContext; use codex_protocol::ThreadId; use codex_protocol::error::CodexErrorDetails; use std::sync::Arc; /// Resolves a single tool-facing agent target to a thread id. pub(crate) async fn resolve_agent_target( session: &Arc, turn: &Arc, target: &str, ) -> Result { register_session_root(session, turn); if let Ok(thread_id) = ThreadId::from_string(target) { return Ok(thread_id); } session .services .agent_control .resolve_agent_reference(session.thread_id, &turn.session_source, target) .await .map_err(|err| match err.details() { CodexErrorDetails::UnsupportedOperation(message) => { FunctionCallError::RespondToModel(message.clone()) } _ => FunctionCallError::RespondToModel(err.to_string()), }) } fn register_session_root(session: &Arc, turn: &Arc) { session .services .agent_control .register_session_root(session.thread_id, turn.parent_thread_id); }