@@ -34,6 +34,7 @@ use codex_protocol::protocol::SessionSource;
3434use codex_protocol:: protocol:: TaskStartedEvent ;
3535use codex_protocol:: protocol:: TurnAbortReason ;
3636use codex_protocol:: protocol:: TurnContextItem ;
37+ use codex_rmcp_client:: ElicitationResponse ;
3738use futures:: future:: BoxFuture ;
3839use futures:: prelude:: * ;
3940use futures:: stream:: FuturesOrdered ;
@@ -44,6 +45,7 @@ use mcp_types::ListResourcesRequestParams;
4445use mcp_types:: ListResourcesResult ;
4546use mcp_types:: ReadResourceRequestParams ;
4647use mcp_types:: ReadResourceResult ;
48+ use mcp_types:: RequestId ;
4749use serde_json;
4850use serde_json:: Value ;
4951use tokio:: sync:: Mutex ;
@@ -940,6 +942,19 @@ impl Session {
940942 }
941943 }
942944
945+ pub async fn resolve_elicitation (
946+ & self ,
947+ server_name : String ,
948+ id : RequestId ,
949+ response : ElicitationResponse ,
950+ ) -> anyhow:: Result < ( ) > {
951+ self . services
952+ . mcp_connection_manager
953+ . read ( )
954+ . await
955+ . resolve_elicitation ( server_name, id, response)
956+ }
957+
943958 /// Records input items: always append to conversation history and
944959 /// persist these response items to rollout.
945960 pub ( crate ) async fn record_conversation_items (
@@ -1413,6 +1428,13 @@ async fn submission_loop(sess: Arc<Session>, config: Arc<Config>, rx_sub: Receiv
14131428 )
14141429 . await ;
14151430 }
1431+ Op :: ResolveElicitation {
1432+ server_name,
1433+ request_id,
1434+ decision,
1435+ } => {
1436+ handlers:: resolve_elicitation ( & sess, server_name, request_id, decision) . await ;
1437+ }
14161438 Op :: Shutdown => {
14171439 if handlers:: shutdown ( & sess, sub. id . clone ( ) ) . await {
14181440 break ;
@@ -1452,6 +1474,9 @@ mod handlers {
14521474 use codex_protocol:: protocol:: TurnAbortReason ;
14531475
14541476 use codex_protocol:: user_input:: UserInput ;
1477+ use codex_rmcp_client:: ElicitationAction ;
1478+ use codex_rmcp_client:: ElicitationResponse ;
1479+ use mcp_types:: RequestId ;
14551480 use std:: sync:: Arc ;
14561481 use tracing:: info;
14571482 use tracing:: warn;
@@ -1535,6 +1560,32 @@ mod handlers {
15351560 * previous_context = Some ( turn_context) ;
15361561 }
15371562
1563+ pub async fn resolve_elicitation (
1564+ sess : & Arc < Session > ,
1565+ server_name : String ,
1566+ request_id : RequestId ,
1567+ decision : codex_protocol:: approvals:: ElicitationAction ,
1568+ ) {
1569+ let action = match decision {
1570+ codex_protocol:: approvals:: ElicitationAction :: Accept => ElicitationAction :: Accept ,
1571+ codex_protocol:: approvals:: ElicitationAction :: Decline => ElicitationAction :: Decline ,
1572+ codex_protocol:: approvals:: ElicitationAction :: Cancel => ElicitationAction :: Cancel ,
1573+ } ;
1574+ let response = ElicitationResponse {
1575+ action,
1576+ content : None ,
1577+ } ;
1578+ if let Err ( err) = sess
1579+ . resolve_elicitation ( server_name, request_id, response)
1580+ . await
1581+ {
1582+ warn ! (
1583+ error = %err,
1584+ "failed to resolve elicitation request in session"
1585+ ) ;
1586+ }
1587+ }
1588+
15381589 pub async fn exec_approval ( sess : & Arc < Session > , id : String , decision : ReviewDecision ) {
15391590 match decision {
15401591 ReviewDecision :: Abort => {
0 commit comments