diff --git a/codex-rs/core/src/turn_metadata.rs b/codex-rs/core/src/turn_metadata.rs index fe85efe685..ec652ee520 100644 --- a/codex-rs/core/src/turn_metadata.rs +++ b/codex-rs/core/src/turn_metadata.rs @@ -87,6 +87,7 @@ pub async fn detached_memory_responses_metadata( ) -> CodexResponsesMetadata { CodexResponsesMetadata { request_kind: Some(CodexResponsesRequestKind::Memory), + thread_source: Some(ThreadSource::MemoryConsolidation), subagent_header: subagent_header_value(session_source), sandbox: sandbox.map(ToString::to_string), sandbox_mode: Some( diff --git a/codex-rs/core/src/turn_metadata_tests.rs b/codex-rs/core/src/turn_metadata_tests.rs index bb19d1adb6..36ad699bbd 100644 --- a/codex-rs/core/src/turn_metadata_tests.rs +++ b/codex-rs/core/src/turn_metadata_tests.rs @@ -153,6 +153,10 @@ async fn detached_memory_responses_metadata_omits_turn_identity() { assert!(!header.contains("東京")); let parsed: Value = serde_json::from_str(&header).expect("valid json"); assert_eq!(parsed["request_kind"].as_str(), Some("memory")); + assert_eq!( + parsed["thread_source"].as_str(), + Some("memory_consolidation") + ); assert_eq!(parsed[SANDBOX_MODE_KEY].as_str(), Some("read-only")); assert!(parsed.get("session_id").is_none()); assert!(parsed.get("thread_id").is_none()); @@ -205,6 +209,7 @@ async fn detached_memory_responses_metadata_omits_empty_workspace_metadata() { serde_json::json!({ "request_kind": "memory", "sandbox_mode": "read-only", + "thread_source": "memory_consolidation", }) ); } diff --git a/codex-rs/memories/write/src/startup_tests.rs b/codex-rs/memories/write/src/startup_tests.rs index b1de7d0af8..729dfb4a24 100644 --- a/codex-rs/memories/write/src/startup_tests.rs +++ b/codex-rs/memories/write/src/startup_tests.rs @@ -507,7 +507,18 @@ async fn memories_startup_phase1_uses_live_thread_service_tier_and_detached_meta .expect("detached memory request should include workspace metadata"); let metadata: serde_json::Value = serde_json::from_str(&metadata_header).expect("turn metadata json"); + let client_metadata: serde_json::Value = serde_json::from_str( + request.body_json()["client_metadata"]["x-codex-turn-metadata"] + .as_str() + .expect("detached memory request should include client metadata"), + ) + .expect("client metadata json"); + assert_eq!(client_metadata, metadata); assert_eq!(metadata["request_kind"].as_str(), Some("memory")); + assert_eq!( + metadata["thread_source"].as_str(), + Some("memory_consolidation") + ); assert_eq!(metadata["sandbox_mode"].as_str(), Some("workspace-write")); assert!(metadata.get("session_id").is_none()); assert!(metadata.get("thread_id").is_none());