From 9f71d57a655628c3fdd20301a62df4446df2a924 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Wed, 1 Apr 2026 22:17:55 -0700 Subject: [PATCH 1/3] Extract code-mode nested tool collection into codex-tools (#16509) ## Why This is another small step in the `codex-core` -> `codex-tools` migration described in `AGENTS.md`. `core/src/tools/spec.rs` and `core/src/tools/code_mode/mod.rs` were both hand-rolling the same pure transformation: convert visible `ToolSpec`s into code-mode nested tool definitions, then sort and deduplicate by tool name. That logic does not depend on core runtime state or handlers, so keeping it in `codex-core` makes `spec.rs` harder to peel out later than it needs to be. ## What Changed - Add `collect_code_mode_tool_definitions()` to `codex-rs/tools/src/code_mode.rs`. - Reuse that helper from `codex-rs/core/src/tools/spec.rs` when assembling the `exec` tool description. - Reuse the same helper from `codex-rs/core/src/tools/code_mode/mod.rs` when exposing nested tool metadata to the code-mode runtime. This is intended to be a straight refactor with no behavior change and no new test surface. ## Verification - `cargo test -p codex-tools` - `cargo test -p codex-core tools::spec::tests` - `cargo test -p codex-core code_mode_only_` --- codex-rs/core/src/tools/code_mode/mod.rs | 12 +++--------- codex-rs/core/src/tools/spec.rs | 17 +++++++++-------- codex-rs/tools/src/code_mode.rs | 12 ++++++++++++ codex-rs/tools/src/lib.rs | 1 + 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/codex-rs/core/src/tools/code_mode/mod.rs b/codex-rs/core/src/tools/code_mode/mod.rs index 45e67271f0..21fca4689e 100644 --- a/codex-rs/core/src/tools/code_mode/mod.rs +++ b/codex-rs/core/src/tools/code_mode/mod.rs @@ -28,7 +28,7 @@ use crate::tools::router::ToolRouterParams; use crate::unified_exec::resolve_max_tokens; use codex_features::Feature; use codex_tools::ToolSpec; -use codex_tools::tool_spec_to_code_mode_tool_definition; +use codex_tools::collect_code_mode_tool_definitions; use codex_utils_output_truncation::TruncationPolicy; use codex_utils_output_truncation::formatted_truncate_text_content_items_with_policy; use codex_utils_output_truncation::truncate_function_output_items_with_policy; @@ -244,14 +244,8 @@ pub(super) async fn build_enabled_tools( exec: &ExecContext, ) -> Vec { let router = build_nested_router(exec).await; - let mut out = router - .specs() - .into_iter() - .filter_map(|spec| tool_spec_to_code_mode_tool_definition(&spec)) - .collect::>(); - out.sort_by(|left, right| left.name.cmp(&right.name)); - out.dedup_by(|left, right| left.name == right.name); - out + let specs = router.specs(); + collect_code_mode_tool_definitions(&specs) } async fn build_nested_router(exec: &ExecContext) -> ToolRouter { diff --git a/codex-rs/core/src/tools/spec.rs b/codex-rs/core/src/tools/spec.rs index cd6afe5512..0a7ddb1aaa 100644 --- a/codex-rs/core/src/tools/spec.rs +++ b/codex-rs/core/src/tools/spec.rs @@ -29,6 +29,7 @@ use codex_tools::ViewImageToolOptions; use codex_tools::WaitAgentTimeoutOptions; use codex_tools::WebSearchToolOptions; use codex_tools::augment_tool_spec_for_code_mode; +use codex_tools::collect_code_mode_tool_definitions; use codex_tools::collect_tool_search_app_infos; use codex_tools::collect_tool_suggest_entries; use codex_tools::create_apply_patch_freeform_tool; @@ -72,7 +73,6 @@ use codex_tools::dynamic_tool_to_responses_api_tool; use codex_tools::mcp_tool_to_responses_api_tool; use codex_tools::request_permissions_tool_description; use codex_tools::request_user_input_tool_description; -use codex_tools::tool_spec_to_code_mode_tool_definition; use std::collections::HashMap; #[cfg(test)] @@ -202,13 +202,14 @@ pub(crate) fn build_specs_with_discoverable_tools( dynamic_tools, ) .build(); - let mut enabled_tools = nested_specs - .into_iter() - .filter_map(|spec| tool_spec_to_code_mode_tool_definition(&spec.spec)) - .map(|tool| (tool.name, tool.description)) - .collect::>(); - enabled_tools.sort_by(|left, right| left.0.cmp(&right.0)); - enabled_tools.dedup_by(|left, right| left.0 == right.0); + let enabled_tools = collect_code_mode_tool_definitions( + nested_specs + .iter() + .map(|configured_tool| &configured_tool.spec), + ) + .into_iter() + .map(|tool| (tool.name, tool.description)) + .collect::>(); push_tool_spec( &mut builder, create_code_mode_tool(&enabled_tools, config.code_mode_only_enabled), diff --git a/codex-rs/tools/src/code_mode.rs b/codex-rs/tools/src/code_mode.rs index 814621f347..c90c3f7bc8 100644 --- a/codex-rs/tools/src/code_mode.rs +++ b/codex-rs/tools/src/code_mode.rs @@ -37,6 +37,18 @@ pub fn tool_spec_to_code_mode_tool_definition(spec: &ToolSpec) -> Option( + specs: impl IntoIterator, +) -> Vec { + let mut tool_definitions = specs + .into_iter() + .filter_map(tool_spec_to_code_mode_tool_definition) + .collect::>(); + tool_definitions.sort_by(|left, right| left.name.cmp(&right.name)); + tool_definitions.dedup_by(|left, right| left.name == right.name); + tool_definitions +} + pub fn create_wait_tool() -> ToolSpec { let properties = BTreeMap::from([ ( diff --git a/codex-rs/tools/src/lib.rs b/codex-rs/tools/src/lib.rs index 2e58fa1529..3bce0fb107 100644 --- a/codex-rs/tools/src/lib.rs +++ b/codex-rs/tools/src/lib.rs @@ -42,6 +42,7 @@ pub use apply_patch_tool::ApplyPatchToolArgs; pub use apply_patch_tool::create_apply_patch_freeform_tool; pub use apply_patch_tool::create_apply_patch_json_tool; pub use code_mode::augment_tool_spec_for_code_mode; +pub use code_mode::collect_code_mode_tool_definitions; pub use code_mode::create_code_mode_tool; pub use code_mode::create_wait_tool; pub use code_mode::tool_spec_to_code_mode_tool_definition; From aa2403e2eb4126a6bebb50b9db8d943510bd37b9 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Wed, 1 Apr 2026 23:06:24 -0700 Subject: [PATCH 2/3] core: remove cross-crate re-exports from lib.rs (#16512) ## Why `codex-core` was re-exporting APIs owned by sibling `codex-*` crates, which made downstream crates depend on `codex-core` as a proxy module instead of the actual owner crate. Removing those forwards makes crate boundaries explicit and lets leaf crates drop unnecessary `codex-core` dependencies. In this PR, this reduces the dependency on `codex-core` to `codex-login` in the following files: ``` codex-rs/backend-client/Cargo.toml codex-rs/mcp-server/tests/common/Cargo.toml ``` ## What - Remove `codex-rs/core/src/lib.rs` re-exports for symbols owned by `codex-login`, `codex-mcp`, `codex-rollout`, `codex-analytics`, `codex-protocol`, `codex-shell-command`, `codex-sandboxing`, `codex-tools`, and `codex-utils-path`. - Delete the `default_client` forwarding shim in `codex-rs/core`. - Update in-crate and downstream callsites to import directly from the owning `codex-*` crate. - Add direct Cargo dependencies where callsites now target the owner crate, and remove `codex-core` from `codex-rs/backend-client`. --- codex-rs/Cargo.lock | 11 +- codex-rs/app-server/Cargo.toml | 2 + .../app-server/src/codex_message_processor.rs | 20 ++-- codex-rs/app-server/src/config_api.rs | 8 +- codex-rs/app-server/src/in_process.rs | 2 +- codex-rs/app-server/src/lib.rs | 4 +- codex-rs/app-server/src/message_processor.rs | 16 +-- .../src/message_processor/tracing_tests.rs | 2 +- .../app-server/tests/common/auth_fixtures.rs | 6 +- .../app-server/tests/common/mcp_process.rs | 2 +- codex-rs/app-server/tests/suite/auth.rs | 4 +- codex-rs/app-server/tests/suite/v2/account.rs | 2 +- .../app-server/tests/suite/v2/analytics.rs | 2 +- .../app-server/tests/suite/v2/app_list.rs | 6 +- .../app-server/tests/suite/v2/compaction.rs | 2 +- .../tests/suite/v2/mcp_server_elicitation.rs | 2 +- .../tests/suite/v2/plugin_install.rs | 2 +- .../app-server/tests/suite/v2/plugin_list.rs | 2 +- .../app-server/tests/suite/v2/plugin_read.rs | 2 +- .../tests/suite/v2/plugin_uninstall.rs | 2 +- .../app-server/tests/suite/v2/rate_limits.rs | 2 +- .../app-server/tests/suite/v2/thread_fork.rs | 4 +- .../tests/suite/v2/thread_metadata_update.rs | 2 +- .../tests/suite/v2/thread_resume.rs | 4 +- .../app-server/tests/suite/v2/thread_start.rs | 4 +- codex-rs/backend-client/Cargo.toml | 2 +- codex-rs/backend-client/src/client.rs | 4 +- codex-rs/chatgpt/src/chatgpt_client.rs | 2 +- codex-rs/chatgpt/src/chatgpt_token.rs | 5 +- codex-rs/chatgpt/src/connectors.rs | 2 +- codex-rs/cli/Cargo.toml | 1 + codex-rs/cli/src/login.rs | 12 +- codex-rs/cli/src/wsl_paths.rs | 2 +- codex-rs/cloud-requirements/Cargo.toml | 1 + codex-rs/cloud-requirements/src/lib.rs | 10 +- codex-rs/cloud-tasks/src/lib.rs | 5 +- codex-rs/cloud-tasks/src/util.rs | 4 +- codex-rs/core/src/agent/control.rs | 2 +- codex-rs/core/src/agent/control_tests.rs | 2 +- codex-rs/core/src/api_bridge.rs | 2 +- codex-rs/core/src/apply_patch.rs | 4 +- codex-rs/core/src/arc_monitor.rs | 8 +- codex-rs/core/src/arc_monitor_tests.rs | 4 +- codex-rs/core/src/auth_env_telemetry.rs | 6 +- codex-rs/core/src/client.rs | 33 +++--- codex-rs/core/src/client_tests.rs | 2 +- codex-rs/core/src/codex.rs | 104 +++++++++--------- .../src/codex/rollout_reconstruction_tests.rs | 6 +- codex-rs/core/src/codex_delegate.rs | 2 +- codex-rs/core/src/codex_tests.rs | 79 +++++++------ codex-rs/core/src/codex_tests_guardian.rs | 2 +- codex-rs/core/src/codex_thread.rs | 8 +- codex-rs/core/src/command_canonicalization.rs | 6 +- codex-rs/core/src/compact.rs | 8 +- codex-rs/core/src/compact_remote.rs | 6 +- codex-rs/core/src/config/mod.rs | 8 +- codex-rs/core/src/config/profile.rs | 2 +- codex-rs/core/src/connectors.rs | 26 ++--- codex-rs/core/src/connectors_tests.rs | 2 +- .../core/src/default_client_forwarding.rs | 2 - codex-rs/core/src/exec.rs | 10 +- codex-rs/core/src/exec_policy.rs | 8 +- codex-rs/core/src/guardian/review_session.rs | 2 +- codex-rs/core/src/guardian/tests.rs | 2 +- codex-rs/core/src/hook_runtime.rs | 3 +- codex-rs/core/src/landlock.rs | 2 +- codex-rs/core/src/lib.rs | 30 ----- codex-rs/core/src/mcp.rs | 2 +- codex-rs/core/src/mcp_tool_call.rs | 10 +- codex-rs/core/src/mcp_tool_call_tests.rs | 10 +- codex-rs/core/src/memories/tests.rs | 4 +- codex-rs/core/src/memories/usage.rs | 4 +- codex-rs/core/src/model_provider_info.rs | 2 +- codex-rs/core/src/models_manager/manager.rs | 8 +- .../core/src/models_manager/manager_tests.rs | 8 +- codex-rs/core/src/otel_init.rs | 2 +- codex-rs/core/src/personality_migration.rs | 2 +- codex-rs/core/src/plugins/injection.rs | 2 +- codex-rs/core/src/plugins/manager.rs | 4 +- codex-rs/core/src/plugins/manager_tests.rs | 2 +- codex-rs/core/src/plugins/remote.rs | 4 +- codex-rs/core/src/plugins/startup_sync.rs | 4 +- .../core/src/plugins/startup_sync_tests.rs | 2 +- codex-rs/core/src/provider_auth.rs | 2 +- codex-rs/core/src/realtime_conversation.rs | 9 +- codex-rs/core/src/review_format.rs | 4 +- codex-rs/core/src/safety.rs | 6 +- codex-rs/core/src/sandbox_tags.rs | 2 +- codex-rs/core/src/sandbox_tags_tests.rs | 2 +- codex-rs/core/src/seatbelt.rs | 2 +- codex-rs/core/src/state/service.rs | 6 +- codex-rs/core/src/state/session.rs | 6 +- codex-rs/core/src/state/session_tests.rs | 7 +- codex-rs/core/src/state/turn.rs | 4 +- codex-rs/core/src/stream_events_utils.rs | 2 +- codex-rs/core/src/tasks/ghost_snapshot.rs | 4 +- codex-rs/core/src/tasks/mod.rs | 13 ++- codex-rs/core/src/tasks/regular.rs | 4 +- codex-rs/core/src/tasks/undo.rs | 6 +- codex-rs/core/src/tasks/user_shell.rs | 16 +-- codex-rs/core/src/test_support.rs | 4 +- codex-rs/core/src/thread_manager.rs | 10 +- codex-rs/core/src/tools/events.rs | 22 ++-- codex-rs/core/src/tools/handlers/js_repl.rs | 2 +- .../core/src/tools/handlers/js_repl_tests.rs | 4 +- .../core/src/tools/handlers/mcp_resource.rs | 8 +- .../src/tools/handlers/multi_agents_tests.rs | 28 ++--- codex-rs/core/src/tools/handlers/shell.rs | 4 +- .../core/src/tools/handlers/shell_tests.rs | 6 +- .../core/src/tools/handlers/tool_search.rs | 2 +- .../core/src/tools/handlers/tool_suggest.rs | 4 +- .../core/src/tools/handlers/unified_exec.rs | 6 +- .../core/src/tools/handlers/view_image.rs | 4 +- codex-rs/core/src/tools/js_repl/mod_tests.rs | 14 +-- codex-rs/core/src/tools/registry.rs | 2 +- codex-rs/core/src/tools/router.rs | 2 +- codex-rs/core/src/tools/runtimes/shell.rs | 2 +- .../runtimes/shell/unix_escalation_tests.rs | 8 +- .../core/src/tools/runtimes/unified_exec.rs | 2 +- codex-rs/core/src/tools/sandboxing.rs | 6 +- codex-rs/core/src/tools/spec.rs | 2 +- codex-rs/core/src/turn_diff_tracker.rs | 2 +- .../core/src/unified_exec/async_watcher.rs | 8 +- .../core/src/unified_exec/process_manager.rs | 2 +- codex-rs/core/src/util.rs | 2 +- codex-rs/core/src/windows_sandbox.rs | 4 +- .../core/src/windows_sandbox_read_grants.rs | 2 +- .../src/windows_sandbox_read_grants_tests.rs | 2 +- codex-rs/core/tests/common/Cargo.toml | 1 + codex-rs/core/tests/common/test_codex.rs | 2 +- codex-rs/core/tests/common/test_codex_exec.rs | 2 +- codex-rs/core/tests/responses_headers.rs | 2 +- codex-rs/core/tests/suite/auth_refresh.rs | 14 +-- codex-rs/core/tests/suite/cli_stream.rs | 2 +- codex-rs/core/tests/suite/client.rs | 10 +- .../core/tests/suite/client_websockets.rs | 2 +- codex-rs/core/tests/suite/compact.rs | 2 +- codex-rs/core/tests/suite/compact_remote.rs | 2 +- .../core/tests/suite/compact_resume_fork.rs | 2 +- .../core/tests/suite/model_info_overrides.rs | 2 +- codex-rs/core/tests/suite/model_switching.rs | 2 +- codex-rs/core/tests/suite/models_cache_ttl.rs | 2 +- .../core/tests/suite/models_etag_responses.rs | 2 +- codex-rs/core/tests/suite/personality.rs | 4 +- codex-rs/core/tests/suite/plugins.rs | 4 +- .../core/tests/suite/realtime_conversation.rs | 4 +- codex-rs/core/tests/suite/remote_models.rs | 2 +- .../core/tests/suite/request_compression.rs | 2 +- codex-rs/core/tests/suite/resume_warning.rs | 2 +- codex-rs/core/tests/suite/rmcp_client.rs | 2 +- codex-rs/core/tests/suite/search_tool.rs | 2 +- .../tests/suite/spawn_agent_description.rs | 2 +- codex-rs/core/tests/suite/tool_suggest.rs | 2 +- .../tests/suite/unstable_features_warning.rs | 2 +- codex-rs/core/tests/suite/view_image.rs | 2 +- codex-rs/exec/Cargo.toml | 1 + codex-rs/exec/src/lib.rs | 8 +- codex-rs/exec/tests/suite/originator.rs | 2 +- codex-rs/mcp-server/Cargo.toml | 1 + codex-rs/mcp-server/src/message_processor.rs | 6 +- codex-rs/mcp-server/tests/common/Cargo.toml | 2 +- .../mcp-server/tests/common/mcp_process.rs | 2 +- codex-rs/tui/Cargo.toml | 1 + codex-rs/tui/src/app.rs | 2 +- codex-rs/tui/src/chatwidget.rs | 2 +- codex-rs/tui/src/lib.rs | 10 +- codex-rs/tui/src/local_chatgpt_auth.rs | 8 +- codex-rs/tui/src/onboarding/auth.rs | 4 +- .../onboarding/auth/headless_chatgpt_login.rs | 2 +- codex-rs/tui/src/updates.rs | 2 +- 170 files changed, 495 insertions(+), 512 deletions(-) delete mode 100644 codex-rs/core/src/default_client_forwarding.rs diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 454d41d9b2..0f1046b69b 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1401,6 +1401,7 @@ dependencies = [ "base64 0.22.1", "chrono", "clap", + "codex-analytics", "codex-app-server-protocol", "codex-arg0", "codex-backend-client", @@ -1417,6 +1418,7 @@ dependencies = [ "codex-otel", "codex-protocol", "codex-rmcp-client", + "codex-rollout", "codex-sandboxing", "codex-shell-command", "codex-state", @@ -1573,7 +1575,7 @@ dependencies = [ "anyhow", "codex-backend-openapi-models", "codex-client", - "codex-core", + "codex-login", "codex-protocol", "pretty_assertions", "reqwest", @@ -1642,6 +1644,7 @@ dependencies = [ "codex-tui", "codex-utils-cargo-bin", "codex-utils-cli", + "codex-utils-path", "codex-windows-sandbox", "libc", "owo-colors", @@ -1698,6 +1701,7 @@ dependencies = [ "chrono", "codex-backend-client", "codex-core", + "codex-login", "codex-otel", "codex-protocol", "hmac", @@ -1995,6 +1999,7 @@ dependencies = [ "codex-core", "codex-feedback", "codex-git-utils", + "codex-login", "codex-otel", "codex-protocol", "codex-utils-absolute-path", @@ -2301,6 +2306,7 @@ dependencies = [ "codex-core", "codex-exec-server", "codex-features", + "codex-login", "codex-protocol", "codex-shell-command", "codex-utils-cli", @@ -2696,6 +2702,7 @@ dependencies = [ "codex-mcp", "codex-otel", "codex-protocol", + "codex-rollout", "codex-shell-command", "codex-state", "codex-terminal-detection", @@ -3197,6 +3204,7 @@ dependencies = [ "codex-core", "codex-exec-server", "codex-features", + "codex-login", "codex-protocol", "codex-utils-absolute-path", "codex-utils-cargo-bin", @@ -6012,6 +6020,7 @@ version = "0.0.0" dependencies = [ "anyhow", "codex-core", + "codex-login", "codex-mcp-server", "codex-terminal-detection", "codex-utils-cargo-bin", diff --git a/codex-rs/app-server/Cargo.toml b/codex-rs/app-server/Cargo.toml index fc3e8c8cb5..3d58bbe146 100644 --- a/codex-rs/app-server/Cargo.toml +++ b/codex-rs/app-server/Cargo.toml @@ -29,6 +29,7 @@ axum = { workspace = true, default-features = false, features = [ "tokio", "ws", ] } +codex-analytics = { workspace = true } codex-arg0 = { workspace = true } codex-cloud-requirements = { workspace = true } codex-core = { workspace = true } @@ -48,6 +49,7 @@ codex-protocol = { workspace = true } codex-app-server-protocol = { workspace = true } codex-feedback = { workspace = true } codex-rmcp-client = { workspace = true } +codex-rollout = { workspace = true } codex-sandboxing = { workspace = true } codex-state = { workspace = true } codex-tools = { workspace = true } diff --git a/codex-rs/app-server/src/codex_message_processor.rs b/codex-rs/app-server/src/codex_message_processor.rs index 4eea3fed64..f833e5234f 100644 --- a/codex-rs/app-server/src/codex_message_processor.rs +++ b/codex-rs/app-server/src/codex_message_processor.rs @@ -20,6 +20,7 @@ use crate::thread_status::resolve_thread_status; use chrono::DateTime; use chrono::SecondsFormat; use chrono::Utc; +use codex_analytics::AnalyticsEventsClient; use codex_app_server_protocol::Account; use codex_app_server_protocol::AccountLoginCompletedNotification; use codex_app_server_protocol::AccountUpdatedNotification; @@ -180,9 +181,6 @@ use codex_arg0::Arg0DispatchPaths; use codex_backend_client::Client as BackendClient; use codex_chatgpt::connectors; use codex_cloud_requirements::cloud_requirements_loader; -use codex_core::AnalyticsEventsClient; -use codex_core::AuthManager; -use codex_core::CodexAuth; use codex_core::CodexThread; use codex_core::Cursor as RolloutCursor; use codex_core::ForkSnapshot; @@ -193,9 +191,6 @@ use codex_core::SteerInputError; use codex_core::ThreadConfigSnapshot; use codex_core::ThreadManager; use codex_core::ThreadSortKey as CoreThreadSortKey; -use codex_core::auth::AuthMode as CoreAuthMode; -use codex_core::auth::CLIENT_ID; -use codex_core::auth::login_with_api_key; use codex_core::config::Config; use codex_core::config::ConfigOverrides; use codex_core::config::NetworkProxyAuditMetadata; @@ -207,7 +202,6 @@ use codex_core::config_loader::CloudRequirementsLoadErrorCode; use codex_core::config_loader::CloudRequirementsLoader; use codex_core::config_loader::LoaderOverrides; use codex_core::config_loader::load_config_layers_state; -use codex_core::default_client::set_default_client_residency_requirement; use codex_core::error::CodexErr; use codex_core::error::Result as CodexResult; use codex_core::exec::ExecCapturePolicy; @@ -233,9 +227,6 @@ use codex_core::read_head_for_summary; use codex_core::read_session_meta_line; use codex_core::rollout_date_parts; use codex_core::sandboxing::SandboxPermissions; -use codex_core::state_db::StateDbHandle; -use codex_core::state_db::get_state_db; -use codex_core::state_db::reconcile_rollout; use codex_core::windows_sandbox::WindowsSandboxLevelExt; use codex_core::windows_sandbox::WindowsSandboxSetupMode as CoreWindowsSandboxSetupMode; use codex_core::windows_sandbox::WindowsSandboxSetupRequest; @@ -244,10 +235,16 @@ use codex_features::Feature; use codex_features::Stage; use codex_feedback::CodexFeedback; use codex_git_utils::git_diff_to_remote; +use codex_login::AuthManager; +use codex_login::AuthMode as CoreAuthMode; +use codex_login::CLIENT_ID; +use codex_login::CodexAuth; use codex_login::ServerOptions as LoginServerOptions; use codex_login::ShutdownHandle; use codex_login::auth::login_with_chatgpt_auth_tokens; use codex_login::complete_device_code_login; +use codex_login::default_client::set_default_client_residency_requirement; +use codex_login::login_with_api_key; use codex_login::request_device_code; use codex_login::run_login_server; use codex_mcp::mcp::auth::discover_supported_scopes; @@ -284,6 +281,9 @@ use codex_protocol::protocol::W3cTraceContext; use codex_protocol::user_input::MAX_USER_INPUT_TEXT_CHARS; use codex_protocol::user_input::UserInput as CoreInputItem; use codex_rmcp_client::perform_oauth_login_return_url; +use codex_rollout::state_db::StateDbHandle; +use codex_rollout::state_db::get_state_db; +use codex_rollout::state_db::reconcile_rollout; use codex_state::StateRuntime; use codex_state::ThreadMetadata; use codex_state::ThreadMetadataBuilder; diff --git a/codex-rs/app-server/src/config_api.rs b/codex-rs/app-server/src/config_api.rs index d138d2f5eb..c36d406d80 100644 --- a/codex-rs/app-server/src/config_api.rs +++ b/codex-rs/app-server/src/config_api.rs @@ -1,6 +1,7 @@ use crate::error_code::INTERNAL_ERROR_CODE; use crate::error_code::INVALID_REQUEST_ERROR_CODE; use async_trait::async_trait; +use codex_analytics::AnalyticsEventsClient; use codex_app_server_protocol::ConfigBatchWriteParams; use codex_app_server_protocol::ConfigReadParams; use codex_app_server_protocol::ConfigReadResponse; @@ -16,7 +17,6 @@ use codex_app_server_protocol::NetworkDomainPermission; use codex_app_server_protocol::NetworkRequirements; use codex_app_server_protocol::NetworkUnixSocketPermission; use codex_app_server_protocol::SandboxMode; -use codex_core::AnalyticsEventsClient; use codex_core::ThreadManager; use codex_core::config::Config; use codex_core::config::ConfigService; @@ -510,15 +510,15 @@ fn config_write_error(code: ConfigWriteErrorCode, message: impl Into) -> #[cfg(test)] mod tests { use super::*; - use codex_core::AnalyticsEventsClient; - use codex_core::AuthManager; - use codex_core::CodexAuth; + use codex_analytics::AnalyticsEventsClient; use codex_core::config_loader::NetworkDomainPermissionToml as CoreNetworkDomainPermissionToml; use codex_core::config_loader::NetworkDomainPermissionsToml as CoreNetworkDomainPermissionsToml; use codex_core::config_loader::NetworkRequirementsToml as CoreNetworkRequirementsToml; use codex_core::config_loader::NetworkUnixSocketPermissionToml as CoreNetworkUnixSocketPermissionToml; use codex_core::config_loader::NetworkUnixSocketPermissionsToml as CoreNetworkUnixSocketPermissionsToml; use codex_features::Feature; + use codex_login::AuthManager; + use codex_login::CodexAuth; use codex_protocol::protocol::AskForApproval as CoreAskForApproval; use pretty_assertions::assert_eq; use serde_json::json; diff --git a/codex-rs/app-server/src/in_process.rs b/codex-rs/app-server/src/in_process.rs index 4f79b1445a..eda2c75da8 100644 --- a/codex-rs/app-server/src/in_process.rs +++ b/codex-rs/app-server/src/in_process.rs @@ -64,6 +64,7 @@ use crate::outgoing_message::QueuedOutgoingMessage; use crate::transport::CHANNEL_CAPACITY; use crate::transport::OutboundConnectionState; use crate::transport::route_outgoing_envelope; +use codex_analytics::AppServerRpcTransport; use codex_app_server_protocol::ClientNotification; use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::ConfigWarningNotification; @@ -74,7 +75,6 @@ use codex_app_server_protocol::Result; use codex_app_server_protocol::ServerNotification; use codex_app_server_protocol::ServerRequest; use codex_arg0::Arg0DispatchPaths; -use codex_core::AppServerRpcTransport; use codex_core::config::Config; use codex_core::config_loader::CloudRequirementsLoader; use codex_core::config_loader::LoaderOverrides; diff --git a/codex-rs/app-server/src/lib.rs b/codex-rs/app-server/src/lib.rs index d2bae7ccd7..a4e458abfc 100644 --- a/codex-rs/app-server/src/lib.rs +++ b/codex-rs/app-server/src/lib.rs @@ -2,7 +2,6 @@ use codex_arg0::Arg0DispatchPaths; use codex_cloud_requirements::cloud_requirements_loader; -use codex_core::AuthManager; use codex_core::config::Config; use codex_core::config::ConfigBuilder; use codex_core::config_loader::CloudRequirementsLoader; @@ -31,18 +30,19 @@ use crate::transport::auth::policy_from_settings; use crate::transport::route_outgoing_envelope; use crate::transport::start_stdio_connection; use crate::transport::start_websocket_acceptor; +use codex_analytics::AppServerRpcTransport; use codex_app_server_protocol::ConfigLayerSource; use codex_app_server_protocol::ConfigWarningNotification; use codex_app_server_protocol::JSONRPCMessage; use codex_app_server_protocol::TextPosition as AppTextPosition; use codex_app_server_protocol::TextRange as AppTextRange; -use codex_core::AppServerRpcTransport; use codex_core::ExecPolicyError; use codex_core::check_execpolicy_for_warnings; use codex_core::config_loader::ConfigLoadError; use codex_core::config_loader::TextRange as CoreTextRange; use codex_exec_server::EnvironmentManager; use codex_feedback::CodexFeedback; +use codex_login::AuthManager; use codex_protocol::protocol::SessionSource; use codex_state::log_db; use tokio::sync::mpsc; diff --git a/codex-rs/app-server/src/message_processor.rs b/codex-rs/app-server/src/message_processor.rs index 47be1e1e59..c63d0a83cf 100644 --- a/codex-rs/app-server/src/message_processor.rs +++ b/codex-rs/app-server/src/message_processor.rs @@ -20,6 +20,8 @@ use crate::outgoing_message::OutgoingMessageSender; use crate::outgoing_message::RequestContext; use crate::transport::AppServerTransport; use async_trait::async_trait; +use codex_analytics::AnalyticsEventsClient; +use codex_analytics::AppServerRpcTransport; use codex_app_server_protocol::AppListUpdatedNotification; use codex_app_server_protocol::ChatgptAuthTokensRefreshParams; use codex_app_server_protocol::ChatgptAuthTokensRefreshReason; @@ -55,27 +57,25 @@ use codex_app_server_protocol::ServerRequestPayload; use codex_app_server_protocol::experimental_required_message; use codex_arg0::Arg0DispatchPaths; use codex_chatgpt::connectors; -use codex_core::AnalyticsEventsClient; -use codex_core::AppServerRpcTransport; -use codex_core::AuthManager; use codex_core::ThreadManager; use codex_core::config::Config; use codex_core::config_loader::CloudRequirementsLoader; use codex_core::config_loader::LoaderOverrides; -use codex_core::default_client::SetOriginatorError; -use codex_core::default_client::USER_AGENT_SUFFIX; -use codex_core::default_client::get_codex_user_agent; -use codex_core::default_client::set_default_client_residency_requirement; -use codex_core::default_client::set_default_originator; use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_exec_server::EnvironmentManager; use codex_features::Feature; use codex_feedback::CodexFeedback; +use codex_login::AuthManager; use codex_login::AuthMode as LoginAuthMode; use codex_login::auth::ExternalAuth; use codex_login::auth::ExternalAuthRefreshContext; use codex_login::auth::ExternalAuthRefreshReason; use codex_login::auth::ExternalAuthTokens; +use codex_login::default_client::SetOriginatorError; +use codex_login::default_client::USER_AGENT_SUFFIX; +use codex_login::default_client::get_codex_user_agent; +use codex_login::default_client::set_default_client_residency_requirement; +use codex_login::default_client::set_default_originator; use codex_protocol::ThreadId; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::W3cTraceContext; diff --git a/codex-rs/app-server/src/message_processor/tracing_tests.rs b/codex-rs/app-server/src/message_processor/tracing_tests.rs index 44cbe21b60..d110f4feea 100644 --- a/codex-rs/app-server/src/message_processor/tracing_tests.rs +++ b/codex-rs/app-server/src/message_processor/tracing_tests.rs @@ -7,6 +7,7 @@ use crate::transport::AppServerTransport; use anyhow::Result; use app_test_support::create_mock_responses_server_repeating_assistant; use app_test_support::write_mock_responses_config_toml; +use codex_analytics::AppServerRpcTransport; use codex_app_server_protocol::ClientInfo; use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::InitializeCapabilities; @@ -20,7 +21,6 @@ use codex_app_server_protocol::TurnStartParams; use codex_app_server_protocol::TurnStartResponse; use codex_app_server_protocol::UserInput; use codex_arg0::Arg0DispatchPaths; -use codex_core::AppServerRpcTransport; use codex_core::config::Config; use codex_core::config::ConfigBuilder; use codex_core::config_loader::CloudRequirementsLoader; diff --git a/codex-rs/app-server/tests/common/auth_fixtures.rs b/codex-rs/app-server/tests/common/auth_fixtures.rs index d814dece46..dfda247254 100644 --- a/codex-rs/app-server/tests/common/auth_fixtures.rs +++ b/codex-rs/app-server/tests/common/auth_fixtures.rs @@ -7,9 +7,9 @@ use base64::engine::general_purpose::URL_SAFE_NO_PAD; use chrono::DateTime; use chrono::Utc; use codex_app_server_protocol::AuthMode; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::AuthDotJson; -use codex_core::auth::save_auth; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthDotJson; +use codex_login::save_auth; use codex_login::token_data::TokenData; use codex_login::token_data::parse_chatgpt_jwt_claims; use serde_json::json; diff --git a/codex-rs/app-server/tests/common/mcp_process.rs b/codex-rs/app-server/tests/common/mcp_process.rs index 0345028d88..a94b601d5b 100644 --- a/codex-rs/app-server/tests/common/mcp_process.rs +++ b/codex-rs/app-server/tests/common/mcp_process.rs @@ -79,7 +79,7 @@ use codex_app_server_protocol::TurnInterruptParams; use codex_app_server_protocol::TurnStartParams; use codex_app_server_protocol::TurnSteerParams; use codex_app_server_protocol::WindowsSandboxSetupStartParams; -use codex_core::default_client::CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR; +use codex_login::default_client::CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR; use tokio::process::Command; pub struct McpProcess { diff --git a/codex-rs/app-server/tests/suite/auth.rs b/codex-rs/app-server/tests/suite/auth.rs index 769d73b82d..78572d8ce1 100644 --- a/codex-rs/app-server/tests/suite/auth.rs +++ b/codex-rs/app-server/tests/suite/auth.rs @@ -12,8 +12,8 @@ use codex_app_server_protocol::JSONRPCError; use codex_app_server_protocol::JSONRPCResponse; use codex_app_server_protocol::LoginAccountResponse; use codex_app_server_protocol::RequestId; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; +use codex_login::AuthCredentialsStoreMode; +use codex_login::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; use pretty_assertions::assert_eq; use std::path::Path; use tempfile::TempDir; diff --git a/codex-rs/app-server/tests/suite/v2/account.rs b/codex-rs/app-server/tests/suite/v2/account.rs index 1505060a99..0755c37553 100644 --- a/codex-rs/app-server/tests/suite/v2/account.rs +++ b/codex-rs/app-server/tests/suite/v2/account.rs @@ -28,7 +28,7 @@ use codex_app_server_protocol::ServerNotification; use codex_app_server_protocol::ServerRequest; use codex_app_server_protocol::TurnCompletedNotification; use codex_app_server_protocol::TurnStatus; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use codex_login::login_with_api_key; use codex_protocol::account::PlanType as AccountPlanType; use core_test_support::responses; diff --git a/codex-rs/app-server/tests/suite/v2/analytics.rs b/codex-rs/app-server/tests/suite/v2/analytics.rs index bd9276ddcd..d4884d1337 100644 --- a/codex-rs/app-server/tests/suite/v2/analytics.rs +++ b/codex-rs/app-server/tests/suite/v2/analytics.rs @@ -2,10 +2,10 @@ use anyhow::Result; use app_test_support::ChatGptAuthFixture; use app_test_support::DEFAULT_CLIENT_NAME; use app_test_support::write_chatgpt_auth; -use codex_core::auth::AuthCredentialsStoreMode; use codex_core::config::ConfigBuilder; use codex_core::config::types::OtelExporterKind; use codex_core::config::types::OtelHttpProtocol; +use codex_login::AuthCredentialsStoreMode; use pretty_assertions::assert_eq; use serde_json::Value; use std::collections::HashMap; diff --git a/codex-rs/app-server/tests/suite/v2/app_list.rs b/codex-rs/app-server/tests/suite/v2/app_list.rs index 23ffa80a67..d8cedf2a41 100644 --- a/codex-rs/app-server/tests/suite/v2/app_list.rs +++ b/codex-rs/app-server/tests/suite/v2/app_list.rs @@ -35,9 +35,9 @@ use codex_app_server_protocol::RequestId; use codex_app_server_protocol::ServerNotification; use codex_app_server_protocol::ThreadStartParams; use codex_app_server_protocol::ThreadStartResponse; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::AuthDotJson; -use codex_core::auth::save_auth; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthDotJson; +use codex_login::save_auth; use pretty_assertions::assert_eq; use rmcp::handler::server::ServerHandler; use rmcp::model::JsonObject; diff --git a/codex-rs/app-server/tests/suite/v2/compaction.rs b/codex-rs/app-server/tests/suite/v2/compaction.rs index a1bde9e965..8849b39abb 100644 --- a/codex-rs/app-server/tests/suite/v2/compaction.rs +++ b/codex-rs/app-server/tests/suite/v2/compaction.rs @@ -28,7 +28,7 @@ use codex_app_server_protocol::TurnCompletedNotification; use codex_app_server_protocol::TurnStartParams; use codex_app_server_protocol::TurnStartResponse; use codex_app_server_protocol::UserInput as V2UserInput; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; use core_test_support::responses; diff --git a/codex-rs/app-server/tests/suite/v2/mcp_server_elicitation.rs b/codex-rs/app-server/tests/suite/v2/mcp_server_elicitation.rs index a784b34908..7a50092b99 100644 --- a/codex-rs/app-server/tests/suite/v2/mcp_server_elicitation.rs +++ b/codex-rs/app-server/tests/suite/v2/mcp_server_elicitation.rs @@ -31,7 +31,7 @@ use codex_app_server_protocol::TurnStartParams; use codex_app_server_protocol::TurnStartResponse; use codex_app_server_protocol::TurnStatus; use codex_app_server_protocol::UserInput as V2UserInput; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use core_test_support::responses; use pretty_assertions::assert_eq; use rmcp::handler::server::ServerHandler; diff --git a/codex-rs/app-server/tests/suite/v2/plugin_install.rs b/codex-rs/app-server/tests/suite/v2/plugin_install.rs index 90a7d813be..95630079cc 100644 --- a/codex-rs/app-server/tests/suite/v2/plugin_install.rs +++ b/codex-rs/app-server/tests/suite/v2/plugin_install.rs @@ -25,7 +25,7 @@ use codex_app_server_protocol::PluginAuthPolicy; use codex_app_server_protocol::PluginInstallParams; use codex_app_server_protocol::PluginInstallResponse; use codex_app_server_protocol::RequestId; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use codex_utils_absolute_path::AbsolutePathBuf; use pretty_assertions::assert_eq; use rmcp::handler::server::ServerHandler; diff --git a/codex-rs/app-server/tests/suite/v2/plugin_list.rs b/codex-rs/app-server/tests/suite/v2/plugin_list.rs index 4136c6d679..d1ee1aa203 100644 --- a/codex-rs/app-server/tests/suite/v2/plugin_list.rs +++ b/codex-rs/app-server/tests/suite/v2/plugin_list.rs @@ -15,8 +15,8 @@ use codex_app_server_protocol::PluginMarketplaceEntry; use codex_app_server_protocol::PluginSource; use codex_app_server_protocol::PluginSummary; use codex_app_server_protocol::RequestId; -use codex_core::auth::AuthCredentialsStoreMode; use codex_core::config::set_project_trust_level; +use codex_login::AuthCredentialsStoreMode; use codex_protocol::config_types::TrustLevel; use codex_utils_absolute_path::AbsolutePathBuf; use pretty_assertions::assert_eq; diff --git a/codex-rs/app-server/tests/suite/v2/plugin_read.rs b/codex-rs/app-server/tests/suite/v2/plugin_read.rs index 977ceb2691..32e799468e 100644 --- a/codex-rs/app-server/tests/suite/v2/plugin_read.rs +++ b/codex-rs/app-server/tests/suite/v2/plugin_read.rs @@ -23,7 +23,7 @@ use codex_app_server_protocol::PluginInstallPolicy; use codex_app_server_protocol::PluginReadParams; use codex_app_server_protocol::PluginReadResponse; use codex_app_server_protocol::RequestId; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use codex_utils_absolute_path::AbsolutePathBuf; use pretty_assertions::assert_eq; use rmcp::handler::server::ServerHandler; diff --git a/codex-rs/app-server/tests/suite/v2/plugin_uninstall.rs b/codex-rs/app-server/tests/suite/v2/plugin_uninstall.rs index 6e0938aa53..d0122c62f9 100644 --- a/codex-rs/app-server/tests/suite/v2/plugin_uninstall.rs +++ b/codex-rs/app-server/tests/suite/v2/plugin_uninstall.rs @@ -11,7 +11,7 @@ use codex_app_server_protocol::JSONRPCResponse; use codex_app_server_protocol::PluginUninstallParams; use codex_app_server_protocol::PluginUninstallResponse; use codex_app_server_protocol::RequestId; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use pretty_assertions::assert_eq; use serde_json::json; use tempfile::TempDir; diff --git a/codex-rs/app-server/tests/suite/v2/rate_limits.rs b/codex-rs/app-server/tests/suite/v2/rate_limits.rs index 51048202f6..64c155081b 100644 --- a/codex-rs/app-server/tests/suite/v2/rate_limits.rs +++ b/codex-rs/app-server/tests/suite/v2/rate_limits.rs @@ -10,7 +10,7 @@ use codex_app_server_protocol::LoginAccountResponse; use codex_app_server_protocol::RateLimitSnapshot; use codex_app_server_protocol::RateLimitWindow; use codex_app_server_protocol::RequestId; -use codex_core::auth::AuthCredentialsStoreMode; +use codex_login::AuthCredentialsStoreMode; use codex_protocol::account::PlanType as AccountPlanType; use pretty_assertions::assert_eq; use serde_json::json; diff --git a/codex-rs/app-server/tests/suite/v2/thread_fork.rs b/codex-rs/app-server/tests/suite/v2/thread_fork.rs index dc68992fe4..0a62ad7ff2 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_fork.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_fork.rs @@ -24,8 +24,8 @@ use codex_app_server_protocol::TurnStartParams; use codex_app_server_protocol::TurnStartResponse; use codex_app_server_protocol::TurnStatus; use codex_app_server_protocol::UserInput; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; +use codex_login::AuthCredentialsStoreMode; +use codex_login::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; use pretty_assertions::assert_eq; use serde_json::Value; use serde_json::json; diff --git a/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs b/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs index 9ce233f948..8bf9a8a9aa 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs @@ -19,10 +19,10 @@ use codex_app_server_protocol::ThreadStartParams; use codex_app_server_protocol::ThreadStartResponse; use codex_app_server_protocol::ThreadStatus; use codex_core::ARCHIVED_SESSIONS_SUBDIR; -use codex_core::state_db::reconcile_rollout; use codex_git_utils::GitSha; use codex_protocol::ThreadId; use codex_protocol::protocol::GitInfo as RolloutGitInfo; +use codex_rollout::state_db::reconcile_rollout; use codex_state::StateRuntime; use pretty_assertions::assert_eq; use serde_json::Value; diff --git a/codex-rs/app-server/tests/suite/v2/thread_resume.rs b/codex-rs/app-server/tests/suite/v2/thread_resume.rs index 3a93451326..83ed147e12 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_resume.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_resume.rs @@ -38,8 +38,8 @@ use codex_app_server_protocol::TurnStartParams; use codex_app_server_protocol::TurnStartResponse; use codex_app_server_protocol::TurnStatus; use codex_app_server_protocol::UserInput; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; +use codex_login::AuthCredentialsStoreMode; +use codex_login::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; use codex_protocol::ThreadId; use codex_protocol::config_types::Personality; use codex_protocol::models::ContentItem; diff --git a/codex-rs/app-server/tests/suite/v2/thread_start.rs b/codex-rs/app-server/tests/suite/v2/thread_start.rs index c684bd2336..979c36e119 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_start.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_start.rs @@ -16,9 +16,9 @@ use codex_app_server_protocol::ThreadStartResponse; use codex_app_server_protocol::ThreadStartedNotification; use codex_app_server_protocol::ThreadStatus; use codex_app_server_protocol::ThreadStatusChangedNotification; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; use codex_core::config::set_project_trust_level; +use codex_login::AuthCredentialsStoreMode; +use codex_login::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; use codex_protocol::config_types::ServiceTier; use codex_protocol::config_types::TrustLevel; use codex_protocol::openai_models::ReasoningEffort; diff --git a/codex-rs/backend-client/Cargo.toml b/codex-rs/backend-client/Cargo.toml index 96e9d73599..1707d45b1b 100644 --- a/codex-rs/backend-client/Cargo.toml +++ b/codex-rs/backend-client/Cargo.toml @@ -18,8 +18,8 @@ serde_json = "1" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } codex-backend-openapi-models = { path = "../codex-backend-openapi-models" } codex-client = { workspace = true } +codex-login = { workspace = true } codex-protocol = { workspace = true } -codex-core = { workspace = true } [dev-dependencies] pretty_assertions = "1" diff --git a/codex-rs/backend-client/src/client.rs b/codex-rs/backend-client/src/client.rs index cb1e003ff2..3d5beb9d15 100644 --- a/codex-rs/backend-client/src/client.rs +++ b/codex-rs/backend-client/src/client.rs @@ -5,8 +5,8 @@ use crate::types::RateLimitStatusPayload; use crate::types::TurnAttemptsSiblingTurnsResponse; use anyhow::Result; use codex_client::build_reqwest_client_with_custom_ca; -use codex_core::auth::CodexAuth; -use codex_core::default_client::get_codex_user_agent; +use codex_login::CodexAuth; +use codex_login::default_client::get_codex_user_agent; use codex_protocol::account::PlanType as AccountPlanType; use codex_protocol::protocol::CreditsSnapshot; use codex_protocol::protocol::RateLimitSnapshot; diff --git a/codex-rs/chatgpt/src/chatgpt_client.rs b/codex-rs/chatgpt/src/chatgpt_client.rs index 5d02bdac7f..fa3a63dadb 100644 --- a/codex-rs/chatgpt/src/chatgpt_client.rs +++ b/codex-rs/chatgpt/src/chatgpt_client.rs @@ -1,5 +1,5 @@ use codex_core::config::Config; -use codex_core::default_client::create_client; +use codex_login::default_client::create_client; use crate::chatgpt_token::get_chatgpt_token_data; use crate::chatgpt_token::init_chatgpt_token_from_auth; diff --git a/codex-rs/chatgpt/src/chatgpt_token.rs b/codex-rs/chatgpt/src/chatgpt_token.rs index ceca132e9b..4f6c492a43 100644 --- a/codex-rs/chatgpt/src/chatgpt_token.rs +++ b/codex-rs/chatgpt/src/chatgpt_token.rs @@ -1,11 +1,10 @@ -use codex_core::AuthManager; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthManager; use codex_login::token_data::TokenData; use std::path::Path; use std::sync::LazyLock; use std::sync::RwLock; -use codex_core::auth::AuthCredentialsStoreMode; - static CHATGPT_TOKEN: LazyLock>> = LazyLock::new(|| RwLock::new(None)); pub fn get_chatgpt_token_data() -> Option { diff --git a/codex-rs/chatgpt/src/connectors.rs b/codex-rs/chatgpt/src/connectors.rs index aa13d70d47..8ba12b3460 100644 --- a/codex-rs/chatgpt/src/connectors.rs +++ b/codex-rs/chatgpt/src/connectors.rs @@ -1,5 +1,5 @@ -use codex_core::AuthManager; use codex_core::config::Config; +use codex_login::AuthManager; use codex_login::token_data::TokenData; use std::collections::HashSet; use std::time::Duration; diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index db2f9a3965..8ba27b3339 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -42,6 +42,7 @@ codex-state = { workspace = true } codex-stdio-to-uds = { workspace = true } codex-terminal-detection = { workspace = true } codex-tui = { workspace = true } +codex-utils-path = { workspace = true } libc = { workspace = true } owo-colors = { workspace = true } regex-lite = { workspace = true } diff --git a/codex-rs/cli/src/login.rs b/codex-rs/cli/src/login.rs index d0cc1a3a1d..f4e20effb5 100644 --- a/codex-rs/cli/src/login.rs +++ b/codex-rs/cli/src/login.rs @@ -7,14 +7,14 @@ //! into a one-shot CLI command while still producing a durable `codex-login.log` artifact that //! support can request from users. -use codex_core::CodexAuth; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::AuthMode; -use codex_core::auth::CLIENT_ID; -use codex_core::auth::login_with_api_key; -use codex_core::auth::logout; use codex_core::config::Config; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthMode; +use codex_login::CLIENT_ID; +use codex_login::CodexAuth; use codex_login::ServerOptions; +use codex_login::login_with_api_key; +use codex_login::logout; use codex_login::run_device_code_login; use codex_login::run_login_server; use codex_protocol::config_types::ForcedLoginMethod; diff --git a/codex-rs/cli/src/wsl_paths.rs b/codex-rs/cli/src/wsl_paths.rs index b6ceb2e0bc..28366579e5 100644 --- a/codex-rs/cli/src/wsl_paths.rs +++ b/codex-rs/cli/src/wsl_paths.rs @@ -1,7 +1,7 @@ use std::ffi::OsStr; /// Returns true if the current process is running under WSL. -pub use codex_core::env::is_wsl; +pub use codex_utils_path::env::is_wsl; /// Convert a Windows absolute path (`C:\foo\bar` or `C:/foo/bar`) to a WSL mount path (`/mnt/c/foo/bar`). /// Returns `None` if the input does not look like a Windows drive path. diff --git a/codex-rs/cloud-requirements/Cargo.toml b/codex-rs/cloud-requirements/Cargo.toml index bbaa3a6db9..9eda7a7c36 100644 --- a/codex-rs/cloud-requirements/Cargo.toml +++ b/codex-rs/cloud-requirements/Cargo.toml @@ -13,6 +13,7 @@ base64 = { workspace = true } chrono = { workspace = true, features = ["serde"] } codex-backend-client = { workspace = true } codex-core = { workspace = true } +codex-login = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } hmac = "0.12.1" diff --git a/codex-rs/cloud-requirements/src/lib.rs b/codex-rs/cloud-requirements/src/lib.rs index b5080ea63f..1befb936c0 100644 --- a/codex-rs/cloud-requirements/src/lib.rs +++ b/codex-rs/cloud-requirements/src/lib.rs @@ -15,15 +15,15 @@ use chrono::DateTime; use chrono::Duration as ChronoDuration; use chrono::Utc; use codex_backend_client::Client as BackendClient; -use codex_core::AuthManager; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::CodexAuth; -use codex_core::auth::RefreshTokenError; use codex_core::config_loader::CloudRequirementsLoadError; use codex_core::config_loader::CloudRequirementsLoadErrorCode; use codex_core::config_loader::CloudRequirementsLoader; use codex_core::config_loader::ConfigRequirementsToml; use codex_core::util::backoff; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthManager; +use codex_login::CodexAuth; +use codex_login::RefreshTokenError; use codex_protocol::account::PlanType; use hmac::Hmac; use hmac::Mac; @@ -820,7 +820,7 @@ mod tests { use super::*; use base64::Engine; use base64::engine::general_purpose::URL_SAFE_NO_PAD; - use codex_core::auth::AuthCredentialsStoreMode; + use codex_login::AuthCredentialsStoreMode; use codex_protocol::protocol::AskForApproval; use pretty_assertions::assert_eq; use serde_json::json; diff --git a/codex-rs/cloud-tasks/src/lib.rs b/codex-rs/cloud-tasks/src/lib.rs index f7698a300f..f96ac62ed9 100644 --- a/codex-rs/cloud-tasks/src/lib.rs +++ b/codex-rs/cloud-tasks/src/lib.rs @@ -12,6 +12,7 @@ use chrono::Utc; use codex_cloud_tasks_client::TaskStatus; use codex_git_utils::current_branch_name; use codex_git_utils::default_branch_name; +use codex_login::default_client::get_codex_user_agent; use owo_colors::OwoColorize; use owo_colors::Stream; use std::cmp::Ordering; @@ -58,7 +59,7 @@ async fn init_backend(user_agent_suffix: &str) -> anyhow::Result }); } - let ua = codex_core::default_client::get_codex_user_agent(); + let ua = get_codex_user_agent(); let mut http = codex_cloud_tasks_client::HttpClient::new(base_url.clone())?.with_user_agent(ua); let style = if base_url.contains("/backend-api") { "wham" @@ -804,7 +805,7 @@ pub async fn run_main(cli: Cli, _codex_linux_sandbox_exe: Option) -> an append_error_log(format!( "startup: wham_force_internal={} ua={}", force_internal, - codex_core::default_client::get_codex_user_agent() + get_codex_user_agent() )); // Non-blocking initial load so the in-box spinner can animate app.status = "Loading tasks…".to_string(); diff --git a/codex-rs/cloud-tasks/src/util.rs b/codex-rs/cloud-tasks/src/util.rs index 0dcf18432a..090eec227e 100644 --- a/codex-rs/cloud-tasks/src/util.rs +++ b/codex-rs/cloud-tasks/src/util.rs @@ -8,7 +8,7 @@ use codex_core::config::Config; use codex_login::AuthManager; pub fn set_user_agent_suffix(suffix: &str) { - if let Ok(mut guard) = codex_core::default_client::USER_AGENT_SUFFIX.lock() { + if let Ok(mut guard) = codex_login::default_client::USER_AGENT_SUFFIX.lock() { guard.replace(suffix.to_string()); } } @@ -78,7 +78,7 @@ pub async fn build_chatgpt_headers() -> HeaderMap { use reqwest::header::USER_AGENT; set_user_agent_suffix("codex_cloud_tasks_tui"); - let ua = codex_core::default_client::get_codex_user_agent(); + let ua = codex_login::default_client::get_codex_user_agent(); let mut headers = HeaderMap::new(); headers.insert( USER_AGENT, diff --git a/codex-rs/core/src/agent/control.rs b/codex-rs/core/src/agent/control.rs index c522acd1c1..2b4409c27d 100644 --- a/codex-rs/core/src/agent/control.rs +++ b/codex-rs/core/src/agent/control.rs @@ -13,7 +13,6 @@ use crate::rollout::RolloutRecorder; use crate::session_prefix::format_subagent_context_line; use crate::session_prefix::format_subagent_notification_message; use crate::shell_snapshot::ShellSnapshot; -use crate::state_db; use crate::thread_manager::ThreadManagerState; use crate::thread_rollout_truncation::truncate_rollout_to_last_n_fork_turns; use codex_features::Feature; @@ -29,6 +28,7 @@ use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::TokenUsage; use codex_protocol::user_input::UserInput; +use codex_rollout::state_db; use codex_state::DirectionalThreadSpawnEdgeStatus; use serde::Serialize; use std::collections::HashMap; diff --git a/codex-rs/core/src/agent/control_tests.rs b/codex-rs/core/src/agent/control_tests.rs index 834ab2037b..e92ef67a7e 100644 --- a/codex-rs/core/src/agent/control_tests.rs +++ b/codex-rs/core/src/agent/control_tests.rs @@ -1,5 +1,4 @@ use super::*; -use crate::CodexAuth; use crate::CodexThread; use crate::ThreadManager; use crate::agent::agent_status_from_event; @@ -11,6 +10,7 @@ use crate::contextual_user_message::SUBAGENT_NOTIFICATION_OPEN_TAG; use assert_matches::assert_matches; use chrono::Utc; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::AgentPath; use codex_protocol::config_types::ModeKind; use codex_protocol::models::ContentItem; diff --git a/codex-rs/core/src/api_bridge.rs b/codex-rs/core/src/api_bridge.rs index e7826f9ac6..8f900b7241 100644 --- a/codex-rs/core/src/api_bridge.rs +++ b/codex-rs/core/src/api_bridge.rs @@ -11,12 +11,12 @@ use http::HeaderMap; use serde::Deserialize; use serde_json::Value; -use crate::auth::CodexAuth; use crate::error::CodexErr; use crate::error::RetryLimitReachedError; use crate::error::UnexpectedResponseError; use crate::error::UsageLimitReachedError; use crate::model_provider_info::ModelProviderInfo; +use codex_login::CodexAuth; pub(crate) fn map_api_error(err: ApiError) -> CodexErr { match err { diff --git a/codex-rs/core/src/apply_patch.rs b/codex-rs/core/src/apply_patch.rs index 9a09ae9f09..0810d319b8 100644 --- a/codex-rs/core/src/apply_patch.rs +++ b/codex-rs/core/src/apply_patch.rs @@ -1,12 +1,12 @@ use crate::codex::TurnContext; use crate::function_tool::FunctionCallError; -use crate::protocol::FileChange; -use crate::protocol::FileSystemSandboxPolicy; use crate::safety::SafetyCheck; use crate::safety::assess_patch_safety; use crate::tools::sandboxing::ExecApprovalRequirement; use codex_apply_patch::ApplyPatchAction; use codex_apply_patch::ApplyPatchFileChange; +use codex_protocol::protocol::FileChange; +use codex_protocol::protocol::FileSystemSandboxPolicy; use std::collections::HashMap; use std::path::PathBuf; diff --git a/codex-rs/core/src/arc_monitor.rs b/codex-rs/core/src/arc_monitor.rs index ba9a886de6..13f33f6c90 100644 --- a/codex-rs/core/src/arc_monitor.rs +++ b/codex-rs/core/src/arc_monitor.rs @@ -8,8 +8,9 @@ use tracing::warn; use crate::codex::Session; use crate::codex::TurnContext; use crate::compact::content_items_to_text; -use crate::default_client::build_reqwest_client; use crate::event_mapping::is_contextual_user_message_content; +use codex_login::CodexAuth; +use codex_login::default_client::build_reqwest_client; use codex_protocol::models::MessagePhase; use codex_protocol::models::ResponseItem; @@ -147,10 +148,7 @@ pub(crate) async fn monitor_action( .timeout(ARC_MONITOR_TIMEOUT) .json(&body) .bearer_auth(token); - if let Some(account_id) = auth - .as_ref() - .and_then(crate::auth::CodexAuth::get_account_id) - { + if let Some(account_id) = auth.as_ref().and_then(CodexAuth::get_account_id) { request = request.header("chatgpt-account-id", account_id); } diff --git a/codex-rs/core/src/arc_monitor_tests.rs b/codex-rs/core/src/arc_monitor_tests.rs index ab88fddca9..a7ba239973 100644 --- a/codex-rs/core/src/arc_monitor_tests.rs +++ b/codex-rs/core/src/arc_monitor_tests.rs @@ -253,7 +253,7 @@ async fn monitor_action_posts_expected_arc_request() { let server = MockServer::start().await; let (session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); turn_context.developer_instructions = Some("Developer policy".to_string()); turn_context.user_instructions = Some("User policy".to_string()); @@ -407,7 +407,7 @@ async fn monitor_action_rejects_legacy_response_fields() { let (session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); let mut config = (*turn_context.config).clone(); config.chatgpt_base_url = server.uri(); diff --git a/codex-rs/core/src/auth_env_telemetry.rs b/codex-rs/core/src/auth_env_telemetry.rs index 583d79de16..b87dd42cc0 100644 --- a/codex-rs/core/src/auth_env_telemetry.rs +++ b/codex-rs/core/src/auth_env_telemetry.rs @@ -1,9 +1,9 @@ use codex_otel::AuthEnvTelemetryMetadata; -use crate::auth::CODEX_API_KEY_ENV_VAR; -use crate::auth::OPENAI_API_KEY_ENV_VAR; -use crate::auth::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; use crate::model_provider_info::ModelProviderInfo; +use codex_login::CODEX_API_KEY_ENV_VAR; +use codex_login::OPENAI_API_KEY_ENV_VAR; +use codex_login::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; #[derive(Debug, Clone, Default, PartialEq, Eq)] pub(crate) struct AuthEnvTelemetry { diff --git a/codex-rs/core/src/client.rs b/codex-rs/core/src/client.rs index 57e5db1d0d..407c4f2e9b 100644 --- a/codex-rs/core/src/client.rs +++ b/codex-rs/core/src/client.rs @@ -33,7 +33,6 @@ use std::sync::atomic::Ordering; use crate::api_bridge::CoreAuthProvider; use crate::api_bridge::auth_provider_from_auth; use crate::api_bridge::map_api_error; -use crate::auth::UnauthorizedRecovery; use crate::auth_env_telemetry::AuthEnvTelemetry; use crate::auth_env_telemetry::collect_auth_env_telemetry; use codex_api::CompactClient as ApiCompactClient; @@ -60,6 +59,12 @@ use codex_api::create_text_param_for_request; use codex_api::error::ApiError; use codex_api::requests::responses::Compression; use codex_api::response_create_client_metadata; +use codex_login::AuthManager; +use codex_login::AuthMode; +use codex_login::CodexAuth; +use codex_login::RefreshTokenError; +use codex_login::UnauthorizedRecovery; +use codex_login::default_client::build_reqwest_client; use codex_otel::SessionTelemetry; use codex_otel::current_span_w3c_trace_context; @@ -71,6 +76,7 @@ use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; use codex_protocol::protocol::SessionSource; +use codex_protocol::protocol::SubAgentSource; use codex_protocol::protocol::W3cTraceContext; use codex_tools::create_tools_json_for_responses_api; use eventsource_stream::Event; @@ -91,14 +97,9 @@ use tracing::instrument; use tracing::trace; use tracing::warn; -use crate::AuthManager; -use crate::auth::AuthMode; -use crate::auth::CodexAuth; -use crate::auth::RefreshTokenError; use crate::client_common::Prompt; use crate::client_common::ResponseEvent; use crate::client_common::ResponseStream; -use crate::default_client::build_reqwest_client; use crate::error::CodexErr; use crate::error::Result; use crate::flags::CODEX_RS_SSE_FIXTURE; @@ -460,13 +461,11 @@ impl ModelClient { let mut extra_headers = ApiHeaderMap::new(); if let SessionSource::SubAgent(sub) = &self.state.session_source { let subagent = match sub { - crate::protocol::SubAgentSource::Review => "review".to_string(), - crate::protocol::SubAgentSource::Compact => "compact".to_string(), - crate::protocol::SubAgentSource::MemoryConsolidation => { - "memory_consolidation".to_string() - } - crate::protocol::SubAgentSource::ThreadSpawn { .. } => "collab_spawn".to_string(), - crate::protocol::SubAgentSource::Other(label) => label.clone(), + SubAgentSource::Review => "review".to_string(), + SubAgentSource::Compact => "compact".to_string(), + SubAgentSource::MemoryConsolidation => "memory_consolidation".to_string(), + SubAgentSource::ThreadSpawn { .. } => "collab_spawn".to_string(), + SubAgentSource::Other(label) => label.clone(), }; if let Ok(val) = HeaderValue::from_str(&subagent) { extra_headers.insert("x-openai-subagent", val); @@ -574,7 +573,7 @@ impl ModelClient { websocket_connect_timeout, ApiWebSocketResponsesClient::new(api_provider, api_auth).connect( headers, - crate::default_client::default_headers(), + codex_login::default_client::default_headers(), turn_state, Some(websocket_telemetry), ), @@ -972,7 +971,7 @@ impl ModelClientSession { )) } - fn responses_request_compression(&self, auth: Option<&crate::auth::CodexAuth>) -> Compression { + fn responses_request_compression(&self, auth: Option<&CodexAuth>) -> Compression { if self.client.state.enable_request_compression && auth.is_some_and(CodexAuth::is_chatgpt_auth) && self.client.state.provider.is_openai() @@ -1025,7 +1024,7 @@ impl ModelClientSession { let auth_manager = self.client.state.auth_manager.clone(); let mut auth_recovery = auth_manager .as_ref() - .map(super::auth::AuthManager::unauthorized_recovery); + .map(AuthManager::unauthorized_recovery); let mut pending_retry = PendingUnauthorizedRetry::default(); loop { let client_setup = self.client.current_client_setup().await?; @@ -1114,7 +1113,7 @@ impl ModelClientSession { let mut auth_recovery = auth_manager .as_ref() - .map(super::auth::AuthManager::unauthorized_recovery); + .map(AuthManager::unauthorized_recovery); let mut pending_retry = PendingUnauthorizedRetry::default(); loop { let client_setup = self.client.current_client_setup().await?; diff --git a/codex-rs/core/src/client_tests.rs b/codex-rs/core/src/client_tests.rs index b7d8075f0d..53a110acaf 100644 --- a/codex-rs/core/src/client_tests.rs +++ b/codex-rs/core/src/client_tests.rs @@ -105,7 +105,7 @@ async fn summarize_memories_returns_empty_for_empty_input() { #[test] fn auth_request_telemetry_context_tracks_attached_auth_and_retry_phase() { let auth_context = AuthRequestTelemetryContext::new( - Some(crate::auth::AuthMode::Chatgpt), + Some(codex_login::AuthMode::Chatgpt), &crate::api_bridge::CoreAuthProvider::for_test(Some("access-token"), Some("workspace-123")), PendingUnauthorizedRetry::from_recovery(UnauthorizedRecoveryExecution { mode: "managed", diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index a26adf97c9..47c6cf8600 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -6,9 +6,6 @@ use std::path::PathBuf; use std::sync::Arc; use std::sync::atomic::AtomicU64; -use crate::AuthManager; -use crate::CodexAuth; -use crate::SandboxState; use crate::agent::AgentControl; use crate::agent::AgentStatus; use crate::agent::Mailbox; @@ -30,7 +27,6 @@ use crate::exec_policy::ExecPolicyManager; use crate::models_manager::collaboration_mode_presets::CollaborationModesConfig; use crate::models_manager::manager::ModelsManager; use crate::models_manager::manager::RefreshStrategy; -use crate::parse_command::parse_command; use crate::parse_turn_item; use crate::path_utils::normalize_for_native_workdir; use crate::realtime_conversation::RealtimeConversationManager; @@ -71,6 +67,14 @@ use codex_hooks::HookPayload; use codex_hooks::HookResult; use codex_hooks::Hooks; use codex_hooks::HooksConfig; +use codex_login::AuthManager; +use codex_login::CodexAuth; +use codex_login::default_client::originator; +use codex_mcp::mcp_connection_manager::McpConnectionManager; +use codex_mcp::mcp_connection_manager::SandboxState; +use codex_mcp::mcp_connection_manager::ToolInfo as McpToolInfo; +use codex_mcp::mcp_connection_manager::codex_apps_tools_cache_key; +use codex_mcp::mcp_connection_manager::filter_non_codex_apps_mcp_tools_only; use codex_network_proxy::NetworkProxy; use codex_network_proxy::NetworkProxyAuditMetadata; use codex_network_proxy::normalize_host; @@ -122,6 +126,8 @@ 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_rollout::state_db; +use codex_shell_command::parse_command::parse_command; use codex_terminal_detection::user_agent; use codex_tools::filter_tool_suggest_discoverable_tools_for_client; use codex_utils_output_truncation::TruncationPolicy; @@ -263,9 +269,6 @@ use crate::injection::app_id_from_path; use crate::injection::tool_kind_for_path; use crate::instructions::UserInstructions; use crate::mcp::McpManager; -use crate::mcp_connection_manager::McpConnectionManager; -use crate::mcp_connection_manager::codex_apps_tools_cache_key; -use crate::mcp_connection_manager::filter_non_codex_apps_mcp_tools_only; use crate::mcp_skill_dependencies::maybe_prompt_and_install_mcp_dependencies; use crate::memories; use crate::mentions::build_connector_slug_counts; @@ -278,43 +281,6 @@ use crate::plugins::PluginsManager; use crate::plugins::build_plugin_injections; use crate::plugins::render_plugins_section; use crate::project_doc::get_user_instructions; -use crate::protocol::AgentMessageContentDeltaEvent; -use crate::protocol::AgentReasoningSectionBreakEvent; -use crate::protocol::ApplyPatchApprovalRequestEvent; -use crate::protocol::AskForApproval; -use crate::protocol::BackgroundEventEvent; -use crate::protocol::CompactedItem; -use crate::protocol::DeprecationNoticeEvent; -use crate::protocol::ErrorEvent; -use crate::protocol::Event; -use crate::protocol::EventMsg; -use crate::protocol::ExecApprovalRequestEvent; -use crate::protocol::McpServerRefreshConfig; -use crate::protocol::ModelRerouteEvent; -use crate::protocol::ModelRerouteReason; -use crate::protocol::NetworkApprovalContext; -use crate::protocol::Op; -use crate::protocol::PlanDeltaEvent; -use crate::protocol::RateLimitSnapshot; -use crate::protocol::ReasoningContentDeltaEvent; -use crate::protocol::ReasoningRawContentDeltaEvent; -use crate::protocol::RequestUserInputEvent; -use crate::protocol::ReviewDecision; -use crate::protocol::SandboxPolicy; -use crate::protocol::SessionConfiguredEvent; -use crate::protocol::SessionNetworkProxyRuntime; -use crate::protocol::SkillDependencies as ProtocolSkillDependencies; -use crate::protocol::SkillErrorInfo; -use crate::protocol::SkillInterface as ProtocolSkillInterface; -use crate::protocol::SkillMetadata as ProtocolSkillMetadata; -use crate::protocol::SkillToolDependency as ProtocolSkillToolDependency; -use crate::protocol::StreamErrorEvent; -use crate::protocol::Submission; -use crate::protocol::TokenCountEvent; -use crate::protocol::TokenUsage; -use crate::protocol::TokenUsageInfo; -use crate::protocol::TurnDiffEvent; -use crate::protocol::WarningEvent; use crate::resolve_skill_dependencies_for_turn; use crate::rollout::RolloutRecorder; use crate::rollout::RolloutRecorderParams; @@ -329,7 +295,6 @@ use crate::skills_watcher::SkillsWatcherEvent; use crate::state::ActiveTurn; use crate::state::SessionServices; use crate::state::SessionState; -use crate::state_db; use crate::tasks::GhostSnapshotTask; use crate::tasks::ReviewTask; use crate::tasks::SessionTask; @@ -369,9 +334,46 @@ use codex_protocol::models::DeveloperInstructions; use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; +use codex_protocol::protocol::AgentMessageContentDeltaEvent; +use codex_protocol::protocol::AgentReasoningSectionBreakEvent; +use codex_protocol::protocol::ApplyPatchApprovalRequestEvent; +use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::BackgroundEventEvent; use codex_protocol::protocol::CodexErrorInfo; +use codex_protocol::protocol::CompactedItem; +use codex_protocol::protocol::DeprecationNoticeEvent; +use codex_protocol::protocol::ErrorEvent; +use codex_protocol::protocol::Event; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ExecApprovalRequestEvent; use codex_protocol::protocol::InitialHistory; +use codex_protocol::protocol::McpServerRefreshConfig; +use codex_protocol::protocol::ModelRerouteEvent; +use codex_protocol::protocol::ModelRerouteReason; +use codex_protocol::protocol::NetworkApprovalContext; use codex_protocol::protocol::NonSteerableTurnKind; +use codex_protocol::protocol::Op; +use codex_protocol::protocol::PlanDeltaEvent; +use codex_protocol::protocol::RateLimitSnapshot; +use codex_protocol::protocol::ReasoningContentDeltaEvent; +use codex_protocol::protocol::ReasoningRawContentDeltaEvent; +use codex_protocol::protocol::RequestUserInputEvent; +use codex_protocol::protocol::ReviewDecision; +use codex_protocol::protocol::SandboxPolicy; +use codex_protocol::protocol::SessionConfiguredEvent; +use codex_protocol::protocol::SessionNetworkProxyRuntime; +use codex_protocol::protocol::SkillDependencies as ProtocolSkillDependencies; +use codex_protocol::protocol::SkillErrorInfo; +use codex_protocol::protocol::SkillInterface as ProtocolSkillInterface; +use codex_protocol::protocol::SkillMetadata as ProtocolSkillMetadata; +use codex_protocol::protocol::SkillToolDependency as ProtocolSkillToolDependency; +use codex_protocol::protocol::StreamErrorEvent; +use codex_protocol::protocol::Submission; +use codex_protocol::protocol::TokenCountEvent; +use codex_protocol::protocol::TokenUsage; +use codex_protocol::protocol::TokenUsageInfo; +use codex_protocol::protocol::TurnDiffEvent; +use codex_protocol::protocol::WarningEvent; use codex_protocol::user_input::UserInput; use codex_tools::ToolsConfig; use codex_tools::ToolsConfigParams; @@ -1664,7 +1666,7 @@ impl Session { let auth_mode = auth.map(CodexAuth::auth_mode).map(TelemetryAuthMode::from); 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 originator = originator().value; let terminal_type = user_agent(); let session_model = session_configuration.collaboration_mode.model().to_string(); let auth_env_telemetry = collect_auth_env_telemetry( @@ -4965,7 +4967,7 @@ mod handlers { let event = Event { id: sub_id, msg: EventMsg::GetHistoryEntryResponse( - crate::protocol::GetHistoryEntryResponseEvent { + codex_protocol::protocol::GetHistoryEntryResponseEvent { offset, log_id, entry: entry_opt.map(|e| codex_protocol::message_history::HistoryEntry { @@ -6017,7 +6019,7 @@ pub(crate) async fn run_turn( for run in sess.hooks().preview_stop(&stop_request) { sess.send_event( &turn_context, - EventMsg::HookStarted(crate::protocol::HookStartedEvent { + EventMsg::HookStarted(codex_protocol::protocol::HookStartedEvent { turn_id: Some(turn_context.sub_id.clone()), run, }), @@ -6367,10 +6369,10 @@ fn connector_inserted_in_messages( } fn filter_codex_apps_mcp_tools( - mcp_tools: &HashMap, + mcp_tools: &HashMap, connectors: &[connectors::AppInfo], config: &Config, -) -> HashMap { +) -> HashMap { let allowed: HashSet<&str> = connectors .iter() .map(|connector| connector.id.as_str()) @@ -6391,7 +6393,7 @@ fn filter_codex_apps_mcp_tools( .collect() } -fn codex_apps_connector_id(tool: &crate::mcp_connection_manager::ToolInfo) -> Option<&str> { +fn codex_apps_connector_id(tool: &McpToolInfo) -> Option<&str> { tool.connector_id.as_deref() } diff --git a/codex-rs/core/src/codex/rollout_reconstruction_tests.rs b/codex-rs/core/src/codex/rollout_reconstruction_tests.rs index 86abfa6756..5dd4f60e14 100644 --- a/codex-rs/core/src/codex/rollout_reconstruction_tests.rs +++ b/codex-rs/core/src/codex/rollout_reconstruction_tests.rs @@ -1,13 +1,13 @@ use super::*; -use crate::protocol::CompactedItem; -use crate::protocol::InitialHistory; -use crate::protocol::ResumedHistory; use codex_protocol::AgentPath; use codex_protocol::ThreadId; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::CompactedItem; +use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; +use codex_protocol::protocol::ResumedHistory; use pretty_assertions::assert_eq; use std::path::PathBuf; diff --git a/codex-rs/core/src/codex_delegate.rs b/codex-rs/core/src/codex_delegate.rs index b968d219d2..6bb8257f09 100644 --- a/codex-rs/core/src/codex_delegate.rs +++ b/codex-rs/core/src/codex_delegate.rs @@ -30,7 +30,6 @@ use tokio::sync::oneshot; use tokio::time::timeout; use tokio_util::sync::CancellationToken; -use crate::AuthManager; use crate::codex::Codex; use crate::codex::CodexSpawnArgs; use crate::codex::CodexSpawnOk; @@ -49,6 +48,7 @@ use crate::mcp_tool_call::build_guardian_mcp_tool_review_request; use crate::mcp_tool_call::is_mcp_tool_approval_question_id; use crate::mcp_tool_call::lookup_mcp_tool_metadata; use crate::models_manager::manager::ModelsManager; +use codex_login::AuthManager; use codex_protocol::protocol::InitialHistory; #[cfg(test)] diff --git a/codex-rs/core/src/codex_tests.rs b/codex-rs/core/src/codex_tests.rs index 22681f7a4b..24c24eb935 100644 --- a/codex-rs/core/src/codex_tests.rs +++ b/codex-rs/core/src/codex_tests.rs @@ -1,5 +1,4 @@ use super::*; -use crate::CodexAuth; use crate::config::ConfigBuilder; use crate::config::test_config; use crate::config_loader::ConfigLayerStack; @@ -12,12 +11,13 @@ use crate::config_loader::Sourced; use crate::exec::ExecCapturePolicy; use crate::exec::ExecToolCallOutput; use crate::function_tool::FunctionCallError; -use crate::mcp_connection_manager::ToolInfo; use crate::models_manager::model_info; use crate::shell::default_user_shell; use crate::tools::format_exec_output_str; use codex_features::Features; +use codex_login::CodexAuth; +use codex_mcp::mcp_connection_manager::ToolInfo; use codex_protocol::ThreadId; use codex_protocol::models::FunctionCallOutputBody; use codex_protocol::models::FunctionCallOutputPayload; @@ -33,20 +33,6 @@ use codex_protocol::request_permissions::PermissionGrantScope; use codex_protocol::request_permissions::RequestPermissionProfile; use tracing::Span; -use crate::protocol::CompactedItem; -use crate::protocol::CreditsSnapshot; -use crate::protocol::InitialHistory; -use crate::protocol::NetworkApprovalProtocol; -use crate::protocol::RateLimitSnapshot; -use crate::protocol::RateLimitWindow; -use crate::protocol::ResumedHistory; -use crate::protocol::RolloutItem; -use crate::protocol::TokenCountEvent; -use crate::protocol::TokenUsage; -use crate::protocol::TokenUsageInfo; -use crate::protocol::TurnCompleteEvent; -use crate::protocol::TurnStartedEvent; -use crate::protocol::UserMessageEvent; use crate::rollout::policy::EventPersistenceMode; use crate::rollout::recorder::RolloutRecorder; use crate::rollout::recorder::RolloutRecorderParams; @@ -78,9 +64,26 @@ use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ConversationAudioParams; +use codex_protocol::protocol::CreditsSnapshot; +use codex_protocol::protocol::GranularApprovalConfig; +use codex_protocol::protocol::InitialHistory; +use codex_protocol::protocol::NetworkApprovalProtocol; +use codex_protocol::protocol::RateLimitSnapshot; +use codex_protocol::protocol::RateLimitWindow; use codex_protocol::protocol::RealtimeAudioFrame; +use codex_protocol::protocol::ResumedHistory; +use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::Submission; +use codex_protocol::protocol::ThreadRolledBackEvent; +use codex_protocol::protocol::TokenCountEvent; +use codex_protocol::protocol::TokenUsage; +use codex_protocol::protocol::TokenUsageInfo; +use codex_protocol::protocol::TurnAbortedEvent; +use codex_protocol::protocol::TurnCompleteEvent; +use codex_protocol::protocol::TurnStartedEvent; +use codex_protocol::protocol::UserMessageEvent; use codex_protocol::protocol::W3cTraceContext; use core_test_support::PathBufExt; use core_test_support::context_snapshot; @@ -238,7 +241,7 @@ async fn interrupting_regular_turn_waiting_on_startup_prewarm_emits_turn_aborted .expect("channel open"); assert!(matches!( second.msg, - EventMsg::TurnAborted(crate::protocol::TurnAbortedEvent { + EventMsg::TurnAborted(TurnAbortedEvent { turn_id: Some(turn_id), reason: TurnAbortReason::Interrupted, }) if turn_id == tc.sub_id @@ -2120,9 +2123,7 @@ fn success_flag_true_with_no_error_and_content_used() { assert_eq!(expected, got); } -async fn wait_for_thread_rolled_back( - rx: &async_channel::Receiver, -) -> crate::protocol::ThreadRolledBackEvent { +async fn wait_for_thread_rolled_back(rx: &async_channel::Receiver) -> ThreadRolledBackEvent { let deadline = StdDuration::from_secs(2); let start = std::time::Instant::now(); loop { @@ -2788,15 +2789,13 @@ async fn request_permissions_emits_event_when_granular_policy_allows_requests() Arc::get_mut(&mut turn_context) .expect("single turn context ref") .approval_policy - .set(crate::protocol::AskForApproval::Granular( - crate::protocol::GranularApprovalConfig { - sandbox_approval: true, - rules: true, - skill_approval: true, - request_permissions: true, - mcp_elicitations: true, - }, - )) + .set(AskForApproval::Granular(GranularApprovalConfig { + sandbox_approval: true, + rules: true, + skill_approval: true, + request_permissions: true, + mcp_elicitations: true, + })) .expect("test setup should allow updating approval policy"); let session = Arc::new(session); @@ -2863,15 +2862,13 @@ async fn request_permissions_is_auto_denied_when_granular_policy_blocks_tool_req Arc::get_mut(&mut turn_context) .expect("single turn context ref") .approval_policy - .set(crate::protocol::AskForApproval::Granular( - crate::protocol::GranularApprovalConfig { - sandbox_approval: true, - rules: true, - skill_approval: true, - request_permissions: false, - mcp_elicitations: true, - }, - )) + .set(AskForApproval::Granular(GranularApprovalConfig { + sandbox_approval: true, + rules: true, + skill_approval: true, + request_permissions: false, + mcp_elicitations: true, + })) .expect("test setup should allow updating approval policy"); let session = Arc::new(session); @@ -5087,10 +5084,10 @@ async fn sample_rollout( #[tokio::test] async fn rejects_escalated_permissions_when_policy_not_on_request() { use crate::exec::ExecParams; - use crate::protocol::AskForApproval; - use crate::protocol::SandboxPolicy; use crate::sandboxing::SandboxPermissions; use crate::turn_diff_tracker::TurnDiffTracker; + use codex_protocol::protocol::AskForApproval; + use codex_protocol::protocol::SandboxPolicy; use std::collections::HashMap; let (session, mut turn_context_raw) = make_session_and_context().await; @@ -5242,9 +5239,9 @@ async fn rejects_escalated_permissions_when_policy_not_on_request() { } #[tokio::test] async fn unified_exec_rejects_escalated_permissions_when_policy_not_on_request() { - use crate::protocol::AskForApproval; use crate::sandboxing::SandboxPermissions; use crate::turn_diff_tracker::TurnDiffTracker; + use codex_protocol::protocol::AskForApproval; let (session, mut turn_context_raw) = make_session_and_context().await; turn_context_raw diff --git a/codex-rs/core/src/codex_tests_guardian.rs b/codex-rs/core/src/codex_tests_guardian.rs index f5698d58ff..4f60c2f28e 100644 --- a/codex-rs/core/src/codex_tests_guardian.rs +++ b/codex-rs/core/src/codex_tests_guardian.rs @@ -7,7 +7,6 @@ use crate::exec::ExecCapturePolicy; use crate::exec::ExecParams; use crate::exec_policy::ExecPolicyManager; use crate::guardian::GUARDIAN_REVIEWER_NAME; -use crate::protocol::AskForApproval; use crate::sandboxing::SandboxPermissions; use crate::tools::context::FunctionToolOutput; use crate::turn_diff_tracker::TurnDiffTracker; @@ -24,6 +23,7 @@ use codex_protocol::models::ResponseItem; use codex_protocol::models::function_call_output_content_items_to_text; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::AskForApproval; use core_test_support::PathExt; use core_test_support::TempDirExt; use core_test_support::codex_linux_sandbox_exe_or_skip; diff --git a/codex-rs/core/src/codex_thread.rs b/codex-rs/core/src/codex_thread.rs index 8b467fc10b..2b7327df60 100644 --- a/codex-rs/core/src/codex_thread.rs +++ b/codex-rs/core/src/codex_thread.rs @@ -5,9 +5,6 @@ use crate::config::ConstraintResult; use crate::error::CodexErr; use crate::error::Result as CodexResult; use crate::file_watcher::WatchRegistration; -use crate::protocol::Event; -use crate::protocol::Op; -use crate::protocol::Submission; use codex_features::Feature; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::Personality; @@ -17,8 +14,11 @@ use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::Event; +use codex_protocol::protocol::Op; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionSource; +use codex_protocol::protocol::Submission; use codex_protocol::protocol::TokenUsage; use codex_protocol::protocol::W3cTraceContext; use codex_protocol::user_input::UserInput; @@ -26,7 +26,7 @@ use std::path::PathBuf; use tokio::sync::Mutex; use tokio::sync::watch; -use crate::state_db::StateDbHandle; +use codex_rollout::state_db::StateDbHandle; #[derive(Clone, Debug)] pub struct ThreadConfigSnapshot { diff --git a/codex-rs/core/src/command_canonicalization.rs b/codex-rs/core/src/command_canonicalization.rs index 3457fa2f63..b88a79375d 100644 --- a/codex-rs/core/src/command_canonicalization.rs +++ b/codex-rs/core/src/command_canonicalization.rs @@ -1,6 +1,6 @@ -use crate::bash::extract_bash_command; -use crate::bash::parse_shell_lc_plain_commands; -use crate::powershell::extract_powershell_command; +use codex_shell_command::bash::extract_bash_command; +use codex_shell_command::bash::parse_shell_lc_plain_commands; +use codex_shell_command::powershell::extract_powershell_command; const CANONICAL_BASH_SCRIPT_PREFIX: &str = "__codex_shell_script__"; const CANONICAL_POWERSHELL_SCRIPT_PREFIX: &str = "__codex_powershell_script__"; diff --git a/codex-rs/core/src/compact.rs b/codex-rs/core/src/compact.rs index 82fd5c15e3..a281134e71 100644 --- a/codex-rs/core/src/compact.rs +++ b/codex-rs/core/src/compact.rs @@ -11,16 +11,16 @@ use crate::codex::TurnContext; use crate::codex::get_last_assistant_message_from_turn; use crate::error::CodexErr; use crate::error::Result as CodexResult; -use crate::protocol::CompactedItem; -use crate::protocol::EventMsg; -use crate::protocol::TurnStartedEvent; -use crate::protocol::WarningEvent; use crate::util::backoff; use codex_protocol::items::ContextCompactionItem; use codex_protocol::items::TurnItem; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::CompactedItem; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::TurnStartedEvent; +use codex_protocol::protocol::WarningEvent; use codex_protocol::user_input::UserInput; use codex_utils_output_truncation::TruncationPolicy; use codex_utils_output_truncation::approx_token_count; diff --git a/codex-rs/core/src/compact_remote.rs b/codex-rs/core/src/compact_remote.rs index 28be574318..123a79ebbc 100644 --- a/codex-rs/core/src/compact_remote.rs +++ b/codex-rs/core/src/compact_remote.rs @@ -13,13 +13,13 @@ use crate::context_manager::estimate_response_item_model_visible_bytes; use crate::context_manager::is_codex_generated_item; use crate::error::CodexErr; use crate::error::Result as CodexResult; -use crate::protocol::CompactedItem; -use crate::protocol::EventMsg; -use crate::protocol::TurnStartedEvent; use codex_protocol::items::ContextCompactionItem; use codex_protocol::items::TurnItem; use codex_protocol::models::BaseInstructions; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::CompactedItem; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::TurnStartedEvent; use futures::TryFutureExt; use tokio_util::sync::CancellationToken; use tracing::error; diff --git a/codex-rs/core/src/config/mod.rs b/codex-rs/core/src/config/mod.rs index 785238e265..67b6afc857 100644 --- a/codex-rs/core/src/config/mod.rs +++ b/codex-rs/core/src/config/mod.rs @@ -1,4 +1,3 @@ -use crate::auth::AuthCredentialsStoreMode; use crate::config::edit::ConfigEdit; use crate::config::edit::ConfigEditsBuilder; use crate::config::types::AppsConfigToml; @@ -50,9 +49,6 @@ use crate::model_provider_info::built_in_model_providers; use crate::path_utils::normalize_for_native_workdir; use crate::project_doc::DEFAULT_PROJECT_DOC_FILENAME; use crate::project_doc::LOCAL_PROJECT_DOC_FILENAME; -use crate::protocol::AskForApproval; -use crate::protocol::ReadOnlyAccess; -use crate::protocol::SandboxPolicy; use crate::unified_exec::DEFAULT_MAX_BACKGROUND_TERMINAL_TIMEOUT_MS; use crate::unified_exec::MIN_EMPTY_YIELD_TIME_MS; use crate::windows_sandbox::WindowsSandboxLevelExt; @@ -66,6 +62,7 @@ use codex_features::FeatureOverrides; use codex_features::Features; use codex_features::FeaturesToml; use codex_git_utils::resolve_root_git_project_for_trust; +use codex_login::AuthCredentialsStoreMode; use codex_mcp::mcp::McpConfig; use codex_protocol::config_types::AltScreenMode; use codex_protocol::config_types::ForcedLoginMethod; @@ -83,6 +80,9 @@ use codex_protocol::openai_models::ModelsResponse; use codex_protocol::openai_models::ReasoningEffort; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::ReadOnlyAccess; +use codex_protocol::protocol::SandboxPolicy; use codex_rmcp_client::OAuthCredentialsStoreMode; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_absolute_path::AbsolutePathBufGuard; diff --git a/codex-rs/core/src/config/profile.rs b/codex-rs/core/src/config/profile.rs index e0947302e9..fcfda644e0 100644 --- a/codex-rs/core/src/config/profile.rs +++ b/codex-rs/core/src/config/profile.rs @@ -7,7 +7,6 @@ use crate::config::ToolsToml; use crate::config::types::ApprovalsReviewer; use crate::config::types::Personality; use crate::config::types::WindowsToml; -use crate::protocol::AskForApproval; use codex_features::FeaturesToml; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::config_types::SandboxMode; @@ -15,6 +14,7 @@ use codex_protocol::config_types::ServiceTier; use codex_protocol::config_types::Verbosity; use codex_protocol::config_types::WebSearchMode; use codex_protocol::openai_models::ReasoningEffort; +use codex_protocol::protocol::AskForApproval; /// Collection of common configuration options that a user can define as a unit /// in `config.toml`. diff --git a/codex-rs/core/src/connectors.rs b/codex-rs/core/src/connectors.rs index 4a19163a86..e02a6fc227 100644 --- a/codex-rs/core/src/connectors.rs +++ b/codex-rs/core/src/connectors.rs @@ -24,29 +24,30 @@ use serde::Deserialize; use serde::de::DeserializeOwned; use tracing::warn; -use crate::AuthManager; -use crate::CodexAuth; -use crate::SandboxState; use crate::codex::INITIAL_SUBMIT_ID; use crate::config::Config; use crate::config::types::AppToolApproval; use crate::config::types::AppsConfigToml; use crate::config::types::ToolSuggestDiscoverableType; use crate::config_loader::AppsRequirementsToml; -use crate::default_client::create_client; -use crate::default_client::is_first_party_chat_originator; -use crate::default_client::originator; use crate::mcp::McpManager; -use crate::mcp_connection_manager::McpConnectionManager; -use crate::mcp_connection_manager::codex_apps_tools_cache_key; use crate::plugins::AppConnectorId; use crate::plugins::PluginsManager; use crate::plugins::list_tool_suggest_discoverable_plugins; use codex_features::Feature; +use codex_login::AuthManager; +use codex_login::CodexAuth; +use codex_login::default_client::create_client; +use codex_login::default_client::is_first_party_chat_originator; +use codex_login::default_client::originator; use codex_mcp::mcp::CODEX_APPS_MCP_SERVER_NAME; use codex_mcp::mcp::ToolPluginProvenance; use codex_mcp::mcp::auth::compute_auth_statuses; use codex_mcp::mcp::with_codex_apps_mcp; +use codex_mcp::mcp_connection_manager::McpConnectionManager; +use codex_mcp::mcp_connection_manager::SandboxState; +use codex_mcp::mcp_connection_manager::ToolInfo; +use codex_mcp::mcp_connection_manager::codex_apps_tools_cache_key; pub use codex_connectors::CONNECTORS_CACHE_TTL; const CONNECTORS_READY_TIMEOUT_ON_EMPTY_TOOLS: Duration = Duration::from_secs(30); @@ -154,7 +155,7 @@ pub async fn list_cached_accessible_connectors_from_mcp_tools( pub(crate) fn refresh_accessible_connectors_cache_from_mcp_tools( config: &Config, auth: Option<&CodexAuth>, - mcp_tools: &HashMap, + mcp_tools: &HashMap, ) { if !config.features.enabled(Feature::Apps) { return; @@ -508,7 +509,7 @@ pub fn connector_mention_slug(connector: &AppInfo) -> String { } pub(crate) fn accessible_connectors_from_mcp_tools( - mcp_tools: &HashMap, + mcp_tools: &HashMap, ) -> Vec { // ToolInfo already carries plugin provenance, so app-level plugin sources // can be derived here instead of requiring a separate enrichment pass. @@ -682,10 +683,7 @@ pub(crate) fn app_tool_policy( ) } -pub(crate) fn codex_app_tool_is_enabled( - config: &Config, - tool_info: &crate::mcp_connection_manager::ToolInfo, -) -> bool { +pub(crate) fn codex_app_tool_is_enabled(config: &Config, tool_info: &ToolInfo) -> bool { if tool_info.server_name != CODEX_APPS_MCP_SERVER_NAME { return true; } diff --git a/codex-rs/core/src/connectors_tests.rs b/codex-rs/core/src/connectors_tests.rs index 16ff8b8e0f..11ec4b6ca5 100644 --- a/codex-rs/core/src/connectors_tests.rs +++ b/codex-rs/core/src/connectors_tests.rs @@ -11,9 +11,9 @@ use crate::config_loader::CloudRequirementsLoader; use crate::config_loader::ConfigLayerStack; use crate::config_loader::ConfigRequirements; use crate::config_loader::ConfigRequirementsToml; -use crate::mcp_connection_manager::ToolInfo; use codex_features::Feature; use codex_mcp::mcp::CODEX_APPS_MCP_SERVER_NAME; +use codex_mcp::mcp_connection_manager::ToolInfo; use codex_utils_absolute_path::AbsolutePathBuf; use pretty_assertions::assert_eq; use rmcp::model::JsonObject; diff --git a/codex-rs/core/src/default_client_forwarding.rs b/codex-rs/core/src/default_client_forwarding.rs deleted file mode 100644 index 75b76b042c..0000000000 --- a/codex-rs/core/src/default_client_forwarding.rs +++ /dev/null @@ -1,2 +0,0 @@ -// Re-exported as `crate::default_client` from `lib.rs`. -pub use codex_login::default_client::*; diff --git a/codex-rs/core/src/exec.rs b/codex-rs/core/src/exec.rs index 0582232d91..bfefc2510d 100644 --- a/codex-rs/core/src/exec.rs +++ b/codex-rs/core/src/exec.rs @@ -20,11 +20,6 @@ use tokio_util::sync::CancellationToken; use crate::error::CodexErr; use crate::error::Result; use crate::error::SandboxErr; -use crate::protocol::Event; -use crate::protocol::EventMsg; -use crate::protocol::ExecCommandOutputDeltaEvent; -use crate::protocol::ExecOutputStream; -use crate::protocol::SandboxPolicy; use crate::sandboxing::ExecOptions; use crate::sandboxing::ExecRequest; use crate::sandboxing::SandboxPermissions; @@ -37,6 +32,11 @@ use codex_protocol::config_types::WindowsSandboxLevel; use codex_protocol::permissions::FileSystemSandboxKind; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::Event; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ExecCommandOutputDeltaEvent; +use codex_protocol::protocol::ExecOutputStream; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::SandboxCommand; use codex_sandboxing::SandboxManager; use codex_sandboxing::SandboxTransformRequest; diff --git a/codex-rs/core/src/exec_policy.rs b/codex-rs/core/src/exec_policy.rs index a027f2461b..dbfab81d32 100644 --- a/codex-rs/core/src/exec_policy.rs +++ b/codex-rs/core/src/exec_policy.rs @@ -7,8 +7,6 @@ use arc_swap::ArcSwap; use crate::config_loader::ConfigLayerStack; use crate::config_loader::ConfigLayerStackOrdering; -use crate::is_dangerous_command::command_might_be_dangerous; -use crate::is_safe_command::is_known_safe_command; use codex_execpolicy::AmendError; use codex_execpolicy::Decision; use codex_execpolicy::Error as ExecPolicyRuleError; @@ -25,16 +23,18 @@ use codex_protocol::permissions::FileSystemSandboxKind; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::SandboxPolicy; +use codex_shell_command::is_dangerous_command::command_might_be_dangerous; +use codex_shell_command::is_safe_command::is_known_safe_command; use thiserror::Error; use tokio::fs; use tokio::task::spawn_blocking; use tracing::instrument; -use crate::bash::parse_shell_lc_plain_commands; -use crate::bash::parse_shell_lc_single_command_prefix; use crate::config::Config; use crate::sandboxing::SandboxPermissions; use crate::tools::sandboxing::ExecApprovalRequirement; +use codex_shell_command::bash::parse_shell_lc_plain_commands; +use codex_shell_command::bash::parse_shell_lc_single_command_prefix; use codex_utils_absolute_path::AbsolutePathBuf; use shlex::try_join as shlex_try_join; diff --git a/codex-rs/core/src/guardian/review_session.rs b/codex-rs/core/src/guardian/review_session.rs index 17993a9743..88bc795c16 100644 --- a/codex-rs/core/src/guardian/review_session.rs +++ b/codex-rs/core/src/guardian/review_session.rs @@ -17,6 +17,7 @@ use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::Op; use codex_protocol::protocol::RolloutItem; +use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SubAgentSource; use codex_protocol::user_input::UserInput; use serde_json::Value; @@ -35,7 +36,6 @@ use crate::config::NetworkProxySpec; use crate::config::Permissions; use crate::config::types::McpServerConfig; use crate::model_provider_info::ModelProviderInfo; -use crate::protocol::SandboxPolicy; use crate::rollout::recorder::RolloutRecorder; use codex_features::Feature; diff --git a/codex-rs/core/src/guardian/tests.rs b/codex-rs/core/src/guardian/tests.rs index fa59cf908a..17813ee7d0 100644 --- a/codex-rs/core/src/guardian/tests.rs +++ b/codex-rs/core/src/guardian/tests.rs @@ -15,7 +15,6 @@ use crate::config_loader::NetworkDomainPermissionToml; use crate::config_loader::NetworkDomainPermissionsToml; use crate::config_loader::RequirementSource; use crate::config_loader::Sourced; -use crate::protocol::SandboxPolicy; use crate::test_support; use codex_network_proxy::NetworkProxyConfig; use codex_protocol::approvals::NetworkApprovalProtocol; @@ -27,6 +26,7 @@ use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::GuardianAssessmentStatus; use codex_protocol::protocol::GuardianRiskLevel; use codex_protocol::protocol::ReviewDecision; +use codex_protocol::protocol::SandboxPolicy; use core_test_support::PathBufExt; use core_test_support::TempDirExt; use core_test_support::context_snapshot; diff --git a/codex-rs/core/src/hook_runtime.rs b/codex-rs/core/src/hook_runtime.rs index ece93b1da1..0d620119f7 100644 --- a/codex-rs/core/src/hook_runtime.rs +++ b/codex-rs/core/src/hook_runtime.rs @@ -16,6 +16,7 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::HookCompletedEvent; use codex_protocol::protocol::HookRunSummary; +use codex_protocol::protocol::HookStartedEvent; use codex_protocol::user_input::UserInput; use serde_json::Value; @@ -306,7 +307,7 @@ async fn emit_hook_started_events( for run in preview_runs { sess.send_event( turn_context, - EventMsg::HookStarted(crate::protocol::HookStartedEvent { + EventMsg::HookStarted(HookStartedEvent { turn_id: Some(turn_context.sub_id.clone()), run, }), diff --git a/codex-rs/core/src/landlock.rs b/codex-rs/core/src/landlock.rs index ef55a207e2..95f107be9c 100644 --- a/codex-rs/core/src/landlock.rs +++ b/codex-rs/core/src/landlock.rs @@ -1,10 +1,10 @@ -use crate::protocol::SandboxPolicy; use crate::spawn::SpawnChildRequest; use crate::spawn::StdioPolicy; use crate::spawn::spawn_child_async; use codex_network_proxy::NetworkProxy; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::landlock::CODEX_LINUX_SANDBOX_ARG0; use codex_sandboxing::landlock::allow_network_for_proxy; use codex_sandboxing::landlock::create_linux_sandbox_command_args_for_policies; diff --git a/codex-rs/core/src/lib.rs b/codex-rs/core/src/lib.rs index 4b8510bc8e..8ffc7acfb7 100644 --- a/codex-rs/core/src/lib.rs +++ b/codex-rs/core/src/lib.rs @@ -9,7 +9,6 @@ pub mod api_bridge; mod apply_patch; mod apps; mod arc_monitor; -pub use codex_login as auth; mod auth_env_telemetry; mod client; mod client_common; @@ -30,7 +29,6 @@ pub mod config_loader; pub mod connectors; mod context_manager; mod contextual_user_message; -pub use codex_utils_path::env; mod environment_context; pub mod error; pub mod exec; @@ -52,10 +50,6 @@ pub mod models_manager; mod network_policy_decision; pub mod network_proxy_loader; mod original_image_detail; -pub use codex_mcp::mcp_connection_manager; -pub use codex_mcp::mcp_connection_manager::MCP_SANDBOX_STATE_CAPABILITY; -pub use codex_mcp::mcp_connection_manager::MCP_SANDBOX_STATE_METHOD; -pub use codex_mcp::mcp_connection_manager::SandboxState; pub use text_encoding::bytes_to_string_smart; mod mcp_tool_call; mod memories; @@ -105,7 +99,6 @@ mod text_encoding; mod unified_exec; pub mod windows_sandbox; pub use client::X_RESPONSESAPI_INCLUDE_TIMING_METRICS_HEADER; -pub use codex_protocol::config_types::ModelProviderAuthInfo; pub use model_provider_info::DEFAULT_LMSTUDIO_PORT; pub use model_provider_info::DEFAULT_OLLAMA_PORT; pub use model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; @@ -131,20 +124,6 @@ pub type ConversationManager = ThreadManager; pub type NewConversation = NewThread; #[deprecated(note = "use CodexThread")] pub type CodexConversation = CodexThread; -// Re-export common auth types for workspace consumers -pub use auth::AuthManager; -pub use auth::CodexAuth; -pub use codex_analytics::AnalyticsEventsClient; -pub use codex_analytics::AppServerRpcTransport; -mod default_client_forwarding; - -/// Default Codex HTTP client headers and reqwest construction. -/// -/// Implemented in [`codex_login::default_client`]; this module re-exports that API for crates -/// that import `codex_core::default_client`. -pub mod default_client { - pub use super::default_client_forwarding::*; -} pub mod project_doc; mod rollout; pub(crate) mod safety; @@ -154,7 +133,6 @@ pub mod shell; pub mod shell_snapshot; pub mod spawn; pub mod state_db_bridge; -pub use codex_rollout::state_db; mod thread_rollout_truncation; mod tools; pub mod turn_diff_tracker; @@ -188,12 +166,6 @@ mod state; mod tasks; mod user_shell_command; pub mod util; -pub(crate) use codex_protocol::protocol; -pub(crate) use codex_shell_command::bash; -pub(crate) use codex_shell_command::is_dangerous_command; -pub(crate) use codex_shell_command::is_safe_command; -pub(crate) use codex_shell_command::parse_command; -pub(crate) use codex_shell_command::powershell; pub use client::ModelClient; pub use client::ModelClientSession; @@ -202,8 +174,6 @@ pub use client_common::Prompt; pub use client_common::REVIEW_PROMPT; pub use client_common::ResponseEvent; pub use client_common::ResponseStream; -pub use codex_sandboxing::get_platform_sandbox; -pub use codex_tools::parse_tool_input_schema; pub use compact::content_items_to_text; pub use event_mapping::parse_turn_item; pub use exec_policy::ExecPolicyError; diff --git a/codex-rs/core/src/mcp.rs b/codex-rs/core/src/mcp.rs index 552868304f..d82452c54d 100644 --- a/codex-rs/core/src/mcp.rs +++ b/codex-rs/core/src/mcp.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; use std::sync::Arc; -use crate::CodexAuth; use crate::config::Config; use crate::plugins::PluginsManager; use codex_config::McpServerConfig; +use codex_login::CodexAuth; use codex_mcp::mcp::ToolPluginProvenance; use codex_mcp::mcp::configured_mcp_servers; use codex_mcp::mcp::effective_mcp_servers; diff --git a/codex-rs/core/src/mcp_tool_call.rs b/codex-rs/core/src/mcp_tool_call.rs index 8f81c23843..994f9586d9 100644 --- a/codex-rs/core/src/mcp_tool_call.rs +++ b/codex-rs/core/src/mcp_tool_call.rs @@ -28,11 +28,6 @@ use crate::guardian::review_approval_request; use crate::guardian::routes_approval_to_guardian; use crate::mcp_tool_approval_templates::RenderedMcpToolApprovalParam; use crate::mcp_tool_approval_templates::render_mcp_tool_approval_template; -use crate::protocol::EventMsg; -use crate::protocol::McpInvocation; -use crate::protocol::McpToolCallBeginEvent; -use crate::protocol::McpToolCallEndEvent; -use crate::state_db; use codex_analytics::AppInvocation; use codex_analytics::InvocationType; use codex_analytics::build_track_events_context; @@ -42,6 +37,10 @@ use codex_otel::sanitize_metric_tag_value; use codex_protocol::mcp::CallToolResult; use codex_protocol::openai_models::InputModality; use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::McpInvocation; +use codex_protocol::protocol::McpToolCallBeginEvent; +use codex_protocol::protocol::McpToolCallEndEvent; use codex_protocol::protocol::ReviewDecision; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::request_user_input::RequestUserInputAnswer; @@ -51,6 +50,7 @@ use codex_protocol::request_user_input::RequestUserInputQuestionOption; use codex_protocol::request_user_input::RequestUserInputResponse; use codex_rmcp_client::ElicitationAction; use codex_rmcp_client::ElicitationResponse; +use codex_rollout::state_db; use rmcp::model::ToolAnnotations; use serde::Deserialize; use serde::Serialize; diff --git a/codex-rs/core/src/mcp_tool_call_tests.rs b/codex-rs/core/src/mcp_tool_call_tests.rs index d7fcb374f3..8acdf917e5 100644 --- a/codex-rs/core/src/mcp_tool_call_tests.rs +++ b/codex-rs/core/src/mcp_tool_call_tests.rs @@ -1384,7 +1384,7 @@ async fn approve_mode_blocks_when_arc_returns_interrupt_for_model() { let (session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); let mut config = (*turn_context.config).clone(); config.chatgpt_base_url = server.uri(); @@ -1453,7 +1453,7 @@ async fn custom_approve_mode_blocks_when_arc_returns_interrupt_for_model() { let (session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); let mut config = (*turn_context.config).clone(); config.chatgpt_base_url = server.uri(); @@ -1522,7 +1522,7 @@ async fn approve_mode_blocks_when_arc_returns_interrupt_without_annotations() { let (session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); let mut config = (*turn_context.config).clone(); config.chatgpt_base_url = server.uri(); @@ -1591,7 +1591,7 @@ async fn full_access_mode_skips_arc_monitor_for_all_approval_modes() { let (session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); turn_context .approval_policy @@ -1689,7 +1689,7 @@ async fn approve_mode_routes_arc_ask_user_to_guardian_when_guardian_reviewer_is_ let (mut session, mut turn_context) = make_session_and_context().await; turn_context.auth_manager = Some(crate::test_support::auth_manager_from_auth( - crate::CodexAuth::create_dummy_chatgpt_auth_for_testing(), + codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing(), )); turn_context .approval_policy diff --git a/codex-rs/core/src/memories/tests.rs b/codex-rs/core/src/memories/tests.rs index 8eae9db861..783bac3c37 100644 --- a/codex-rs/core/src/memories/tests.rs +++ b/codex-rs/core/src/memories/tests.rs @@ -414,7 +414,6 @@ task_outcome: success } mod phase2 { - use crate::CodexAuth; use crate::ThreadManager; use crate::agent::AgentControl; use crate::codex::Session; @@ -427,6 +426,7 @@ mod phase2 { use crate::memories::rollout_summaries_dir; use chrono::Utc; use codex_config::Constrained; + use codex_login::CodexAuth; use codex_protocol::ThreadId; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::Op; @@ -693,7 +693,7 @@ mod phase2 { let rollout_path = subagent .rollout_path() .expect("consolidation thread should have a rollout path"); - crate::state_db::read_repair_rollout_path( + codex_rollout::state_db::read_repair_rollout_path( Some(harness.state_db.as_ref()), Some(thread_id), Some(/*archived_only*/ false), diff --git a/codex-rs/core/src/memories/usage.rs b/codex-rs/core/src/memories/usage.rs index 337ee782f2..b98a009822 100644 --- a/codex-rs/core/src/memories/usage.rs +++ b/codex-rs/core/src/memories/usage.rs @@ -1,11 +1,11 @@ -use crate::is_safe_command::is_known_safe_command; -use crate::parse_command::parse_command; use crate::tools::context::ToolInvocation; use crate::tools::context::ToolPayload; use crate::tools::handlers::unified_exec::ExecCommandArgs; use codex_protocol::models::ShellCommandToolCallParams; use codex_protocol::models::ShellToolCallParams; use codex_protocol::parse_command::ParsedCommand; +use codex_shell_command::is_safe_command::is_known_safe_command; +use codex_shell_command::parse_command::parse_command; use std::path::PathBuf; const MEMORIES_USAGE_METRIC: &str = "codex.memories.usage"; diff --git a/codex-rs/core/src/model_provider_info.rs b/codex-rs/core/src/model_provider_info.rs index a3df34b64d..231fe73b90 100644 --- a/codex-rs/core/src/model_provider_info.rs +++ b/codex-rs/core/src/model_provider_info.rs @@ -5,10 +5,10 @@ //! 2. User-defined entries inside `~/.codex/config.toml` under the `model_providers` //! key. These override or extend the defaults at runtime. -use crate::auth::AuthMode; use crate::error::EnvVarError; use codex_api::Provider as ApiProvider; use codex_api::provider::RetryConfig as ApiRetryConfig; +use codex_login::AuthMode; use codex_protocol::config_types::ModelProviderAuthInfo; use http::HeaderMap; use http::header::HeaderName; diff --git a/codex-rs/core/src/models_manager/manager.rs b/codex-rs/core/src/models_manager/manager.rs index aa22186f98..8f52bab371 100644 --- a/codex-rs/core/src/models_manager/manager.rs +++ b/codex-rs/core/src/models_manager/manager.rs @@ -1,13 +1,9 @@ use super::cache::ModelsCacheManager; use crate::api_bridge::auth_provider_from_auth; use crate::api_bridge::map_api_error; -use crate::auth::AuthManager; -use crate::auth::AuthMode; -use crate::auth::CodexAuth; use crate::auth_env_telemetry::AuthEnvTelemetry; use crate::auth_env_telemetry::collect_auth_env_telemetry; use crate::config::Config; -use crate::default_client::build_reqwest_client; use crate::error::CodexErr; use crate::error::Result as CoreResult; use crate::model_provider_info::ModelProviderInfo; @@ -23,6 +19,10 @@ use codex_api::ModelsClient; use codex_api::RequestTelemetry; use codex_api::ReqwestTransport; use codex_api::TransportError; +use codex_login::AuthManager; +use codex_login::AuthMode; +use codex_login::CodexAuth; +use codex_login::default_client::build_reqwest_client; use codex_otel::TelemetryAuthMode; use codex_protocol::config_types::CollaborationModeMask; use codex_protocol::openai_models::ModelInfo; diff --git a/codex-rs/core/src/models_manager/manager_tests.rs b/codex-rs/core/src/models_manager/manager_tests.rs index 7f79e07052..3e0ca152c7 100644 --- a/codex-rs/core/src/models_manager/manager_tests.rs +++ b/codex-rs/core/src/models_manager/manager_tests.rs @@ -1,13 +1,13 @@ use super::*; -use crate::AuthManager; -use crate::CodexAuth; -use crate::ModelProviderAuthInfo; -use crate::auth::AuthCredentialsStoreMode; use crate::config::ConfigBuilder; use crate::model_provider_info::WireApi; use base64::Engine as _; use chrono::Utc; use codex_api::TransportError; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthManager; +use codex_login::CodexAuth; +use codex_protocol::config_types::ModelProviderAuthInfo; use codex_protocol::openai_models::ModelsResponse; use core_test_support::responses::mount_models_once; use http::HeaderMap; diff --git a/codex-rs/core/src/otel_init.rs b/codex-rs/core/src/otel_init.rs index 0bec06724f..9e38cea52d 100644 --- a/codex-rs/core/src/otel_init.rs +++ b/codex-rs/core/src/otel_init.rs @@ -1,8 +1,8 @@ use crate::config::Config; use crate::config::types::OtelExporterKind as Kind; use crate::config::types::OtelHttpProtocol as Protocol; -use crate::default_client::originator; use codex_features::Feature; +use codex_login::default_client::originator; use codex_otel::OtelProvider; use codex_otel::config::OtelExporter; use codex_otel::config::OtelHttpProtocol; diff --git a/codex-rs/core/src/personality_migration.rs b/codex-rs/core/src/personality_migration.rs index f535465209..8a3786e79e 100644 --- a/codex-rs/core/src/personality_migration.rs +++ b/codex-rs/core/src/personality_migration.rs @@ -6,9 +6,9 @@ use crate::rollout::list::ThreadListConfig; use crate::rollout::list::ThreadListLayout; use crate::rollout::list::ThreadSortKey; use crate::rollout::list::get_threads_in_root; -use crate::state_db; use codex_protocol::config_types::Personality; use codex_protocol::protocol::SessionSource; +use codex_rollout::state_db; use std::io; use std::path::Path; use tokio::fs::OpenOptions; diff --git a/codex-rs/core/src/plugins/injection.rs b/codex-rs/core/src/plugins/injection.rs index 26d5f0816c..e482010b2e 100644 --- a/codex-rs/core/src/plugins/injection.rs +++ b/codex-rs/core/src/plugins/injection.rs @@ -5,10 +5,10 @@ use codex_protocol::models::DeveloperInstructions; use codex_protocol::models::ResponseItem; use crate::connectors; -use crate::mcp_connection_manager::ToolInfo; use crate::plugins::PluginCapabilitySummary; use crate::plugins::render_explicit_plugin_instructions; use codex_mcp::mcp::CODEX_APPS_MCP_SERVER_NAME; +use codex_mcp::mcp_connection_manager::ToolInfo; pub(crate) fn build_plugin_injections( mentioned_plugins: &[PluginCapabilitySummary], diff --git a/codex-rs/core/src/plugins/manager.rs b/codex-rs/core/src/plugins/manager.rs index 59bc99b238..9147675e2f 100644 --- a/codex-rs/core/src/plugins/manager.rs +++ b/codex-rs/core/src/plugins/manager.rs @@ -26,9 +26,7 @@ use super::store::PluginInstallResult as StorePluginInstallResult; use super::store::PluginStore; use super::store::PluginStoreError; use super::sync_openai_plugins_repo; -use crate::AuthManager; use crate::SkillMetadata; -use crate::auth::CodexAuth; use crate::config::CONFIG_TOML_FILE; use crate::config::Config; use crate::config::ConfigService; @@ -47,6 +45,8 @@ use codex_analytics::AnalyticsEventsClient; use codex_app_server_protocol::ConfigValueWriteParams; use codex_app_server_protocol::MergeStrategy; use codex_features::Feature; +use codex_login::AuthManager; +use codex_login::CodexAuth; use codex_plugin::AppConnectorId; use codex_plugin::PluginCapabilitySummary; use codex_plugin::PluginId; diff --git a/codex-rs/core/src/plugins/manager_tests.rs b/codex-rs/core/src/plugins/manager_tests.rs index 08d0e7cc77..2089670d73 100644 --- a/codex-rs/core/src/plugins/manager_tests.rs +++ b/codex-rs/core/src/plugins/manager_tests.rs @@ -1,5 +1,4 @@ use super::*; -use crate::auth::CodexAuth; use crate::config::CONFIG_TOML_FILE; use crate::config::ConfigBuilder; use crate::config::types::McpServerTransportConfig; @@ -15,6 +14,7 @@ use crate::plugins::test_support::write_curated_plugin_sha_with as write_curated use crate::plugins::test_support::write_file; use crate::plugins::test_support::write_openai_curated_marketplace; use codex_app_server_protocol::ConfigLayerSource; +use codex_login::CodexAuth; use codex_protocol::protocol::Product; use pretty_assertions::assert_eq; use std::fs; diff --git a/codex-rs/core/src/plugins/remote.rs b/codex-rs/core/src/plugins/remote.rs index 756824b339..f26bbe8880 100644 --- a/codex-rs/core/src/plugins/remote.rs +++ b/codex-rs/core/src/plugins/remote.rs @@ -1,6 +1,6 @@ -use crate::auth::CodexAuth; use crate::config::Config; -use crate::default_client::build_reqwest_client; +use codex_login::CodexAuth; +use codex_login::default_client::build_reqwest_client; use codex_protocol::protocol::Product; use serde::Deserialize; use std::time::Duration; diff --git a/codex-rs/core/src/plugins/startup_sync.rs b/codex-rs/core/src/plugins/startup_sync.rs index ceeb1d0f81..6dcf18f54f 100644 --- a/codex-rs/core/src/plugins/startup_sync.rs +++ b/codex-rs/core/src/plugins/startup_sync.rs @@ -1,4 +1,3 @@ -use crate::default_client::build_reqwest_client; use std::path::Path; use std::path::PathBuf; use std::process::Command; @@ -16,8 +15,9 @@ use tracing::info; use tracing::warn; use zip::ZipArchive; -use crate::AuthManager; use crate::config::Config; +use codex_login::AuthManager; +use codex_login::default_client::build_reqwest_client; use super::PluginsManager; diff --git a/codex-rs/core/src/plugins/startup_sync_tests.rs b/codex-rs/core/src/plugins/startup_sync_tests.rs index c3d11572ca..e1a1d8596f 100644 --- a/codex-rs/core/src/plugins/startup_sync_tests.rs +++ b/codex-rs/core/src/plugins/startup_sync_tests.rs @@ -1,10 +1,10 @@ use super::*; -use crate::auth::CodexAuth; use crate::config::CONFIG_TOML_FILE; use crate::plugins::test_support::TEST_CURATED_PLUGIN_SHA; use crate::plugins::test_support::write_curated_plugin_sha; use crate::plugins::test_support::write_file; use crate::plugins::test_support::write_openai_curated_marketplace; +use codex_login::CodexAuth; use pretty_assertions::assert_eq; use std::io::Write; use std::path::Path; diff --git a/codex-rs/core/src/provider_auth.rs b/codex-rs/core/src/provider_auth.rs index 4737ccc8bc..09f8b273c6 100644 --- a/codex-rs/core/src/provider_auth.rs +++ b/codex-rs/core/src/provider_auth.rs @@ -1,7 +1,7 @@ use std::sync::Arc; -use crate::AuthManager; use crate::model_provider_info::ModelProviderInfo; +use codex_login::AuthManager; /// Returns the provider-scoped auth manager when this provider uses command-backed auth. /// diff --git a/codex-rs/core/src/realtime_conversation.rs b/codex-rs/core/src/realtime_conversation.rs index 1bfe1b5a88..fafbb50633 100644 --- a/codex-rs/core/src/realtime_conversation.rs +++ b/codex-rs/core/src/realtime_conversation.rs @@ -1,10 +1,7 @@ -use crate::CodexAuth; use crate::api_bridge::map_api_error; -use crate::auth::read_openai_api_key_from_env; use crate::codex::Session; use crate::config::RealtimeWsMode; use crate::config::RealtimeWsVersion; -use crate::default_client::default_headers; use crate::error::CodexErr; use crate::error::Result as CodexResult; use crate::realtime_context::build_realtime_startup_context; @@ -22,6 +19,10 @@ use codex_api::RealtimeSessionMode; use codex_api::RealtimeWebsocketClient; use codex_api::endpoint::realtime_websocket::RealtimeWebsocketEvents; use codex_api::endpoint::realtime_websocket::RealtimeWebsocketWriter; +use codex_login::AuthMode; +use codex_login::CodexAuth; +use codex_login::default_client::default_headers; +use codex_login::read_openai_api_key_from_env; use codex_protocol::protocol::CodexErrorInfo; use codex_protocol::protocol::ConversationAudioParams; use codex_protocol::protocol::ConversationStartParams; @@ -459,7 +460,7 @@ async fn prepare_realtime_start( .unwrap_or_else(|| Arc::clone(&sess.services.auth_manager)); let auth = auth_manager.auth().await; let realtime_api_key = realtime_api_key(auth.as_ref(), &provider)?; - let mut api_provider = provider.to_api_provider(Some(crate::auth::AuthMode::ApiKey))?; + let mut api_provider = provider.to_api_provider(Some(AuthMode::ApiKey))?; let config = sess.get_config().await; if let Some(realtime_ws_base_url) = &config.experimental_realtime_ws_base_url { api_provider.base_url = realtime_ws_base_url.clone(); diff --git a/codex-rs/core/src/review_format.rs b/codex-rs/core/src/review_format.rs index b0e286ce98..2e249df793 100644 --- a/codex-rs/core/src/review_format.rs +++ b/codex-rs/core/src/review_format.rs @@ -1,5 +1,5 @@ -use crate::protocol::ReviewFinding; -use crate::protocol::ReviewOutputEvent; +use codex_protocol::protocol::ReviewFinding; +use codex_protocol::protocol::ReviewOutputEvent; // Note: We keep this module UI-agnostic. It returns plain strings that // higher layers (e.g., TUI) may style as needed. diff --git a/codex-rs/core/src/safety.rs b/codex-rs/core/src/safety.rs index 61fdc8f6e1..dec7a00876 100644 --- a/codex-rs/core/src/safety.rs +++ b/codex-rs/core/src/safety.rs @@ -2,13 +2,13 @@ use std::path::Component; use std::path::Path; use std::path::PathBuf; -use crate::protocol::AskForApproval; -use crate::protocol::FileSystemSandboxPolicy; -use crate::protocol::SandboxPolicy; use crate::util::resolve_path; use codex_apply_patch::ApplyPatchAction; use codex_apply_patch::ApplyPatchFileChange; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::permissions::FileSystemSandboxPolicy; +use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::SandboxType; use codex_sandboxing::get_platform_sandbox; diff --git a/codex-rs/core/src/sandbox_tags.rs b/codex-rs/core/src/sandbox_tags.rs index 57a99a8038..b3b4749097 100644 --- a/codex-rs/core/src/sandbox_tags.rs +++ b/codex-rs/core/src/sandbox_tags.rs @@ -1,5 +1,5 @@ -use crate::protocol::SandboxPolicy; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::SandboxType; use codex_sandboxing::get_platform_sandbox; diff --git a/codex-rs/core/src/sandbox_tags_tests.rs b/codex-rs/core/src/sandbox_tags_tests.rs index cc75d47501..6ff54f6eb9 100644 --- a/codex-rs/core/src/sandbox_tags_tests.rs +++ b/codex-rs/core/src/sandbox_tags_tests.rs @@ -1,7 +1,7 @@ use super::sandbox_tag; -use crate::protocol::SandboxPolicy; use codex_protocol::config_types::WindowsSandboxLevel; use codex_protocol::protocol::NetworkAccess; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::SandboxType; use codex_sandboxing::get_platform_sandbox; use pretty_assertions::assert_eq; diff --git a/codex-rs/core/src/seatbelt.rs b/codex-rs/core/src/seatbelt.rs index 353c9708f5..cc59f65c83 100644 --- a/codex-rs/core/src/seatbelt.rs +++ b/codex-rs/core/src/seatbelt.rs @@ -1,6 +1,5 @@ #![cfg(target_os = "macos")] -use crate::protocol::SandboxPolicy; use crate::spawn::CODEX_SANDBOX_ENV_VAR; use crate::spawn::SpawnChildRequest; use crate::spawn::StdioPolicy; @@ -8,6 +7,7 @@ use crate::spawn::spawn_child_async; use codex_network_proxy::NetworkProxy; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::seatbelt::MACOS_PATH_TO_SEATBELT_EXECUTABLE; use codex_sandboxing::seatbelt::create_seatbelt_command_args_for_policies; use std::collections::HashMap; diff --git a/codex-rs/core/src/state/service.rs b/codex-rs/core/src/state/service.rs index 2e33f03d88..a7c384202f 100644 --- a/codex-rs/core/src/state/service.rs +++ b/codex-rs/core/src/state/service.rs @@ -1,6 +1,5 @@ use std::sync::Arc; -use crate::AuthManager; use crate::RolloutRecorder; use crate::SkillsManager; use crate::agent::AgentControl; @@ -8,11 +7,9 @@ use crate::client::ModelClient; use crate::config::StartedNetworkProxy; use crate::exec_policy::ExecPolicyManager; use crate::mcp::McpManager; -use crate::mcp_connection_manager::McpConnectionManager; use crate::models_manager::manager::ModelsManager; use crate::plugins::PluginsManager; use crate::skills_watcher::SkillsWatcher; -use crate::state_db::StateDbHandle; use crate::tools::code_mode::CodeModeService; use crate::tools::network_approval::NetworkApprovalService; use crate::tools::sandboxing::ApprovalStore; @@ -20,7 +17,10 @@ use crate::unified_exec::UnifiedExecProcessManager; use codex_analytics::AnalyticsEventsClient; use codex_exec_server::Environment; use codex_hooks::Hooks; +use codex_login::AuthManager; +use codex_mcp::mcp_connection_manager::McpConnectionManager; use codex_otel::SessionTelemetry; +use codex_rollout::state_db::StateDbHandle; use std::path::PathBuf; use tokio::sync::Mutex; use tokio::sync::RwLock; diff --git a/codex-rs/core/src/state/session.rs b/codex-rs/core/src/state/session.rs index 1a14236163..206f75060c 100644 --- a/codex-rs/core/src/state/session.rs +++ b/codex-rs/core/src/state/session.rs @@ -9,10 +9,10 @@ use std::collections::HashSet; use crate::codex::PreviousTurnSettings; use crate::codex::SessionConfiguration; use crate::context_manager::ContextManager; -use crate::protocol::RateLimitSnapshot; -use crate::protocol::TokenUsage; -use crate::protocol::TokenUsageInfo; use crate::session_startup_prewarm::SessionStartupPrewarmHandle; +use codex_protocol::protocol::RateLimitSnapshot; +use codex_protocol::protocol::TokenUsage; +use codex_protocol::protocol::TokenUsageInfo; use codex_protocol::protocol::TurnContextItem; use codex_utils_output_truncation::TruncationPolicy; diff --git a/codex-rs/core/src/state/session_tests.rs b/codex-rs/core/src/state/session_tests.rs index 2b7c276d7e..1af7ccc8f6 100644 --- a/codex-rs/core/src/state/session_tests.rs +++ b/codex-rs/core/src/state/session_tests.rs @@ -1,6 +1,7 @@ use super::*; use crate::codex::make_session_configuration_for_tests; -use crate::protocol::RateLimitWindow; +use codex_protocol::protocol::CreditsSnapshot; +use codex_protocol::protocol::RateLimitWindow; use pretty_assertions::assert_eq; #[tokio::test] @@ -112,7 +113,7 @@ async fn set_rate_limits_carries_credits_and_plan_type_from_codex_to_codex_other resets_at: Some(100), }), secondary: None, - credits: Some(crate::protocol::CreditsSnapshot { + credits: Some(CreditsSnapshot { has_credits: true, unlimited: false, balance: Some("50".to_string()), @@ -144,7 +145,7 @@ async fn set_rate_limits_carries_credits_and_plan_type_from_codex_to_codex_other resets_at: Some(200), }), secondary: None, - credits: Some(crate::protocol::CreditsSnapshot { + credits: Some(CreditsSnapshot { has_credits: true, unlimited: false, balance: Some("50".to_string()), diff --git a/codex-rs/core/src/state/turn.rs b/codex-rs/core/src/state/turn.rs index 07d040ca21..b573123ad4 100644 --- a/codex-rs/core/src/state/turn.rs +++ b/codex-rs/core/src/state/turn.rs @@ -18,10 +18,10 @@ use rmcp::model::RequestId; use tokio::sync::oneshot; use crate::codex::TurnContext; -use crate::protocol::ReviewDecision; -use crate::protocol::TokenUsage; use crate::tasks::SessionTask; use codex_protocol::models::PermissionProfile; +use codex_protocol::protocol::ReviewDecision; +use codex_protocol::protocol::TokenUsage; /// Metadata about the currently running turn. pub(crate) struct ActiveTurn { diff --git a/codex-rs/core/src/stream_events_utils.rs b/codex-rs/core/src/stream_events_utils.rs index cd77f1d5a3..5cc9574db3 100644 --- a/codex-rs/core/src/stream_events_utils.rs +++ b/codex-rs/core/src/stream_events_utils.rs @@ -18,7 +18,6 @@ use crate::function_tool::FunctionCallError; use crate::memories::citations::get_thread_id_from_citations; use crate::memories::citations::parse_memory_citation; use crate::parse_turn_item; -use crate::state_db; use crate::tools::parallel::ToolCallRuntime; use crate::tools::router::ToolRouter; use codex_protocol::models::DeveloperInstructions; @@ -26,6 +25,7 @@ use codex_protocol::models::FunctionCallOutputBody; use codex_protocol::models::FunctionCallOutputPayload; use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; +use codex_rollout::state_db; use codex_utils_stream_parser::strip_proposed_plan_blocks; use futures::Future; use tracing::debug; diff --git a/codex-rs/core/src/tasks/ghost_snapshot.rs b/codex-rs/core/src/tasks/ghost_snapshot.rs index 6028c311cc..7b848098a4 100644 --- a/codex-rs/core/src/tasks/ghost_snapshot.rs +++ b/codex-rs/core/src/tasks/ghost_snapshot.rs @@ -1,6 +1,4 @@ use crate::codex::TurnContext; -use crate::protocol::EventMsg; -use crate::protocol::WarningEvent; use crate::state::TaskKind; use crate::tasks::SessionTask; use crate::tasks::SessionTaskContext; @@ -10,6 +8,8 @@ use codex_git_utils::GhostSnapshotReport; use codex_git_utils::GitToolingError; use codex_git_utils::create_ghost_commit_with_report; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::WarningEvent; use codex_protocol::user_input::UserInput; use codex_utils_readiness::Readiness; use codex_utils_readiness::Token; diff --git a/codex-rs/core/src/tasks/mod.rs b/codex-rs/core/src/tasks/mod.rs index 0f14e233c7..74b2e471cd 100644 --- a/codex-rs/core/src/tasks/mod.rs +++ b/codex-rs/core/src/tasks/mod.rs @@ -19,7 +19,6 @@ use tracing::info_span; use tracing::trace; use tracing::warn; -use crate::AuthManager; use crate::codex::Session; use crate::codex::TurnContext; use crate::contextual_user_message::TURN_ABORTED_CLOSE_TAG; @@ -29,13 +28,10 @@ use crate::hook_runtime::inspect_pending_input; use crate::hook_runtime::record_additional_contexts; use crate::hook_runtime::record_pending_input; use crate::models_manager::manager::ModelsManager; -use crate::protocol::EventMsg; -use crate::protocol::TurnAbortReason; -use crate::protocol::TurnAbortedEvent; -use crate::protocol::TurnCompleteEvent; use crate::state::ActiveTurn; use crate::state::RunningTask; use crate::state::TaskKind; +use codex_login::AuthManager; use codex_otel::SessionTelemetry; use codex_otel::metrics::names::TURN_E2E_DURATION_METRIC; use codex_otel::metrics::names::TURN_NETWORK_PROXY_METRIC; @@ -44,7 +40,12 @@ use codex_otel::metrics::names::TURN_TOOL_CALL_METRIC; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::RolloutItem; +use codex_protocol::protocol::TokenUsage; +use codex_protocol::protocol::TurnAbortReason; +use codex_protocol::protocol::TurnAbortedEvent; +use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::user_input::UserInput; use codex_features::Feature; @@ -405,7 +406,7 @@ impl Session { &[tmp_mem], ); let total_token_usage = self.total_token_usage().await.unwrap_or_default(); - let turn_token_usage = crate::protocol::TokenUsage { + let turn_token_usage = TokenUsage { input_tokens: (total_token_usage.input_tokens - token_usage_at_turn_start.input_tokens) .max(0), diff --git a/codex-rs/core/src/tasks/regular.rs b/codex-rs/core/src/tasks/regular.rs index 171c0adaa3..7a274d534f 100644 --- a/codex-rs/core/src/tasks/regular.rs +++ b/codex-rs/core/src/tasks/regular.rs @@ -5,10 +5,10 @@ use tokio_util::sync::CancellationToken; use crate::codex::TurnContext; use crate::codex::run_turn; -use crate::protocol::EventMsg; -use crate::protocol::TurnStartedEvent; use crate::session_startup_prewarm::SessionStartupPrewarmResolution; use crate::state::TaskKind; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::TurnStartedEvent; use codex_protocol::user_input::UserInput; use tracing::Instrument; use tracing::trace_span; diff --git a/codex-rs/core/src/tasks/undo.rs b/codex-rs/core/src/tasks/undo.rs index 7fd2ea07e8..48cdf11aab 100644 --- a/codex-rs/core/src/tasks/undo.rs +++ b/codex-rs/core/src/tasks/undo.rs @@ -1,9 +1,6 @@ use std::sync::Arc; use crate::codex::TurnContext; -use crate::protocol::EventMsg; -use crate::protocol::UndoCompletedEvent; -use crate::protocol::UndoStartedEvent; use crate::state::TaskKind; use crate::tasks::SessionTask; use crate::tasks::SessionTaskContext; @@ -11,6 +8,9 @@ use async_trait::async_trait; use codex_git_utils::RestoreGhostCommitOptions; use codex_git_utils::restore_ghost_commit_with_options; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::UndoCompletedEvent; +use codex_protocol::protocol::UndoStartedEvent; use codex_protocol::user_input::UserInput; use tokio_util::sync::CancellationToken; use tracing::error; diff --git a/codex-rs/core/src/tasks/user_shell.rs b/codex-rs/core/src/tasks/user_shell.rs index 25f994c866..4d4ff383ac 100644 --- a/codex-rs/core/src/tasks/user_shell.rs +++ b/codex-rs/core/src/tasks/user_shell.rs @@ -16,20 +16,20 @@ use crate::exec::StdoutStream; use crate::exec::StreamOutput; use crate::exec::execute_exec_request; use crate::exec_env::create_env; -use crate::parse_command::parse_command; -use crate::protocol::EventMsg; -use crate::protocol::ExecCommandBeginEvent; -use crate::protocol::ExecCommandEndEvent; -use crate::protocol::ExecCommandSource; -use crate::protocol::ExecCommandStatus; -use crate::protocol::SandboxPolicy; -use crate::protocol::TurnStartedEvent; use crate::sandboxing::ExecRequest; use crate::state::TaskKind; use crate::tools::format_exec_output_str; use crate::tools::runtimes::maybe_wrap_shell_lc_with_snapshot; use crate::user_shell_command::user_shell_command_record_item; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ExecCommandBeginEvent; +use codex_protocol::protocol::ExecCommandEndEvent; +use codex_protocol::protocol::ExecCommandSource; +use codex_protocol::protocol::ExecCommandStatus; +use codex_protocol::protocol::SandboxPolicy; +use codex_protocol::protocol::TurnStartedEvent; use codex_sandboxing::SandboxType; +use codex_shell_command::parse_command::parse_command; use super::SessionTask; use super::SessionTaskContext; diff --git a/codex-rs/core/src/test_support.rs b/codex-rs/core/src/test_support.rs index 075395e3a7..d6f99a0ae7 100644 --- a/codex-rs/core/src/test_support.rs +++ b/codex-rs/core/src/test_support.rs @@ -14,8 +14,6 @@ use codex_protocol::openai_models::ModelPreset; use codex_protocol::openai_models::ModelsResponse; use once_cell::sync::Lazy; -use crate::AuthManager; -use crate::CodexAuth; use crate::ModelProviderInfo; use crate::ThreadManager; use crate::config::Config; @@ -23,6 +21,8 @@ use crate::models_manager::collaboration_mode_presets; use crate::models_manager::manager::ModelsManager; use crate::thread_manager; use crate::unified_exec; +use codex_login::AuthManager; +use codex_login::CodexAuth; static TEST_MODEL_PRESETS: Lazy> = Lazy::new(|| { let file_contents = include_str!("../models.json"); diff --git a/codex-rs/core/src/thread_manager.rs b/codex-rs/core/src/thread_manager.rs index 7f272f9595..94a81d6209 100644 --- a/codex-rs/core/src/thread_manager.rs +++ b/codex-rs/core/src/thread_manager.rs @@ -1,5 +1,3 @@ -use crate::AuthManager; -use crate::CodexAuth; use crate::ModelProviderInfo; use crate::OPENAI_PROVIDER_ID; use crate::SkillsManager; @@ -17,9 +15,6 @@ use crate::mcp::McpManager; use crate::models_manager::collaboration_mode_presets::CollaborationModesConfig; use crate::models_manager::manager::ModelsManager; use crate::plugins::PluginsManager; -use crate::protocol::Event; -use crate::protocol::EventMsg; -use crate::protocol::SessionConfiguredEvent; use crate::rollout::RolloutRecorder; use crate::rollout::truncation; use crate::shell_snapshot::ShellSnapshot; @@ -29,15 +24,20 @@ use crate::tasks::interrupted_turn_history_marker; use codex_app_server_protocol::ThreadHistoryBuilder; use codex_app_server_protocol::TurnStatus; use codex_exec_server::EnvironmentManager; +use codex_login::AuthManager; +use codex_login::CodexAuth; use codex_protocol::ThreadId; use codex_protocol::config_types::CollaborationModeMask; #[cfg(test)] use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ModelPreset; +use codex_protocol::protocol::Event; +use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::McpServerRefreshConfig; use codex_protocol::protocol::Op; use codex_protocol::protocol::RolloutItem; +use codex_protocol::protocol::SessionConfiguredEvent; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::TurnAbortReason; use codex_protocol::protocol::TurnAbortedEvent; diff --git a/codex-rs/core/src/tools/events.rs b/codex-rs/core/src/tools/events.rs index 7cf3382abd..b664235405 100644 --- a/codex-rs/core/src/tools/events.rs +++ b/codex-rs/core/src/tools/events.rs @@ -4,20 +4,20 @@ use crate::error::CodexErr; use crate::error::SandboxErr; use crate::exec::ExecToolCallOutput; use crate::function_tool::FunctionCallError; -use crate::parse_command::parse_command; -use crate::protocol::EventMsg; -use crate::protocol::ExecCommandBeginEvent; -use crate::protocol::ExecCommandEndEvent; -use crate::protocol::ExecCommandSource; -use crate::protocol::ExecCommandStatus; -use crate::protocol::FileChange; -use crate::protocol::PatchApplyBeginEvent; -use crate::protocol::PatchApplyEndEvent; -use crate::protocol::PatchApplyStatus; -use crate::protocol::TurnDiffEvent; use crate::tools::context::SharedTurnDiffTracker; use crate::tools::sandboxing::ToolError; use codex_protocol::parse_command::ParsedCommand; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ExecCommandBeginEvent; +use codex_protocol::protocol::ExecCommandEndEvent; +use codex_protocol::protocol::ExecCommandSource; +use codex_protocol::protocol::ExecCommandStatus; +use codex_protocol::protocol::FileChange; +use codex_protocol::protocol::PatchApplyBeginEvent; +use codex_protocol::protocol::PatchApplyEndEvent; +use codex_protocol::protocol::PatchApplyStatus; +use codex_protocol::protocol::TurnDiffEvent; +use codex_shell_command::parse_command::parse_command; use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; diff --git a/codex-rs/core/src/tools/handlers/js_repl.rs b/codex-rs/core/src/tools/handlers/js_repl.rs index 43b986e0d8..c5906abafc 100644 --- a/codex-rs/core/src/tools/handlers/js_repl.rs +++ b/codex-rs/core/src/tools/handlers/js_repl.rs @@ -7,7 +7,6 @@ use std::time::Instant; use crate::exec::ExecToolCallOutput; use crate::exec::StreamOutput; use crate::function_tool::FunctionCallError; -use crate::protocol::ExecCommandSource; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolInvocation; use crate::tools::context::ToolPayload; @@ -22,6 +21,7 @@ use crate::tools::registry::ToolHandler; use crate::tools::registry::ToolKind; use codex_features::Feature; use codex_protocol::models::FunctionCallOutputContentItem; +use codex_protocol::protocol::ExecCommandSource; pub struct JsReplHandler; pub struct JsReplResetHandler; diff --git a/codex-rs/core/src/tools/handlers/js_repl_tests.rs b/codex-rs/core/src/tools/handlers/js_repl_tests.rs index 51f7b3a17d..9697d7700a 100644 --- a/codex-rs/core/src/tools/handlers/js_repl_tests.rs +++ b/codex-rs/core/src/tools/handlers/js_repl_tests.rs @@ -2,8 +2,8 @@ use std::time::Duration; use super::parse_freeform_args; use crate::codex::make_session_and_context_with_rx; -use crate::protocol::EventMsg; -use crate::protocol::ExecCommandSource; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ExecCommandSource; use pretty_assertions::assert_eq; #[test] diff --git a/codex-rs/core/src/tools/handlers/mcp_resource.rs b/codex-rs/core/src/tools/handlers/mcp_resource.rs index 02253d1080..158aee612b 100644 --- a/codex-rs/core/src/tools/handlers/mcp_resource.rs +++ b/codex-rs/core/src/tools/handlers/mcp_resource.rs @@ -21,15 +21,15 @@ use serde_json::Value; use crate::codex::Session; use crate::codex::TurnContext; use crate::function_tool::FunctionCallError; -use crate::protocol::EventMsg; -use crate::protocol::McpInvocation; -use crate::protocol::McpToolCallBeginEvent; -use crate::protocol::McpToolCallEndEvent; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolInvocation; use crate::tools::context::ToolPayload; use crate::tools::registry::ToolHandler; use crate::tools::registry::ToolKind; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::McpInvocation; +use codex_protocol::protocol::McpToolCallBeginEvent; +use codex_protocol::protocol::McpToolCallEndEvent; pub struct McpResourceHandler; diff --git a/codex-rs/core/src/tools/handlers/multi_agents_tests.rs b/codex-rs/core/src/tools/handlers/multi_agents_tests.rs index c971346d75..bb94085876 100644 --- a/codex-rs/core/src/tools/handlers/multi_agents_tests.rs +++ b/codex-rs/core/src/tools/handlers/multi_agents_tests.rs @@ -1,24 +1,10 @@ use super::*; -use crate::AuthManager; -use crate::CodexAuth; use crate::ThreadManager; use crate::built_in_model_providers; use crate::codex::make_session_and_context; use crate::config::DEFAULT_AGENT_MAX_DEPTH; use crate::config::types::ShellEnvironmentPolicy; use crate::function_tool::FunctionCallError; -use crate::protocol::AgentStatus; -use crate::protocol::AskForApproval; -use crate::protocol::EventMsg; -use crate::protocol::FileSystemSandboxPolicy; -use crate::protocol::NetworkSandboxPolicy; -use crate::protocol::Op; -use crate::protocol::SandboxPolicy; -use crate::protocol::SessionSource; -use crate::protocol::SubAgentSource; -use crate::protocol::TurnAbortReason; -use crate::protocol::TurnAbortedEvent; -use crate::protocol::TurnCompleteEvent; use crate::session_prefix::format_subagent_notification_message; use crate::state::TaskKind; use crate::tasks::SessionTask; @@ -32,6 +18,8 @@ use crate::tools::handlers::multi_agents_v2::SpawnAgentHandler as SpawnAgentHand use crate::tools::handlers::multi_agents_v2::WaitAgentHandler as WaitAgentHandlerV2; use crate::turn_diff_tracker::TurnDiffTracker; use codex_features::Feature; +use codex_login::AuthManager; +use codex_login::CodexAuth; use codex_protocol::AgentPath; use codex_protocol::ThreadId; use codex_protocol::models::BaseInstructions; @@ -39,9 +27,21 @@ use codex_protocol::models::ContentItem; use codex_protocol::models::FunctionCallOutputBody; use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::AgentStatus; +use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::FileSystemSandboxPolicy; use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::InterAgentCommunication; +use codex_protocol::protocol::NetworkSandboxPolicy; +use codex_protocol::protocol::Op; use codex_protocol::protocol::RolloutItem; +use codex_protocol::protocol::SandboxPolicy; +use codex_protocol::protocol::SessionSource; +use codex_protocol::protocol::SubAgentSource; +use codex_protocol::protocol::TurnAbortReason; +use codex_protocol::protocol::TurnAbortedEvent; +use codex_protocol::protocol::TurnCompleteEvent; use codex_protocol::user_input::UserInput; use core_test_support::TempDirExt; use pretty_assertions::assert_eq; diff --git a/codex-rs/core/src/tools/handlers/shell.rs b/codex-rs/core/src/tools/handlers/shell.rs index 5191b893e2..34cdd5b976 100644 --- a/codex-rs/core/src/tools/handlers/shell.rs +++ b/codex-rs/core/src/tools/handlers/shell.rs @@ -11,9 +11,7 @@ use crate::exec::ExecParams; use crate::exec_env::create_env; use crate::exec_policy::ExecApprovalRequest; use crate::function_tool::FunctionCallError; -use crate::is_safe_command::is_known_safe_command; use crate::maybe_emit_implicit_skill_invocation; -use crate::protocol::ExecCommandSource; use crate::shell::Shell; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolInvocation; @@ -39,6 +37,8 @@ use crate::tools::runtimes::shell::ShellRuntimeBackend; use crate::tools::sandboxing::ToolCtx; use codex_features::Feature; use codex_protocol::models::PermissionProfile; +use codex_protocol::protocol::ExecCommandSource; +use codex_shell_command::is_safe_command::is_known_safe_command; use codex_tools::ShellCommandBackendConfig; pub struct ShellHandler; diff --git a/codex-rs/core/src/tools/handlers/shell_tests.rs b/codex-rs/core/src/tools/handlers/shell_tests.rs index 68b92dcf92..fee47c2147 100644 --- a/codex-rs/core/src/tools/handlers/shell_tests.rs +++ b/codex-rs/core/src/tools/handlers/shell_tests.rs @@ -6,9 +6,6 @@ use pretty_assertions::assert_eq; use crate::codex::make_session_and_context; use crate::exec_env::create_env; -use crate::is_safe_command::is_known_safe_command; -use crate::powershell::try_find_powershell_executable_blocking; -use crate::powershell::try_find_pwsh_executable_blocking; use crate::sandboxing::SandboxPermissions; use crate::shell::Shell; use crate::shell::ShellType; @@ -20,6 +17,9 @@ use crate::tools::handlers::ShellCommandHandler; use crate::tools::handlers::ShellHandler; use crate::tools::registry::ToolHandler; use crate::turn_diff_tracker::TurnDiffTracker; +use codex_shell_command::is_safe_command::is_known_safe_command; +use codex_shell_command::powershell::try_find_powershell_executable_blocking; +use codex_shell_command::powershell::try_find_pwsh_executable_blocking; use serde_json::json; use tokio::sync::Mutex; use tokio::sync::watch; diff --git a/codex-rs/core/src/tools/handlers/tool_search.rs b/codex-rs/core/src/tools/handlers/tool_search.rs index dac79a257f..aa9d8e92f1 100644 --- a/codex-rs/core/src/tools/handlers/tool_search.rs +++ b/codex-rs/core/src/tools/handlers/tool_search.rs @@ -1,5 +1,4 @@ use crate::function_tool::FunctionCallError; -use crate::mcp_connection_manager::ToolInfo; use crate::tools::context::ToolInvocation; use crate::tools::context::ToolPayload; use crate::tools::context::ToolSearchOutput; @@ -9,6 +8,7 @@ use async_trait::async_trait; use bm25::Document; use bm25::Language; use bm25::SearchEngineBuilder; +use codex_mcp::mcp_connection_manager::ToolInfo; use codex_tools::TOOL_SEARCH_DEFAULT_LIMIT; use codex_tools::TOOL_SEARCH_TOOL_NAME; use codex_tools::ToolSearchResultSource; diff --git a/codex-rs/core/src/tools/handlers/tool_suggest.rs b/codex-rs/core/src/tools/handlers/tool_suggest.rs index 440f8d58bb..45c77a350c 100644 --- a/codex-rs/core/src/tools/handlers/tool_suggest.rs +++ b/codex-rs/core/src/tools/handlers/tool_suggest.rs @@ -160,7 +160,7 @@ async fn verify_tool_suggestion_completed( session: &crate::codex::Session, turn: &crate::codex::TurnContext, tool: &DiscoverableTool, - auth: Option<&crate::CodexAuth>, + auth: Option<&codex_login::CodexAuth>, ) -> bool { match tool { DiscoverableTool::Connector(connector) => refresh_missing_suggested_connectors( @@ -198,7 +198,7 @@ async fn verify_tool_suggestion_completed( async fn refresh_missing_suggested_connectors( session: &crate::codex::Session, turn: &crate::codex::TurnContext, - auth: Option<&crate::CodexAuth>, + auth: Option<&codex_login::CodexAuth>, expected_connector_ids: &[String], tool_id: &str, ) -> Option> { diff --git a/codex-rs/core/src/tools/handlers/unified_exec.rs b/codex-rs/core/src/tools/handlers/unified_exec.rs index 1b0e393c6b..98d7d717fc 100644 --- a/codex-rs/core/src/tools/handlers/unified_exec.rs +++ b/codex-rs/core/src/tools/handlers/unified_exec.rs @@ -1,8 +1,5 @@ use crate::function_tool::FunctionCallError; -use crate::is_safe_command::is_known_safe_command; use crate::maybe_emit_implicit_skill_invocation; -use crate::protocol::EventMsg; -use crate::protocol::TerminalInteractionEvent; use crate::sandboxing::SandboxPermissions; use crate::shell::Shell; use crate::shell::get_shell_by_model_provided_path; @@ -30,6 +27,9 @@ use codex_features::Feature; use codex_otel::SessionTelemetry; use codex_otel::metrics::names::TOOL_CALL_UNIFIED_EXEC_METRIC; use codex_protocol::models::PermissionProfile; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::TerminalInteractionEvent; +use codex_shell_command::is_safe_command::is_known_safe_command; use codex_tools::UnifiedExecShellMode; use serde::Deserialize; use std::path::PathBuf; diff --git a/codex-rs/core/src/tools/handlers/view_image.rs b/codex-rs/core/src/tools/handlers/view_image.rs index f4015a7624..e87638bba6 100644 --- a/codex-rs/core/src/tools/handlers/view_image.rs +++ b/codex-rs/core/src/tools/handlers/view_image.rs @@ -12,14 +12,14 @@ use serde::Deserialize; use crate::function_tool::FunctionCallError; use crate::original_image_detail::can_request_original_image_detail; -use crate::protocol::EventMsg; -use crate::protocol::ViewImageToolCallEvent; use crate::tools::context::ToolInvocation; use crate::tools::context::ToolOutput; use crate::tools::context::ToolPayload; use crate::tools::handlers::parse_arguments; use crate::tools::registry::ToolHandler; use crate::tools::registry::ToolKind; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ViewImageToolCallEvent; pub struct ViewImageHandler; diff --git a/codex-rs/core/src/tools/js_repl/mod_tests.rs b/codex-rs/core/src/tools/js_repl/mod_tests.rs index 242fe9140b..bbc0f50dcd 100644 --- a/codex-rs/core/src/tools/js_repl/mod_tests.rs +++ b/codex-rs/core/src/tools/js_repl/mod_tests.rs @@ -1,9 +1,6 @@ use super::*; use crate::codex::make_session_and_context; use crate::codex::make_session_and_context_with_dynamic_tools_and_rx; -use crate::protocol::AskForApproval; -use crate::protocol::EventMsg; -use crate::protocol::SandboxPolicy; use crate::turn_diff_tracker::TurnDiffTracker; use codex_features::Feature; use codex_protocol::dynamic_tools::DynamicToolCallOutputContentItem; @@ -14,6 +11,11 @@ use codex_protocol::models::FunctionCallOutputPayload; use codex_protocol::models::ImageDetail; use codex_protocol::models::ResponseInputItem; use codex_protocol::openai_models::InputModality; +use codex_protocol::permissions::FileSystemSandboxPolicy; +use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::SandboxPolicy; use core_test_support::PathBufExt; use core_test_support::TempDirExt; use pretty_assertions::assert_eq; @@ -25,10 +27,8 @@ fn set_danger_full_access(turn: &mut crate::codex::TurnContext) { turn.sandbox_policy .set(SandboxPolicy::DangerFullAccess) .expect("test setup should allow updating sandbox policy"); - turn.file_system_sandbox_policy = - crate::protocol::FileSystemSandboxPolicy::from(turn.sandbox_policy.get()); - turn.network_sandbox_policy = - crate::protocol::NetworkSandboxPolicy::from(turn.sandbox_policy.get()); + turn.file_system_sandbox_policy = FileSystemSandboxPolicy::from(turn.sandbox_policy.get()); + turn.network_sandbox_policy = NetworkSandboxPolicy::from(turn.sandbox_policy.get()); } #[test] diff --git a/codex-rs/core/src/tools/registry.rs b/codex-rs/core/src/tools/registry.rs index 6cacfd27ac..f1ebb38c06 100644 --- a/codex-rs/core/src/tools/registry.rs +++ b/codex-rs/core/src/tools/registry.rs @@ -8,7 +8,6 @@ use crate::hook_runtime::record_additional_contexts; use crate::hook_runtime::run_post_tool_use_hooks; use crate::hook_runtime::run_pre_tool_use_hooks; use crate::memories::usage::emit_metric_for_tool_read; -use crate::protocol::SandboxPolicy; use crate::sandbox_tags::sandbox_tag; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolInvocation; @@ -23,6 +22,7 @@ use codex_hooks::HookToolInput; use codex_hooks::HookToolInputLocalShell; use codex_hooks::HookToolKind; use codex_protocol::models::ResponseInputItem; +use codex_protocol::protocol::SandboxPolicy; use codex_tools::ConfiguredToolSpec; use codex_tools::ToolSpec; use codex_utils_readiness::Readiness; diff --git a/codex-rs/core/src/tools/router.rs b/codex-rs/core/src/tools/router.rs index 1fe1005138..4fd64715bb 100644 --- a/codex-rs/core/src/tools/router.rs +++ b/codex-rs/core/src/tools/router.rs @@ -1,7 +1,6 @@ use crate::codex::Session; use crate::codex::TurnContext; use crate::function_tool::FunctionCallError; -use crate::mcp_connection_manager::ToolInfo; use crate::sandboxing::SandboxPermissions; use crate::tools::context::SharedTurnDiffTracker; use crate::tools::context::ToolInvocation; @@ -9,6 +8,7 @@ use crate::tools::context::ToolPayload; use crate::tools::registry::AnyToolResult; use crate::tools::registry::ToolRegistry; use crate::tools::spec::build_specs_with_discoverable_tools; +use codex_mcp::mcp_connection_manager::ToolInfo; use codex_protocol::dynamic_tools::DynamicToolSpec; use codex_protocol::models::LocalShellAction; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/core/src/tools/runtimes/shell.rs b/codex-rs/core/src/tools/runtimes/shell.rs index 3916a86301..27645ccb74 100644 --- a/codex-rs/core/src/tools/runtimes/shell.rs +++ b/codex-rs/core/src/tools/runtimes/shell.rs @@ -14,7 +14,6 @@ use crate::exec::ExecToolCallOutput; use crate::guardian::GuardianApprovalRequest; use crate::guardian::review_approval_request; use crate::guardian::routes_approval_to_guardian; -use crate::powershell::prefix_powershell_script_with_utf8; use crate::sandboxing::ExecOptions; use crate::sandboxing::SandboxPermissions; use crate::sandboxing::execute_env; @@ -38,6 +37,7 @@ use codex_network_proxy::NetworkProxy; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::ReviewDecision; use codex_sandboxing::SandboxablePreference; +use codex_shell_command::powershell::prefix_powershell_script_with_utf8; use futures::future::BoxFuture; use std::collections::HashMap; use std::path::PathBuf; diff --git a/codex-rs/core/src/tools/runtimes/shell/unix_escalation_tests.rs b/codex-rs/core/src/tools/runtimes/shell/unix_escalation_tests.rs index 226f7f0540..f11050f72b 100644 --- a/codex-rs/core/src/tools/runtimes/shell/unix_escalation_tests.rs +++ b/codex-rs/core/src/tools/runtimes/shell/unix_escalation_tests.rs @@ -6,10 +6,6 @@ use super::evaluate_intercepted_exec_policy; use super::extract_shell_script; use super::join_program_and_argv; use super::map_exec_result; -use crate::protocol::AskForApproval; -use crate::protocol::GranularApprovalConfig; -use crate::protocol::ReadOnlyAccess; -use crate::protocol::SandboxPolicy; use crate::sandboxing::SandboxPermissions; use codex_execpolicy::Decision; use codex_execpolicy::Evaluation; @@ -23,6 +19,10 @@ use codex_protocol::permissions::FileSystemSandboxEntry; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::FileSystemSpecialPath; use codex_protocol::permissions::NetworkSandboxPolicy; +use codex_protocol::protocol::AskForApproval; +use codex_protocol::protocol::GranularApprovalConfig; +use codex_protocol::protocol::ReadOnlyAccess; +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::SandboxType; use codex_shell_escalation::EscalationExecution; use codex_shell_escalation::EscalationPermissions; diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs index 4f5e970eda..bafb614ec0 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs @@ -12,7 +12,6 @@ use crate::exec::ExecExpiration; use crate::guardian::GuardianApprovalRequest; use crate::guardian::review_approval_request; use crate::guardian::routes_approval_to_guardian; -use crate::powershell::prefix_powershell_script_with_utf8; use crate::sandboxing::ExecOptions; use crate::sandboxing::SandboxPermissions; use crate::shell::ShellType; @@ -40,6 +39,7 @@ use codex_network_proxy::NetworkProxy; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::ReviewDecision; use codex_sandboxing::SandboxablePreference; +use codex_shell_command::powershell::prefix_powershell_script_with_utf8; use codex_tools::UnifiedExecShellMode; use futures::future::BoxFuture; use std::collections::HashMap; diff --git a/codex-rs/core/src/tools/sandboxing.rs b/codex-rs/core/src/tools/sandboxing.rs index 5b7e950192..5316501e6d 100644 --- a/codex-rs/core/src/tools/sandboxing.rs +++ b/codex-rs/core/src/tools/sandboxing.rs @@ -7,8 +7,6 @@ use crate::codex::Session; use crate::codex::TurnContext; use crate::error::CodexErr; -#[cfg(test)] -use crate::protocol::SandboxPolicy; use crate::sandboxing::ExecOptions; use crate::sandboxing::SandboxPermissions; use crate::state::SessionServices; @@ -21,6 +19,8 @@ use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::ReviewDecision; +#[cfg(test)] +use codex_protocol::protocol::SandboxPolicy; use codex_sandboxing::SandboxCommand; use codex_sandboxing::SandboxManager; use codex_sandboxing::SandboxTransformError; @@ -319,7 +319,7 @@ pub(crate) trait ToolRuntime: Approvable + Sandboxable { pub(crate) struct SandboxAttempt<'a> { pub sandbox: SandboxType, - pub policy: &'a crate::protocol::SandboxPolicy, + pub policy: &'a codex_protocol::protocol::SandboxPolicy, pub file_system_policy: &'a FileSystemSandboxPolicy, pub network_policy: NetworkSandboxPolicy, pub enforce_managed_network: bool, diff --git a/codex-rs/core/src/tools/spec.rs b/codex-rs/core/src/tools/spec.rs index 0a7ddb1aaa..1a9db07084 100644 --- a/codex-rs/core/src/tools/spec.rs +++ b/codex-rs/core/src/tools/spec.rs @@ -1,4 +1,3 @@ -use crate::mcp_connection_manager::ToolInfo; use crate::shell::Shell; use crate::shell::ShellType; use crate::tools::code_mode::PUBLIC_TOOL_NAME; @@ -10,6 +9,7 @@ use crate::tools::handlers::multi_agents_common::MIN_WAIT_TIMEOUT_MS; use crate::tools::registry::ToolRegistryBuilder; use crate::tools::registry::tool_handler_key; use codex_mcp::mcp::CODEX_APPS_MCP_SERVER_NAME; +use codex_mcp::mcp_connection_manager::ToolInfo; use codex_protocol::dynamic_tools::DynamicToolSpec; use codex_protocol::openai_models::ApplyPatchToolType; use codex_protocol::openai_models::ConfigShellToolType; diff --git a/codex-rs/core/src/turn_diff_tracker.rs b/codex-rs/core/src/turn_diff_tracker.rs index 3568c915af..2353e49e82 100644 --- a/codex-rs/core/src/turn_diff_tracker.rs +++ b/codex-rs/core/src/turn_diff_tracker.rs @@ -10,7 +10,7 @@ use anyhow::anyhow; use sha1::digest::Output; use uuid::Uuid; -use crate::protocol::FileChange; +use codex_protocol::protocol::FileChange; const ZERO_OID: &str = "0000000000000000000000000000000000000000"; const DEV_NULL: &str = "/dev/null"; diff --git a/codex-rs/core/src/unified_exec/async_watcher.rs b/codex-rs/core/src/unified_exec/async_watcher.rs index eee6e869e4..45cbc0d670 100644 --- a/codex-rs/core/src/unified_exec/async_watcher.rs +++ b/codex-rs/core/src/unified_exec/async_watcher.rs @@ -14,15 +14,15 @@ use crate::codex::TurnContext; use crate::exec::ExecToolCallOutput; use crate::exec::MAX_EXEC_OUTPUT_DELTAS_PER_CALL; use crate::exec::StreamOutput; -use crate::protocol::EventMsg; -use crate::protocol::ExecCommandOutputDeltaEvent; -use crate::protocol::ExecCommandSource; -use crate::protocol::ExecOutputStream; use crate::tools::events::ToolEmitter; use crate::tools::events::ToolEventCtx; use crate::tools::events::ToolEventFailure; use crate::tools::events::ToolEventStage; use crate::unified_exec::head_tail_buffer::HeadTailBuffer; +use codex_protocol::protocol::EventMsg; +use codex_protocol::protocol::ExecCommandOutputDeltaEvent; +use codex_protocol::protocol::ExecCommandSource; +use codex_protocol::protocol::ExecOutputStream; pub(crate) const TRAILING_OUTPUT_GRACE: Duration = Duration::from_millis(100); diff --git a/codex-rs/core/src/unified_exec/process_manager.rs b/codex-rs/core/src/unified_exec/process_manager.rs index 2d992507bd..a3465f7d63 100644 --- a/codex-rs/core/src/unified_exec/process_manager.rs +++ b/codex-rs/core/src/unified_exec/process_manager.rs @@ -14,7 +14,6 @@ use tokio_util::sync::CancellationToken; use crate::exec_env::create_env; use crate::exec_policy::ExecApprovalRequest; -use crate::protocol::ExecCommandSource; use crate::sandboxing::ExecRequest; use crate::tools::context::ExecCommandToolOutput; use crate::tools::events::ToolEmitter; @@ -49,6 +48,7 @@ use crate::unified_exec::process::OutputBuffer; use crate::unified_exec::process::OutputHandles; use crate::unified_exec::process::SpawnLifecycleHandle; use crate::unified_exec::process::UnifiedExecProcess; +use codex_protocol::protocol::ExecCommandSource; use codex_utils_output_truncation::approx_token_count; const UNIFIED_EXEC_ENV: [(&str, &str); 10] = [ diff --git a/codex-rs/core/src/util.rs b/codex-rs/core/src/util.rs index 04d973c86b..0856b16892 100644 --- a/codex-rs/core/src/util.rs +++ b/codex-rs/core/src/util.rs @@ -7,7 +7,7 @@ use rand::Rng; use tracing::error; use crate::auth_env_telemetry::AuthEnvTelemetry; -use crate::parse_command::shlex_join; +use codex_shell_command::parse_command::shlex_join; const INITIAL_DELAY_MS: u64 = 200; const BACKOFF_FACTOR: f64 = 2.0; diff --git a/codex-rs/core/src/windows_sandbox.rs b/codex-rs/core/src/windows_sandbox.rs index ee3a040a69..391c59d250 100644 --- a/codex-rs/core/src/windows_sandbox.rs +++ b/codex-rs/core/src/windows_sandbox.rs @@ -3,13 +3,13 @@ use crate::config::ConfigToml; use crate::config::edit::ConfigEditsBuilder; use crate::config::profile::ConfigProfile; use crate::config::types::WindowsSandboxModeToml; -use crate::default_client::originator; -use crate::protocol::SandboxPolicy; use codex_features::Feature; use codex_features::Features; use codex_features::FeaturesToml; +use codex_login::default_client::originator; use codex_otel::sanitize_metric_tag_value; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::protocol::SandboxPolicy; use std::collections::BTreeMap; use std::collections::HashMap; use std::path::Path; diff --git a/codex-rs/core/src/windows_sandbox_read_grants.rs b/codex-rs/core/src/windows_sandbox_read_grants.rs index ec08e55cfd..b0891ec6a6 100644 --- a/codex-rs/core/src/windows_sandbox_read_grants.rs +++ b/codex-rs/core/src/windows_sandbox_read_grants.rs @@ -1,6 +1,6 @@ -use crate::protocol::SandboxPolicy; use crate::windows_sandbox::run_setup_refresh_with_extra_read_roots; use anyhow::Result; +use codex_protocol::protocol::SandboxPolicy; use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; diff --git a/codex-rs/core/src/windows_sandbox_read_grants_tests.rs b/codex-rs/core/src/windows_sandbox_read_grants_tests.rs index c23920264b..bffa840ede 100644 --- a/codex-rs/core/src/windows_sandbox_read_grants_tests.rs +++ b/codex-rs/core/src/windows_sandbox_read_grants_tests.rs @@ -1,5 +1,5 @@ use super::grant_read_root_non_elevated; -use crate::protocol::SandboxPolicy; +use codex_protocol::protocol::SandboxPolicy; use std::collections::HashMap; use std::path::Path; use tempfile::TempDir; diff --git a/codex-rs/core/tests/common/Cargo.toml b/codex-rs/core/tests/common/Cargo.toml index 0fcf812815..2611aa5d22 100644 --- a/codex-rs/core/tests/common/Cargo.toml +++ b/codex-rs/core/tests/common/Cargo.toml @@ -18,6 +18,7 @@ codex-arg0 = { workspace = true } codex-core = { workspace = true } codex-exec-server = { workspace = true } codex-features = { workspace = true } +codex-login = { workspace = true } codex-protocol = { workspace = true } codex-utils-absolute-path = { workspace = true } codex-utils-cargo-bin = { workspace = true } diff --git a/codex-rs/core/tests/common/test_codex.rs b/codex-rs/core/tests/common/test_codex.rs index 3b910838bc..a347488c2d 100644 --- a/codex-rs/core/tests/common/test_codex.rs +++ b/codex-rs/core/tests/common/test_codex.rs @@ -11,7 +11,6 @@ use std::time::Instant; use anyhow::Context; use anyhow::Result; use anyhow::anyhow; -use codex_core::CodexAuth; use codex_core::CodexThread; use codex_core::ModelProviderInfo; use codex_core::ThreadManager; @@ -23,6 +22,7 @@ use codex_core::shell::get_shell_by_model_provided_path; use codex_exec_server::CreateDirectoryOptions; use codex_exec_server::ExecutorFileSystem; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::config_types::ServiceTier; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; diff --git a/codex-rs/core/tests/common/test_codex_exec.rs b/codex-rs/core/tests/common/test_codex_exec.rs index 6815692869..5fe47018a6 100644 --- a/codex-rs/core/tests/common/test_codex_exec.rs +++ b/codex-rs/core/tests/common/test_codex_exec.rs @@ -1,5 +1,5 @@ #![allow(clippy::expect_used)] -use codex_core::auth::CODEX_API_KEY_ENV_VAR; +use codex_login::CODEX_API_KEY_ENV_VAR; use std::path::Path; use tempfile::TempDir; use wiremock::MockServer; diff --git a/codex-rs/core/tests/responses_headers.rs b/codex-rs/core/tests/responses_headers.rs index 536e985d19..8bed61458d 100644 --- a/codex-rs/core/tests/responses_headers.rs +++ b/codex-rs/core/tests/responses_headers.rs @@ -1,12 +1,12 @@ use std::process::Command; use std::sync::Arc; -use codex_core::CodexAuth; use codex_core::ModelClient; use codex_core::ModelProviderInfo; use codex_core::Prompt; use codex_core::ResponseEvent; use codex_core::WireApi; +use codex_login::CodexAuth; use codex_otel::SessionTelemetry; use codex_otel::TelemetryAuthMode; use codex_protocol::ThreadId; diff --git a/codex-rs/core/tests/suite/auth_refresh.rs b/codex-rs/core/tests/suite/auth_refresh.rs index bdac334a66..b4249ea96d 100644 --- a/codex-rs/core/tests/suite/auth_refresh.rs +++ b/codex-rs/core/tests/suite/auth_refresh.rs @@ -4,14 +4,14 @@ use base64::Engine; use chrono::Duration; use chrono::Utc; use codex_app_server_protocol::AuthMode; -use codex_core::AuthManager; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::AuthDotJson; -use codex_core::auth::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; -use codex_core::auth::RefreshTokenError; -use codex_core::auth::load_auth_dot_json; -use codex_core::auth::save_auth; use codex_core::error::RefreshTokenFailedReason; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthDotJson; +use codex_login::AuthManager; +use codex_login::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; +use codex_login::RefreshTokenError; +use codex_login::load_auth_dot_json; +use codex_login::save_auth; use codex_login::token_data::IdTokenInfo; use codex_login::token_data::TokenData; use core_test_support::skip_if_no_network; diff --git a/codex-rs/core/tests/suite/cli_stream.rs b/codex-rs/core/tests/suite/cli_stream.rs index cc8a0103aa..85cde5b222 100644 --- a/codex-rs/core/tests/suite/cli_stream.rs +++ b/codex-rs/core/tests/suite/cli_stream.rs @@ -1,6 +1,6 @@ use assert_cmd::Command as AssertCommand; -use codex_core::auth::CODEX_API_KEY_ENV_VAR; use codex_git_utils::collect_git_info; +use codex_login::CODEX_API_KEY_ENV_VAR; use codex_protocol::protocol::GitInfo; use codex_utils_cargo_bin::find_resource; use core_test_support::fs_wait; diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 37a9d838fd..231ab1a5dc 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -1,24 +1,24 @@ -use codex_core::AuthManager; -use codex_core::CodexAuth; use codex_core::ModelClient; -use codex_core::ModelProviderAuthInfo; use codex_core::ModelProviderInfo; use codex_core::NewThread; use codex_core::Prompt; use codex_core::ResponseEvent; use codex_core::ThreadManager; use codex_core::WireApi; -use codex_core::auth::AuthCredentialsStoreMode; use codex_core::built_in_model_providers; -use codex_core::default_client::originator; use codex_core::error::CodexErr; use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_features::Feature; +use codex_login::AuthCredentialsStoreMode; +use codex_login::AuthManager; +use codex_login::CodexAuth; +use codex_login::default_client::originator; use codex_otel::SessionTelemetry; use codex_otel::TelemetryAuthMode; use codex_protocol::ThreadId; use codex_protocol::config_types::CollaborationMode; use codex_protocol::config_types::ModeKind; +use codex_protocol::config_types::ModelProviderAuthInfo; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::config_types::Settings; use codex_protocol::config_types::Verbosity; diff --git a/codex-rs/core/tests/suite/client_websockets.rs b/codex-rs/core/tests/suite/client_websockets.rs index 836399f0c4..f863ea0b6d 100755 --- a/codex-rs/core/tests/suite/client_websockets.rs +++ b/codex-rs/core/tests/suite/client_websockets.rs @@ -1,7 +1,6 @@ #![allow(clippy::expect_used, clippy::unwrap_used)] use codex_api::WS_REQUEST_HEADER_TRACEPARENT_CLIENT_METADATA_KEY; use codex_api::WS_REQUEST_HEADER_TRACESTATE_CLIENT_METADATA_KEY; -use codex_core::CodexAuth; use codex_core::ModelClient; use codex_core::ModelClientSession; use codex_core::ModelProviderInfo; @@ -10,6 +9,7 @@ use codex_core::ResponseEvent; use codex_core::WireApi; use codex_core::X_RESPONSESAPI_INCLUDE_TIMING_METRICS_HEADER; use codex_features::Feature; +use codex_login::CodexAuth; use codex_otel::SessionTelemetry; use codex_otel::TelemetryAuthMode; use codex_otel::current_span_w3c_trace_context; diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index 8be8c72da5..35fe9d07e7 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -1,11 +1,11 @@ #![allow(clippy::expect_used)] -use codex_core::CodexAuth; use codex_core::ModelProviderInfo; use codex_core::built_in_model_providers; use codex_core::compact::SUMMARIZATION_PROMPT; use codex_core::compact::SUMMARY_PREFIX; use codex_core::config::Config; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::items::TurnItem; use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelsResponse; diff --git a/codex-rs/core/tests/suite/compact_remote.rs b/codex-rs/core/tests/suite/compact_remote.rs index 3ab92e7734..0069c5fb86 100644 --- a/codex-rs/core/tests/suite/compact_remote.rs +++ b/codex-rs/core/tests/suite/compact_remote.rs @@ -4,8 +4,8 @@ use std::fs; use std::path::PathBuf; use anyhow::Result; -use codex_core::CodexAuth; use codex_core::compact::SUMMARY_PREFIX; +use codex_login::CodexAuth; use codex_protocol::items::TurnItem; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/core/tests/suite/compact_resume_fork.rs b/codex-rs/core/tests/suite/compact_resume_fork.rs index 3fd0dab047..d47ed7c94c 100644 --- a/codex-rs/core/tests/suite/compact_resume_fork.rs +++ b/codex-rs/core/tests/suite/compact_resume_fork.rs @@ -843,7 +843,7 @@ async fn resume_conversation( path: std::path::PathBuf, ) -> Arc { let auth_manager = codex_core::test_support::auth_manager_from_auth( - codex_core::CodexAuth::from_api_key("dummy"), + codex_login::CodexAuth::from_api_key("dummy"), ); Box::pin(manager.resume_thread_from_rollout( config.clone(), diff --git a/codex-rs/core/tests/suite/model_info_overrides.rs b/codex-rs/core/tests/suite/model_info_overrides.rs index fc1cbac765..52656affec 100644 --- a/codex-rs/core/tests/suite/model_info_overrides.rs +++ b/codex-rs/core/tests/suite/model_info_overrides.rs @@ -1,6 +1,6 @@ -use codex_core::CodexAuth; use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_core::models_manager::manager::ModelsManager; +use codex_login::CodexAuth; use codex_protocol::openai_models::TruncationPolicyConfig; use core_test_support::load_default_config_for_test; use pretty_assertions::assert_eq; diff --git a/codex-rs/core/tests/suite/model_switching.rs b/codex-rs/core/tests/suite/model_switching.rs index 808b04191d..de88455484 100644 --- a/codex-rs/core/tests/suite/model_switching.rs +++ b/codex-rs/core/tests/suite/model_switching.rs @@ -1,8 +1,8 @@ use anyhow::Result; -use codex_core::CodexAuth; use codex_core::config::types::Personality; use codex_core::models_manager::manager::RefreshStrategy; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::config_types::ServiceTier; use codex_protocol::openai_models::ConfigShellToolType; diff --git a/codex-rs/core/tests/suite/models_cache_ttl.rs b/codex-rs/core/tests/suite/models_cache_ttl.rs index 7d0ce8046d..0e043bd9f6 100644 --- a/codex-rs/core/tests/suite/models_cache_ttl.rs +++ b/codex-rs/core/tests/suite/models_cache_ttl.rs @@ -5,8 +5,8 @@ use anyhow::Result; use chrono::DateTime; use chrono::TimeZone; use chrono::Utc; -use codex_core::CodexAuth; use codex_core::models_manager::manager::RefreshStrategy; +use codex_login::CodexAuth; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ModelInfo; diff --git a/codex-rs/core/tests/suite/models_etag_responses.rs b/codex-rs/core/tests/suite/models_etag_responses.rs index 272c820caf..daf3e89462 100644 --- a/codex-rs/core/tests/suite/models_etag_responses.rs +++ b/codex-rs/core/tests/suite/models_etag_responses.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use anyhow::Result; -use codex_core::CodexAuth; +use codex_login::CodexAuth; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; diff --git a/codex-rs/core/tests/suite/personality.rs b/codex-rs/core/tests/suite/personality.rs index cc68c57156..a51a398264 100644 --- a/codex-rs/core/tests/suite/personality.rs +++ b/codex-rs/core/tests/suite/personality.rs @@ -684,7 +684,7 @@ async fn remote_model_friendly_personality_instructions_with_feature() -> anyhow let resp_mock = mount_sse_once(&server, sse_completed("resp-1")).await; let mut builder = test_codex() - .with_auth(codex_core::CodexAuth::create_dummy_chatgpt_auth_for_testing()) + .with_auth(codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing()) .with_config(|config| { config .features @@ -804,7 +804,7 @@ async fn user_turn_personality_remote_model_template_includes_update_message() - .await; let mut builder = test_codex() - .with_auth(codex_core::CodexAuth::create_dummy_chatgpt_auth_for_testing()) + .with_auth(codex_login::CodexAuth::create_dummy_chatgpt_auth_for_testing()) .with_config(|config| { config .features diff --git a/codex-rs/core/tests/suite/plugins.rs b/codex-rs/core/tests/suite/plugins.rs index 5448e49161..cd0ad330ae 100644 --- a/codex-rs/core/tests/suite/plugins.rs +++ b/codex-rs/core/tests/suite/plugins.rs @@ -6,8 +6,8 @@ use std::time::Duration; use std::time::Instant; use anyhow::Result; -use codex_core::CodexAuth; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; use core_test_support::apps_test_server::AppsTestServer; @@ -400,7 +400,7 @@ async fn explicit_plugin_mentions_track_plugin_used_analytics() -> Result<()> { ); assert_eq!( event["event_params"]["product_client_id"], - serde_json::json!(codex_core::default_client::originator().value) + serde_json::json!(codex_login::default_client::originator().value) ); assert_eq!(event["event_params"]["model_slug"], "gpt-5"); assert!(event["event_params"]["thread_id"].as_str().is_some()); diff --git a/codex-rs/core/tests/suite/realtime_conversation.rs b/codex-rs/core/tests/suite/realtime_conversation.rs index 415d764e4e..b169e229a5 100644 --- a/codex-rs/core/tests/suite/realtime_conversation.rs +++ b/codex-rs/core/tests/suite/realtime_conversation.rs @@ -1,8 +1,8 @@ use anyhow::Context; use anyhow::Result; use chrono::Utc; -use codex_core::CodexAuth; -use codex_core::auth::OPENAI_API_KEY_ENV_VAR; +use codex_login::CodexAuth; +use codex_login::OPENAI_API_KEY_ENV_VAR; use codex_protocol::ThreadId; use codex_protocol::protocol::CodexErrorInfo; use codex_protocol::protocol::ConversationAudioParams; diff --git a/codex-rs/core/tests/suite/remote_models.rs b/codex-rs/core/tests/suite/remote_models.rs index 6b2da1116b..c0776e1ea7 100644 --- a/codex-rs/core/tests/suite/remote_models.rs +++ b/codex-rs/core/tests/suite/remote_models.rs @@ -4,11 +4,11 @@ use std::sync::Arc; use anyhow::Result; -use codex_core::CodexAuth; use codex_core::ModelProviderInfo; use codex_core::built_in_model_providers; use codex_core::models_manager::manager::ModelsManager; use codex_core::models_manager::manager::RefreshStrategy; +use codex_login::CodexAuth; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ModelInfo; diff --git a/codex-rs/core/tests/suite/request_compression.rs b/codex-rs/core/tests/suite/request_compression.rs index dd42499288..fb0125e66e 100644 --- a/codex-rs/core/tests/suite/request_compression.rs +++ b/codex-rs/core/tests/suite/request_compression.rs @@ -1,7 +1,7 @@ #![cfg(not(target_os = "windows"))] -use codex_core::CodexAuth; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/core/tests/suite/resume_warning.rs b/codex-rs/core/tests/suite/resume_warning.rs index f55f87e530..0252a99271 100644 --- a/codex-rs/core/tests/suite/resume_warning.rs +++ b/codex-rs/core/tests/suite/resume_warning.rs @@ -1,7 +1,7 @@ #![allow(clippy::unwrap_used, clippy::expect_used)] -use codex_core::CodexAuth; use codex_core::NewThread; +use codex_login::CodexAuth; use codex_protocol::ThreadId; use codex_protocol::config_types::ModeKind; use codex_protocol::config_types::ReasoningSummary; diff --git a/codex-rs/core/tests/suite/rmcp_client.rs b/codex-rs/core/tests/suite/rmcp_client.rs index 0335ead7e9..5b942c201a 100644 --- a/codex-rs/core/tests/suite/rmcp_client.rs +++ b/codex-rs/core/tests/suite/rmcp_client.rs @@ -9,10 +9,10 @@ use std::time::Duration; use std::time::SystemTime; use std::time::UNIX_EPOCH; -use codex_core::CodexAuth; use codex_core::config::types::McpServerConfig; use codex_core::config::types::McpServerTransportConfig; use codex_core::models_manager::manager::RefreshStrategy; +use codex_login::CodexAuth; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; diff --git a/codex-rs/core/tests/suite/search_tool.rs b/codex-rs/core/tests/suite/search_tool.rs index 423c57a8c6..a9f4c3e44a 100644 --- a/codex-rs/core/tests/suite/search_tool.rs +++ b/codex-rs/core/tests/suite/search_tool.rs @@ -2,9 +2,9 @@ #![allow(clippy::unwrap_used, clippy::expect_used)] use anyhow::Result; -use codex_core::CodexAuth; use codex_core::config::Config; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; diff --git a/codex-rs/core/tests/suite/spawn_agent_description.rs b/codex-rs/core/tests/suite/spawn_agent_description.rs index e27e3466f7..3b1cfa2002 100644 --- a/codex-rs/core/tests/suite/spawn_agent_description.rs +++ b/codex-rs/core/tests/suite/spawn_agent_description.rs @@ -2,10 +2,10 @@ #![allow(clippy::unwrap_used, clippy::expect_used)] use anyhow::Result; -use codex_core::CodexAuth; use codex_core::models_manager::manager::ModelsManager; use codex_core::models_manager::manager::RefreshStrategy; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ModelInfo; diff --git a/codex-rs/core/tests/suite/tool_suggest.rs b/codex-rs/core/tests/suite/tool_suggest.rs index 460c7366a3..09c29cb1f6 100644 --- a/codex-rs/core/tests/suite/tool_suggest.rs +++ b/codex-rs/core/tests/suite/tool_suggest.rs @@ -2,11 +2,11 @@ #![allow(clippy::unwrap_used, clippy::expect_used)] use anyhow::Result; -use codex_core::CodexAuth; use codex_core::config::Config; use codex_core::config::types::ToolSuggestDiscoverable; use codex_core::config::types::ToolSuggestDiscoverableType; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::SandboxPolicy; diff --git a/codex-rs/core/tests/suite/unstable_features_warning.rs b/codex-rs/core/tests/suite/unstable_features_warning.rs index efb154e6e1..1b18697297 100644 --- a/codex-rs/core/tests/suite/unstable_features_warning.rs +++ b/codex-rs/core/tests/suite/unstable_features_warning.rs @@ -1,9 +1,9 @@ #![allow(clippy::unwrap_used, clippy::expect_used)] use codex_config::CONFIG_TOML_FILE; -use codex_core::CodexAuth; use codex_core::NewThread; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::WarningEvent; diff --git a/codex-rs/core/tests/suite/view_image.rs b/codex-rs/core/tests/suite/view_image.rs index fab2098ca5..f16d3c2b18 100644 --- a/codex-rs/core/tests/suite/view_image.rs +++ b/codex-rs/core/tests/suite/view_image.rs @@ -2,9 +2,9 @@ use base64::Engine; use base64::engine::general_purpose::STANDARD as BASE64_STANDARD; -use codex_core::CodexAuth; use codex_exec_server::CreateDirectoryOptions; use codex_features::Feature; +use codex_login::CodexAuth; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::InputModality; diff --git a/codex-rs/exec/Cargo.toml b/codex-rs/exec/Cargo.toml index be9cf5d750..0933f4a44d 100644 --- a/codex-rs/exec/Cargo.toml +++ b/codex-rs/exec/Cargo.toml @@ -30,6 +30,7 @@ codex-cloud-requirements = { workspace = true } codex-core = { workspace = true } codex-feedback = { workspace = true } codex-git-utils = { workspace = true } +codex-login = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-utils-absolute-path = { workspace = true } diff --git a/codex-rs/exec/src/lib.rs b/codex-rs/exec/src/lib.rs index ae1285be4d..6ad3b2047b 100644 --- a/codex-rs/exec/src/lib.rs +++ b/codex-rs/exec/src/lib.rs @@ -51,8 +51,6 @@ use codex_arg0::Arg0DispatchPaths; use codex_cloud_requirements::cloud_requirements_loader_for_storage; use codex_core::LMSTUDIO_OSS_PROVIDER_ID; use codex_core::OLLAMA_OSS_PROVIDER_ID; -use codex_core::auth::AuthConfig; -use codex_core::auth::enforce_login_restrictions; use codex_core::check_execpolicy_for_warnings; use codex_core::config::Config; use codex_core::config::ConfigBuilder; @@ -67,6 +65,10 @@ use codex_core::format_exec_policy_error_with_source; use codex_core::path_utils; use codex_feedback::CodexFeedback; use codex_git_utils::get_git_repo_root; +use codex_login::AuthConfig; +use codex_login::default_client::set_default_client_residency_requirement; +use codex_login::default_client::set_default_originator; +use codex_login::enforce_login_restrictions; use codex_otel::set_parent_from_context; use codex_otel::traceparent_context_from_env; use codex_protocol::config_types::SandboxMode; @@ -105,8 +107,6 @@ use uuid::Uuid; use crate::cli::Command as ExecCommand; use crate::event_processor::CodexStatus; use crate::event_processor::EventProcessor; -use codex_core::default_client::set_default_client_residency_requirement; -use codex_core::default_client::set_default_originator; const DEFAULT_ANALYTICS_ENABLED: bool = true; diff --git a/codex-rs/exec/tests/suite/originator.rs b/codex-rs/exec/tests/suite/originator.rs index 9b57c2c92f..e63f57ab0f 100644 --- a/codex-rs/exec/tests/suite/originator.rs +++ b/codex-rs/exec/tests/suite/originator.rs @@ -1,7 +1,7 @@ #![cfg(not(target_os = "windows"))] #![allow(clippy::expect_used, clippy::unwrap_used)] -use codex_core::default_client::CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR; +use codex_login::default_client::CODEX_INTERNAL_ORIGINATOR_OVERRIDE_ENV_VAR; use core_test_support::responses; use core_test_support::test_codex_exec::test_codex_exec; use wiremock::matchers::header; diff --git a/codex-rs/mcp-server/Cargo.toml b/codex-rs/mcp-server/Cargo.toml index a7d38a0fed..5de2a9e5a3 100644 --- a/codex-rs/mcp-server/Cargo.toml +++ b/codex-rs/mcp-server/Cargo.toml @@ -21,6 +21,7 @@ codex-arg0 = { workspace = true } codex-core = { workspace = true } codex-exec-server = { workspace = true } codex-features = { workspace = true } +codex-login = { workspace = true } codex-protocol = { workspace = true } codex-shell-command = { workspace = true } codex-utils-cli = { workspace = true } diff --git a/codex-rs/mcp-server/src/message_processor.rs b/codex-rs/mcp-server/src/message_processor.rs index 1fba41164c..a41c6ddcff 100644 --- a/codex-rs/mcp-server/src/message_processor.rs +++ b/codex-rs/mcp-server/src/message_processor.rs @@ -2,14 +2,14 @@ use std::collections::HashMap; use std::sync::Arc; use codex_arg0::Arg0DispatchPaths; -use codex_core::AuthManager; use codex_core::ThreadManager; use codex_core::config::Config; -use codex_core::default_client::USER_AGENT_SUFFIX; -use codex_core::default_client::get_codex_user_agent; use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_exec_server::EnvironmentManager; use codex_features::Feature; +use codex_login::AuthManager; +use codex_login::default_client::USER_AGENT_SUFFIX; +use codex_login::default_client::get_codex_user_agent; use codex_protocol::ThreadId; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::Submission; diff --git a/codex-rs/mcp-server/tests/common/Cargo.toml b/codex-rs/mcp-server/tests/common/Cargo.toml index d19f673634..d642cca824 100644 --- a/codex-rs/mcp-server/tests/common/Cargo.toml +++ b/codex-rs/mcp-server/tests/common/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] anyhow = { workspace = true } -codex-core = { workspace = true } +codex-login = { workspace = true } codex-mcp-server = { workspace = true } codex-terminal-detection = { workspace = true } codex-utils-cargo-bin = { 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 53925ca396..f50f25f49f 100644 --- a/codex-rs/mcp-server/tests/common/mcp_process.rs +++ b/codex-rs/mcp-server/tests/common/mcp_process.rs @@ -151,7 +151,7 @@ impl McpProcess { let initialized = self.read_jsonrpc_message().await?; let os_info = os_info::get(); let build_version = env!("CARGO_PKG_VERSION"); - let originator = codex_core::default_client::originator().value; + let originator = codex_login::default_client::originator().value; let user_agent = format!( "{originator}/{build_version} ({} {}; {}) {} (elicitation test; 0.0.0)", os_info.os_type(), diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 33c2de00fd..590257609e 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -39,6 +39,7 @@ codex-git-utils = { workspace = true } codex-login = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } +codex-rollout = { workspace = true } codex-shell-command = { workspace = true } codex-state = { workspace = true } codex-terminal-detection = { workspace = true } diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 7e1a0abddc..89f5916e11 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -3550,7 +3550,7 @@ impl App { /*account_id*/ None, bootstrap.account_email.clone(), auth_mode, - codex_core::default_client::originator().value, + codex_login::default_client::originator().value, config.otel.log_user_prompt, user_agent(), SessionSource::Cli, diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 2b245428c9..3c8d068f9b 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -5191,7 +5191,7 @@ impl ChatWidget { self.request_quit_without_confirmation(); } SlashCommand::Logout => { - if let Err(e) = codex_core::auth::logout( + if let Err(e) = codex_login::logout( &self.config.codex_home, self.config.cli_auth_credentials_store_mode, ) { diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 6cf864751d..2fd9ebd12f 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -21,8 +21,6 @@ use codex_app_server_protocol::ThreadListParams; use codex_app_server_protocol::ThreadSortKey as AppServerThreadSortKey; use codex_app_server_protocol::ThreadSourceKind; use codex_cloud_requirements::cloud_requirements_loader_for_storage; -use codex_core::auth::AuthConfig; -use codex_core::auth::enforce_login_restrictions; use codex_core::check_execpolicy_for_warnings; use codex_core::config::Config; use codex_core::config::ConfigBuilder; @@ -34,12 +32,13 @@ use codex_core::config_loader::CloudRequirementsLoader; use codex_core::config_loader::ConfigLoadError; use codex_core::config_loader::LoaderOverrides; use codex_core::config_loader::format_config_error_with_source; -use codex_core::default_client::set_default_client_residency_requirement; 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::windows_sandbox::WindowsSandboxLevelExt; +use codex_login::AuthConfig; +use codex_login::default_client::set_default_client_residency_requirement; +use codex_login::enforce_login_restrictions; use codex_protocol::ThreadId; use codex_protocol::config_types::AltScreenMode; use codex_protocol::config_types::SandboxMode; @@ -48,6 +47,7 @@ use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::RolloutLine; use codex_protocol::protocol::TurnContextItem; +use codex_rollout::state_db::get_state_db; use codex_state::log_db; use codex_terminal_detection::Multiplexer; use codex_terminal_detection::terminal_info; @@ -890,7 +890,7 @@ pub async fn run_main( let otel_tracing_layer = otel.as_ref().and_then(|o| o.tracing_layer()); - let log_db_layer = codex_core::state_db::get_state_db(&config) + let log_db_layer = get_state_db(&config) .await .map(|db| log_db::start(db).with_filter(env_filter())); diff --git a/codex-rs/tui/src/local_chatgpt_auth.rs b/codex-rs/tui/src/local_chatgpt_auth.rs index b671d818e5..cb8a3a4aae 100644 --- a/codex-rs/tui/src/local_chatgpt_auth.rs +++ b/codex-rs/tui/src/local_chatgpt_auth.rs @@ -1,8 +1,8 @@ use std::path::Path; use codex_app_server_protocol::AuthMode; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::load_auth_dot_json; +use codex_login::AuthCredentialsStoreMode; +use codex_login::load_auth_dot_json; #[derive(Debug, Clone, PartialEq, Eq)] pub(crate) struct LocalChatgptAuth { @@ -58,9 +58,9 @@ mod tests { use base64::Engine; use chrono::Utc; use codex_app_server_protocol::AuthMode; - use codex_core::auth::AuthDotJson; - use codex_core::auth::save_auth; + use codex_login::AuthDotJson; use codex_login::auth::login_with_chatgpt_auth_tokens; + use codex_login::save_auth; use codex_login::token_data::TokenData; use pretty_assertions::assert_eq; use serde::Serialize; diff --git a/codex-rs/tui/src/onboarding/auth.rs b/codex-rs/tui/src/onboarding/auth.rs index e442eebb19..a5915618ca 100644 --- a/codex-rs/tui/src/onboarding/auth.rs +++ b/codex-rs/tui/src/onboarding/auth.rs @@ -8,9 +8,9 @@ use codex_app_server_protocol::CancelLoginAccountParams; use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::LoginAccountParams; use codex_app_server_protocol::LoginAccountResponse; -use codex_core::auth::AuthCredentialsStoreMode; -use codex_core::auth::read_openai_api_key_from_env; +use codex_login::AuthCredentialsStoreMode; use codex_login::DeviceCode; +use codex_login::read_openai_api_key_from_env; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; use crossterm::event::KeyEventKind; diff --git a/codex-rs/tui/src/onboarding/auth/headless_chatgpt_login.rs b/codex-rs/tui/src/onboarding/auth/headless_chatgpt_login.rs index d0834fe166..97709e9493 100644 --- a/codex-rs/tui/src/onboarding/auth/headless_chatgpt_login.rs +++ b/codex-rs/tui/src/onboarding/auth/headless_chatgpt_login.rs @@ -3,7 +3,7 @@ use codex_app_server_protocol::ClientRequest; use codex_app_server_protocol::LoginAccountParams; use codex_app_server_protocol::LoginAccountResponse; -use codex_core::auth::CLIENT_ID; +use codex_login::CLIENT_ID; use codex_login::ServerOptions; use codex_login::complete_device_code_login; use codex_login::request_device_code; diff --git a/codex-rs/tui/src/updates.rs b/codex-rs/tui/src/updates.rs index 58d025a4a1..1edd871d0b 100644 --- a/codex-rs/tui/src/updates.rs +++ b/codex-rs/tui/src/updates.rs @@ -6,7 +6,7 @@ use chrono::DateTime; use chrono::Duration; use chrono::Utc; use codex_core::config::Config; -use codex_core::default_client::create_client; +use codex_login::default_client::create_client; use serde::Deserialize; use serde::Serialize; use std::path::Path; From 8e7b90b94baa590b44cbb44ac6a8820e91babc4e Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Wed, 1 Apr 2026 23:06:43 -0700 Subject: [PATCH 3/3] Extract tool registry planning into codex-tools --- codex-rs/core/src/tools/spec.rs | 672 ++++-------------- codex-rs/core/src/tools/spec_tests.rs | 13 + codex-rs/tools/src/lib.rs | 8 + codex-rs/tools/src/tool_registry_plan.rs | 488 +++++++++++++ .../tools/src/tool_registry_plan_types.rs | 118 +++ 5 files changed, 765 insertions(+), 534 deletions(-) create mode 100644 codex-rs/tools/src/tool_registry_plan.rs create mode 100644 codex-rs/tools/src/tool_registry_plan_types.rs diff --git a/codex-rs/core/src/tools/spec.rs b/codex-rs/core/src/tools/spec.rs index 1a9db07084..a347e5f306 100644 --- a/codex-rs/core/src/tools/spec.rs +++ b/codex-rs/core/src/tools/spec.rs @@ -1,79 +1,23 @@ use crate::shell::Shell; use crate::shell::ShellType; -use crate::tools::code_mode::PUBLIC_TOOL_NAME; -use crate::tools::code_mode::WAIT_TOOL_NAME; use crate::tools::handlers::agent_jobs::BatchJobHandler; use crate::tools::handlers::multi_agents_common::DEFAULT_WAIT_TIMEOUT_MS; use crate::tools::handlers::multi_agents_common::MAX_WAIT_TIMEOUT_MS; use crate::tools::handlers::multi_agents_common::MIN_WAIT_TIMEOUT_MS; use crate::tools::registry::ToolRegistryBuilder; -use crate::tools::registry::tool_handler_key; use codex_mcp::mcp::CODEX_APPS_MCP_SERVER_NAME; use codex_mcp::mcp_connection_manager::ToolInfo; use codex_protocol::dynamic_tools::DynamicToolSpec; -use codex_protocol::openai_models::ApplyPatchToolType; -use codex_protocol::openai_models::ConfigShellToolType; -use codex_tools::CommandToolOptions; use codex_tools::DiscoverableTool; -use codex_tools::REQUEST_USER_INPUT_TOOL_NAME; -use codex_tools::ShellToolOptions; -use codex_tools::SpawnAgentToolOptions; -use codex_tools::TOOL_SEARCH_DEFAULT_LIMIT; -use codex_tools::TOOL_SEARCH_TOOL_NAME; -use codex_tools::TOOL_SUGGEST_TOOL_NAME; -use codex_tools::ToolSearchAppSource; -use codex_tools::ToolSpec; +use codex_tools::ToolHandlerKind; +use codex_tools::ToolRegistryPlanAppTool; +use codex_tools::ToolRegistryPlanParams; use codex_tools::ToolUserShellType; use codex_tools::ToolsConfig; -use codex_tools::ViewImageToolOptions; use codex_tools::WaitAgentTimeoutOptions; -use codex_tools::WebSearchToolOptions; -use codex_tools::augment_tool_spec_for_code_mode; -use codex_tools::collect_code_mode_tool_definitions; -use codex_tools::collect_tool_search_app_infos; -use codex_tools::collect_tool_suggest_entries; -use codex_tools::create_apply_patch_freeform_tool; -use codex_tools::create_apply_patch_json_tool; -use codex_tools::create_assign_task_tool; -use codex_tools::create_close_agent_tool_v1; -use codex_tools::create_close_agent_tool_v2; -use codex_tools::create_code_mode_tool; -use codex_tools::create_exec_command_tool; -use codex_tools::create_image_generation_tool; -use codex_tools::create_js_repl_reset_tool; -use codex_tools::create_js_repl_tool; -use codex_tools::create_list_agents_tool; -use codex_tools::create_list_dir_tool; -use codex_tools::create_list_mcp_resource_templates_tool; -use codex_tools::create_list_mcp_resources_tool; -use codex_tools::create_local_shell_tool; -use codex_tools::create_read_mcp_resource_tool; -use codex_tools::create_report_agent_job_result_tool; -use codex_tools::create_request_permissions_tool; -use codex_tools::create_request_user_input_tool; -use codex_tools::create_resume_agent_tool; -use codex_tools::create_send_input_tool_v1; -use codex_tools::create_send_message_tool; -use codex_tools::create_shell_command_tool; -use codex_tools::create_shell_tool; -use codex_tools::create_spawn_agent_tool_v1; -use codex_tools::create_spawn_agent_tool_v2; -use codex_tools::create_spawn_agents_on_csv_tool; -use codex_tools::create_test_sync_tool; -use codex_tools::create_tool_search_tool; -use codex_tools::create_tool_suggest_tool; -use codex_tools::create_update_plan_tool; -use codex_tools::create_view_image_tool; -use codex_tools::create_wait_agent_tool_v1; -use codex_tools::create_wait_agent_tool_v2; -use codex_tools::create_wait_tool; -use codex_tools::create_web_search_tool; -use codex_tools::create_write_stdin_tool; -use codex_tools::dynamic_tool_to_responses_api_tool; -use codex_tools::mcp_tool_to_responses_api_tool; -use codex_tools::request_permissions_tool_description; -use codex_tools::request_user_input_tool_description; +use codex_tools::build_tool_registry_plan; use std::collections::HashMap; +use std::sync::Arc; #[cfg(test)] pub(crate) use codex_tools::mcp_call_tool_result_output_schema; @@ -88,32 +32,6 @@ pub(crate) fn tool_user_shell_type(user_shell: &Shell) -> ToolUserShellType { } } -fn agent_type_description(config: &ToolsConfig) -> String { - if config.agent_type_description.is_empty() { - crate::agent::role::spawn_tool_spec::build(&std::collections::BTreeMap::new()) - } else { - config.agent_type_description.clone() - } -} - -fn push_tool_spec( - builder: &mut ToolRegistryBuilder, - spec: ToolSpec, - supports_parallel_tool_calls: bool, - code_mode_enabled: bool, -) { - let spec = if code_mode_enabled { - augment_tool_spec_for_code_mode(spec) - } else { - spec - }; - if supports_parallel_tool_calls { - builder.push_spec_with_parallel_support(spec, /*supports_parallel_tool_calls*/ true); - } else { - builder.push_spec(spec); - } -} - /// Builds the tool registry builder while collecting tool specs for later serialization. #[cfg(test)] pub(crate) fn build_specs( @@ -168,10 +86,38 @@ pub(crate) fn build_specs_with_discoverable_tools( use crate::tools::handlers::multi_agents_v2::SendMessageHandler as SendMessageHandlerV2; use crate::tools::handlers::multi_agents_v2::SpawnAgentHandler as SpawnAgentHandlerV2; use crate::tools::handlers::multi_agents_v2::WaitAgentHandler as WaitAgentHandlerV2; - use std::sync::Arc; let mut builder = ToolRegistryBuilder::new(); - + let app_tool_sources = app_tools.as_ref().map(|app_tools| { + app_tools + .values() + .map(|tool| ToolRegistryPlanAppTool { + tool_name: tool.tool_name.as_str(), + tool_namespace: tool.tool_namespace.as_str(), + server_name: tool.server_name.as_str(), + connector_name: tool.connector_name.as_deref(), + connector_description: tool.connector_description.as_deref(), + }) + .collect::>() + }); + let default_agent_type_description = + crate::agent::role::spawn_tool_spec::build(&std::collections::BTreeMap::new()); + let plan = build_tool_registry_plan( + config, + ToolRegistryPlanParams { + mcp_tools: mcp_tools.as_ref(), + app_tools: app_tool_sources.as_deref(), + discoverable_tools: discoverable_tools.as_deref(), + dynamic_tools, + default_agent_type_description: &default_agent_type_description, + wait_agent_timeouts: WaitAgentTimeoutOptions { + default_timeout_ms: DEFAULT_WAIT_TIMEOUT_MS, + min_timeout_ms: MIN_WAIT_TIMEOUT_MS, + max_timeout_ms: MAX_WAIT_TIMEOUT_MS, + }, + codex_apps_mcp_server_name: CODEX_APPS_MCP_SERVER_NAME, + }, + ); let shell_handler = Arc::new(ShellHandler); let unified_exec_handler = Arc::new(UnifiedExecHandler); let plan_handler = Arc::new(PlanHandler); @@ -185,466 +131,124 @@ pub(crate) fn build_specs_with_discoverable_tools( let request_user_input_handler = Arc::new(RequestUserInputHandler { default_mode_request_user_input: config.default_mode_request_user_input, }); + let tool_search_handler = app_tools + .as_ref() + .map(|app_tools| Arc::new(ToolSearchHandler::new(app_tools.clone()))); let tool_suggest_handler = Arc::new(ToolSuggestHandler); let code_mode_handler = Arc::new(CodeModeExecuteHandler); let code_mode_wait_handler = Arc::new(CodeModeWaitHandler); let js_repl_handler = Arc::new(JsReplHandler); let js_repl_reset_handler = Arc::new(JsReplResetHandler); - let exec_permission_approvals_enabled = config.exec_permission_approvals_enabled; - if config.code_mode_enabled { - let nested_config = config.for_code_mode_nested_tools(); - let (nested_specs, _) = build_specs_with_discoverable_tools( - &nested_config, - mcp_tools.clone(), - app_tools.clone(), - /*discoverable_tools*/ None, - dynamic_tools, - ) - .build(); - let enabled_tools = collect_code_mode_tool_definitions( - nested_specs - .iter() - .map(|configured_tool| &configured_tool.spec), - ) - .into_iter() - .map(|tool| (tool.name, tool.description)) - .collect::>(); - push_tool_spec( - &mut builder, - create_code_mode_tool(&enabled_tools, config.code_mode_only_enabled), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler(PUBLIC_TOOL_NAME, code_mode_handler); - push_tool_spec( - &mut builder, - create_wait_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler(WAIT_TOOL_NAME, code_mode_wait_handler); - } - - match &config.shell_type { - ConfigShellToolType::Default => { - push_tool_spec( - &mut builder, - create_shell_tool(ShellToolOptions { - exec_permission_approvals_enabled, - }), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, + for spec in plan.specs { + if spec.supports_parallel_tool_calls { + builder.push_spec_with_parallel_support( + spec.spec, /*supports_parallel_tool_calls*/ true, ); - } - ConfigShellToolType::Local => { - push_tool_spec( - &mut builder, - create_local_shell_tool(), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - } - ConfigShellToolType::UnifiedExec => { - push_tool_spec( - &mut builder, - create_exec_command_tool(CommandToolOptions { - allow_login_shell: config.allow_login_shell, - exec_permission_approvals_enabled, - }), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_write_stdin_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("exec_command", unified_exec_handler.clone()); - builder.register_handler("write_stdin", unified_exec_handler); - } - ConfigShellToolType::Disabled => { - // Do nothing. - } - ConfigShellToolType::ShellCommand => { - push_tool_spec( - &mut builder, - create_shell_command_tool(CommandToolOptions { - allow_login_shell: config.allow_login_shell, - exec_permission_approvals_enabled, - }), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - } - } - - if config.shell_type != ConfigShellToolType::Disabled { - // Always register shell aliases so older prompts remain compatible. - builder.register_handler("shell", shell_handler.clone()); - builder.register_handler("container.exec", shell_handler.clone()); - builder.register_handler("local_shell", shell_handler); - builder.register_handler("shell_command", shell_command_handler); - } - - if mcp_tools.is_some() { - push_tool_spec( - &mut builder, - create_list_mcp_resources_tool(), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_list_mcp_resource_templates_tool(), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_read_mcp_resource_tool(), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - builder.register_handler("list_mcp_resources", mcp_resource_handler.clone()); - builder.register_handler("list_mcp_resource_templates", mcp_resource_handler.clone()); - builder.register_handler("read_mcp_resource", mcp_resource_handler); - } - - push_tool_spec( - &mut builder, - create_update_plan_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("update_plan", plan_handler); - - if config.js_repl_enabled { - push_tool_spec( - &mut builder, - create_js_repl_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_js_repl_reset_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("js_repl", js_repl_handler); - builder.register_handler("js_repl_reset", js_repl_reset_handler); - } - - if config.request_user_input { - push_tool_spec( - &mut builder, - create_request_user_input_tool(request_user_input_tool_description( - config.default_mode_request_user_input, - )), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler(REQUEST_USER_INPUT_TOOL_NAME, request_user_input_handler); - } - - if config.request_permissions_tool_enabled { - push_tool_spec( - &mut builder, - create_request_permissions_tool(request_permissions_tool_description()), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("request_permissions", request_permissions_handler); - } - - if config.search_tool - && let Some(app_tools) = app_tools - { - let search_tool_handler = Arc::new(ToolSearchHandler::new(app_tools.clone())); - let search_app_infos = collect_tool_search_app_infos( - app_tools.values().map(|tool| ToolSearchAppSource { - server_name: &tool.server_name, - connector_name: tool.connector_name.as_deref(), - connector_description: tool.connector_description.as_deref(), - }), - CODEX_APPS_MCP_SERVER_NAME, - ); - push_tool_spec( - &mut builder, - create_tool_search_tool(&search_app_infos, TOOL_SEARCH_DEFAULT_LIMIT), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - builder.register_handler(TOOL_SEARCH_TOOL_NAME, search_tool_handler); - - for tool in app_tools.values() { - let alias_name = - tool_handler_key(tool.tool_name.as_str(), Some(tool.tool_namespace.as_str())); - - builder.register_handler(alias_name, mcp_handler.clone()); - } - } - - if config.tool_suggest - && let Some(discoverable_tools) = discoverable_tools - .as_ref() - .filter(|tools| !tools.is_empty()) - { - builder.push_spec_with_parallel_support( - create_tool_suggest_tool(&collect_tool_suggest_entries(discoverable_tools)), - /*supports_parallel_tool_calls*/ true, - ); - builder.register_handler(TOOL_SUGGEST_TOOL_NAME, tool_suggest_handler); - } - - if let Some(apply_patch_tool_type) = &config.apply_patch_tool_type { - match apply_patch_tool_type { - ApplyPatchToolType::Freeform => { - push_tool_spec( - &mut builder, - create_apply_patch_freeform_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - } - ApplyPatchToolType::Function => { - push_tool_spec( - &mut builder, - create_apply_patch_json_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - } - } - builder.register_handler("apply_patch", apply_patch_handler); - } - - if config - .experimental_supported_tools - .iter() - .any(|tool| tool == "list_dir") - { - let list_dir_handler = Arc::new(ListDirHandler); - push_tool_spec( - &mut builder, - create_list_dir_tool(), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - builder.register_handler("list_dir", list_dir_handler); - } - - if config - .experimental_supported_tools - .contains(&"test_sync_tool".to_string()) - { - let test_sync_handler = Arc::new(TestSyncHandler); - push_tool_spec( - &mut builder, - create_test_sync_tool(), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - builder.register_handler("test_sync_tool", test_sync_handler); - } - - if let Some(web_search_tool) = create_web_search_tool(WebSearchToolOptions { - web_search_mode: config.web_search_mode, - web_search_config: config.web_search_config.as_ref(), - web_search_tool_type: config.web_search_tool_type, - }) { - push_tool_spec( - &mut builder, - web_search_tool, - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - } - - if config.image_gen_tool { - push_tool_spec( - &mut builder, - create_image_generation_tool("png"), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - } - - push_tool_spec( - &mut builder, - create_view_image_tool(ViewImageToolOptions { - can_request_original_image_detail: config.can_request_original_image_detail, - }), - /*supports_parallel_tool_calls*/ true, - config.code_mode_enabled, - ); - builder.register_handler("view_image", view_image_handler); - - if config.collab_tools { - if config.multi_agent_v2 { - let agent_type_description = agent_type_description(config); - push_tool_spec( - &mut builder, - create_spawn_agent_tool_v2(SpawnAgentToolOptions { - available_models: &config.available_models, - agent_type_description, - }), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_send_message_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_assign_task_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_wait_agent_tool_v2(WaitAgentTimeoutOptions { - default_timeout_ms: DEFAULT_WAIT_TIMEOUT_MS, - min_timeout_ms: MIN_WAIT_TIMEOUT_MS, - max_timeout_ms: MAX_WAIT_TIMEOUT_MS, - }), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_close_agent_tool_v2(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_list_agents_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("spawn_agent", Arc::new(SpawnAgentHandlerV2)); - builder.register_handler("send_message", Arc::new(SendMessageHandlerV2)); - builder.register_handler("assign_task", Arc::new(AssignTaskHandlerV2)); - builder.register_handler("wait_agent", Arc::new(WaitAgentHandlerV2)); - builder.register_handler("close_agent", Arc::new(CloseAgentHandlerV2)); - builder.register_handler("list_agents", Arc::new(ListAgentsHandlerV2)); } else { - let agent_type_description = agent_type_description(config); - push_tool_spec( - &mut builder, - create_spawn_agent_tool_v1(SpawnAgentToolOptions { - available_models: &config.available_models, - agent_type_description, - }), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_send_input_tool_v1(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_resume_agent_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("resume_agent", Arc::new(ResumeAgentHandler)); - push_tool_spec( - &mut builder, - create_wait_agent_tool_v1(WaitAgentTimeoutOptions { - default_timeout_ms: DEFAULT_WAIT_TIMEOUT_MS, - min_timeout_ms: MIN_WAIT_TIMEOUT_MS, - max_timeout_ms: MAX_WAIT_TIMEOUT_MS, - }), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - push_tool_spec( - &mut builder, - create_close_agent_tool_v1(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("spawn_agent", Arc::new(SpawnAgentHandler)); - builder.register_handler("send_input", Arc::new(SendInputHandler)); - builder.register_handler("wait_agent", Arc::new(WaitAgentHandler)); - builder.register_handler("close_agent", Arc::new(CloseAgentHandler)); + builder.push_spec(spec.spec); } } - if config.agent_jobs_tools { - let agent_jobs_handler = Arc::new(BatchJobHandler); - push_tool_spec( - &mut builder, - create_spawn_agents_on_csv_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("spawn_agents_on_csv", agent_jobs_handler.clone()); - if config.agent_jobs_worker_tools { - push_tool_spec( - &mut builder, - create_report_agent_job_result_tool(), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler("report_agent_job_result", agent_jobs_handler); - } - } - - if let Some(mcp_tools) = mcp_tools { - let mut entries: Vec<(String, rmcp::model::Tool)> = mcp_tools.into_iter().collect(); - entries.sort_by(|a, b| a.0.cmp(&b.0)); - - for (name, tool) in entries.into_iter() { - match mcp_tool_to_responses_api_tool(name.clone(), &tool) { - Ok(converted_tool) => { - push_tool_spec( - &mut builder, - ToolSpec::Function(converted_tool), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler(name, mcp_handler.clone()); - } - Err(e) => { - tracing::error!("Failed to convert {name:?} MCP tool to OpenAI tool: {e:?}"); + for handler in plan.handlers { + match handler.kind { + ToolHandlerKind::AgentJobs => { + builder.register_handler(handler.name, Arc::new(BatchJobHandler)); + } + ToolHandlerKind::ApplyPatch => { + builder.register_handler(handler.name, apply_patch_handler.clone()); + } + ToolHandlerKind::AssignTaskV2 => { + builder.register_handler(handler.name, Arc::new(AssignTaskHandlerV2)); + } + ToolHandlerKind::CloseAgentV1 => { + builder.register_handler(handler.name, Arc::new(CloseAgentHandler)); + } + ToolHandlerKind::CloseAgentV2 => { + builder.register_handler(handler.name, Arc::new(CloseAgentHandlerV2)); + } + ToolHandlerKind::CodeModeExecute => { + builder.register_handler(handler.name, code_mode_handler.clone()); + } + ToolHandlerKind::CodeModeWait => { + builder.register_handler(handler.name, code_mode_wait_handler.clone()); + } + ToolHandlerKind::DynamicTool => { + builder.register_handler(handler.name, dynamic_tool_handler.clone()); + } + ToolHandlerKind::JsRepl => { + builder.register_handler(handler.name, js_repl_handler.clone()); + } + ToolHandlerKind::JsReplReset => { + builder.register_handler(handler.name, js_repl_reset_handler.clone()); + } + ToolHandlerKind::ListAgentsV2 => { + builder.register_handler(handler.name, Arc::new(ListAgentsHandlerV2)); + } + ToolHandlerKind::ListDir => { + builder.register_handler(handler.name, Arc::new(ListDirHandler)); + } + ToolHandlerKind::Mcp => { + builder.register_handler(handler.name, mcp_handler.clone()); + } + ToolHandlerKind::McpResource => { + builder.register_handler(handler.name, mcp_resource_handler.clone()); + } + ToolHandlerKind::Plan => { + builder.register_handler(handler.name, plan_handler.clone()); + } + ToolHandlerKind::RequestPermissions => { + builder.register_handler(handler.name, request_permissions_handler.clone()); + } + ToolHandlerKind::RequestUserInput => { + builder.register_handler(handler.name, request_user_input_handler.clone()); + } + ToolHandlerKind::ResumeAgentV1 => { + builder.register_handler(handler.name, Arc::new(ResumeAgentHandler)); + } + ToolHandlerKind::SendInputV1 => { + builder.register_handler(handler.name, Arc::new(SendInputHandler)); + } + ToolHandlerKind::SendMessageV2 => { + builder.register_handler(handler.name, Arc::new(SendMessageHandlerV2)); + } + ToolHandlerKind::Shell => { + builder.register_handler(handler.name, shell_handler.clone()); + } + ToolHandlerKind::ShellCommand => { + builder.register_handler(handler.name, shell_command_handler.clone()); + } + ToolHandlerKind::SpawnAgentV1 => { + builder.register_handler(handler.name, Arc::new(SpawnAgentHandler)); + } + ToolHandlerKind::SpawnAgentV2 => { + builder.register_handler(handler.name, Arc::new(SpawnAgentHandlerV2)); + } + ToolHandlerKind::TestSync => { + builder.register_handler(handler.name, Arc::new(TestSyncHandler)); + } + ToolHandlerKind::ToolSearch => { + if let Some(tool_search_handler) = tool_search_handler.as_ref() { + builder.register_handler(handler.name, tool_search_handler.clone()); } } + ToolHandlerKind::ToolSuggest => { + builder.register_handler(handler.name, tool_suggest_handler.clone()); + } + ToolHandlerKind::UnifiedExec => { + builder.register_handler(handler.name, unified_exec_handler.clone()); + } + ToolHandlerKind::ViewImage => { + builder.register_handler(handler.name, view_image_handler.clone()); + } + ToolHandlerKind::WaitAgentV1 => { + builder.register_handler(handler.name, Arc::new(WaitAgentHandler)); + } + ToolHandlerKind::WaitAgentV2 => { + builder.register_handler(handler.name, Arc::new(WaitAgentHandlerV2)); + } } } - - if !dynamic_tools.is_empty() { - for tool in dynamic_tools { - match dynamic_tool_to_responses_api_tool(tool) { - Ok(converted_tool) => { - push_tool_spec( - &mut builder, - ToolSpec::Function(converted_tool), - /*supports_parallel_tool_calls*/ false, - config.code_mode_enabled, - ); - builder.register_handler(tool.name.clone(), dynamic_tool_handler.clone()); - } - Err(e) => { - tracing::error!( - "Failed to convert dynamic tool {:?} to OpenAI tool: {e:?}", - tool.name - ); - } - } - } - } - builder } #[cfg(test)] diff --git a/codex-rs/core/src/tools/spec_tests.rs b/codex-rs/core/src/tools/spec_tests.rs index b4b68da25d..222d7e4c72 100644 --- a/codex-rs/core/src/tools/spec_tests.rs +++ b/codex-rs/core/src/tools/spec_tests.rs @@ -4,6 +4,7 @@ use crate::models_manager::model_info::with_config_overrides; use crate::shell::Shell; use crate::shell::ShellType; use crate::tools::ToolRouter; +use crate::tools::registry::tool_handler_key; use crate::tools::router::ToolRouterParams; use codex_app_server_protocol::AppInfo; use codex_features::Feature; @@ -13,6 +14,7 @@ use codex_protocol::config_types::WebSearchConfig; use codex_protocol::config_types::WebSearchMode; use codex_protocol::config_types::WindowsSandboxLevel; use codex_protocol::models::VIEW_IMAGE_TOOL_NAME; +use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::InputModality; use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelsResponse; @@ -32,6 +34,9 @@ use codex_tools::ResponsesApiWebSearchFilters; use codex_tools::ResponsesApiWebSearchUserLocation; use codex_tools::ShellCommandBackendConfig; use codex_tools::SpawnAgentToolOptions; +use codex_tools::TOOL_SEARCH_TOOL_NAME; +use codex_tools::TOOL_SUGGEST_TOOL_NAME; +use codex_tools::ToolSpec; use codex_tools::ToolsConfig; use codex_tools::ToolsConfigParams; use codex_tools::UnifiedExecShellMode; @@ -203,6 +208,14 @@ fn spawn_agent_tool_options(config: &ToolsConfig) -> SpawnAgentToolOptions<'_> { } } +fn agent_type_description(config: &ToolsConfig) -> String { + if config.agent_type_description.is_empty() { + crate::agent::role::spawn_tool_spec::build(&BTreeMap::new()) + } else { + config.agent_type_description.clone() + } +} + fn wait_agent_timeout_options() -> WaitAgentTimeoutOptions { WaitAgentTimeoutOptions { default_timeout_ms: DEFAULT_WAIT_TIMEOUT_MS, diff --git a/codex-rs/tools/src/lib.rs b/codex-rs/tools/src/lib.rs index 3bce0fb107..91931e8944 100644 --- a/codex-rs/tools/src/lib.rs +++ b/codex-rs/tools/src/lib.rs @@ -18,6 +18,8 @@ mod responses_api; mod tool_config; mod tool_definition; mod tool_discovery; +mod tool_registry_plan; +mod tool_registry_plan_types; mod tool_spec; mod tool_suggest; mod utility_tool; @@ -107,6 +109,12 @@ pub use tool_discovery::collect_tool_suggest_entries; pub use tool_discovery::create_tool_search_tool; pub use tool_discovery::create_tool_suggest_tool; pub use tool_discovery::filter_tool_suggest_discoverable_tools_for_client; +pub use tool_registry_plan::build_tool_registry_plan; +pub use tool_registry_plan_types::ToolHandlerKind; +pub use tool_registry_plan_types::ToolHandlerSpec; +pub use tool_registry_plan_types::ToolRegistryPlan; +pub use tool_registry_plan_types::ToolRegistryPlanAppTool; +pub use tool_registry_plan_types::ToolRegistryPlanParams; pub use tool_spec::ConfiguredToolSpec; pub use tool_spec::ResponsesApiWebSearchFilters; pub use tool_spec::ResponsesApiWebSearchUserLocation; diff --git a/codex-rs/tools/src/tool_registry_plan.rs b/codex-rs/tools/src/tool_registry_plan.rs new file mode 100644 index 0000000000..01cda5d64e --- /dev/null +++ b/codex-rs/tools/src/tool_registry_plan.rs @@ -0,0 +1,488 @@ +use crate::CommandToolOptions; +use crate::REQUEST_USER_INPUT_TOOL_NAME; +use crate::ShellToolOptions; +use crate::SpawnAgentToolOptions; +use crate::TOOL_SEARCH_DEFAULT_LIMIT; +use crate::TOOL_SEARCH_TOOL_NAME; +use crate::TOOL_SUGGEST_TOOL_NAME; +use crate::ToolHandlerKind; +use crate::ToolRegistryPlan; +use crate::ToolRegistryPlanParams; +use crate::ToolSearchAppSource; +use crate::ToolSpec; +use crate::ToolsConfig; +use crate::ViewImageToolOptions; +use crate::WebSearchToolOptions; +use crate::collect_code_mode_tool_definitions; +use crate::collect_tool_search_app_infos; +use crate::collect_tool_suggest_entries; +use crate::create_apply_patch_freeform_tool; +use crate::create_apply_patch_json_tool; +use crate::create_assign_task_tool; +use crate::create_close_agent_tool_v1; +use crate::create_close_agent_tool_v2; +use crate::create_code_mode_tool; +use crate::create_exec_command_tool; +use crate::create_image_generation_tool; +use crate::create_js_repl_reset_tool; +use crate::create_js_repl_tool; +use crate::create_list_agents_tool; +use crate::create_list_dir_tool; +use crate::create_list_mcp_resource_templates_tool; +use crate::create_list_mcp_resources_tool; +use crate::create_local_shell_tool; +use crate::create_read_mcp_resource_tool; +use crate::create_report_agent_job_result_tool; +use crate::create_request_permissions_tool; +use crate::create_request_user_input_tool; +use crate::create_resume_agent_tool; +use crate::create_send_input_tool_v1; +use crate::create_send_message_tool; +use crate::create_shell_command_tool; +use crate::create_shell_tool; +use crate::create_spawn_agent_tool_v1; +use crate::create_spawn_agent_tool_v2; +use crate::create_spawn_agents_on_csv_tool; +use crate::create_test_sync_tool; +use crate::create_tool_search_tool; +use crate::create_tool_suggest_tool; +use crate::create_update_plan_tool; +use crate::create_view_image_tool; +use crate::create_wait_agent_tool_v1; +use crate::create_wait_agent_tool_v2; +use crate::create_wait_tool; +use crate::create_web_search_tool; +use crate::create_write_stdin_tool; +use crate::dynamic_tool_to_responses_api_tool; +use crate::mcp_tool_to_responses_api_tool; +use crate::request_permissions_tool_description; +use crate::request_user_input_tool_description; +use crate::tool_registry_plan_types::agent_type_description; +use codex_protocol::openai_models::ApplyPatchToolType; +use codex_protocol::openai_models::ConfigShellToolType; +use rmcp::model::Tool as McpTool; + +pub fn build_tool_registry_plan( + config: &ToolsConfig, + params: ToolRegistryPlanParams<'_>, +) -> ToolRegistryPlan { + let mut plan = ToolRegistryPlan::new(); + let exec_permission_approvals_enabled = config.exec_permission_approvals_enabled; + + if config.code_mode_enabled { + let nested_config = config.for_code_mode_nested_tools(); + let nested_plan = build_tool_registry_plan( + &nested_config, + ToolRegistryPlanParams { + discoverable_tools: None, + ..params + }, + ); + let enabled_tools = collect_code_mode_tool_definitions( + nested_plan + .specs + .iter() + .map(|configured_tool| &configured_tool.spec), + ) + .into_iter() + .map(|tool| (tool.name, tool.description)) + .collect::>(); + plan.push_spec( + create_code_mode_tool(&enabled_tools, config.code_mode_only_enabled), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler( + codex_code_mode::PUBLIC_TOOL_NAME, + ToolHandlerKind::CodeModeExecute, + ); + plan.push_spec( + create_wait_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler( + codex_code_mode::WAIT_TOOL_NAME, + ToolHandlerKind::CodeModeWait, + ); + } + + match &config.shell_type { + ConfigShellToolType::Default => { + plan.push_spec( + create_shell_tool(ShellToolOptions { + exec_permission_approvals_enabled, + }), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + } + ConfigShellToolType::Local => { + plan.push_spec( + create_local_shell_tool(), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + } + ConfigShellToolType::UnifiedExec => { + plan.push_spec( + create_exec_command_tool(CommandToolOptions { + allow_login_shell: config.allow_login_shell, + exec_permission_approvals_enabled, + }), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.push_spec( + create_write_stdin_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("exec_command", ToolHandlerKind::UnifiedExec); + plan.register_handler("write_stdin", ToolHandlerKind::UnifiedExec); + } + ConfigShellToolType::Disabled => {} + ConfigShellToolType::ShellCommand => { + plan.push_spec( + create_shell_command_tool(CommandToolOptions { + allow_login_shell: config.allow_login_shell, + exec_permission_approvals_enabled, + }), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + } + } + + if config.shell_type != ConfigShellToolType::Disabled { + plan.register_handler("shell", ToolHandlerKind::Shell); + plan.register_handler("container.exec", ToolHandlerKind::Shell); + plan.register_handler("local_shell", ToolHandlerKind::Shell); + plan.register_handler("shell_command", ToolHandlerKind::ShellCommand); + } + + if params.mcp_tools.is_some() { + plan.push_spec( + create_list_mcp_resources_tool(), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.push_spec( + create_list_mcp_resource_templates_tool(), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.push_spec( + create_read_mcp_resource_tool(), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.register_handler("list_mcp_resources", ToolHandlerKind::McpResource); + plan.register_handler("list_mcp_resource_templates", ToolHandlerKind::McpResource); + plan.register_handler("read_mcp_resource", ToolHandlerKind::McpResource); + } + + plan.push_spec( + create_update_plan_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("update_plan", ToolHandlerKind::Plan); + + if config.js_repl_enabled { + plan.push_spec( + create_js_repl_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_js_repl_reset_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("js_repl", ToolHandlerKind::JsRepl); + plan.register_handler("js_repl_reset", ToolHandlerKind::JsReplReset); + } + + if config.request_user_input { + plan.push_spec( + create_request_user_input_tool(request_user_input_tool_description( + config.default_mode_request_user_input, + )), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler( + REQUEST_USER_INPUT_TOOL_NAME, + ToolHandlerKind::RequestUserInput, + ); + } + + if config.request_permissions_tool_enabled { + plan.push_spec( + create_request_permissions_tool(request_permissions_tool_description()), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("request_permissions", ToolHandlerKind::RequestPermissions); + } + + if config.search_tool + && let Some(app_tools) = params.app_tools + { + let search_app_infos = collect_tool_search_app_infos( + app_tools.iter().map(|tool| ToolSearchAppSource { + server_name: tool.server_name, + connector_name: tool.connector_name, + connector_description: tool.connector_description, + }), + params.codex_apps_mcp_server_name, + ); + plan.push_spec( + create_tool_search_tool(&search_app_infos, TOOL_SEARCH_DEFAULT_LIMIT), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.register_handler(TOOL_SEARCH_TOOL_NAME, ToolHandlerKind::ToolSearch); + + for tool in app_tools { + plan.register_handler( + format!("{}:{}", tool.tool_namespace, tool.tool_name), + ToolHandlerKind::Mcp, + ); + } + } + + if config.tool_suggest + && let Some(discoverable_tools) = + params.discoverable_tools.filter(|tools| !tools.is_empty()) + { + plan.push_spec( + create_tool_suggest_tool(&collect_tool_suggest_entries(discoverable_tools)), + /*supports_parallel_tool_calls*/ true, + /*code_mode_enabled*/ false, + ); + plan.register_handler(TOOL_SUGGEST_TOOL_NAME, ToolHandlerKind::ToolSuggest); + } + + if let Some(apply_patch_tool_type) = &config.apply_patch_tool_type { + match apply_patch_tool_type { + ApplyPatchToolType::Freeform => { + plan.push_spec( + create_apply_patch_freeform_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + } + ApplyPatchToolType::Function => { + plan.push_spec( + create_apply_patch_json_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + } + } + plan.register_handler("apply_patch", ToolHandlerKind::ApplyPatch); + } + + if config + .experimental_supported_tools + .iter() + .any(|tool| tool == "list_dir") + { + plan.push_spec( + create_list_dir_tool(), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.register_handler("list_dir", ToolHandlerKind::ListDir); + } + + if config + .experimental_supported_tools + .iter() + .any(|tool| tool == "test_sync_tool") + { + plan.push_spec( + create_test_sync_tool(), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.register_handler("test_sync_tool", ToolHandlerKind::TestSync); + } + + if let Some(web_search_tool) = create_web_search_tool(WebSearchToolOptions { + web_search_mode: config.web_search_mode, + web_search_config: config.web_search_config.as_ref(), + web_search_tool_type: config.web_search_tool_type, + }) { + plan.push_spec( + web_search_tool, + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + } + + if config.image_gen_tool { + plan.push_spec( + create_image_generation_tool("png"), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + } + + plan.push_spec( + create_view_image_tool(ViewImageToolOptions { + can_request_original_image_detail: config.can_request_original_image_detail, + }), + /*supports_parallel_tool_calls*/ true, + config.code_mode_enabled, + ); + plan.register_handler("view_image", ToolHandlerKind::ViewImage); + + if config.collab_tools { + if config.multi_agent_v2 { + let agent_type_description = + agent_type_description(config, params.default_agent_type_description); + plan.push_spec( + create_spawn_agent_tool_v2(SpawnAgentToolOptions { + available_models: &config.available_models, + agent_type_description, + }), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_send_message_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_assign_task_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_wait_agent_tool_v2(params.wait_agent_timeouts), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_close_agent_tool_v2(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_list_agents_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("spawn_agent", ToolHandlerKind::SpawnAgentV2); + plan.register_handler("send_message", ToolHandlerKind::SendMessageV2); + plan.register_handler("assign_task", ToolHandlerKind::AssignTaskV2); + plan.register_handler("wait_agent", ToolHandlerKind::WaitAgentV2); + plan.register_handler("close_agent", ToolHandlerKind::CloseAgentV2); + plan.register_handler("list_agents", ToolHandlerKind::ListAgentsV2); + } else { + let agent_type_description = + agent_type_description(config, params.default_agent_type_description); + plan.push_spec( + create_spawn_agent_tool_v1(SpawnAgentToolOptions { + available_models: &config.available_models, + agent_type_description, + }), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_send_input_tool_v1(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_resume_agent_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("resume_agent", ToolHandlerKind::ResumeAgentV1); + plan.push_spec( + create_wait_agent_tool_v1(params.wait_agent_timeouts), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.push_spec( + create_close_agent_tool_v1(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("spawn_agent", ToolHandlerKind::SpawnAgentV1); + plan.register_handler("send_input", ToolHandlerKind::SendInputV1); + plan.register_handler("wait_agent", ToolHandlerKind::WaitAgentV1); + plan.register_handler("close_agent", ToolHandlerKind::CloseAgentV1); + } + } + + if config.agent_jobs_tools { + plan.push_spec( + create_spawn_agents_on_csv_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("spawn_agents_on_csv", ToolHandlerKind::AgentJobs); + if config.agent_jobs_worker_tools { + plan.push_spec( + create_report_agent_job_result_tool(), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler("report_agent_job_result", ToolHandlerKind::AgentJobs); + } + } + + if let Some(mcp_tools) = params.mcp_tools { + let mut entries: Vec<(String, &McpTool)> = mcp_tools + .iter() + .map(|(name, tool)| (name.clone(), tool)) + .collect(); + entries.sort_by(|left, right| left.0.cmp(&right.0)); + + for (name, tool) in entries { + match mcp_tool_to_responses_api_tool(name.clone(), tool) { + Ok(converted_tool) => { + plan.push_spec( + ToolSpec::Function(converted_tool), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler(name, ToolHandlerKind::Mcp); + } + Err(error) => { + tracing::error!( + "Failed to convert {name:?} MCP tool to OpenAI tool: {error:?}" + ); + } + } + } + } + + for tool in params.dynamic_tools { + match dynamic_tool_to_responses_api_tool(tool) { + Ok(converted_tool) => { + plan.push_spec( + ToolSpec::Function(converted_tool), + /*supports_parallel_tool_calls*/ false, + config.code_mode_enabled, + ); + plan.register_handler(tool.name.clone(), ToolHandlerKind::DynamicTool); + } + Err(error) => { + tracing::error!( + "Failed to convert dynamic tool {:?} to OpenAI tool: {error:?}", + tool.name + ); + } + } + } + + plan +} diff --git a/codex-rs/tools/src/tool_registry_plan_types.rs b/codex-rs/tools/src/tool_registry_plan_types.rs new file mode 100644 index 0000000000..bdcb75acd8 --- /dev/null +++ b/codex-rs/tools/src/tool_registry_plan_types.rs @@ -0,0 +1,118 @@ +use crate::ConfiguredToolSpec; +use crate::DiscoverableTool; +use crate::ToolSpec; +use crate::ToolsConfig; +use crate::WaitAgentTimeoutOptions; +use crate::augment_tool_spec_for_code_mode; +use codex_protocol::dynamic_tools::DynamicToolSpec; +use rmcp::model::Tool as McpTool; +use std::collections::HashMap; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ToolHandlerKind { + AgentJobs, + ApplyPatch, + AssignTaskV2, + CloseAgentV1, + CloseAgentV2, + CodeModeExecute, + CodeModeWait, + DynamicTool, + JsRepl, + JsReplReset, + ListAgentsV2, + ListDir, + Mcp, + McpResource, + Plan, + RequestPermissions, + RequestUserInput, + ResumeAgentV1, + SendInputV1, + SendMessageV2, + Shell, + ShellCommand, + SpawnAgentV1, + SpawnAgentV2, + TestSync, + ToolSearch, + ToolSuggest, + UnifiedExec, + ViewImage, + WaitAgentV1, + WaitAgentV2, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ToolHandlerSpec { + pub name: String, + pub kind: ToolHandlerKind, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct ToolRegistryPlan { + pub specs: Vec, + pub handlers: Vec, +} + +#[derive(Debug, Clone, Copy)] +pub struct ToolRegistryPlanParams<'a> { + pub mcp_tools: Option<&'a HashMap>, + pub app_tools: Option<&'a [ToolRegistryPlanAppTool<'a>]>, + pub discoverable_tools: Option<&'a [DiscoverableTool]>, + pub dynamic_tools: &'a [DynamicToolSpec], + pub default_agent_type_description: &'a str, + pub wait_agent_timeouts: WaitAgentTimeoutOptions, + pub codex_apps_mcp_server_name: &'a str, +} + +#[derive(Debug, Clone, Copy)] +pub struct ToolRegistryPlanAppTool<'a> { + pub tool_name: &'a str, + pub tool_namespace: &'a str, + pub server_name: &'a str, + pub connector_name: Option<&'a str>, + pub connector_description: Option<&'a str>, +} + +impl ToolRegistryPlan { + pub(crate) fn new() -> Self { + Self { + specs: Vec::new(), + handlers: Vec::new(), + } + } + + pub(crate) fn push_spec( + &mut self, + spec: ToolSpec, + supports_parallel_tool_calls: bool, + code_mode_enabled: bool, + ) { + let spec = if code_mode_enabled { + augment_tool_spec_for_code_mode(spec) + } else { + spec + }; + self.specs + .push(ConfiguredToolSpec::new(spec, supports_parallel_tool_calls)); + } + + pub(crate) fn register_handler(&mut self, name: impl Into, kind: ToolHandlerKind) { + self.handlers.push(ToolHandlerSpec { + name: name.into(), + kind, + }); + } +} + +pub(crate) fn agent_type_description( + config: &ToolsConfig, + default_agent_type_description: &str, +) -> String { + if config.agent_type_description.is_empty() { + default_agent_type_description.to_string() + } else { + config.agent_type_description.clone() + } +}