Changing method in MCP notifications (#1684)

- Changing the codex/event type
This commit is contained in:
aibrahim-oai
2025-07-26 10:35:49 -07:00
committed by GitHub
parent c66c99c5b5
commit 5a0079fea2
3 changed files with 50 additions and 12 deletions

View File

@@ -278,8 +278,9 @@ pub struct Event {
} }
/// Response event from the agent /// Response event from the agent
#[derive(Debug, Clone, Deserialize, Serialize)] #[derive(Debug, Clone, Deserialize, Serialize, Display)]
#[serde(tag = "type", rename_all = "snake_case")] #[serde(tag = "type", rename_all = "snake_case")]
#[strum(serialize_all = "lowercase")]
pub enum EventMsg { pub enum EventMsg {
/// Error while executing a submission /// Error while executing a submission
Error(ErrorEvent), Error(ErrorEvent),

View File

@@ -83,11 +83,26 @@ impl OutgoingMessageSender {
let params = Some(serde_json::to_value(event).expect("Event must serialize")); let params = Some(serde_json::to_value(event).expect("Event must serialize"));
let outgoing_message = OutgoingMessage::Notification(OutgoingNotification { let outgoing_message = OutgoingMessage::Notification(OutgoingNotification {
method: "codex/event".to_string(), method: "codex/event".to_string(),
params: params.clone(),
});
let _ = self.sender.send(outgoing_message).await;
self.send_event_as_notification_new_schema(event, params)
.await;
}
// should be backwards compatible.
// it will replace send_event_as_notification eventually.
async fn send_event_as_notification_new_schema(
&self,
event: &Event,
params: Option<serde_json::Value>,
) {
let outgoing_message = OutgoingMessage::Notification(OutgoingNotification {
method: event.msg.to_string(),
params, params,
}); });
let _ = self.sender.send(outgoing_message).await; let _ = self.sender.send(outgoing_message).await;
} }
pub(crate) async fn send_error(&self, id: RequestId, error: JSONRPCErrorError) { pub(crate) async fn send_error(&self, id: RequestId, error: JSONRPCErrorError) {
let outgoing_message = OutgoingMessage::Error(OutgoingError { id, error }); let outgoing_message = OutgoingMessage::Error(OutgoingError { id, error });
let _ = self.sender.send(outgoing_message).await; let _ = self.sender.send(outgoing_message).await;

View File

@@ -270,27 +270,49 @@ impl McpProcess {
pub async fn read_stream_until_configured_response_message( pub async fn read_stream_until_configured_response_message(
&mut self, &mut self,
) -> anyhow::Result<String> { ) -> anyhow::Result<String> {
let mut sid_old: Option<String> = None;
let mut sid_new: Option<String> = None;
loop { loop {
let message = self.read_jsonrpc_message().await?; let message = self.read_jsonrpc_message().await?;
eprint!("message: {message:?}"); eprint!("message: {message:?}");
match message { match message {
JSONRPCMessage::Notification(notification) => { JSONRPCMessage::Notification(notification) => {
if notification.method == "codex/event" { if let Some(params) = notification.params {
if let Some(params) = notification.params { // Back-compat schema: method == "codex/event" and msg.type == "session_configured"
if notification.method == "codex/event" {
if let Some(msg) = params.get("msg") { if let Some(msg) = params.get("msg") {
if let Some(msg_type) = msg.get("type") { if msg.get("type").and_then(|v| v.as_str())
if msg_type == "session_configured" { == Some("session_configured")
if let Some(session_id) = msg.get("session_id") { {
return Ok(session_id if let Some(session_id) =
.to_string() msg.get("session_id").and_then(|v| v.as_str())
.trim_matches('"') {
.to_string()); sid_old = Some(session_id.to_string());
}
} }
} }
} }
} }
// New schema: method is the Display of EventMsg::SessionConfigured => "SessionConfigured"
if notification.method == "sessionconfigured" {
if let Some(msg) = params.get("msg") {
if let Some(session_id) =
msg.get("session_id").and_then(|v| v.as_str())
{
sid_new = Some(session_id.to_string());
}
}
}
}
if sid_old.is_some() && sid_new.is_some() {
// Both seen, they must match
assert_eq!(
sid_old.as_ref().unwrap(),
sid_new.as_ref().unwrap(),
"session_id mismatch between old and new schema"
);
return Ok(sid_old.unwrap());
} }
} }
JSONRPCMessage::Request(_) => { JSONRPCMessage::Request(_) => {