From 8a400e7812b0c7488a2bf7963741dceb1aa2e693 Mon Sep 17 00:00:00 2001 From: jif Date: Thu, 1 Oct 2026 10:52:28 +0000 Subject: [PATCH] Cache the placeholder regex for MCP hook argument expansion (#49956) Use `LazyLock` to compile the placeholder regex once and reuse it across argument strings, avoiding repeated compilation during template expansion. Preserve regex error propagation and placeholder substitution behavior. GitOrigin-RevId: 2ac8aec86de3430335c068e47d09422dcd276f7c --- codex-rs/hooks/src/engine/mcp_runner.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/codex-rs/hooks/src/engine/mcp_runner.rs b/codex-rs/hooks/src/engine/mcp_runner.rs index 7a8da53e4d..71bf050e0f 100644 --- a/codex-rs/hooks/src/engine/mcp_runner.rs +++ b/codex-rs/hooks/src/engine/mcp_runner.rs @@ -1,3 +1,4 @@ +use std::sync::LazyLock; use std::time::Duration; use std::time::Instant; @@ -121,7 +122,9 @@ fn resolve_value(value: &Value, hook_event: &Value) -> Result { } fn resolve_string(text: &str, hook_event: &Value) -> Result { - let pattern = Regex::new(r"\$\{([^{}]+)\}")?; + static PLACEHOLDER_PATTERN: LazyLock> = + LazyLock::new(|| Regex::new(r"\$\{([^{}]+)\}")); + let pattern = PLACEHOLDER_PATTERN.as_ref().map_err(Clone::clone)?; let captures = pattern.captures_iter(text).collect::>(); if captures.is_empty() { return Ok(Value::String(text.to_string()));