From df7a5872916053eab788ed158eb738d4472153bf Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Thu, 19 Mar 2026 11:43:42 -0700 Subject: [PATCH 1/3] Move terminal module to its own crate Co-authored-by: Codex --- codex-rs/Cargo.lock | 13 +++++++++++++ codex-rs/Cargo.toml | 2 ++ codex-rs/cli/Cargo.toml | 1 + codex-rs/cli/src/main.rs | 4 ++-- codex-rs/core/Cargo.toml | 1 + codex-rs/core/src/codex.rs | 4 ++-- codex-rs/core/src/default_client.rs | 3 ++- codex-rs/core/src/lib.rs | 1 - codex-rs/mcp-server/Cargo.toml | 1 + .../mcp-server/tests/common/mcp_process.rs | 3 ++- codex-rs/terminal/BUILD.bazel | 6 ++++++ codex-rs/terminal/Cargo.toml | 18 ++++++++++++++++++ .../src/terminal.rs => terminal/src/lib.rs} | 0 .../{core => terminal}/src/terminal_tests.rs | 0 codex-rs/tui/Cargo.toml | 1 + codex-rs/tui/src/app.rs | 3 ++- codex-rs/tui/src/chatwidget.rs | 4 ++-- codex-rs/tui/src/chatwidget/tests.rs | 2 +- codex-rs/tui/src/diff_render.rs | 4 ++-- codex-rs/tui/src/lib.rs | 5 +++-- codex-rs/tui_app_server/Cargo.toml | 1 + codex-rs/tui_app_server/src/app.rs | 3 ++- codex-rs/tui_app_server/src/chatwidget.rs | 4 ++-- .../tui_app_server/src/chatwidget/tests.rs | 2 +- codex-rs/tui_app_server/src/diff_render.rs | 4 ++-- codex-rs/tui_app_server/src/lib.rs | 5 +++-- 26 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 codex-rs/terminal/BUILD.bazel create mode 100644 codex-rs/terminal/Cargo.toml rename codex-rs/{core/src/terminal.rs => terminal/src/lib.rs} (100%) rename codex-rs/{core => terminal}/src/terminal_tests.rs (100%) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 32b41c02271..dbb812c7686 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1664,6 +1664,7 @@ dependencies = [ "codex-rmcp-client", "codex-state", "codex-stdio-to-uds", + "codex-terminal", "codex-tui", "codex-tui-app-server", "codex-utils-cargo-bin", @@ -1858,6 +1859,7 @@ dependencies = [ "codex-shell-escalation", "codex-skills", "codex-state", + "codex-terminal", "codex-test-macros", "codex-utils-absolute-path", "codex-utils-cache", @@ -2201,6 +2203,7 @@ dependencies = [ "codex-core", "codex-protocol", "codex-shell-command", + "codex-terminal", "codex-utils-cli", "codex-utils-json-to-toml", "core_test_support", @@ -2507,6 +2510,14 @@ dependencies = [ "uds_windows", ] +[[package]] +name = "codex-terminal" +version = "0.0.0" +dependencies = [ + "pretty_assertions", + "tracing", +] + [[package]] name = "codex-test-macros" version = "0.0.0" @@ -2542,6 +2553,7 @@ dependencies = [ "codex-protocol", "codex-shell-command", "codex-state", + "codex-terminal", "codex-tui-app-server", "codex-utils-absolute-path", "codex-utils-approval-presets", @@ -2633,6 +2645,7 @@ dependencies = [ "codex-protocol", "codex-shell-command", "codex-state", + "codex-terminal", "codex-utils-absolute-path", "codex-utils-approval-presets", "codex-utils-cargo-bin", diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index edcd98fbb11..71c8facfe2b 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -66,6 +66,7 @@ members = [ "codex-client", "codex-api", "state", + "terminal", "codex-experimental-api-macros", "test-macros", "package-manager", @@ -131,6 +132,7 @@ codex-skills = { path = "skills" } codex-state = { path = "state" } codex-stdio-to-uds = { path = "stdio-to-uds" } codex-test-macros = { path = "test-macros" } +codex-terminal = { path = "terminal" } codex-tui = { path = "tui" } codex-tui-app-server = { path = "tui_app_server" } codex-utils-absolute-path = { path = "utils/absolute-path" } diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index a7e88cd1b4d..8975de87637 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -37,6 +37,7 @@ codex-responses-api-proxy = { workspace = true } codex-rmcp-client = { workspace = true } codex-state = { workspace = true } codex-stdio-to-uds = { workspace = true } +codex-terminal = { workspace = true } codex-tui = { workspace = true } codex-tui-app-server = { workspace = true } libc = { workspace = true } diff --git a/codex-rs/cli/src/main.rs b/codex-rs/cli/src/main.rs index 93863982846..31bd6213124 100644 --- a/codex-rs/cli/src/main.rs +++ b/codex-rs/cli/src/main.rs @@ -50,7 +50,7 @@ use codex_core::config::edit::ConfigEditsBuilder; use codex_core::config::find_codex_home; use codex_core::features::Stage; use codex_core::features::is_known_feature_key; -use codex_core::terminal::TerminalName; +use codex_terminal::TerminalName; /// Codex CLI /// @@ -1049,7 +1049,7 @@ async fn run_interactive_tui( interactive.prompt = Some(prompt.replace("\r\n", "\n").replace('\r', "\n")); } - let terminal_info = codex_core::terminal::terminal_info(); + let terminal_info = codex_terminal::terminal_info(); if terminal_info.name == TerminalName::Dumb { if !(std::io::stdin().is_terminal() && std::io::stderr().is_terminal()) { return Ok(AppExitInfo::fatal( diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index a44da5e111d..9f0269537af 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -48,6 +48,7 @@ codex-artifacts = { workspace = true } codex-protocol = { workspace = true } codex-rmcp-client = { workspace = true } codex-state = { workspace = true } +codex-terminal = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-cache = { workspace = true } codex-utils-image = { workspace = true } diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 83fb05626c0..62a22e57127 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -49,7 +49,6 @@ use crate::stream_events_utils::handle_output_item_done; use crate::stream_events_utils::last_assistant_message_from_item; use crate::stream_events_utils::raw_assistant_output_text_from_item; use crate::stream_events_utils::record_completed_response_item; -use crate::terminal; use crate::truncate::TruncationPolicy; use crate::turn_metadata::TurnMetadataState; use crate::util::error_or_panic; @@ -117,6 +116,7 @@ use codex_protocol::request_user_input::RequestUserInputArgs; use codex_protocol::request_user_input::RequestUserInputResponse; use codex_rmcp_client::ElicitationResponse; use codex_rmcp_client::OAuthCredentialsStoreMode; +use codex_terminal::user_agent; use codex_utils_stream_parser::AssistantTextChunk; use codex_utils_stream_parser::AssistantTextStreamParser; use codex_utils_stream_parser::ProposedPlanSegment; @@ -1581,7 +1581,7 @@ impl Session { let account_id = auth.and_then(CodexAuth::get_account_id); let account_email = auth.and_then(CodexAuth::get_account_email); let originator = crate::default_client::originator().value; - let terminal_type = terminal::user_agent(); + let terminal_type = user_agent(); let session_model = session_configuration.collaboration_mode.model().to_string(); let auth_env_telemetry = collect_auth_env_telemetry( &session_configuration.provider, diff --git a/codex-rs/core/src/default_client.rs b/codex-rs/core/src/default_client.rs index 3ca653ba468..6b88ae9a9fe 100644 --- a/codex-rs/core/src/default_client.rs +++ b/codex-rs/core/src/default_client.rs @@ -4,6 +4,7 @@ use codex_client::BuildCustomCaTransportError; use codex_client::CodexHttpClient; pub use codex_client::CodexRequestBuilder; use codex_client::build_reqwest_client_with_custom_ca; +use codex_terminal::user_agent; use reqwest::header::HeaderMap; use reqwest::header::HeaderValue; use std::sync::LazyLock; @@ -130,7 +131,7 @@ pub fn get_codex_user_agent() -> String { os_info.os_type(), os_info.version(), os_info.architecture().unwrap_or("unknown"), - crate::terminal::user_agent() + user_agent() ); let suffix = USER_AGENT_SUFFIX .lock() diff --git a/codex-rs/core/src/lib.rs b/codex-rs/core/src/lib.rs index 10a51b23ecd..6d519f488f0 100644 --- a/codex-rs/core/src/lib.rs +++ b/codex-rs/core/src/lib.rs @@ -120,7 +120,6 @@ pub mod shell_snapshot; pub mod skills; pub mod spawn; pub mod state_db; -pub mod terminal; mod tools; pub mod turn_diff_tracker; mod turn_metadata; diff --git a/codex-rs/mcp-server/Cargo.toml b/codex-rs/mcp-server/Cargo.toml index 2ecce383cea..9158a7b66ee 100644 --- a/codex-rs/mcp-server/Cargo.toml +++ b/codex-rs/mcp-server/Cargo.toml @@ -40,6 +40,7 @@ tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } [dev-dependencies] core_test_support = { workspace = true } +codex-terminal = { workspace = true } mcp_test_support = { workspace = true } os_info = { workspace = true } pretty_assertions = { workspace = true } diff --git a/codex-rs/mcp-server/tests/common/mcp_process.rs b/codex-rs/mcp-server/tests/common/mcp_process.rs index 92b5caa65a9..5ff9e1788cf 100644 --- a/codex-rs/mcp-server/tests/common/mcp_process.rs +++ b/codex-rs/mcp-server/tests/common/mcp_process.rs @@ -11,6 +11,7 @@ use tokio::process::ChildStdout; use anyhow::Context; use codex_mcp_server::CodexToolCallParam; +use codex_terminal::user_agent; use pretty_assertions::assert_eq; use rmcp::model::CallToolRequestParams; @@ -156,7 +157,7 @@ impl McpProcess { os_info.os_type(), os_info.version(), os_info.architecture().unwrap_or("unknown"), - codex_core::terminal::user_agent() + user_agent() ); let JsonRpcMessage::Response(JsonRpcResponse { jsonrpc, diff --git a/codex-rs/terminal/BUILD.bazel b/codex-rs/terminal/BUILD.bazel new file mode 100644 index 00000000000..fde9e230907 --- /dev/null +++ b/codex-rs/terminal/BUILD.bazel @@ -0,0 +1,6 @@ +load("//:defs.bzl", "codex_rust_crate") + +codex_rust_crate( + name = "terminal", + crate_name = "codex_terminal", +) diff --git a/codex-rs/terminal/Cargo.toml b/codex-rs/terminal/Cargo.toml new file mode 100644 index 00000000000..4816c40e707 --- /dev/null +++ b/codex-rs/terminal/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "codex-terminal" +version.workspace = true +edition.workspace = true +license.workspace = true + +[lib] +name = "codex_terminal" +path = "src/lib.rs" + +[lints] +workspace = true + +[dependencies] +tracing = { workspace = true } + +[dev-dependencies] +pretty_assertions = { workspace = true } diff --git a/codex-rs/core/src/terminal.rs b/codex-rs/terminal/src/lib.rs similarity index 100% rename from codex-rs/core/src/terminal.rs rename to codex-rs/terminal/src/lib.rs diff --git a/codex-rs/core/src/terminal_tests.rs b/codex-rs/terminal/src/terminal_tests.rs similarity index 100% rename from codex-rs/core/src/terminal_tests.rs rename to codex-rs/terminal/src/terminal_tests.rs diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 03c3a03dd05..5b62c86186f 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -43,6 +43,7 @@ codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-shell-command = { workspace = true } codex-state = { workspace = true } +codex-terminal = { workspace = true } codex-tui-app-server = { workspace = true } codex-utils-approval-presets = { workspace = true } codex-utils-absolute-path = { workspace = true } diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 09776f0f778..98f2679ded6 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -80,6 +80,7 @@ use codex_protocol::protocol::SessionConfiguredEvent; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SkillErrorInfo; use codex_protocol::protocol::TokenUsage; +use codex_terminal::user_agent; use codex_utils_absolute_path::AbsolutePathBuf; use color_eyre::eyre::Result; use color_eyre::eyre::WrapErr; @@ -2079,7 +2080,7 @@ impl App { auth_mode, codex_core::default_client::originator().value, config.otel.log_user_prompt, - codex_core::terminal::user_agent(), + user_agent(), SessionSource::Cli, ); if config diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index a1736171cfc..8bc96c008b8 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -76,8 +76,6 @@ use codex_core::models_manager::manager::ModelsManager; use codex_core::plugins::PluginsManager; use codex_core::project_doc::DEFAULT_PROJECT_DOC_FILENAME; use codex_core::skills::model::SkillMetadata; -use codex_core::terminal::TerminalName; -use codex_core::terminal::terminal_info; #[cfg(target_os = "windows")] use codex_core::windows_sandbox::WindowsSandboxLevelExt; use codex_otel::RuntimeMetricsSummary; @@ -155,6 +153,8 @@ use codex_protocol::request_permissions::RequestPermissionsEvent; use codex_protocol::request_user_input::RequestUserInputEvent; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; +use codex_terminal::TerminalName; +use codex_terminal::terminal_info; use codex_utils_sleep_inhibitor::SleepInhibitor; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 05adf3d3079..ccf26dd2318 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -38,7 +38,6 @@ use codex_core::features::Feature; use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_core::models_manager::manager::ModelsManager; use codex_core::skills::model::SkillMetadata; -use codex_core::terminal::TerminalName; use codex_otel::RuntimeMetricsSummary; use codex_otel::SessionTelemetry; use codex_protocol::ThreadId; @@ -121,6 +120,7 @@ use codex_protocol::request_user_input::RequestUserInputQuestion; use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; +use codex_terminal::TerminalName; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_approval_presets::builtin_approval_presets; use crossterm::event::KeyCode; diff --git a/codex-rs/tui/src/diff_render.rs b/codex-rs/tui/src/diff_render.rs index dd39901651a..4b15cd27c53 100644 --- a/codex-rs/tui/src/diff_render.rs +++ b/codex-rs/tui/src/diff_render.rs @@ -93,9 +93,9 @@ use crate::terminal_palette::indexed_color; use crate::terminal_palette::rgb_color; use crate::terminal_palette::stdout_color_level; use codex_core::git_info::get_git_repo_root; -use codex_core::terminal::TerminalName; -use codex_core::terminal::terminal_info; use codex_protocol::protocol::FileChange; +use codex_terminal::TerminalName; +use codex_terminal::terminal_info; /// Classifies a diff line for gutter sign rendering and style selection. /// diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index b4841a77979..2d75eb29de2 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -33,7 +33,6 @@ use codex_core::format_exec_policy_error_with_source; use codex_core::path_utils; use codex_core::read_session_meta_line; use codex_core::state_db::get_state_db; -use codex_core::terminal::Multiplexer; use codex_core::windows_sandbox::WindowsSandboxLevelExt; use codex_protocol::ThreadId; use codex_protocol::config_types::AltScreenMode; @@ -43,6 +42,8 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::RolloutLine; use codex_state::log_db; +use codex_terminal::Multiplexer; +use codex_terminal::terminal_info; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_oss::ensure_oss_provider_ready; use codex_utils_oss::get_default_model_for_oss_provider; @@ -1138,7 +1139,7 @@ fn determine_alt_screen_mode(no_alt_screen: bool, tui_alternate_screen: AltScree AltScreenMode::Always => true, AltScreenMode::Never => false, AltScreenMode::Auto => { - let terminal_info = codex_core::terminal::terminal_info(); + let terminal_info = terminal_info(); !matches!(terminal_info.multiplexer, Some(Multiplexer::Zellij { .. })) } } diff --git a/codex-rs/tui_app_server/Cargo.toml b/codex-rs/tui_app_server/Cargo.toml index 9ab33202c68..9b75c83ff46 100644 --- a/codex-rs/tui_app_server/Cargo.toml +++ b/codex-rs/tui_app_server/Cargo.toml @@ -48,6 +48,7 @@ codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-shell-command = { workspace = true } codex-state = { workspace = true } +codex-terminal = { workspace = true } codex-utils-approval-presets = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-cli = { workspace = true } diff --git a/codex-rs/tui_app_server/src/app.rs b/codex-rs/tui_app_server/src/app.rs index 8f8092eac63..b404a6d73d4 100644 --- a/codex-rs/tui_app_server/src/app.rs +++ b/codex-rs/tui_app_server/src/app.rs @@ -96,6 +96,7 @@ use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SkillErrorInfo; use codex_protocol::protocol::TokenUsage; +use codex_terminal::user_agent; use codex_utils_absolute_path::AbsolutePathBuf; use color_eyre::eyre::Result; use color_eyre::eyre::WrapErr; @@ -2965,7 +2966,7 @@ impl App { auth_mode, codex_core::default_client::originator().value, config.otel.log_user_prompt, - codex_core::terminal::user_agent(), + user_agent(), SessionSource::Cli, ); if config diff --git a/codex-rs/tui_app_server/src/chatwidget.rs b/codex-rs/tui_app_server/src/chatwidget.rs index d76751c1468..9a4523e5f1b 100644 --- a/codex-rs/tui_app_server/src/chatwidget.rs +++ b/codex-rs/tui_app_server/src/chatwidget.rs @@ -94,8 +94,6 @@ use codex_core::git_info::local_git_branches; use codex_core::plugins::PluginsManager; use codex_core::project_doc::DEFAULT_PROJECT_DOC_FILENAME; use codex_core::skills::model::SkillMetadata; -use codex_core::terminal::TerminalName; -use codex_core::terminal::terminal_info; #[cfg(target_os = "windows")] use codex_core::windows_sandbox::WindowsSandboxLevelExt; use codex_otel::RuntimeMetricsSummary; @@ -199,6 +197,8 @@ use codex_protocol::request_user_input::RequestUserInputEvent; use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; +use codex_terminal::TerminalName; +use codex_terminal::terminal_info; use codex_utils_sleep_inhibitor::SleepInhibitor; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; diff --git a/codex-rs/tui_app_server/src/chatwidget/tests.rs b/codex-rs/tui_app_server/src/chatwidget/tests.rs index bae556d51af..5c6077b52e7 100644 --- a/codex-rs/tui_app_server/src/chatwidget/tests.rs +++ b/codex-rs/tui_app_server/src/chatwidget/tests.rs @@ -61,7 +61,6 @@ use codex_core::features::FEATURES; use codex_core::features::Feature; use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_core::skills::model::SkillMetadata; -use codex_core::terminal::TerminalName; use codex_otel::RuntimeMetricsSummary; use codex_otel::SessionTelemetry; use codex_protocol::ThreadId; @@ -144,6 +143,7 @@ use codex_protocol::request_user_input::RequestUserInputQuestion; use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; +use codex_terminal::TerminalName; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_approval_presets::builtin_approval_presets; use crossterm::event::KeyCode; diff --git a/codex-rs/tui_app_server/src/diff_render.rs b/codex-rs/tui_app_server/src/diff_render.rs index dd39901651a..4b15cd27c53 100644 --- a/codex-rs/tui_app_server/src/diff_render.rs +++ b/codex-rs/tui_app_server/src/diff_render.rs @@ -93,9 +93,9 @@ use crate::terminal_palette::indexed_color; use crate::terminal_palette::rgb_color; use crate::terminal_palette::stdout_color_level; use codex_core::git_info::get_git_repo_root; -use codex_core::terminal::TerminalName; -use codex_core::terminal::terminal_info; use codex_protocol::protocol::FileChange; +use codex_terminal::TerminalName; +use codex_terminal::terminal_info; /// Classifies a diff line for gutter sign rendering and style selection. /// diff --git a/codex-rs/tui_app_server/src/lib.rs b/codex-rs/tui_app_server/src/lib.rs index 19cf079f545..7fdfc86b1ea 100644 --- a/codex-rs/tui_app_server/src/lib.rs +++ b/codex-rs/tui_app_server/src/lib.rs @@ -38,7 +38,6 @@ use codex_core::format_exec_policy_error_with_source; use codex_core::path_utils; use codex_core::read_session_meta_line; use codex_core::state_db::get_state_db; -use codex_core::terminal::Multiplexer; use codex_core::windows_sandbox::WindowsSandboxLevelExt; use codex_protocol::ThreadId; use codex_protocol::config_types::AltScreenMode; @@ -49,6 +48,8 @@ use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::TurnContextItem; use codex_state::log_db; +use codex_terminal::Multiplexer; +use codex_terminal::terminal_info; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_oss::ensure_oss_provider_ready; use codex_utils_oss::get_default_model_for_oss_provider; @@ -1485,7 +1486,7 @@ fn determine_alt_screen_mode(no_alt_screen: bool, tui_alternate_screen: AltScree AltScreenMode::Always => true, AltScreenMode::Never => false, AltScreenMode::Auto => { - let terminal_info = codex_core::terminal::terminal_info(); + let terminal_info = terminal_info(); !matches!(terminal_info.multiplexer, Some(Multiplexer::Zellij { .. })) } } From 3661c085ded4aa30083d374fc786681eeea044b0 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Thu, 19 Mar 2026 13:13:26 -0700 Subject: [PATCH 2/3] Rename terminal crate to terminal-detection Co-authored-by: Codex --- codex-rs/Cargo.lock | 12 ++++++------ codex-rs/Cargo.toml | 4 ++-- codex-rs/cli/Cargo.toml | 2 +- codex-rs/cli/src/main.rs | 4 ++-- codex-rs/core/Cargo.toml | 2 +- codex-rs/core/src/codex.rs | 2 +- codex-rs/core/src/default_client.rs | 2 +- codex-rs/mcp-server/Cargo.toml | 1 - codex-rs/mcp-server/tests/common/Cargo.toml | 1 + codex-rs/mcp-server/tests/common/mcp_process.rs | 2 +- codex-rs/terminal-detection/BUILD.bazel | 6 ++++++ codex-rs/{terminal => terminal-detection}/Cargo.toml | 4 ++-- codex-rs/{terminal => terminal-detection}/src/lib.rs | 0 .../src/terminal_tests.rs | 0 codex-rs/terminal/BUILD.bazel | 6 ------ codex-rs/tui/Cargo.toml | 2 +- codex-rs/tui/src/app.rs | 2 +- codex-rs/tui/src/chatwidget.rs | 4 ++-- codex-rs/tui/src/chatwidget/tests.rs | 2 +- codex-rs/tui/src/diff_render.rs | 4 ++-- codex-rs/tui/src/lib.rs | 4 ++-- codex-rs/tui_app_server/Cargo.toml | 2 +- codex-rs/tui_app_server/src/app.rs | 2 +- codex-rs/tui_app_server/src/chatwidget.rs | 4 ++-- codex-rs/tui_app_server/src/chatwidget/tests.rs | 2 +- codex-rs/tui_app_server/src/diff_render.rs | 4 ++-- codex-rs/tui_app_server/src/lib.rs | 4 ++-- 27 files changed, 42 insertions(+), 42 deletions(-) create mode 100644 codex-rs/terminal-detection/BUILD.bazel rename codex-rs/{terminal => terminal-detection}/Cargo.toml (78%) rename codex-rs/{terminal => terminal-detection}/src/lib.rs (100%) rename codex-rs/{terminal => terminal-detection}/src/terminal_tests.rs (100%) delete mode 100644 codex-rs/terminal/BUILD.bazel diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index dbb812c7686..d00aa454562 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1664,7 +1664,7 @@ dependencies = [ "codex-rmcp-client", "codex-state", "codex-stdio-to-uds", - "codex-terminal", + "codex-terminal-detection", "codex-tui", "codex-tui-app-server", "codex-utils-cargo-bin", @@ -1859,7 +1859,7 @@ dependencies = [ "codex-shell-escalation", "codex-skills", "codex-state", - "codex-terminal", + "codex-terminal-detection", "codex-test-macros", "codex-utils-absolute-path", "codex-utils-cache", @@ -2203,7 +2203,6 @@ dependencies = [ "codex-core", "codex-protocol", "codex-shell-command", - "codex-terminal", "codex-utils-cli", "codex-utils-json-to-toml", "core_test_support", @@ -2511,7 +2510,7 @@ dependencies = [ ] [[package]] -name = "codex-terminal" +name = "codex-terminal-detection" version = "0.0.0" dependencies = [ "pretty_assertions", @@ -2553,7 +2552,7 @@ dependencies = [ "codex-protocol", "codex-shell-command", "codex-state", - "codex-terminal", + "codex-terminal-detection", "codex-tui-app-server", "codex-utils-absolute-path", "codex-utils-approval-presets", @@ -2645,7 +2644,7 @@ dependencies = [ "codex-protocol", "codex-shell-command", "codex-state", - "codex-terminal", + "codex-terminal-detection", "codex-utils-absolute-path", "codex-utils-approval-presets", "codex-utils-cargo-bin", @@ -5828,6 +5827,7 @@ dependencies = [ "anyhow", "codex-core", "codex-mcp-server", + "codex-terminal-detection", "codex-utils-cargo-bin", "core_test_support", "os_info", diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index 71c8facfe2b..961c4ef9f98 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -66,7 +66,7 @@ members = [ "codex-client", "codex-api", "state", - "terminal", + "terminal-detection", "codex-experimental-api-macros", "test-macros", "package-manager", @@ -132,7 +132,7 @@ codex-skills = { path = "skills" } codex-state = { path = "state" } codex-stdio-to-uds = { path = "stdio-to-uds" } codex-test-macros = { path = "test-macros" } -codex-terminal = { path = "terminal" } +codex-terminal-detection = { path = "terminal-detection" } codex-tui = { path = "tui" } codex-tui-app-server = { path = "tui_app_server" } codex-utils-absolute-path = { path = "utils/absolute-path" } diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index 8975de87637..affc5ef8c20 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -37,7 +37,7 @@ codex-responses-api-proxy = { workspace = true } codex-rmcp-client = { workspace = true } codex-state = { workspace = true } codex-stdio-to-uds = { workspace = true } -codex-terminal = { workspace = true } +codex-terminal-detection = { workspace = true } codex-tui = { workspace = true } codex-tui-app-server = { workspace = true } libc = { workspace = true } diff --git a/codex-rs/cli/src/main.rs b/codex-rs/cli/src/main.rs index 31bd6213124..e9f4d6f686d 100644 --- a/codex-rs/cli/src/main.rs +++ b/codex-rs/cli/src/main.rs @@ -50,7 +50,7 @@ use codex_core::config::edit::ConfigEditsBuilder; use codex_core::config::find_codex_home; use codex_core::features::Stage; use codex_core::features::is_known_feature_key; -use codex_terminal::TerminalName; +use codex_terminal_detection::TerminalName; /// Codex CLI /// @@ -1049,7 +1049,7 @@ async fn run_interactive_tui( interactive.prompt = Some(prompt.replace("\r\n", "\n").replace('\r', "\n")); } - let terminal_info = codex_terminal::terminal_info(); + let terminal_info = codex_terminal_detection::terminal_info(); if terminal_info.name == TerminalName::Dumb { if !(std::io::stdin().is_terminal() && std::io::stderr().is_terminal()) { return Ok(AppExitInfo::fatal( diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index 9f0269537af..869f9dd9f41 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -48,7 +48,7 @@ codex-artifacts = { workspace = true } codex-protocol = { workspace = true } codex-rmcp-client = { workspace = true } codex-state = { workspace = true } -codex-terminal = { workspace = true } +codex-terminal-detection = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-cache = { workspace = true } codex-utils-image = { workspace = true } diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 62a22e57127..505d25439ce 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -116,7 +116,7 @@ use codex_protocol::request_user_input::RequestUserInputArgs; use codex_protocol::request_user_input::RequestUserInputResponse; use codex_rmcp_client::ElicitationResponse; use codex_rmcp_client::OAuthCredentialsStoreMode; -use codex_terminal::user_agent; +use codex_terminal_detection::user_agent; use codex_utils_stream_parser::AssistantTextChunk; use codex_utils_stream_parser::AssistantTextStreamParser; use codex_utils_stream_parser::ProposedPlanSegment; diff --git a/codex-rs/core/src/default_client.rs b/codex-rs/core/src/default_client.rs index 6b88ae9a9fe..59c7bd2fb9b 100644 --- a/codex-rs/core/src/default_client.rs +++ b/codex-rs/core/src/default_client.rs @@ -4,7 +4,7 @@ use codex_client::BuildCustomCaTransportError; use codex_client::CodexHttpClient; pub use codex_client::CodexRequestBuilder; use codex_client::build_reqwest_client_with_custom_ca; -use codex_terminal::user_agent; +use codex_terminal_detection::user_agent; use reqwest::header::HeaderMap; use reqwest::header::HeaderValue; use std::sync::LazyLock; diff --git a/codex-rs/mcp-server/Cargo.toml b/codex-rs/mcp-server/Cargo.toml index 9158a7b66ee..2ecce383cea 100644 --- a/codex-rs/mcp-server/Cargo.toml +++ b/codex-rs/mcp-server/Cargo.toml @@ -40,7 +40,6 @@ tracing-subscriber = { workspace = true, features = ["env-filter", "fmt"] } [dev-dependencies] core_test_support = { workspace = true } -codex-terminal = { workspace = true } mcp_test_support = { workspace = true } os_info = { workspace = true } pretty_assertions = { workspace = true } diff --git a/codex-rs/mcp-server/tests/common/Cargo.toml b/codex-rs/mcp-server/tests/common/Cargo.toml index 1dec2d09acb..83f2c53697c 100644 --- a/codex-rs/mcp-server/tests/common/Cargo.toml +++ b/codex-rs/mcp-server/tests/common/Cargo.toml @@ -11,6 +11,7 @@ path = "lib.rs" anyhow = { workspace = true } codex-core = { workspace = true } codex-mcp-server = { workspace = true } +codex-terminal-detection = { workspace = true } codex-utils-cargo-bin = { workspace = true } rmcp = { workspace = true } os_info = { workspace = true } diff --git a/codex-rs/mcp-server/tests/common/mcp_process.rs b/codex-rs/mcp-server/tests/common/mcp_process.rs index 5ff9e1788cf..53925ca396a 100644 --- a/codex-rs/mcp-server/tests/common/mcp_process.rs +++ b/codex-rs/mcp-server/tests/common/mcp_process.rs @@ -11,7 +11,7 @@ use tokio::process::ChildStdout; use anyhow::Context; use codex_mcp_server::CodexToolCallParam; -use codex_terminal::user_agent; +use codex_terminal_detection::user_agent; use pretty_assertions::assert_eq; use rmcp::model::CallToolRequestParams; diff --git a/codex-rs/terminal-detection/BUILD.bazel b/codex-rs/terminal-detection/BUILD.bazel new file mode 100644 index 00000000000..a41a762c18a --- /dev/null +++ b/codex-rs/terminal-detection/BUILD.bazel @@ -0,0 +1,6 @@ +load("//:defs.bzl", "codex_rust_crate") + +codex_rust_crate( + name = "terminal-detection", + crate_name = "codex_terminal_detection", +) diff --git a/codex-rs/terminal/Cargo.toml b/codex-rs/terminal-detection/Cargo.toml similarity index 78% rename from codex-rs/terminal/Cargo.toml rename to codex-rs/terminal-detection/Cargo.toml index 4816c40e707..f75e649d36a 100644 --- a/codex-rs/terminal/Cargo.toml +++ b/codex-rs/terminal-detection/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "codex-terminal" +name = "codex-terminal-detection" version.workspace = true edition.workspace = true license.workspace = true [lib] -name = "codex_terminal" +name = "codex_terminal_detection" path = "src/lib.rs" [lints] diff --git a/codex-rs/terminal/src/lib.rs b/codex-rs/terminal-detection/src/lib.rs similarity index 100% rename from codex-rs/terminal/src/lib.rs rename to codex-rs/terminal-detection/src/lib.rs diff --git a/codex-rs/terminal/src/terminal_tests.rs b/codex-rs/terminal-detection/src/terminal_tests.rs similarity index 100% rename from codex-rs/terminal/src/terminal_tests.rs rename to codex-rs/terminal-detection/src/terminal_tests.rs diff --git a/codex-rs/terminal/BUILD.bazel b/codex-rs/terminal/BUILD.bazel deleted file mode 100644 index fde9e230907..00000000000 --- a/codex-rs/terminal/BUILD.bazel +++ /dev/null @@ -1,6 +0,0 @@ -load("//:defs.bzl", "codex_rust_crate") - -codex_rust_crate( - name = "terminal", - crate_name = "codex_terminal", -) diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 5b62c86186f..d4b6f25f01f 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -43,7 +43,7 @@ codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-shell-command = { workspace = true } codex-state = { workspace = true } -codex-terminal = { workspace = true } +codex-terminal-detection = { workspace = true } codex-tui-app-server = { workspace = true } codex-utils-approval-presets = { workspace = true } codex-utils-absolute-path = { workspace = true } diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 98f2679ded6..50b663162d3 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -80,7 +80,7 @@ use codex_protocol::protocol::SessionConfiguredEvent; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SkillErrorInfo; use codex_protocol::protocol::TokenUsage; -use codex_terminal::user_agent; +use codex_terminal_detection::user_agent; use codex_utils_absolute_path::AbsolutePathBuf; use color_eyre::eyre::Result; use color_eyre::eyre::WrapErr; diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 8bc96c008b8..897ec389ec8 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -153,8 +153,8 @@ use codex_protocol::request_permissions::RequestPermissionsEvent; use codex_protocol::request_user_input::RequestUserInputEvent; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; -use codex_terminal::TerminalName; -use codex_terminal::terminal_info; +use codex_terminal_detection::TerminalName; +use codex_terminal_detection::terminal_info; use codex_utils_sleep_inhibitor::SleepInhibitor; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index ccf26dd2318..97cdf7eeef7 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -120,7 +120,7 @@ use codex_protocol::request_user_input::RequestUserInputQuestion; use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; -use codex_terminal::TerminalName; +use codex_terminal_detection::TerminalName; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_approval_presets::builtin_approval_presets; use crossterm::event::KeyCode; diff --git a/codex-rs/tui/src/diff_render.rs b/codex-rs/tui/src/diff_render.rs index 4b15cd27c53..684d76b1e08 100644 --- a/codex-rs/tui/src/diff_render.rs +++ b/codex-rs/tui/src/diff_render.rs @@ -94,8 +94,8 @@ use crate::terminal_palette::rgb_color; use crate::terminal_palette::stdout_color_level; use codex_core::git_info::get_git_repo_root; use codex_protocol::protocol::FileChange; -use codex_terminal::TerminalName; -use codex_terminal::terminal_info; +use codex_terminal_detection::TerminalName; +use codex_terminal_detection::terminal_info; /// Classifies a diff line for gutter sign rendering and style selection. /// diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 2d75eb29de2..8f015981c07 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -42,8 +42,8 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::RolloutLine; use codex_state::log_db; -use codex_terminal::Multiplexer; -use codex_terminal::terminal_info; +use codex_terminal_detection::Multiplexer; +use codex_terminal_detection::terminal_info; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_oss::ensure_oss_provider_ready; use codex_utils_oss::get_default_model_for_oss_provider; diff --git a/codex-rs/tui_app_server/Cargo.toml b/codex-rs/tui_app_server/Cargo.toml index 9b75c83ff46..4d9b2688957 100644 --- a/codex-rs/tui_app_server/Cargo.toml +++ b/codex-rs/tui_app_server/Cargo.toml @@ -48,7 +48,7 @@ codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-shell-command = { workspace = true } codex-state = { workspace = true } -codex-terminal = { workspace = true } +codex-terminal-detection = { workspace = true } codex-utils-approval-presets = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-cli = { workspace = true } diff --git a/codex-rs/tui_app_server/src/app.rs b/codex-rs/tui_app_server/src/app.rs index b404a6d73d4..52b6db48bbf 100644 --- a/codex-rs/tui_app_server/src/app.rs +++ b/codex-rs/tui_app_server/src/app.rs @@ -96,7 +96,7 @@ use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SkillErrorInfo; use codex_protocol::protocol::TokenUsage; -use codex_terminal::user_agent; +use codex_terminal_detection::user_agent; use codex_utils_absolute_path::AbsolutePathBuf; use color_eyre::eyre::Result; use color_eyre::eyre::WrapErr; diff --git a/codex-rs/tui_app_server/src/chatwidget.rs b/codex-rs/tui_app_server/src/chatwidget.rs index 9a4523e5f1b..eaf9ca11596 100644 --- a/codex-rs/tui_app_server/src/chatwidget.rs +++ b/codex-rs/tui_app_server/src/chatwidget.rs @@ -197,8 +197,8 @@ use codex_protocol::request_user_input::RequestUserInputEvent; use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; -use codex_terminal::TerminalName; -use codex_terminal::terminal_info; +use codex_terminal_detection::TerminalName; +use codex_terminal_detection::terminal_info; use codex_utils_sleep_inhibitor::SleepInhibitor; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; diff --git a/codex-rs/tui_app_server/src/chatwidget/tests.rs b/codex-rs/tui_app_server/src/chatwidget/tests.rs index 5c6077b52e7..a08d56da8f1 100644 --- a/codex-rs/tui_app_server/src/chatwidget/tests.rs +++ b/codex-rs/tui_app_server/src/chatwidget/tests.rs @@ -143,7 +143,7 @@ use codex_protocol::request_user_input::RequestUserInputQuestion; use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::user_input::TextElement; use codex_protocol::user_input::UserInput; -use codex_terminal::TerminalName; +use codex_terminal_detection::TerminalName; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_approval_presets::builtin_approval_presets; use crossterm::event::KeyCode; diff --git a/codex-rs/tui_app_server/src/diff_render.rs b/codex-rs/tui_app_server/src/diff_render.rs index 4b15cd27c53..684d76b1e08 100644 --- a/codex-rs/tui_app_server/src/diff_render.rs +++ b/codex-rs/tui_app_server/src/diff_render.rs @@ -94,8 +94,8 @@ use crate::terminal_palette::rgb_color; use crate::terminal_palette::stdout_color_level; use codex_core::git_info::get_git_repo_root; use codex_protocol::protocol::FileChange; -use codex_terminal::TerminalName; -use codex_terminal::terminal_info; +use codex_terminal_detection::TerminalName; +use codex_terminal_detection::terminal_info; /// Classifies a diff line for gutter sign rendering and style selection. /// diff --git a/codex-rs/tui_app_server/src/lib.rs b/codex-rs/tui_app_server/src/lib.rs index 7fdfc86b1ea..56778065760 100644 --- a/codex-rs/tui_app_server/src/lib.rs +++ b/codex-rs/tui_app_server/src/lib.rs @@ -48,8 +48,8 @@ use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::TurnContextItem; use codex_state::log_db; -use codex_terminal::Multiplexer; -use codex_terminal::terminal_info; +use codex_terminal_detection::Multiplexer; +use codex_terminal_detection::terminal_info; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_oss::ensure_oss_provider_ready; use codex_utils_oss::get_default_model_for_oss_provider; From 9e6c4040126f6c977c099716ff1135b9f0638747 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Thu, 19 Mar 2026 13:39:49 -0700 Subject: [PATCH 3/3] codex: fix CI failure on PR #15216 Co-authored-by: Codex --- codex-rs/exec-server/src/server/filesystem.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/exec-server/src/server/filesystem.rs b/codex-rs/exec-server/src/server/filesystem.rs index bc3d22a4da3..a263bb1fee0 100644 --- a/codex-rs/exec-server/src/server/filesystem.rs +++ b/codex-rs/exec-server/src/server/filesystem.rs @@ -36,7 +36,7 @@ pub(crate) struct ExecServerFileSystem { impl Default for ExecServerFileSystem { fn default() -> Self { Self { - file_system: Arc::new(Environment.get_filesystem()), + file_system: Arc::new(Environment::default().get_filesystem()), } } }