From f64fce61b32a921968667752a947232e8eb964bf Mon Sep 17 00:00:00 2001 From: jif-oai Date: Wed, 20 May 2026 15:13:54 +0200 Subject: [PATCH] feat: async approval contrib (#23690) --- .../ext/extension-api/src/contributors.rs | 17 +++++------ codex-rs/ext/extension-api/src/lib.rs | 1 - codex-rs/ext/extension-api/src/registry.rs | 28 ++++++++++++------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/codex-rs/ext/extension-api/src/contributors.rs b/codex-rs/ext/extension-api/src/contributors.rs index 8968e08573..cbe8e58244 100644 --- a/codex-rs/ext/extension-api/src/contributors.rs +++ b/codex-rs/ext/extension-api/src/contributors.rs @@ -134,18 +134,15 @@ pub trait ToolLifecycleContributor: Send + Sync { } } -/// Future returned by one claimed approval-review contribution. -pub type ApprovalReviewFuture<'a> = - std::pin::Pin + Send + 'a>>; - /// Extension contribution that can claim rendered approval-review prompts. +#[async_trait::async_trait] pub trait ApprovalReviewContributor: Send + Sync { - fn contribute<'a>( - &'a self, - session_store: &'a ExtensionData, - thread_store: &'a ExtensionData, - prompt: &'a str, - ) -> Option>; + async fn contribute( + &self, + session_store: &ExtensionData, + thread_store: &ExtensionData, + prompt: &str, + ) -> Option; } /// Future returned by one ordered turn-item contribution. diff --git a/codex-rs/ext/extension-api/src/lib.rs b/codex-rs/ext/extension-api/src/lib.rs index 373f3735a4..f9af83d38d 100644 --- a/codex-rs/ext/extension-api/src/lib.rs +++ b/codex-rs/ext/extension-api/src/lib.rs @@ -18,7 +18,6 @@ pub use codex_tools::ToolPayload; pub use codex_tools::ToolSpec; pub use codex_tools::parse_tool_input_schema; pub use contributors::ApprovalReviewContributor; -pub use contributors::ApprovalReviewFuture; pub use contributors::ConfigContributor; pub use contributors::ContextContributor; pub use contributors::PromptFragment; diff --git a/codex-rs/ext/extension-api/src/registry.rs b/codex-rs/ext/extension-api/src/registry.rs index 4577ddc048..a359726257 100644 --- a/codex-rs/ext/extension-api/src/registry.rs +++ b/codex-rs/ext/extension-api/src/registry.rs @@ -1,7 +1,8 @@ use std::sync::Arc; +use codex_protocol::protocol::ReviewDecision; + use crate::ApprovalReviewContributor; -use crate::ApprovalReviewFuture; use crate::ConfigContributor; use crate::ContextContributor; use crate::ExtensionData; @@ -171,15 +172,22 @@ impl ExtensionRegistry { /// Claims the first rendered approval-review prompt accepted by an /// installed contributor. - pub fn approval_review<'a>( - &'a self, - session_store: &'a ExtensionData, - thread_store: &'a ExtensionData, - prompt: &'a str, - ) -> Option> { - self.approval_review_contributors - .iter() - .find_map(|contributor| contributor.contribute(session_store, thread_store, prompt)) + pub async fn approval_review( + &self, + session_store: &ExtensionData, + thread_store: &ExtensionData, + prompt: &str, + ) -> Option { + for contributor in &self.approval_review_contributors { + if let Some(decision) = contributor + .contribute(session_store, thread_store, prompt) + .await + { + return Some(decision); + } + } + + None } /// Returns the registered prompt contributors.