diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs index aad25b40d8..3e5995eb53 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs @@ -950,7 +950,7 @@ impl Session { parent_thread_id, thread_source, originator, - dynamic_tools, + dynamic_tools: Arc::from(dynamic_tools), user_shell_override, }; session_configuration diff --git a/codex-rs/core/src/session/session.rs b/codex-rs/core/src/session/session.rs index 830127290f..33baff1fe7 100644 --- a/codex-rs/core/src/session/session.rs +++ b/codex-rs/core/src/session/session.rs @@ -163,7 +163,8 @@ pub(crate) struct SessionConfiguration { pub(super) thread_source: Option, /// Effective originator used for this thread's Responses requests and analytics events. pub(super) originator: String, - pub(super) dynamic_tools: Vec, + /// Fixed at thread startup and shared with turn snapshots. + pub(super) dynamic_tools: Arc<[DynamicToolSpec]>, pub(super) user_shell_override: Option, } @@ -678,8 +679,11 @@ impl Session { } pub(crate) async fn dynamic_tools(&self) -> Vec { - let state = self.state.lock().await; - state.session_configuration.dynamic_tools.clone() + let dynamic_tools = { + let state = self.state.lock().await; + Arc::clone(&state.session_configuration.dynamic_tools) + }; + dynamic_tools.to_vec() } pub(crate) async fn responses_metadata( @@ -1066,7 +1070,7 @@ impl Session { text: session_configuration.base_instructions.clone(), provenance: base_instructions_provenance.clone(), }, - dynamic_tools: session_configuration.dynamic_tools.clone(), + dynamic_tools: session_configuration.dynamic_tools.to_vec(), selected_capability_roots: selected_capability_roots.clone(), multi_agent_version: initial_multi_agent_version, history_mode: session_configuration.history_mode, diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs index 483b2472f8..5793e8bba5 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs @@ -4516,7 +4516,7 @@ async fn set_rate_limits_retains_previous_credits() { parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools: Vec::new(), + dynamic_tools: Arc::default(), user_shell_override: None, }; @@ -4639,7 +4639,7 @@ async fn set_rate_limits_updates_plan_type_when_present() { parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools: Vec::new(), + dynamic_tools: Arc::default(), user_shell_override: None, }; @@ -5263,7 +5263,7 @@ pub(crate) async fn make_session_configuration_for_tests() -> SessionConfigurati parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools: Vec::new(), + dynamic_tools: Arc::default(), user_shell_override: None, } } @@ -6836,7 +6836,7 @@ pub(crate) async fn make_session_and_context() -> (Session, TurnContext) { parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools: Vec::new(), + dynamic_tools: Arc::default(), user_shell_override: None, }; let session_telemetry = session_telemetry( @@ -7156,7 +7156,7 @@ async fn make_session_with_config_and_rx( parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools: Vec::new(), + dynamic_tools: Arc::default(), user_shell_override: None, }; @@ -7291,7 +7291,7 @@ async fn make_session_with_history_source_and_agent_control_and_rx( parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools: Vec::new(), + dynamic_tools: Arc::default(), user_shell_override: None, }; @@ -9104,7 +9104,7 @@ where parent_thread_id: None, thread_source: None, originator: "test_originator".to_string(), - dynamic_tools, + dynamic_tools: Arc::from(dynamic_tools), user_shell_override: None, }; let session_telemetry = session_telemetry( diff --git a/codex-rs/core/src/session/turn_context.rs b/codex-rs/core/src/session/turn_context.rs index aa94539f19..cf4bc7b056 100644 --- a/codex-rs/core/src/session/turn_context.rs +++ b/codex-rs/core/src/session/turn_context.rs @@ -368,7 +368,7 @@ pub struct TurnContext { pub(crate) windows_sandbox_level: WindowsSandboxLevel, pub(crate) available_models: Vec, pub(crate) final_output_json_schema: Option, - pub(crate) dynamic_tools: Vec, + pub(crate) dynamic_tools: Arc<[DynamicToolSpec]>, pub(crate) turn_metadata_state: Arc, pub(crate) extension_data: Arc, pub(crate) turn_timing_state: Arc,