diff --git a/codex-rs/app-server-protocol/src/protocol/thread_history.rs b/codex-rs/app-server-protocol/src/protocol/thread_history.rs index a95cccf9d5..65f2d99ff5 100644 --- a/codex-rs/app-server-protocol/src/protocol/thread_history.rs +++ b/codex-rs/app-server-protocol/src/protocol/thread_history.rs @@ -1286,7 +1286,6 @@ mod tests { item: CoreTurnItem::UserMessage(CoreUserMessageItem { id: "user-item-id".to_string(), content: Vec::new(), - metadata: None, }), }), EventMsg::TurnComplete(TurnCompleteEvent { diff --git a/codex-rs/app-server-protocol/src/protocol/v2.rs b/codex-rs/app-server-protocol/src/protocol/v2.rs index 4aff298d54..e86900cbc7 100644 --- a/codex-rs/app-server-protocol/src/protocol/v2.rs +++ b/codex-rs/app-server-protocol/src/protocol/v2.rs @@ -7409,7 +7409,6 @@ mod tests { path: "app://demo-app".to_string(), }, ], - metadata: None, }); assert_eq!( @@ -7450,7 +7449,6 @@ mod tests { }, ], phase: None, - metadata: None, }); assert_eq!( @@ -7468,7 +7466,6 @@ mod tests { text: "final".to_string(), }], phase: Some(MessagePhase::FinalAnswer), - metadata: None, }); assert_eq!( @@ -7484,7 +7481,6 @@ mod tests { id: "reasoning-1".to_string(), summary_text: vec!["line one".to_string(), "line two".to_string()], raw_content: vec![], - metadata: None, }); assert_eq!( @@ -7503,7 +7499,6 @@ mod tests { query: Some("docs".to_string()), queries: None, }, - metadata: None, }); assert_eq!( diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index dd0f55e33d..65c47b41af 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -85,10 +85,10 @@ use codex_protocol::dynamic_tools::DynamicToolSpec; use codex_protocol::items::PlanItem; use codex_protocol::items::TurnItem; use codex_protocol::items::UserMessageItem; -use codex_protocol::items::UserMessageType; use codex_protocol::mcp::CallToolResult; use codex_protocol::models::BaseInstructions; use codex_protocol::models::PermissionProfile; +use codex_protocol::models::UserMessageType; use codex_protocol::models::format_allow_prefixes; use codex_protocol::openai_models::ModelInfo; use codex_protocol::permissions::FileSystemSandboxPolicy; @@ -6699,7 +6699,6 @@ impl ProposedPlanItemState { let item = TurnItem::Plan(PlanItem { id: self.item_id.clone(), text: String::new(), - metadata: None, }); sess.emit_turn_item_started(turn_context, &item).await; } @@ -6734,7 +6733,6 @@ impl ProposedPlanItemState { let item = TurnItem::Plan(PlanItem { id: self.item_id.clone(), text, - metadata: None, }); sess.emit_turn_item_completed(turn_context, item).await; } @@ -7048,7 +7046,6 @@ async fn emit_agent_message_in_plan_mode( id: agent_message_id.clone(), content: Vec::new(), phase: None, - metadata: None, }) }); sess.emit_turn_item_started(turn_context, &start_item).await; diff --git a/codex-rs/core/src/codex_tests.rs b/codex-rs/core/src/codex_tests.rs index 00f61eaf92..df5eb2cc71 100644 --- a/codex-rs/core/src/codex_tests.rs +++ b/codex-rs/core/src/codex_tests.rs @@ -3885,7 +3885,7 @@ async fn task_finish_emits_prompt_queued_metadata_for_injected_user_input_when_f metadata: Some(metadata), .. } if metadata.user_message_type - == Some(codex_protocol::items::UserMessageType::PromptQueued) + == Some(codex_protocol::models::UserMessageType::PromptQueued) ) )); @@ -4007,7 +4007,7 @@ async fn steer_input_returns_active_turn_id() { pending_input .first() .and_then(|(_, user_message_type)| user_message_type.as_ref()), - Some(&codex_protocol::items::UserMessageType::PromptSteering) + Some(&codex_protocol::models::UserMessageType::PromptSteering) ); } diff --git a/codex-rs/core/src/event_mapping.rs b/codex-rs/core/src/event_mapping.rs index e1043d4604..72372b24cd 100644 --- a/codex-rs/core/src/event_mapping.rs +++ b/codex-rs/core/src/event_mapping.rs @@ -83,12 +83,7 @@ fn parse_agent_message( } } let id = id.cloned().unwrap_or_else(|| Uuid::new_v4().to_string()); - AgentMessageItem { - id, - content, - phase, - metadata: None, - } + AgentMessageItem { id, content, phase } } pub fn parse_turn_item(item: &ResponseItem) -> Option { @@ -134,7 +129,6 @@ pub fn parse_turn_item(item: &ResponseItem) -> Option { id: id.clone(), summary_text, raw_content, - metadata: None, })) } ResponseItem::WebSearchCall { id, action, .. } => { @@ -146,7 +140,6 @@ pub fn parse_turn_item(item: &ResponseItem) -> Option { id: id.clone().unwrap_or_default(), query, action, - metadata: None, })) } ResponseItem::ImageGenerationCall { @@ -161,7 +154,6 @@ pub fn parse_turn_item(item: &ResponseItem) -> Option { revised_prompt: revised_prompt.clone(), result: result.clone(), saved_path: None, - metadata: None, }, )), _ => None, diff --git a/codex-rs/core/src/event_mapping_tests.rs b/codex-rs/core/src/event_mapping_tests.rs index 2546ca53d3..76b73e4980 100644 --- a/codex-rs/core/src/event_mapping_tests.rs +++ b/codex-rs/core/src/event_mapping_tests.rs @@ -330,7 +330,6 @@ fn parses_web_search_call() { query: Some("weather".to_string()), queries: None, }, - metadata: None, } ), other => panic!("expected TurnItem::WebSearch, got {other:?}"), @@ -358,7 +357,6 @@ fn parses_web_search_open_page_call() { action: WebSearchAction::OpenPage { url: Some("https://example.com".to_string()), }, - metadata: None, } ), other => panic!("expected TurnItem::WebSearch, got {other:?}"), @@ -388,7 +386,6 @@ fn parses_web_search_find_in_page_call() { url: Some("https://example.com".to_string()), pattern: Some("needle".to_string()), }, - metadata: None, } ), other => panic!("expected TurnItem::WebSearch, got {other:?}"), @@ -411,7 +408,6 @@ fn parses_partial_web_search_call_without_action_as_other() { id: "ws_partial".to_string(), query: String::new(), action: WebSearchAction::Other, - metadata: None, } ), other => panic!("expected TurnItem::WebSearch, got {other:?}"), diff --git a/codex-rs/core/src/state/turn.rs b/codex-rs/core/src/state/turn.rs index ac3b69b2d6..50961580d2 100644 --- a/codex-rs/core/src/state/turn.rs +++ b/codex-rs/core/src/state/turn.rs @@ -9,8 +9,8 @@ use tokio_util::sync::CancellationToken; use tokio_util::task::AbortOnDropHandle; use codex_protocol::dynamic_tools::DynamicToolResponse; -use codex_protocol::items::UserMessageType; use codex_protocol::models::ResponseInputItem; +use codex_protocol::models::UserMessageType; use codex_protocol::request_permissions::RequestPermissionsResponse; use codex_protocol::request_user_input::RequestUserInputResponse; use codex_rmcp_client::ElicitationResponse; diff --git a/codex-rs/core/src/turn_timing_tests.rs b/codex-rs/core/src/turn_timing_tests.rs index 162e456bcd..513a85bd50 100644 --- a/codex-rs/core/src/turn_timing_tests.rs +++ b/codex-rs/core/src/turn_timing_tests.rs @@ -58,7 +58,6 @@ async fn turn_timing_state_records_ttfm_independently_of_ttft() { id: "msg-1".to_string(), content: Vec::new(), phase: None, - metadata: None, })) .await .is_some() @@ -69,7 +68,6 @@ async fn turn_timing_state_records_ttfm_independently_of_ttft() { id: "msg-2".to_string(), content: Vec::new(), phase: None, - metadata: None, })) .await, None diff --git a/codex-rs/protocol/src/items.rs b/codex-rs/protocol/src/items.rs index 81a852fa08..f200fe6f75 100644 --- a/codex-rs/protocol/src/items.rs +++ b/codex-rs/protocol/src/items.rs @@ -29,29 +29,10 @@ pub enum TurnItem { ContextCompaction(ContextCompactionItem), } -#[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] -pub enum UserMessageType { - Prompt, - PromptSteering, - PromptQueued, -} - -#[derive(Debug, Clone, Default, Deserialize, Serialize, TS, JsonSchema, PartialEq, Eq)] -pub struct TurnItemMetadata { - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub user_message_type: Option, -} - #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema)] pub struct UserMessageItem { pub id: String, pub content: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema)] @@ -77,18 +58,12 @@ pub struct AgentMessageItem { #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub phase: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema)] pub struct PlanItem { pub id: String, pub text: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema)] @@ -97,9 +72,6 @@ pub struct ReasoningItem { pub summary_text: Vec, #[serde(default)] pub raw_content: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema, PartialEq)] @@ -107,9 +79,6 @@ pub struct WebSearchItem { pub id: String, pub query: String, pub action: WebSearchAction, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema, PartialEq)] @@ -123,24 +92,17 @@ pub struct ImageGenerationItem { #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] pub saved_path: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } #[derive(Debug, Clone, Deserialize, Serialize, TS, JsonSchema)] pub struct ContextCompactionItem { pub id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub metadata: Option, } impl ContextCompactionItem { pub fn new() -> Self { Self { id: uuid::Uuid::new_v4().to_string(), - metadata: None, } } @@ -157,14 +119,9 @@ impl Default for ContextCompactionItem { impl UserMessageItem { pub fn new(content: &[UserInput]) -> Self { - Self::new_with_metadata(content, None) - } - - pub fn new_with_metadata(content: &[UserInput], metadata: Option) -> Self { Self { id: uuid::Uuid::new_v4().to_string(), content: content.to_vec(), - metadata, } } @@ -244,7 +201,6 @@ impl AgentMessageItem { id: uuid::Uuid::new_v4().to_string(), content: content.to_vec(), phase: None, - metadata: None, } } diff --git a/codex-rs/protocol/src/models.rs b/codex-rs/protocol/src/models.rs index 8a67eb8d7e..1141b46d8b 100644 --- a/codex-rs/protocol/src/models.rs +++ b/codex-rs/protocol/src/models.rs @@ -11,7 +11,6 @@ use ts_rs::TS; use crate::config_types::CollaborationMode; use crate::config_types::SandboxMode; -use crate::items::UserMessageType; use crate::protocol::AskForApproval; use crate::protocol::COLLABORATION_MODE_CLOSE_TAG; use crate::protocol::COLLABORATION_MODE_OPEN_TAG; @@ -254,6 +253,15 @@ pub enum ResponseInputItem { }, } +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema, TS)] +#[serde(rename_all = "snake_case")] +#[ts(rename_all = "snake_case")] +pub enum UserMessageType { + Prompt, + PromptSteering, + PromptQueued, +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema, TS)] #[serde(tag = "type", rename_all = "snake_case")] pub enum ContentItem {