From c37884d5eb6563791ce6ae42672db0dcfc744f52 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Tue, 26 May 2026 13:56:46 +0200 Subject: [PATCH] Wire metrics client into memories extension (#24567) ## Summary - let the memories extension capture the process-global OTEL metrics client at install time - keep app-server/TUI/exec extension construction APIs unchanged - store the metrics client for future memory metrics without emitting any metrics yet ## Test plan - `just fmt` - `just bazel-lock-update` - `just bazel-lock-check` - Not run: tests/clippy per request; CI will cover them --- codex-rs/app-server/src/extensions.rs | 2 +- codex-rs/ext/memories/Cargo.toml | 1 + codex-rs/ext/memories/src/extension.rs | 22 ++++++++++++++++++---- codex-rs/ext/memories/src/tests.rs | 8 ++++---- 4 files changed, 24 insertions(+), 9 deletions(-) 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/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,