in codex-rs/exec/src/event_processor_with_jsonl_output.rs [141:316]
fn map_item_with_id(
item: ThreadItem,
make_id: impl FnOnce() -> String,
) -> Option<ExecThreadItem> {
match item {
ThreadItem::AgentMessage { text, .. } => Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::AgentMessage(AgentMessageItem { text }),
}),
ThreadItem::Reasoning { summary, .. } => {
let text = summary.join("\n");
if text.trim().is_empty() {
return None;
}
Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::Reasoning(ReasoningItem { text }),
})
}
ThreadItem::CommandExecution {
command,
aggregated_output,
exit_code,
status,
..
} => Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::CommandExecution(CommandExecutionItem {
command,
aggregated_output: aggregated_output.unwrap_or_default(),
exit_code,
status: match status {
CommandExecutionStatus::InProgress => ExecCommandExecutionStatus::InProgress,
CommandExecutionStatus::Completed => ExecCommandExecutionStatus::Completed,
CommandExecutionStatus::Failed => ExecCommandExecutionStatus::Failed,
CommandExecutionStatus::Declined => ExecCommandExecutionStatus::Declined,
},
}),
}),
ThreadItem::FileChange {
changes, status, ..
} => Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::FileChange(FileChangeItem {
changes: changes
.into_iter()
.map(|change| FileUpdateChange {
path: change.path,
kind: match change.kind {
PatchChangeKind::Add => ExecPatchChangeKind::Add,
PatchChangeKind::Delete => ExecPatchChangeKind::Delete,
PatchChangeKind::Update { .. } => ExecPatchChangeKind::Update,
},
})
.collect(),
status: match status {
PatchApplyStatus::InProgress => ExecPatchApplyStatus::InProgress,
PatchApplyStatus::Completed => ExecPatchApplyStatus::Completed,
PatchApplyStatus::Failed | PatchApplyStatus::Declined => {
ExecPatchApplyStatus::Failed
}
},
}),
}),
ThreadItem::McpToolCall {
server,
tool,
status,
arguments,
result,
error,
..
} => Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::McpToolCall(McpToolCallItem {
server,
tool,
status: match status {
McpToolCallStatus::InProgress => ExecMcpToolCallStatus::InProgress,
McpToolCallStatus::Completed => ExecMcpToolCallStatus::Completed,
McpToolCallStatus::Failed => ExecMcpToolCallStatus::Failed,
},
arguments,
result: result.map(|result| McpToolCallItemResult {
content: result.content,
meta: result.meta,
structured_content: result.structured_content,
}),
error: error.map(|error| McpToolCallItemError {
message: error.message,
}),
}),
}),
ThreadItem::CollabAgentToolCall {
tool,
sender_thread_id,
receiver_thread_ids,
prompt,
agents_states,
status,
..
} => Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::CollabToolCall(CollabToolCallItem {
tool: match tool {
CollabAgentTool::SpawnAgent => CollabTool::SpawnAgent,
CollabAgentTool::SendInput => CollabTool::SendInput,
CollabAgentTool::ResumeAgent => CollabTool::Wait,
CollabAgentTool::Wait => CollabTool::Wait,
CollabAgentTool::CloseAgent => CollabTool::CloseAgent,
},
sender_thread_id,
receiver_thread_ids,
prompt,
agents_states: agents_states
.into_iter()
.map(|(thread_id, state)| {
(
thread_id,
CollabAgentState {
status: match state.status {
codex_app_server_protocol::CollabAgentStatus::PendingInit => {
CollabAgentStatus::PendingInit
}
codex_app_server_protocol::CollabAgentStatus::Running => {
CollabAgentStatus::Running
}
codex_app_server_protocol::CollabAgentStatus::Interrupted => {
CollabAgentStatus::Interrupted
}
codex_app_server_protocol::CollabAgentStatus::Completed => {
CollabAgentStatus::Completed
}
codex_app_server_protocol::CollabAgentStatus::Errored => {
CollabAgentStatus::Errored
}
codex_app_server_protocol::CollabAgentStatus::Shutdown => {
CollabAgentStatus::Shutdown
}
codex_app_server_protocol::CollabAgentStatus::NotFound => {
CollabAgentStatus::NotFound
}
},
message: state.message,
},
)
})
.collect(),
status: match status {
CollabAgentToolCallStatus::InProgress => CollabToolCallStatus::InProgress,
CollabAgentToolCallStatus::Completed => CollabToolCallStatus::Completed,
CollabAgentToolCallStatus::Failed => CollabToolCallStatus::Failed,
},
}),
}),
ThreadItem::WebSearch {
id: raw_id,
query,
action,
} => Some(ExecThreadItem {
id: make_id(),
details: ThreadItemDetails::WebSearch(WebSearchItem {
id: raw_id,
query,
action: match action {
Some(action) => serde_json::from_value(
serde_json::to_value(action).unwrap_or_else(|_| json!("other")),
)
.unwrap_or(WebSearchAction::Other),
None => WebSearchAction::Other,
},
}),
}),
_ => None,
}
}