diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 4268666fc6..f95eb7a299 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -3182,6 +3182,7 @@ dependencies = [ "codex-core", "codex-extension-api", "codex-features", + "codex-otel", "codex-tools", "codex-utils-absolute-path", "codex-utils-output-truncation", diff --git a/codex-rs/app-server/src/extensions.rs b/codex-rs/app-server/src/extensions.rs index 689eae2e9d..20a21a94cc 100644 --- a/codex-rs/app-server/src/extensions.rs +++ b/codex-rs/app-server/src/extensions.rs @@ -18,7 +18,7 @@ where { let mut builder = ExtensionRegistryBuilder::::new(); codex_guardian::install(&mut builder, guardian_agent_spawner); - codex_memories_extension::install(&mut builder); + codex_memories_extension::install(&mut builder, codex_otel::global()); Arc::new(builder.build()) } diff --git a/codex-rs/core/tests/suite/cli_stream.rs b/codex-rs/core/tests/suite/cli_stream.rs index edde7b447e..361096943e 100644 --- a/codex-rs/core/tests/suite/cli_stream.rs +++ b/codex-rs/core/tests/suite/cli_stream.rs @@ -68,27 +68,6 @@ async fn responses_mode_stream_cli() { let request = resp_mock.single_request(); assert_eq!(request.path(), "/v1/responses"); - - // TODO(jif) fix - // // Verify a new session rollout was created and is discoverable via list_conversations - // let provider_filter = vec!["mock".to_string()]; - // let page = RolloutRecorder::list_threads( - // home.path(), - // 10, - // None, - // codex_core::ThreadSortKey::UpdatedAt, - // &[], - // Some(provider_filter.as_slice()), - // "mock", - // ) - // .await - // .expect("list conversations"); - // assert!( - // !page.items.is_empty(), - // "expected at least one session to be listed" - // ); - // assert!(page.items[0].thread_id.is_some(), "missing thread_id"); - // assert!(page.items[0].created_at.is_some(), "missing created_at"); } /// Ensures `openai_base_url` config override routes built-in openai provider requests. diff --git a/codex-rs/ext/memories/Cargo.toml b/codex-rs/ext/memories/Cargo.toml index ca55eba84a..68eeaf8ec1 100644 --- a/codex-rs/ext/memories/Cargo.toml +++ b/codex-rs/ext/memories/Cargo.toml @@ -17,6 +17,7 @@ async-trait = { workspace = true } codex-core = { workspace = true } codex-extension-api = { workspace = true } codex-features = { workspace = true } +codex-otel = { workspace = true } codex-tools = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-output-truncation = { workspace = true } diff --git a/codex-rs/ext/memories/src/extension.rs b/codex-rs/ext/memories/src/extension.rs index 70f9f5ddcd..67d87fd125 100644 --- a/codex-rs/ext/memories/src/extension.rs +++ b/codex-rs/ext/memories/src/extension.rs @@ -10,6 +10,7 @@ use codex_extension_api::ThreadLifecycleContributor; use codex_extension_api::ThreadStartInput; use codex_extension_api::ToolContributor; use codex_features::Feature; +use codex_otel::MetricsClient; use codex_utils_absolute_path::AbsolutePathBuf; use crate::local::LocalMemoriesBackend; @@ -17,8 +18,18 @@ use crate::prompts::build_memory_tool_developer_instructions; use crate::tools; /// Contributes Codex memory read-path prompt context and memory read tools. -#[derive(Clone, Copy, Debug, Default)] -pub(crate) struct MemoriesExtension; +#[derive(Clone, Default)] +pub(crate) struct MemoriesExtension { + _metrics_client: Option, +} + +impl MemoriesExtension { + fn new(metrics_client: Option) -> Self { + Self { + _metrics_client: metrics_client, + } + } +} #[derive(Clone, Debug)] pub(crate) struct MemoriesExtensionConfig { @@ -97,8 +108,11 @@ impl ToolContributor for MemoriesExtension { } /// Installs the memories extension contributors into the extension registry. -pub fn install(registry: &mut ExtensionRegistryBuilder) { - let extension = Arc::new(MemoriesExtension); +pub fn install( + registry: &mut ExtensionRegistryBuilder, + metrics_client: Option, +) { + let extension = Arc::new(MemoriesExtension::new(metrics_client)); registry.thread_lifecycle_contributor(extension.clone()); registry.config_contributor(extension.clone()); registry.prompt_contributor(extension); diff --git a/codex-rs/ext/memories/src/tests.rs b/codex-rs/ext/memories/src/tests.rs index 9f6b8d9d74..0c3380d273 100644 --- a/codex-rs/ext/memories/src/tests.rs +++ b/codex-rs/ext/memories/src/tests.rs @@ -23,7 +23,7 @@ use crate::local::LocalMemoriesBackend; #[test] fn tools_are_not_contributed_without_thread_config() { - let extension = MemoriesExtension; + let extension = MemoriesExtension::default(); assert!( extension @@ -37,7 +37,7 @@ fn tools_are_not_contributed_without_thread_config() { #[test] fn tools_are_not_contributed_when_disabled() { - let extension = MemoriesExtension; + let extension = MemoriesExtension::default(); let thread_store = ExtensionData::new("thread"); thread_store.insert(MemoriesExtensionConfig { enabled: false, @@ -53,7 +53,7 @@ fn tools_are_not_contributed_when_disabled() { #[test] fn tools_are_contributed_when_enabled() { - let extension = MemoriesExtension; + let extension = MemoriesExtension::default(); let thread_store = ExtensionData::new("thread"); thread_store.insert(MemoriesExtensionConfig { enabled: true, @@ -111,7 +111,7 @@ async fn prompt_contribution_uses_memory_summary_when_enabled() { .await .expect("write memory summary"); - let extension = MemoriesExtension; + let extension = MemoriesExtension::default(); let thread_store = ExtensionData::new("thread"); thread_store.insert(MemoriesExtensionConfig { enabled: true,