mirror of
https://github.com/openai/codex.git
synced 2026-10-22 17:58:46 +00:00
Return agent snapshots from close_agent (#47252)
## What changed Return an `AgentInfo` snapshot captured before shutdown, including metadata for known unloaded agents. Use the snapshot's status and metadata in the tool's completion event and its status in `previous_status`, replacing the separate status subscription. Preserve the pre-close status for error reporting when shutdown removes the target before a descendant fails to close. Propagate unexpected thread lookup errors before attempting shutdown. GitOrigin-RevId: bdbd877aaf0389e830d6a7e84a5e14bb7d47277a
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
use super::*;
|
||||
use crate::tools::handlers::multi_agents_spec::create_close_agent_tool_v1;
|
||||
use codex_protocol::error::CodexErrorDetails;
|
||||
use codex_tools::ToolSpec;
|
||||
|
||||
pub(crate) struct Handler;
|
||||
@@ -43,7 +42,6 @@ async fn handle_close_agent(
|
||||
let args: CloseAgentArgs = parse_arguments(&arguments)?;
|
||||
let agent_id = parse_agent_id_target(&args.target)?;
|
||||
let receiver_agent = session.services.agent_control.get_agent_metadata(agent_id);
|
||||
let known_agent = receiver_agent.is_some();
|
||||
let receiver_agent = receiver_agent.unwrap_or_default();
|
||||
session
|
||||
.emit_turn_item_started(
|
||||
@@ -62,48 +60,16 @@ async fn handle_close_agent(
|
||||
}),
|
||||
)
|
||||
.await;
|
||||
let status = match session
|
||||
.services
|
||||
.agent_control
|
||||
.subscribe_status(agent_id)
|
||||
.await
|
||||
{
|
||||
Ok(mut status_rx) => status_rx.borrow_and_update().clone(),
|
||||
Err(err)
|
||||
if known_agent && matches!(err.details(), CodexErrorDetails::ThreadNotFound(_)) =>
|
||||
{
|
||||
session.services.agent_control.get_status(agent_id).await
|
||||
}
|
||||
Err(err) => {
|
||||
let status = session.services.agent_control.get_status(agent_id).await;
|
||||
session
|
||||
.emit_turn_item_completed(
|
||||
&turn,
|
||||
TurnItem::CollabAgentToolCall(CollabAgentToolCallItem {
|
||||
id: call_id.clone(),
|
||||
tool: CollabAgentTool::CloseAgent,
|
||||
status: collab_tool_call_status(&status, Some(agent_id)),
|
||||
sender_thread_id: session.thread_id(),
|
||||
receiver_thread_ids: vec![agent_id],
|
||||
receiver_agents: vec![CollabAgentRef {
|
||||
thread_id: agent_id,
|
||||
agent_nickname: receiver_agent.agent_nickname.clone(),
|
||||
agent_role: receiver_agent.agent_role.clone(),
|
||||
}],
|
||||
prompt: None,
|
||||
model: None,
|
||||
reasoning_effort: None,
|
||||
agents_states: [(agent_id, status)].into_iter().collect(),
|
||||
}),
|
||||
)
|
||||
.await;
|
||||
return Err(collab_agent_error(agent_id, err));
|
||||
}
|
||||
// Shutdown may remove the target before a descendant fails to close.
|
||||
let previous_status = session.services.agent_control.get_status(agent_id).await;
|
||||
let result = Box::pin(session.services.agent_control.close_agent(agent_id)).await;
|
||||
let (status, receiver_agent) = match &result {
|
||||
Ok(snapshot) => (
|
||||
snapshot.status().cloned().unwrap_or(AgentStatus::NotFound),
|
||||
snapshot.metadata().clone(),
|
||||
),
|
||||
Err(_) => (previous_status, receiver_agent),
|
||||
};
|
||||
let result = Box::pin(session.services.agent_control.close_agent(agent_id))
|
||||
.await
|
||||
.map_err(|err| collab_agent_error(agent_id, err))
|
||||
.map(|_| ());
|
||||
session
|
||||
.emit_turn_item_completed(
|
||||
&turn,
|
||||
@@ -125,7 +91,7 @@ async fn handle_close_agent(
|
||||
}),
|
||||
)
|
||||
.await;
|
||||
result?;
|
||||
result.map_err(|err| collab_agent_error(agent_id, err))?;
|
||||
|
||||
Ok(CloseAgentResult {
|
||||
previous_status: status,
|
||||
|
||||
Reference in New Issue
Block a user