use codex_extension_api::ToolCallOutcome; use codex_extension_api::ToolCallSource as ExtensionToolCallSource; use codex_extension_api::ToolFinishInput; use codex_extension_api::ToolStartInput; use codex_tools::ToolName; use crate::session::session::Session; use crate::session::turn_context::TurnContext; use crate::tools::context::ToolCallSource; use crate::tools::context::ToolInvocation; pub(crate) async fn notify_tool_start(invocation: &ToolInvocation) { for contributor in invocation .session .services .extensions .tool_lifecycle_contributors() { contributor .on_tool_start(ToolStartInput { session_store: &invocation.session.services.session_extension_data, thread_store: &invocation.session.services.thread_extension_data, turn_store: invocation.turn.extension_data.as_ref(), turn_id: invocation.turn.sub_id.as_str(), call_id: invocation.call_id.as_str(), tool_name: &invocation.tool_name, source: extension_tool_call_source(invocation.source.clone()), }) .await; } } pub(crate) async fn notify_tool_finish(invocation: &ToolInvocation, outcome: ToolCallOutcome) { notify_tool_finish_parts( invocation.session.as_ref(), invocation.turn.as_ref(), invocation.call_id.as_str(), &invocation.tool_name, invocation.source.clone(), outcome, ) .await; } pub(crate) async fn notify_tool_aborted( session: &Session, turn: &TurnContext, call_id: &str, tool_name: &ToolName, source: ToolCallSource, ) { notify_tool_finish_parts( session, turn, call_id, tool_name, source, ToolCallOutcome::Aborted, ) .await; } async fn notify_tool_finish_parts( session: &Session, turn: &TurnContext, call_id: &str, tool_name: &ToolName, source: ToolCallSource, outcome: ToolCallOutcome, ) { for contributor in session.services.extensions.tool_lifecycle_contributors() { contributor .on_tool_finish(ToolFinishInput { session_store: &session.services.session_extension_data, thread_store: &session.services.thread_extension_data, turn_store: turn.extension_data.as_ref(), turn_id: turn.sub_id.as_str(), call_id, tool_name, source: extension_tool_call_source(source.clone()), outcome, }) .await; } } fn extension_tool_call_source(source: ToolCallSource) -> ExtensionToolCallSource { match source { ToolCallSource::Direct => ExtensionToolCallSource::Direct, ToolCallSource::CodeMode { cell_id, runtime_tool_call_id, } => ExtensionToolCallSource::CodeMode { cell_id, runtime_tool_call_id, }, } }