mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Removed remaining core events from tui_app_server (#14942)
This commit is contained in:
committed by
GitHub
Unverified
parent
58ac2a8773
commit
347c6b12ec
File diff suppressed because it is too large
Load Diff
@@ -7,16 +7,12 @@ use codex_app_server_protocol::FileChangeApprovalDecision;
|
||||
use codex_app_server_protocol::FileChangeRequestApprovalResponse;
|
||||
use codex_app_server_protocol::GrantedPermissionProfile;
|
||||
use codex_app_server_protocol::McpServerElicitationAction;
|
||||
use codex_app_server_protocol::McpServerElicitationRequestParams;
|
||||
use codex_app_server_protocol::McpServerElicitationRequestResponse;
|
||||
use codex_app_server_protocol::PermissionsRequestApprovalResponse;
|
||||
use codex_app_server_protocol::RequestId as AppServerRequestId;
|
||||
use codex_app_server_protocol::ServerRequest;
|
||||
use codex_app_server_protocol::ToolRequestUserInputResponse;
|
||||
use codex_protocol::approvals::ElicitationRequest;
|
||||
use codex_protocol::mcp::RequestId as McpRequestId;
|
||||
use codex_protocol::protocol::Event;
|
||||
use codex_protocol::protocol::EventMsg;
|
||||
use codex_protocol::protocol::ReviewDecision;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
@@ -37,9 +33,7 @@ pub(super) struct PendingAppServerRequests {
|
||||
file_change_approvals: HashMap<String, AppServerRequestId>,
|
||||
permissions_approvals: HashMap<String, AppServerRequestId>,
|
||||
user_inputs: HashMap<String, AppServerRequestId>,
|
||||
mcp_pending_by_matcher: HashMap<McpServerMatcher, AppServerRequestId>,
|
||||
mcp_legacy_by_matcher: HashMap<McpServerMatcher, McpLegacyRequestKey>,
|
||||
mcp_legacy_requests: HashMap<McpLegacyRequestKey, AppServerRequestId>,
|
||||
mcp_requests: HashMap<McpLegacyRequestKey, AppServerRequestId>,
|
||||
}
|
||||
|
||||
impl PendingAppServerRequests {
|
||||
@@ -48,9 +42,7 @@ impl PendingAppServerRequests {
|
||||
self.file_change_approvals.clear();
|
||||
self.permissions_approvals.clear();
|
||||
self.user_inputs.clear();
|
||||
self.mcp_pending_by_matcher.clear();
|
||||
self.mcp_legacy_by_matcher.clear();
|
||||
self.mcp_legacy_requests.clear();
|
||||
self.mcp_requests.clear();
|
||||
}
|
||||
|
||||
pub(super) fn note_server_request(
|
||||
@@ -82,14 +74,13 @@ impl PendingAppServerRequests {
|
||||
None
|
||||
}
|
||||
ServerRequest::McpServerElicitationRequest { request_id, params } => {
|
||||
let matcher = McpServerMatcher::from_v2(params);
|
||||
if let Some(legacy_key) = self.mcp_legacy_by_matcher.remove(&matcher) {
|
||||
self.mcp_legacy_requests
|
||||
.insert(legacy_key, request_id.clone());
|
||||
} else {
|
||||
self.mcp_pending_by_matcher
|
||||
.insert(matcher, request_id.clone());
|
||||
}
|
||||
self.mcp_requests.insert(
|
||||
McpLegacyRequestKey {
|
||||
server_name: params.server_name.clone(),
|
||||
request_id: app_server_request_id_to_mcp_request_id(request_id),
|
||||
},
|
||||
request_id.clone(),
|
||||
);
|
||||
None
|
||||
}
|
||||
ServerRequest::DynamicToolCall { request_id, .. } => {
|
||||
@@ -119,27 +110,6 @@ impl PendingAppServerRequests {
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn note_legacy_event(&mut self, event: &Event) {
|
||||
let EventMsg::ElicitationRequest(request) = &event.msg else {
|
||||
return;
|
||||
};
|
||||
|
||||
let matcher = McpServerMatcher::from_core(
|
||||
&request.server_name,
|
||||
request.turn_id.as_deref(),
|
||||
&request.request,
|
||||
);
|
||||
let legacy_key = McpLegacyRequestKey {
|
||||
server_name: request.server_name.clone(),
|
||||
request_id: request.id.clone(),
|
||||
};
|
||||
if let Some(request_id) = self.mcp_pending_by_matcher.remove(&matcher) {
|
||||
self.mcp_legacy_requests.insert(legacy_key, request_id);
|
||||
} else {
|
||||
self.mcp_legacy_by_matcher.insert(matcher, legacy_key);
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn take_resolution<T>(
|
||||
&mut self,
|
||||
op: T,
|
||||
@@ -233,7 +203,7 @@ impl PendingAppServerRequests {
|
||||
content,
|
||||
meta,
|
||||
} => self
|
||||
.mcp_legacy_requests
|
||||
.mcp_requests
|
||||
.remove(&McpLegacyRequestKey {
|
||||
server_name: server_name.to_string(),
|
||||
request_id: request_id.clone(),
|
||||
@@ -274,64 +244,7 @@ impl PendingAppServerRequests {
|
||||
self.permissions_approvals
|
||||
.retain(|_, value| value != request_id);
|
||||
self.user_inputs.retain(|_, value| value != request_id);
|
||||
self.mcp_pending_by_matcher
|
||||
.retain(|_, value| value != request_id);
|
||||
self.mcp_legacy_requests
|
||||
.retain(|_, value| value != request_id);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
struct McpServerMatcher {
|
||||
server_name: String,
|
||||
turn_id: Option<String>,
|
||||
request: String,
|
||||
}
|
||||
|
||||
impl McpServerMatcher {
|
||||
fn from_v2(params: &McpServerElicitationRequestParams) -> Self {
|
||||
Self {
|
||||
server_name: params.server_name.clone(),
|
||||
turn_id: params.turn_id.clone(),
|
||||
request: serde_json::to_string(
|
||||
&serde_json::to_value(¶ms.request).unwrap_or(serde_json::Value::Null),
|
||||
)
|
||||
.unwrap_or_else(|_| "null".to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
fn from_core(server_name: &str, turn_id: Option<&str>, request: &ElicitationRequest) -> Self {
|
||||
let request = match request {
|
||||
ElicitationRequest::Form {
|
||||
meta,
|
||||
message,
|
||||
requested_schema,
|
||||
} => serde_json::to_string(&serde_json::json!({
|
||||
"mode": "form",
|
||||
"_meta": meta,
|
||||
"message": message,
|
||||
"requestedSchema": requested_schema,
|
||||
}))
|
||||
.unwrap_or_else(|_| "null".to_string()),
|
||||
ElicitationRequest::Url {
|
||||
meta,
|
||||
message,
|
||||
url,
|
||||
elicitation_id,
|
||||
} => serde_json::to_string(&serde_json::json!({
|
||||
"mode": "url",
|
||||
"_meta": meta,
|
||||
"message": message,
|
||||
"url": url,
|
||||
"elicitationId": elicitation_id,
|
||||
}))
|
||||
.unwrap_or_else(|_| "null".to_string()),
|
||||
};
|
||||
Self {
|
||||
server_name: server_name.to_string(),
|
||||
turn_id: turn_id.map(str::to_string),
|
||||
request,
|
||||
}
|
||||
self.mcp_requests.retain(|_, value| value != request_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -341,6 +254,13 @@ struct McpLegacyRequestKey {
|
||||
request_id: McpRequestId,
|
||||
}
|
||||
|
||||
fn app_server_request_id_to_mcp_request_id(request_id: &AppServerRequestId) -> McpRequestId {
|
||||
match request_id {
|
||||
AppServerRequestId::String(value) => McpRequestId::String(value.clone()),
|
||||
AppServerRequestId::Integer(value) => McpRequestId::Integer(*value),
|
||||
}
|
||||
}
|
||||
|
||||
fn file_change_decision(decision: &ReviewDecision) -> Result<FileChangeApprovalDecision, String> {
|
||||
match decision {
|
||||
ReviewDecision::Approved => Ok(FileChangeApprovalDecision::Accept),
|
||||
@@ -374,12 +294,8 @@ mod tests {
|
||||
use codex_app_server_protocol::ToolRequestUserInputParams;
|
||||
use codex_app_server_protocol::ToolRequestUserInputResponse;
|
||||
use codex_protocol::approvals::ElicitationAction;
|
||||
use codex_protocol::approvals::ElicitationRequest;
|
||||
use codex_protocol::approvals::ElicitationRequestEvent;
|
||||
use codex_protocol::approvals::ExecPolicyAmendment;
|
||||
use codex_protocol::mcp::RequestId as McpRequestId;
|
||||
use codex_protocol::protocol::Event;
|
||||
use codex_protocol::protocol::EventMsg;
|
||||
use codex_protocol::protocol::Op;
|
||||
use codex_protocol::protocol::ReviewDecision;
|
||||
use pretty_assertions::assert_eq;
|
||||
@@ -515,26 +431,9 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn correlates_mcp_elicitation_between_legacy_event_and_server_request() {
|
||||
fn correlates_mcp_elicitation_server_request_with_resolution() {
|
||||
let mut pending = PendingAppServerRequests::default();
|
||||
|
||||
pending.note_legacy_event(&Event {
|
||||
id: "event-1".to_string(),
|
||||
msg: EventMsg::ElicitationRequest(ElicitationRequestEvent {
|
||||
turn_id: Some("turn-1".to_string()),
|
||||
server_name: "example".to_string(),
|
||||
id: McpRequestId::String("mcp-1".to_string()),
|
||||
request: ElicitationRequest::Form {
|
||||
meta: None,
|
||||
message: "Need input".to_string(),
|
||||
requested_schema: json!({
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
}),
|
||||
},
|
||||
}),
|
||||
});
|
||||
|
||||
assert_eq!(
|
||||
pending.note_server_request(&ServerRequest::McpServerElicitationRequest {
|
||||
request_id: AppServerRequestId::Integer(12),
|
||||
@@ -560,7 +459,7 @@ mod tests {
|
||||
let resolution = pending
|
||||
.take_resolution(&Op::ResolveElicitation {
|
||||
server_name: "example".to_string(),
|
||||
request_id: McpRequestId::String("mcp-1".to_string()),
|
||||
request_id: McpRequestId::Integer(12),
|
||||
decision: ElicitationAction::Accept,
|
||||
content: Some(json!({ "answer": "yes" })),
|
||||
meta: Some(json!({ "source": "tui" })),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user