#[cfg(test)] use codex_config::types::EnvironmentVariablePattern; use codex_config::types::ShellEnvironmentPolicy; use codex_protocol::ThreadId; use std::collections::HashMap; pub use codex_config::shell_environment::CODEX_THREAD_ID_ENV_VAR; /// Construct an environment map based on the rules in the specified policy. The /// resulting map can be passed directly to `Command::envs()` after calling /// `env_clear()` to ensure no unintended variables are leaked to the spawned /// process. /// /// The derivation follows the algorithm documented in the struct-level comment /// for [`ShellEnvironmentPolicy`]. /// /// `CODEX_THREAD_ID` is injected when a thread id is provided, even when /// `include_only` is set. pub fn create_env( policy: &ShellEnvironmentPolicy, thread_id: Option, ) -> HashMap { let thread_id = thread_id.map(|thread_id| thread_id.to_string()); codex_config::shell_environment::create_env(policy, thread_id.as_deref()) } #[cfg(all(test, target_os = "windows"))] fn create_env_from_vars( vars: I, policy: &ShellEnvironmentPolicy, thread_id: Option, ) -> HashMap where I: IntoIterator, { let thread_id = thread_id.map(|thread_id| thread_id.to_string()); codex_config::shell_environment::create_env_from_vars(vars, policy, thread_id.as_deref()) } #[cfg(test)] fn populate_env( vars: I, policy: &ShellEnvironmentPolicy, thread_id: Option, ) -> HashMap where I: IntoIterator, { let thread_id = thread_id.map(|thread_id| thread_id.to_string()); codex_config::shell_environment::populate_env(vars, policy, thread_id.as_deref()) } #[cfg(test)] #[path = "exec_env_tests.rs"] mod tests;