diff --git a/codex-rs/core/config.schema.json b/codex-rs/core/config.schema.json index 043482dfef..c5bb5d4e6f 100644 --- a/codex-rs/core/config.schema.json +++ b/codex-rs/core/config.schema.json @@ -407,6 +407,9 @@ "include_apply_patch_tool": { "type": "boolean" }, + "item_metadata": { + "type": "boolean" + }, "js_repl": { "type": "boolean" }, @@ -1962,6 +1965,9 @@ "include_apply_patch_tool": { "type": "boolean" }, + "item_metadata": { + "type": "boolean" + }, "js_repl": { "type": "boolean" }, diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 65c47b41af..8a8a71049d 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -3787,7 +3787,7 @@ impl Session { response_item: ResponseItem, user_message_type: Option, ) { - let user_message_type = if self.enabled(Feature::UserMessageTypeMetadata) { + let user_message_type = if self.enabled(Feature::ItemMetadata) { user_message_type } else { None @@ -3918,7 +3918,7 @@ impl Session { } let mut input_item: ResponseInputItem = input.into(); - if self.enabled(Feature::UserMessageTypeMetadata) { + if self.enabled(Feature::ItemMetadata) { stamp_user_message_type_on_input_item(&mut input_item, UserMessageType::PromptSteering); } @@ -3941,7 +3941,7 @@ impl Session { ResponseInputItem::Message { .. } => Some(UserMessageType::PromptQueued), _ => None, }; - if self.enabled(Feature::UserMessageTypeMetadata) + if self.enabled(Feature::ItemMetadata) && let Some(kind) = user_message_type.clone() { stamp_user_message_type_on_input_item(&mut item, kind); @@ -5726,7 +5726,7 @@ pub(crate) async fn run_turn( .await; let mut initial_input_for_turn: ResponseInputItem = ResponseInputItem::from(input.clone()); - if sess.enabled(Feature::UserMessageTypeMetadata) { + if sess.enabled(Feature::ItemMetadata) { stamp_user_message_type_on_input_item(&mut initial_input_for_turn, UserMessageType::Prompt); } let response_item: ResponseItem = initial_input_for_turn.clone().into(); diff --git a/codex-rs/core/src/codex_tests.rs b/codex-rs/core/src/codex_tests.rs index df5eb2cc71..a3c33baeb4 100644 --- a/codex-rs/core/src/codex_tests.rs +++ b/codex-rs/core/src/codex_tests.rs @@ -3841,7 +3841,7 @@ async fn task_finish_emits_prompt_queued_metadata_for_injected_user_input_when_f Arc::get_mut(&mut sess) .expect("session should be uniquely owned in this test") .features - .enable(crate::features::Feature::UserMessageTypeMetadata) + .enable(crate::features::Feature::ItemMetadata) .expect("feature flag should be enabled for this test"); let input = vec![UserInput::Text { diff --git a/codex-rs/core/src/features.rs b/codex-rs/core/src/features.rs index 98ef03387b..ed9dae7313 100644 --- a/codex-rs/core/src/features.rs +++ b/codex-rs/core/src/features.rs @@ -174,8 +174,8 @@ pub enum Feature { ToolCallMcpElicitation, /// Enable personality selection in the TUI. Personality, - /// Emit user_message_type metadata on user message turn items and request items. - UserMessageTypeMetadata, + /// Emit item-level metadata on request/response items. + ItemMetadata, /// Enable native artifact tools. Artifact, /// Enable Fast mode selection in the TUI and request layer. @@ -814,8 +814,8 @@ pub const FEATURES: &[FeatureSpec] = &[ default_enabled: true, }, FeatureSpec { - id: Feature::UserMessageTypeMetadata, - key: "user_message_type_metadata", + id: Feature::ItemMetadata, + key: "item_metadata", stage: Stage::UnderDevelopment, default_enabled: false, }, diff --git a/codex-rs/core/src/features/legacy.rs b/codex-rs/core/src/features/legacy.rs index 48e19c0df9..310e64a779 100644 --- a/codex-rs/core/src/features/legacy.rs +++ b/codex-rs/core/src/features/legacy.rs @@ -45,6 +45,10 @@ const ALIASES: &[Alias] = &[ legacy_key: "memory_tool", feature: Feature::MemoryTool, }, + Alias { + legacy_key: "user_message_type_metadata", + feature: Feature::ItemMetadata, + }, ]; pub(crate) fn legacy_feature_keys() -> impl Iterator { diff --git a/codex-rs/core/src/features_tests.rs b/codex-rs/core/src/features_tests.rs index 8385435d7b..46c0998ed3 100644 --- a/codex-rs/core/src/features_tests.rs +++ b/codex-rs/core/src/features_tests.rs @@ -142,6 +142,18 @@ fn collab_is_legacy_alias_for_multi_agent() { assert_eq!(feature_for_key("collab"), Some(Feature::Collab)); } +#[test] +fn user_message_type_metadata_is_legacy_alias_for_item_metadata() { + assert_eq!(feature_for_key("user_message_type_metadata"), Some(Feature::ItemMetadata)); + assert_eq!(feature_for_key("item_metadata"), Some(Feature::ItemMetadata)); +} + +#[test] +fn item_metadata_is_under_development_and_disabled_by_default() { + assert_eq!(Feature::ItemMetadata.stage(), Stage::UnderDevelopment); + assert_eq!(Feature::ItemMetadata.default_enabled(), false); +} + #[test] fn multi_agent_is_stable_and_enabled_by_default() { assert_eq!(Feature::Collab.stage(), Stage::Stable); diff --git a/codex-rs/core/tests/suite/items.rs b/codex-rs/core/tests/suite/items.rs index c12ed473d7..90fe3a236d 100644 --- a/codex-rs/core/tests/suite/items.rs +++ b/codex-rs/core/tests/suite/items.rs @@ -136,7 +136,7 @@ async fn user_message_type_metadata_is_emitted_when_feature_enabled() -> anyhow: .with_config(|config| { config .features - .enable(Feature::UserMessageTypeMetadata) + .enable(Feature::ItemMetadata) .expect("feature flag should be enabled for this test"); }) .build(&server) @@ -259,7 +259,7 @@ async fn user_message_type_prompt_steering_metadata_is_emitted_when_feature_enab .with_config(|config| { config .features - .enable(Feature::UserMessageTypeMetadata) + .enable(Feature::ItemMetadata) .expect("feature flag should be enabled for this test"); }) .build(&server) @@ -389,7 +389,7 @@ async fn user_message_type_prompt_queued_metadata_is_emitted_when_feature_enable .with_config(|config| { config .features - .enable(Feature::UserMessageTypeMetadata) + .enable(Feature::ItemMetadata) .expect("feature flag should be enabled for this test"); }) .build(&server)