diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 744d0b8dbc..57a346a1a0 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -411,6 +411,7 @@ dependencies = [ "codex-core", "codex-features", "codex-login", + "codex-models-manager", "codex-protocol", "codex-utils-cargo-bin", "core_test_support", @@ -1418,6 +1419,7 @@ dependencies = [ "codex-git-utils", "codex-login", "codex-mcp", + "codex-models-manager", "codex-otel", "codex-protocol", "codex-rmcp-client", @@ -1864,6 +1866,7 @@ dependencies = [ "codex-instructions", "codex-login", "codex-mcp", + "codex-model-provider-info", "codex-models-manager", "codex-network-proxy", "codex-otel", @@ -2007,6 +2010,7 @@ dependencies = [ "codex-feedback", "codex-git-utils", "codex-login", + "codex-model-provider-info", "codex-otel", "codex-protocol", "codex-utils-absolute-path", @@ -2230,6 +2234,7 @@ name = "codex-lmstudio" version = "0.0.0" dependencies = [ "codex-core", + "codex-model-provider-info", "reqwest", "serde_json", "tokio", @@ -2320,6 +2325,7 @@ dependencies = [ "codex-exec-server", "codex-features", "codex-login", + "codex-models-manager", "codex-protocol", "codex-shell-command", "codex-utils-cli", @@ -2364,9 +2370,11 @@ dependencies = [ "base64 0.22.1", "chrono", "codex-api", + "codex-app-server-protocol", "codex-collaboration-mode-templates", "codex-feedback", "codex-login", + "codex-model-provider-info", "codex-otel", "codex-protocol", "codex-response-debug-context", @@ -2424,6 +2432,7 @@ dependencies = [ "async-stream", "bytes", "codex-core", + "codex-model-provider-info", "futures", "pretty_assertions", "reqwest", @@ -2781,6 +2790,7 @@ dependencies = [ "codex-git-utils", "codex-login", "codex-mcp", + "codex-model-provider-info", "codex-models-manager", "codex-otel", "codex-protocol", @@ -2945,6 +2955,7 @@ version = "0.0.0" dependencies = [ "codex-core", "codex-lmstudio", + "codex-model-provider-info", "codex-ollama", ] @@ -3016,6 +3027,7 @@ name = "codex-utils-sandbox-summary" version = "0.0.0" dependencies = [ "codex-core", + "codex-model-provider-info", "codex-protocol", "codex-utils-absolute-path", "pretty_assertions", @@ -3287,6 +3299,7 @@ dependencies = [ "codex-exec-server", "codex-features", "codex-login", + "codex-model-provider-info", "codex-models-manager", "codex-protocol", "codex-utils-absolute-path", diff --git a/codex-rs/app-server/Cargo.toml b/codex-rs/app-server/Cargo.toml index b0525685cd..4db6b81a21 100644 --- a/codex-rs/app-server/Cargo.toml +++ b/codex-rs/app-server/Cargo.toml @@ -46,6 +46,7 @@ codex-file-search = { workspace = true } codex-chatgpt = { workspace = true } codex-login = { workspace = true } codex-mcp = { workspace = true } +codex-models-manager = { workspace = true } codex-protocol = { workspace = true } codex-app-server-protocol = { workspace = true } codex-feedback = { 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 932e94f28b..3550d83719 100644 --- a/codex-rs/app-server/src/codex_message_processor.rs +++ b/codex-rs/app-server/src/codex_message_processor.rs @@ -29,6 +29,7 @@ use codex_app_server_protocol::AppsListParams; use codex_app_server_protocol::AppsListResponse; use codex_app_server_protocol::AskForApproval; use codex_app_server_protocol::AuthMode; +use codex_app_server_protocol::AuthMode as CoreAuthMode; use codex_app_server_protocol::CancelLoginAccountParams; use codex_app_server_protocol::CancelLoginAccountResponse; use codex_app_server_protocol::CancelLoginAccountStatus; @@ -202,9 +203,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; use codex_core::exec::ExecExpiration; use codex_core::exec::ExecParams; @@ -213,7 +211,6 @@ use codex_core::find_archived_thread_path_by_id_str; use codex_core::find_thread_name_by_id; use codex_core::find_thread_names_by_ids; use codex_core::find_thread_path_by_id_str; -use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_core::parse_cursor; use codex_core::plugins::MarketplaceError; use codex_core::plugins::MarketplacePluginSource; @@ -238,13 +235,13 @@ use codex_feedback::CodexFeedback; use codex_git_utils::git_diff_to_remote; use codex_git_utils::resolve_root_git_project_for_trust; 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; @@ -252,6 +249,7 @@ use codex_mcp::mcp::auth::discover_supported_scopes; use codex_mcp::mcp::auth::resolve_oauth_scopes; use codex_mcp::mcp::collect_mcp_snapshot; use codex_mcp::mcp::group_tools_by_server; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_protocol::ThreadId; use codex_protocol::config_types::CollaborationMode; use codex_protocol::config_types::ForcedLoginMethod; @@ -259,6 +257,8 @@ use codex_protocol::config_types::Personality; use codex_protocol::config_types::TrustLevel; use codex_protocol::config_types::WindowsSandboxLevel; use codex_protocol::dynamic_tools::DynamicToolSpec as CoreDynamicToolSpec; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; use codex_protocol::items::TurnItem; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::AgentStatus; diff --git a/codex-rs/app-server/src/command_exec.rs b/codex-rs/app-server/src/command_exec.rs index a1a042de6a..bb086e0dd0 100644 --- a/codex-rs/app-server/src/command_exec.rs +++ b/codex-rs/app-server/src/command_exec.rs @@ -18,12 +18,12 @@ use codex_app_server_protocol::CommandExecWriteParams; use codex_app_server_protocol::CommandExecWriteResponse; use codex_app_server_protocol::JSONRPCErrorError; use codex_app_server_protocol::ServerNotification; -use codex_core::bytes_to_string_smart; use codex_core::config::StartedNetworkProxy; use codex_core::exec::DEFAULT_EXEC_COMMAND_TIMEOUT_MS; use codex_core::exec::ExecExpiration; use codex_core::exec::IO_DRAIN_TIMEOUT_MS; use codex_core::sandboxing::ExecRequest; +use codex_protocol::exec_output::bytes_to_string_smart; use codex_sandboxing::SandboxType; use codex_utils_pty::DEFAULT_OUTPUT_BYTES_CAP; use codex_utils_pty::ProcessHandle; diff --git a/codex-rs/app-server/src/message_processor.rs b/codex-rs/app-server/src/message_processor.rs index c63d0a83cf..9773b0c907 100644 --- a/codex-rs/app-server/src/message_processor.rs +++ b/codex-rs/app-server/src/message_processor.rs @@ -23,6 +23,7 @@ use async_trait::async_trait; use codex_analytics::AnalyticsEventsClient; use codex_analytics::AppServerRpcTransport; use codex_app_server_protocol::AppListUpdatedNotification; +use codex_app_server_protocol::AuthMode as LoginAuthMode; use codex_app_server_protocol::ChatgptAuthTokensRefreshParams; use codex_app_server_protocol::ChatgptAuthTokensRefreshReason; use codex_app_server_protocol::ChatgptAuthTokensRefreshResponse; @@ -61,12 +62,10 @@ use codex_core::ThreadManager; use codex_core::config::Config; use codex_core::config_loader::CloudRequirementsLoader; use codex_core::config_loader::LoaderOverrides; -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; @@ -76,6 +75,7 @@ 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_models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_protocol::ThreadId; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::W3cTraceContext; diff --git a/codex-rs/app-server/src/models.rs b/codex-rs/app-server/src/models.rs index 6dbe77455f..3466678a6f 100644 --- a/codex-rs/app-server/src/models.rs +++ b/codex-rs/app-server/src/models.rs @@ -4,7 +4,7 @@ use codex_app_server_protocol::Model; use codex_app_server_protocol::ModelUpgradeInfo; use codex_app_server_protocol::ReasoningEffortOption; use codex_core::ThreadManager; -use codex_core::models_manager::manager::RefreshStrategy; +use codex_models_manager::manager::RefreshStrategy; use codex_protocol::openai_models::ModelPreset; use codex_protocol::openai_models::ReasoningEffortPreset; diff --git a/codex-rs/app-server/tests/common/Cargo.toml b/codex-rs/app-server/tests/common/Cargo.toml index c71e5797ad..6eb1a2c588 100644 --- a/codex-rs/app-server/tests/common/Cargo.toml +++ b/codex-rs/app-server/tests/common/Cargo.toml @@ -18,6 +18,7 @@ codex-app-server-protocol = { workspace = true } codex-core = { workspace = true } codex-features = { workspace = true } codex-login = { workspace = true } +codex-models-manager = { workspace = true } codex-protocol = { workspace = true } codex-utils-cargo-bin = { workspace = true } serde = { workspace = true } diff --git a/codex-rs/app-server/tests/common/models_cache.rs b/codex-rs/app-server/tests/common/models_cache.rs index 8072ff45f6..4173747616 100644 --- a/codex-rs/app-server/tests/common/models_cache.rs +++ b/codex-rs/app-server/tests/common/models_cache.rs @@ -1,6 +1,7 @@ use chrono::DateTime; use chrono::Utc; use codex_core::test_support::all_model_presets; +use codex_models_manager::client_version_to_whole; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ModelInfo; @@ -84,7 +85,7 @@ pub fn write_models_cache_with_models( let cache_path = codex_home.join("models_cache.json"); // DateTime serializes to RFC3339 format by default with serde let fetched_at: DateTime = Utc::now(); - let client_version = codex_core::models_manager::client_version_to_whole(); + let client_version = client_version_to_whole(); let cache = json!({ "fetched_at": fetched_at, "etag": null, diff --git a/codex-rs/cli/src/login.rs b/codex-rs/cli/src/login.rs index f4e20effb5..ced9d4931c 100644 --- a/codex-rs/cli/src/login.rs +++ b/codex-rs/cli/src/login.rs @@ -7,9 +7,9 @@ //! into a one-shot CLI command while still producing a durable `codex-login.log` artifact that //! support can request from users. +use codex_app_server_protocol::AuthMode; 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; diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index a3cb7aba65..0a9dfb521e 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -39,6 +39,7 @@ codex-features = { workspace = true } codex-feedback = { workspace = true } codex-login = { workspace = true } codex-mcp = { workspace = true } +codex-model-provider-info = { workspace = true } codex-models-manager = { workspace = true } codex-shell-command = { workspace = true } codex-execpolicy = { workspace = true } diff --git a/codex-rs/core/src/agent/control.rs b/codex-rs/core/src/agent/control.rs index 2b4409c27d..cbe7cc3844 100644 --- a/codex-rs/core/src/agent/control.rs +++ b/codex-rs/core/src/agent/control.rs @@ -5,8 +5,6 @@ use crate::agent::role::DEFAULT_ROLE_NAME; use crate::agent::role::resolve_role_config; use crate::agent::status::is_final; use crate::codex_thread::ThreadConfigSnapshot; -use crate::error::CodexErr; -use crate::error::Result as CodexResult; use crate::find_archived_thread_path_by_id_str; use crate::find_thread_path_by_id_str; use crate::rollout::RolloutRecorder; @@ -18,6 +16,8 @@ use crate::thread_rollout_truncation::truncate_rollout_to_last_n_fork_turns; use codex_features::Feature; use codex_protocol::AgentPath; use codex_protocol::ThreadId; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; use codex_protocol::models::FunctionCallOutputPayload; use codex_protocol::models::ResponseItem; use codex_protocol::protocol::InitialHistory; diff --git a/codex-rs/core/src/agent/registry.rs b/codex-rs/core/src/agent/registry.rs index f78c8d08bc..c600d5c64b 100644 --- a/codex-rs/core/src/agent/registry.rs +++ b/codex-rs/core/src/agent/registry.rs @@ -1,7 +1,7 @@ -use crate::error::CodexErr; -use crate::error::Result; use codex_protocol::AgentPath; use codex_protocol::ThreadId; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; use rand::prelude::IndexedRandom; diff --git a/codex-rs/core/src/client.rs b/codex-rs/core/src/client.rs index 80aed5112d..be11146c4c 100644 --- a/codex-rs/core/src/client.rs +++ b/codex-rs/core/src/client.rs @@ -54,8 +54,8 @@ 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_app_server_protocol::AuthMode; use codex_login::AuthManager; -use codex_login::AuthMode; use codex_login::CodexAuth; use codex_login::RefreshTokenError; use codex_login::UnauthorizedRecovery; @@ -92,27 +92,29 @@ use tracing::instrument; use tracing::trace; use tracing::warn; -use crate::api_bridge::CoreAuthProvider; -use crate::api_bridge::auth_provider_from_auth; -use crate::api_bridge::map_api_error; -use crate::auth_env_telemetry::AuthEnvTelemetry; -use crate::auth_env_telemetry::collect_auth_env_telemetry; use crate::client_common::Prompt; use crate::client_common::ResponseEvent; use crate::client_common::ResponseStream; -use crate::error::CodexErr; -use crate::error::Result; use crate::flags::CODEX_RS_SSE_FIXTURE; -use crate::model_provider_info::ModelProviderInfo; -use crate::model_provider_info::WireApi; -use crate::provider_auth::auth_manager_for_provider; -use crate::response_debug_context::extract_response_debug_context; -use crate::response_debug_context::extract_response_debug_context_from_api_error; -use crate::response_debug_context::telemetry_api_error_message; -use crate::response_debug_context::telemetry_transport_error_message; -use crate::util::FeedbackRequestTags; use crate::util::emit_feedback_auth_recovery_tags; -use crate::util::emit_feedback_request_tags_with_auth_env; +use codex_api::api_bridge::CoreAuthProvider; +use codex_api::api_bridge::map_api_error; +use codex_feedback::FeedbackRequestTags; +use codex_feedback::emit_feedback_request_tags_with_auth_env; +use codex_login::api_bridge::auth_provider_from_auth; +use codex_login::auth_env_telemetry::AuthEnvTelemetry; +use codex_login::auth_env_telemetry::collect_auth_env_telemetry; +use codex_login::provider_auth::auth_manager_for_provider; +#[cfg(test)] +use codex_model_provider_info::DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS; +use codex_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::WireApi; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; +use codex_response_debug_context::extract_response_debug_context; +use codex_response_debug_context::extract_response_debug_context_from_api_error; +use codex_response_debug_context::telemetry_api_error_message; +use codex_response_debug_context::telemetry_transport_error_message; pub const OPENAI_BETA_HEADER: &str = "OpenAI-Beta"; pub const X_CODEX_TURN_STATE_HEADER: &str = "x-codex-turn-state"; @@ -125,7 +127,7 @@ const RESPONSES_COMPACT_ENDPOINT: &str = "/responses/compact"; const MEMORIES_SUMMARIZE_ENDPOINT: &str = "/memories/trace_summarize"; #[cfg(test)] pub(crate) const WEBSOCKET_CONNECT_TIMEOUT: Duration = - Duration::from_millis(crate::model_provider_info::DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS); + Duration::from_millis(DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS); /// Session-scoped state shared by all [`ModelClient`] clones. /// diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index 8a6c42bb96..cb50ccac39 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -1,6 +1,6 @@ -use crate::error::Result; pub use codex_api::common::ResponseEvent; use codex_config::types::Personality; +use codex_protocol::error::Result; use codex_protocol::models::BaseInstructions; use codex_protocol::models::FunctionCallOutputBody; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/core/src/client_tests.rs b/codex-rs/core/src/client_tests.rs index 23eba5b94f..0b37e5fea4 100644 --- a/codex-rs/core/src/client_tests.rs +++ b/codex-rs/core/src/client_tests.rs @@ -2,8 +2,10 @@ use super::AuthRequestTelemetryContext; use super::ModelClient; use super::PendingUnauthorizedRetry; use super::UnauthorizedRecoveryExecution; -use crate::api_bridge::CoreAuthProvider; -use codex_login::AuthMode; +use codex_api::api_bridge::CoreAuthProvider; +use codex_app_server_protocol::AuthMode; +use codex_model_provider_info::WireApi; +use codex_model_provider_info::create_oss_provider_with_base_url; use codex_otel::SessionTelemetry; use codex_protocol::ThreadId; use codex_protocol::openai_models::ModelInfo; @@ -13,10 +15,7 @@ use pretty_assertions::assert_eq; use serde_json::json; fn test_model_client(session_source: SessionSource) -> ModelClient { - let provider = crate::model_provider_info::create_oss_provider_with_base_url( - "https://example.com/v1", - crate::model_provider_info::WireApi::Responses, - ); + let provider = create_oss_provider_with_base_url("https://example.com/v1", WireApi::Responses); ModelClient::new( /*auth_manager*/ None, ThreadId::new(), diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 0528a9bf2d..241c249ce2 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -13,7 +13,6 @@ use crate::agent::MailboxReceiver; use crate::agent::agent_status_from_event; use crate::agent::status::is_final; use crate::apps::render_apps_section; -use crate::auth_env_telemetry::collect_auth_env_telemetry; use crate::commit_attribution::commit_message_trailer_instruction; use crate::compact; use crate::compact::InitialContextInjection; @@ -23,10 +22,6 @@ use crate::compact_remote::run_inline_remote_auto_compact_task; use crate::config::ManagedFeatures; use crate::connectors; use crate::exec_policy::ExecPolicyManager; -#[cfg(test)] -use crate::models_manager::collaboration_mode_presets::CollaborationModesConfig; -use crate::models_manager::manager::ModelsManager; -use crate::models_manager::manager::RefreshStrategy; use crate::parse_turn_item; use crate::path_utils::normalize_for_native_workdir; use crate::realtime_conversation::RealtimeConversationManager; @@ -69,12 +64,17 @@ use codex_hooks::Hooks; use codex_hooks::HooksConfig; use codex_login::AuthManager; use codex_login::CodexAuth; +use codex_login::auth_env_telemetry::collect_auth_env_telemetry; 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; +#[cfg(test)] +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; +use codex_models_manager::manager::ModelsManager; +use codex_models_manager::manager::RefreshStrategy; use codex_network_proxy::NetworkProxy; use codex_network_proxy::NetworkProxyAuditMetadata; use codex_network_proxy::normalize_host; @@ -168,7 +168,6 @@ use tracing::trace_span; use tracing::warn; use uuid::Uuid; -use crate::ModelProviderInfo; use crate::client::ModelClient; use crate::client::ModelClientSession; use crate::client_common::Prompt; @@ -184,13 +183,14 @@ use crate::config::resolve_web_search_mode_for_turn; use crate::context_manager::ContextManager; use crate::context_manager::TotalTokenUsageBreakdown; use crate::environment_context::EnvironmentContext; -use crate::error::CodexErr; -use crate::error::Result as CodexResult; -#[cfg(test)] -use crate::exec::StreamOutput; use codex_config::CONFIG_TOML_FILE; use codex_config::types::McpServerConfig; use codex_config::types::ShellEnvironmentPolicy; +use codex_model_provider_info::ModelProviderInfo; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; +#[cfg(test)] +use codex_protocol::exec_output::StreamOutput; mod rollout_reconstruction; #[cfg(test)] @@ -551,13 +551,13 @@ impl Codex { let config = Arc::new(config); let refresh_strategy = match session_source { - SessionSource::SubAgent(_) => crate::models_manager::manager::RefreshStrategy::Offline, - _ => crate::models_manager::manager::RefreshStrategy::OnlineIfUncached, + SessionSource::SubAgent(_) => codex_models_manager::manager::RefreshStrategy::Offline, + _ => codex_models_manager::manager::RefreshStrategy::OnlineIfUncached, }; if config.model.is_none() || !matches!( refresh_strategy, - crate::models_manager::manager::RefreshStrategy::Offline + codex_models_manager::manager::RefreshStrategy::Offline ) { let _ = models_manager.list_models(refresh_strategy).await; diff --git a/codex-rs/core/src/codex_delegate.rs b/codex-rs/core/src/codex_delegate.rs index 6bb8257f09..bc5eb8f649 100644 --- a/codex-rs/core/src/codex_delegate.rs +++ b/codex-rs/core/src/codex_delegate.rs @@ -37,7 +37,6 @@ use crate::codex::SUBMISSION_CHANNEL_CAPACITY; use crate::codex::Session; use crate::codex::TurnContext; use crate::config::Config; -use crate::error::CodexErr; use crate::guardian::GuardianApprovalRequest; use crate::guardian::review_approval_request_with_cancel; use crate::guardian::routes_approval_to_guardian; @@ -47,8 +46,9 @@ use crate::mcp_tool_call::MCP_TOOL_APPROVAL_DECLINE_SYNTHETIC; 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_models_manager::manager::ModelsManager; +use codex_protocol::error::CodexErr; 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 291eb6d3f4..a394a1914e 100644 --- a/codex-rs/core/src/codex_tests.rs +++ b/codex-rs/core/src/codex_tests.rs @@ -10,16 +10,18 @@ use crate::config_loader::RequirementSource; use crate::config_loader::Sourced; use crate::exec::ExecCapturePolicy; use crate::function_tool::FunctionCallError; -use crate::models_manager::model_info; use crate::shell::default_user_shell; use crate::tools::format_exec_output_str; -use crate::exec::ExecToolCallOutput; use codex_features::Features; use codex_login::CodexAuth; use codex_mcp::mcp_connection_manager::ToolInfo; +use codex_model_provider_info::ModelProviderInfo; +use codex_models_manager::bundled_models_response; +use codex_models_manager::model_info; use codex_protocol::AgentPath; use codex_protocol::ThreadId; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::models::FunctionCallOutputBody; use codex_protocol::models::FunctionCallOutputPayload; use codex_protocol::permissions::FileSystemAccessMode; @@ -254,9 +256,7 @@ fn test_model_client_session() -> crate::client::ModelClientSession { /*auth_manager*/ None, ThreadId::try_from("00000000-0000-4000-8000-000000000001") .expect("test thread id should be valid"), - crate::model_provider_info::ModelProviderInfo::create_openai_provider( - /* base_url */ /*base_url*/ None, - ), + ModelProviderInfo::create_openai_provider(/* base_url */ /*base_url*/ None), codex_protocol::protocol::SessionSource::Exec, /*model_verbosity*/ None, /*enable_request_compression*/ false, @@ -531,7 +531,7 @@ async fn start_managed_network_proxy_ignores_invalid_execpolicy_network_rules() async fn get_base_instructions_no_user_content() { let prompt_with_apply_patch_instructions = include_str!("../prompt_with_apply_patch_instructions.md"); - let models_response = codex_models_manager::bundled_models_response() + let models_response = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let model_info_for_slug = |slug: &str, config: &Config| { let model = models_response diff --git a/codex-rs/core/src/codex_thread.rs b/codex-rs/core/src/codex_thread.rs index 2b7327df60..d274b8b035 100644 --- a/codex-rs/core/src/codex_thread.rs +++ b/codex-rs/core/src/codex_thread.rs @@ -2,13 +2,13 @@ use crate::agent::AgentStatus; use crate::codex::Codex; use crate::codex::SteerInputError; use crate::config::ConstraintResult; -use crate::error::CodexErr; -use crate::error::Result as CodexResult; use crate::file_watcher::WatchRegistration; use codex_features::Feature; use codex_protocol::config_types::ApprovalsReviewer; use codex_protocol::config_types::Personality; use codex_protocol::config_types::ServiceTier; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseInputItem; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/core/src/compact.rs b/codex-rs/core/src/compact.rs index a281134e71..2f5b82ccc9 100644 --- a/codex-rs/core/src/compact.rs +++ b/codex-rs/core/src/compact.rs @@ -1,6 +1,5 @@ use std::sync::Arc; -use crate::ModelProviderInfo; use crate::Prompt; use crate::client::ModelClientSession; use crate::client_common::ResponseEvent; @@ -9,9 +8,10 @@ use crate::codex::PreviousTurnSettings; use crate::codex::Session; 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::util::backoff; +use codex_model_provider_info::ModelProviderInfo; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; use codex_protocol::items::ContextCompactionItem; use codex_protocol::items::TurnItem; use codex_protocol::models::ContentItem; diff --git a/codex-rs/core/src/compact_remote.rs b/codex-rs/core/src/compact_remote.rs index 123a79ebbc..118d460b8e 100644 --- a/codex-rs/core/src/compact_remote.rs +++ b/codex-rs/core/src/compact_remote.rs @@ -11,8 +11,8 @@ use crate::context_manager::ContextManager; use crate::context_manager::TotalTokenUsageBreakdown; 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 codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; use codex_protocol::items::ContextCompactionItem; use codex_protocol::items::TurnItem; use codex_protocol::models::BaseInstructions; diff --git a/codex-rs/core/src/config/config_tests.rs b/codex-rs/core/src/config/config_tests.rs index 09d601df57..4f7e8283f6 100644 --- a/codex-rs/core/src/config/config_tests.rs +++ b/codex-rs/core/src/config/config_tests.rs @@ -20,6 +20,8 @@ use codex_config::types::Notifications; use codex_config::types::ToolSuggestDiscoverableType; use codex_features::Feature; use codex_features::FeaturesToml; +use codex_model_provider_info::WireApi; +use codex_models_manager::bundled_models_response; use codex_protocol::permissions::FileSystemAccessMode; use codex_protocol::permissions::FileSystemPath; use codex_protocol::permissions::FileSystemSandboxEntry; @@ -1778,10 +1780,7 @@ fn responses_websocket_features_do_not_change_wire_api() -> std::io::Result<()> codex_home.path().to_path_buf(), )?; - assert_eq!( - config.model_provider.wire_api, - crate::model_provider_info::WireApi::Responses - ); + assert_eq!(config.model_provider.wire_api, WireApi::Responses); } Ok(()) @@ -4242,7 +4241,7 @@ fn load_config_rejects_unsafe_agent_role_nickname_candidates() -> std::io::Resul fn model_catalog_json_loads_from_path() -> std::io::Result<()> { let codex_home = TempDir::new()?; let catalog_path = codex_home.path().join("catalog.json"); - let mut catalog = codex_models_manager::bundled_models_response() + let mut catalog = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); catalog.models = catalog.models.into_iter().take(1).collect(); std::fs::write( @@ -4357,7 +4356,7 @@ model_verbosity = "high" name: "OpenAI custom".to_string(), base_url: Some("https://api.openai.com/v1".to_string()), env_key: Some("OPENAI_API_KEY".to_string()), - wire_api: crate::WireApi::Responses, + wire_api: WireApi::Responses, env_key_instructions: None, experimental_bearer_token: None, auth: None, diff --git a/codex-rs/core/src/config/mod.rs b/codex-rs/core/src/config/mod.rs index d85ba15f18..8f1db5ed75 100644 --- a/codex-rs/core/src/config/mod.rs +++ b/codex-rs/core/src/config/mod.rs @@ -13,13 +13,6 @@ use crate::config_loader::ResidencyRequirement; use crate::config_loader::Sourced; use crate::config_loader::load_config_layers_state; use crate::memories::memory_root; -use crate::model_provider_info::LEGACY_OLLAMA_CHAT_PROVIDER_ID; -use crate::model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; -use crate::model_provider_info::ModelProviderInfo; -use crate::model_provider_info::OLLAMA_CHAT_PROVIDER_REMOVED_ERROR; -use crate::model_provider_info::OLLAMA_OSS_PROVIDER_ID; -use crate::model_provider_info::OPENAI_PROVIDER_ID; -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; @@ -65,6 +58,13 @@ 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_model_provider_info::LEGACY_OLLAMA_CHAT_PROVIDER_ID; +use codex_model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; +use codex_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::OLLAMA_CHAT_PROVIDER_REMOVED_ERROR; +use codex_model_provider_info::OLLAMA_OSS_PROVIDER_ID; +use codex_model_provider_info::OPENAI_PROVIDER_ID; +use codex_model_provider_info::built_in_model_providers; use codex_models_manager::ModelsManagerConfig; use codex_protocol::config_types::AltScreenMode; use codex_protocol::config_types::ForcedLoginMethod; diff --git a/codex-rs/core/src/exec.rs b/codex-rs/core/src/exec.rs index 28be1b1e52..309dbbb01b 100644 --- a/codex-rs/core/src/exec.rs +++ b/codex-rs/core/src/exec.rs @@ -17,9 +17,6 @@ use tokio::io::BufReader; use tokio::process::Child; use tokio_util::sync::CancellationToken; -use crate::error::CodexErr; -use crate::error::Result; -use crate::error::SandboxErr; use crate::sandboxing::ExecOptions; use crate::sandboxing::ExecRequest; use crate::sandboxing::SandboxPermissions; @@ -28,8 +25,11 @@ use crate::spawn::StdioPolicy; use crate::spawn::spawn_child_async; use codex_network_proxy::NetworkProxy; use codex_protocol::config_types::WindowsSandboxLevel; -pub use codex_protocol::exec_output::ExecToolCallOutput; -pub use codex_protocol::exec_output::StreamOutput; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; +use codex_protocol::error::SandboxErr; +use codex_protocol::exec_output::ExecToolCallOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::permissions::FileSystemSandboxKind; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; diff --git a/codex-rs/core/src/guardian/review.rs b/codex-rs/core/src/guardian/review.rs index 23d5cb99b0..c984e3d243 100644 --- a/codex-rs/core/src/guardian/review.rs +++ b/codex-rs/core/src/guardian/review.rs @@ -274,7 +274,7 @@ pub(super) async fn run_guardian_review_session( let available_models = session .services .models_manager - .list_models(crate::models_manager::manager::RefreshStrategy::Offline) + .list_models(codex_models_manager::manager::RefreshStrategy::Offline) .await; let preferred_reasoning_effort = |supports_low: bool, fallback| { if supports_low { diff --git a/codex-rs/core/src/guardian/review_session.rs b/codex-rs/core/src/guardian/review_session.rs index 2a63e5b547..bc24974c82 100644 --- a/codex-rs/core/src/guardian/review_session.rs +++ b/codex-rs/core/src/guardian/review_session.rs @@ -34,10 +34,10 @@ use crate::config::Constrained; use crate::config::ManagedFeatures; use crate::config::NetworkProxySpec; use crate::config::Permissions; -use crate::model_provider_info::ModelProviderInfo; use crate::rollout::recorder::RolloutRecorder; use codex_config::types::McpServerConfig; use codex_features::Feature; +use codex_model_provider_info::ModelProviderInfo; use super::GUARDIAN_REVIEW_TIMEOUT; use super::GUARDIAN_REVIEWER_NAME; diff --git a/codex-rs/core/src/lib.rs b/codex-rs/core/src/lib.rs index 5a401767e3..2cf34b0de5 100644 --- a/codex-rs/core/src/lib.rs +++ b/codex-rs/core/src/lib.rs @@ -5,13 +5,9 @@ // the TUI or the tracing stack). #![deny(clippy::print_stdout, clippy::print_stderr)] -pub use codex_login::api_bridge; mod apply_patch; mod apps; mod arc_monitor; -pub use codex_login as auth; -pub use codex_login::auth_env_telemetry; -pub use codex_login::default_client; mod client; mod client_common; pub mod codex; @@ -32,7 +28,6 @@ pub mod connectors; mod context_manager; mod contextual_user_message; mod environment_context; -pub use codex_protocol::error; pub mod exec; pub mod exec_env; mod exec_policy; @@ -48,7 +43,6 @@ pub mod landlock; pub mod mcp; mod mcp_skill_dependencies; mod mcp_tool_approval_templates; -pub use codex_models_manager as models_manager; mod network_policy_decision; pub mod network_proxy_loader; mod original_image_detail; @@ -60,8 +54,6 @@ mod mcp_tool_call; mod memories; pub mod mention_syntax; pub mod message_history; -pub use codex_login::model_provider_info; -pub use codex_login::provider_auth; pub mod utils; pub use utils::path_utils; pub mod personality_migration; @@ -100,25 +92,11 @@ pub(crate) use skills::skills_load_input_from_config; mod skills_watcher; mod stream_events_utils; pub mod test_support; -mod text_encoding { - pub use codex_protocol::exec_output::bytes_to_string_smart; -} mod unified_exec; pub mod windows_sandbox; pub use client::X_RESPONSESAPI_INCLUDE_TIMING_METRICS_HEADER; -pub use codex_login::DEFAULT_LMSTUDIO_PORT; -pub use codex_login::DEFAULT_OLLAMA_PORT; -pub use codex_login::LMSTUDIO_OSS_PROVIDER_ID; -pub use codex_login::ModelProviderInfo; -pub use codex_login::OLLAMA_OSS_PROVIDER_ID; -pub use codex_login::OPENAI_PROVIDER_ID; -pub use codex_login::WireApi; -pub use codex_login::built_in_model_providers; -pub use codex_login::create_oss_provider_with_base_url; pub use codex_protocol::config_types::ModelProviderAuthInfo; -pub use text_encoding::bytes_to_string_smart; mod event_mapping; -pub use codex_response_debug_context as response_debug_context; pub mod review_format; pub mod review_prompts; mod thread_manager; diff --git a/codex-rs/core/src/memories/phase1.rs b/codex-rs/core/src/memories/phase1.rs index 179620fe64..37cb0e9f48 100644 --- a/codex-rs/core/src/memories/phase1.rs +++ b/codex-rs/core/src/memories/phase1.rs @@ -4,7 +4,6 @@ use crate::codex::Session; use crate::codex::TurnContext; use crate::config::Config; use crate::contextual_user_message::is_memory_excluded_contextual_user_fragment; -use crate::error::CodexErr; use crate::memories::metrics; use crate::memories::phase_one; use crate::memories::phase_one::PRUNE_BATCH_SIZE; @@ -16,6 +15,7 @@ use codex_config::types::MemoriesConfig; use codex_otel::SessionTelemetry; use codex_protocol::config_types::ReasoningSummary as ReasoningSummaryConfig; use codex_protocol::config_types::ServiceTier; +use codex_protocol::error::CodexErr; use codex_protocol::models::BaseInstructions; use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/core/src/memories/prompts_tests.rs b/codex-rs/core/src/memories/prompts_tests.rs index 91cdf049a7..c67a386146 100644 --- a/codex-rs/core/src/memories/prompts_tests.rs +++ b/codex-rs/core/src/memories/prompts_tests.rs @@ -1,5 +1,5 @@ use super::*; -use crate::models_manager::model_info::model_info_from_slug; +use codex_models_manager::model_info::model_info_from_slug; use pretty_assertions::assert_eq; use tempfile::tempdir; use tokio::fs as tokio_fs; diff --git a/codex-rs/core/src/memory_trace.rs b/codex-rs/core/src/memory_trace.rs index 2e613e6713..ae501ee94c 100644 --- a/codex-rs/core/src/memory_trace.rs +++ b/codex-rs/core/src/memory_trace.rs @@ -2,11 +2,11 @@ use std::path::Path; use std::path::PathBuf; use crate::ModelClient; -use crate::error::CodexErr; -use crate::error::Result; use codex_api::RawMemory as ApiRawMemory; use codex_api::RawMemoryMetadata as ApiRawMemoryMetadata; use codex_otel::SessionTelemetry; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig; use serde_json::Map; diff --git a/codex-rs/core/src/realtime_conversation.rs b/codex-rs/core/src/realtime_conversation.rs index fafbb50633..dae8f5c5ce 100644 --- a/codex-rs/core/src/realtime_conversation.rs +++ b/codex-rs/core/src/realtime_conversation.rs @@ -1,9 +1,6 @@ -use crate::api_bridge::map_api_error; use crate::codex::Session; use crate::config::RealtimeWsMode; use crate::config::RealtimeWsVersion; -use crate::error::CodexErr; -use crate::error::Result as CodexResult; use crate::realtime_context::build_realtime_startup_context; use async_channel::Receiver; use async_channel::Sender; @@ -17,12 +14,16 @@ use codex_api::RealtimeEventParser; use codex_api::RealtimeSessionConfig; use codex_api::RealtimeSessionMode; use codex_api::RealtimeWebsocketClient; +use codex_api::api_bridge::map_api_error; use codex_api::endpoint::realtime_websocket::RealtimeWebsocketEvents; use codex_api::endpoint::realtime_websocket::RealtimeWebsocketWriter; -use codex_login::AuthMode; +use codex_app_server_protocol::AuthMode; use codex_login::CodexAuth; use codex_login::default_client::default_headers; use codex_login::read_openai_api_key_from_env; +use codex_model_provider_info::ModelProviderInfo; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; use codex_protocol::protocol::CodexErrorInfo; use codex_protocol::protocol::ConversationAudioParams; use codex_protocol::protocol::ConversationStartParams; @@ -631,10 +632,7 @@ fn realtime_text_from_handoff_request(handoff: &RealtimeHandoffRequested) -> Opt .or((!handoff.input_transcript.is_empty()).then_some(handoff.input_transcript.clone())) } -fn realtime_api_key( - auth: Option<&CodexAuth>, - provider: &crate::ModelProviderInfo, -) -> CodexResult { +fn realtime_api_key(auth: Option<&CodexAuth>, provider: &ModelProviderInfo) -> CodexResult { if let Some(api_key) = provider.api_key()? { return Ok(api_key); } diff --git a/codex-rs/core/src/sandboxing/mod.rs b/codex-rs/core/src/sandboxing/mod.rs index d4c12cc3e3..0427de7c76 100644 --- a/codex-rs/core/src/sandboxing/mod.rs +++ b/codex-rs/core/src/sandboxing/mod.rs @@ -9,7 +9,6 @@ ExecRequest for execution. use crate::exec::ExecCapturePolicy; use crate::exec::ExecExpiration; -use crate::exec::ExecToolCallOutput; use crate::exec::StdoutStream; use crate::exec::WindowsRestrictedTokenFilesystemOverlay; use crate::exec::execute_exec_request; @@ -18,6 +17,7 @@ use crate::spawn::CODEX_SANDBOX_ENV_VAR; use crate::spawn::CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR; use codex_network_proxy::NetworkProxy; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::exec_output::ExecToolCallOutput; pub use codex_protocol::models::SandboxPermissions; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; diff --git a/codex-rs/core/src/session_rollout_init_error.rs b/codex-rs/core/src/session_rollout_init_error.rs index ee48bb2029..57e1e8e57a 100644 --- a/codex-rs/core/src/session_rollout_init_error.rs +++ b/codex-rs/core/src/session_rollout_init_error.rs @@ -1,8 +1,8 @@ use std::io::ErrorKind; use std::path::Path; -use crate::error::CodexErr; use crate::rollout::SESSIONS_SUBDIR; +use codex_protocol::error::CodexErr; pub(crate) fn map_session_init_error(err: &anyhow::Error, codex_home: &Path) -> CodexErr { if let Some(mapped) = err diff --git a/codex-rs/core/src/session_startup_prewarm.rs b/codex-rs/core/src/session_startup_prewarm.rs index 326d864f1e..397ffc949c 100644 --- a/codex-rs/core/src/session_startup_prewarm.rs +++ b/codex-rs/core/src/session_startup_prewarm.rs @@ -13,10 +13,10 @@ use crate::codex::INITIAL_SUBMIT_ID; use crate::codex::Session; use crate::codex::build_prompt; use crate::codex::built_tools; -use crate::error::Result as CodexResult; use codex_otel::SessionTelemetry; use codex_otel::metrics::names::STARTUP_PREWARM_AGE_AT_FIRST_TURN_METRIC; use codex_otel::metrics::names::STARTUP_PREWARM_DURATION_METRIC; +use codex_protocol::error::Result as CodexResult; use codex_protocol::models::BaseInstructions; pub(crate) struct SessionStartupPrewarmHandle { diff --git a/codex-rs/core/src/state/service.rs b/codex-rs/core/src/state/service.rs index a7c384202f..e0d7741f41 100644 --- a/codex-rs/core/src/state/service.rs +++ b/codex-rs/core/src/state/service.rs @@ -7,7 +7,6 @@ use crate::client::ModelClient; use crate::config::StartedNetworkProxy; use crate::exec_policy::ExecPolicyManager; use crate::mcp::McpManager; -use crate::models_manager::manager::ModelsManager; use crate::plugins::PluginsManager; use crate::skills_watcher::SkillsWatcher; use crate::tools::code_mode::CodeModeService; @@ -19,6 +18,7 @@ use codex_exec_server::Environment; use codex_hooks::Hooks; use codex_login::AuthManager; use codex_mcp::mcp_connection_manager::McpConnectionManager; +use codex_models_manager::manager::ModelsManager; use codex_otel::SessionTelemetry; use codex_rollout::state_db::StateDbHandle; use std::path::PathBuf; diff --git a/codex-rs/core/src/stream_events_utils.rs b/codex-rs/core/src/stream_events_utils.rs index 931b8429c8..75eb1a8c22 100644 --- a/codex-rs/core/src/stream_events_utils.rs +++ b/codex-rs/core/src/stream_events_utils.rs @@ -12,14 +12,14 @@ use tokio_util::sync::CancellationToken; use crate::codex::Session; use crate::codex::TurnContext; -use crate::error::CodexErr; -use crate::error::Result; 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::tools::parallel::ToolCallRuntime; use crate::tools::router::ToolRouter; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; use codex_protocol::models::DeveloperInstructions; use codex_protocol::models::FunctionCallOutputBody; use codex_protocol::models::FunctionCallOutputPayload; diff --git a/codex-rs/core/src/stream_events_utils_tests.rs b/codex-rs/core/src/stream_events_utils_tests.rs index f2b0012780..712a537216 100644 --- a/codex-rs/core/src/stream_events_utils_tests.rs +++ b/codex-rs/core/src/stream_events_utils_tests.rs @@ -4,7 +4,7 @@ use super::image_generation_artifact_path; use super::last_assistant_message_from_item; use super::save_image_generation_result; use crate::codex::make_session_and_context; -use crate::error::CodexErr; +use codex_protocol::error::CodexErr; use codex_protocol::items::TurnItem; use codex_protocol::models::ContentItem; use codex_protocol::models::MessagePhase; diff --git a/codex-rs/core/src/tasks/mod.rs b/codex-rs/core/src/tasks/mod.rs index c0b5ad4d91..5272921586 100644 --- a/codex-rs/core/src/tasks/mod.rs +++ b/codex-rs/core/src/tasks/mod.rs @@ -27,11 +27,11 @@ use crate::hook_runtime::PendingInputHookDisposition; 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::state::ActiveTurn; use crate::state::RunningTask; use crate::state::TaskKind; use codex_login::AuthManager; +use codex_models_manager::manager::ModelsManager; use codex_otel::SessionTelemetry; use codex_otel::metrics::names::TURN_E2E_DURATION_METRIC; use codex_otel::metrics::names::TURN_NETWORK_PROXY_METRIC; diff --git a/codex-rs/core/src/tasks/user_shell.rs b/codex-rs/core/src/tasks/user_shell.rs index 449db837fd..bd473138b6 100644 --- a/codex-rs/core/src/tasks/user_shell.rs +++ b/codex-rs/core/src/tasks/user_shell.rs @@ -10,9 +10,7 @@ use uuid::Uuid; use crate::codex::TurnContext; use crate::exec::ExecCapturePolicy; -use crate::exec::ExecToolCallOutput; use crate::exec::StdoutStream; -use crate::exec::StreamOutput; use crate::exec::execute_exec_request; use crate::exec_env::create_env; use crate::sandboxing::ExecRequest; @@ -20,6 +18,8 @@ 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::exec_output::ExecToolCallOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ExecCommandBeginEvent; use codex_protocol::protocol::ExecCommandEndEvent; diff --git a/codex-rs/core/src/test_support.rs b/codex-rs/core/src/test_support.rs index 2abb20b9f3..804f84208b 100644 --- a/codex-rs/core/src/test_support.rs +++ b/codex-rs/core/src/test_support.rs @@ -8,23 +8,24 @@ use std::path::PathBuf; use std::sync::Arc; use codex_exec_server::EnvironmentManager; +use codex_login::AuthManager; +use codex_login::CodexAuth; +use codex_model_provider_info::ModelProviderInfo; +use codex_models_manager::bundled_models_response; +use codex_models_manager::collaboration_mode_presets; +use codex_models_manager::manager::ModelsManager; use codex_protocol::config_types::CollaborationModeMask; use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelPreset; use once_cell::sync::Lazy; -use crate::ModelProviderInfo; use crate::ThreadManager; use crate::config::Config; -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 mut response = codex_models_manager::bundled_models_response() + let mut response = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); response.models.sort_by(|a, b| a.priority.cmp(&b.priority)); let mut presets: Vec = response.models.into_iter().map(Into::into).collect(); diff --git a/codex-rs/core/src/thread_manager.rs b/codex-rs/core/src/thread_manager.rs index 94a81d6209..f560a306b8 100644 --- a/codex-rs/core/src/thread_manager.rs +++ b/codex-rs/core/src/thread_manager.rs @@ -1,5 +1,3 @@ -use crate::ModelProviderInfo; -use crate::OPENAI_PROVIDER_ID; use crate::SkillsManager; use crate::agent::AgentControl; use crate::codex::Codex; @@ -8,12 +6,8 @@ use crate::codex::CodexSpawnOk; use crate::codex::INITIAL_SUBMIT_ID; use crate::codex_thread::CodexThread; use crate::config::Config; -use crate::error::CodexErr; -use crate::error::Result as CodexResult; use crate::file_watcher::FileWatcher; use crate::mcp::McpManager; -use crate::models_manager::collaboration_mode_presets::CollaborationModesConfig; -use crate::models_manager::manager::ModelsManager; use crate::plugins::PluginsManager; use crate::rollout::RolloutRecorder; use crate::rollout::truncation; @@ -26,8 +20,15 @@ use codex_app_server_protocol::TurnStatus; use codex_exec_server::EnvironmentManager; use codex_login::AuthManager; use codex_login::CodexAuth; +use codex_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::OPENAI_PROVIDER_ID; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; +use codex_models_manager::manager::ModelsManager; +use codex_models_manager::manager::RefreshStrategy; use codex_protocol::ThreadId; use codex_protocol::config_types::CollaborationModeMask; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result as CodexResult; #[cfg(test)] use codex_protocol::models::ResponseItem; use codex_protocol::openai_models::ModelPreset; @@ -356,10 +357,7 @@ impl ThreadManager { self.state.models_manager.clone() } - pub async fn list_models( - &self, - refresh_strategy: crate::models_manager::manager::RefreshStrategy, - ) -> Vec { + pub async fn list_models(&self, refresh_strategy: RefreshStrategy) -> Vec { self.state .models_manager .list_models(refresh_strategy) diff --git a/codex-rs/core/src/thread_manager_tests.rs b/codex-rs/core/src/thread_manager_tests.rs index 62a9aa199f..92ecd68afa 100644 --- a/codex-rs/core/src/thread_manager_tests.rs +++ b/codex-rs/core/src/thread_manager_tests.rs @@ -1,10 +1,10 @@ use super::*; use crate::codex::make_session_and_context; use crate::config::test_config; -use crate::models_manager::collaboration_mode_presets::CollaborationModesConfig; -use crate::models_manager::manager::RefreshStrategy; use crate::rollout::RolloutRecorder; use crate::tasks::interrupted_turn_history_marker; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; +use codex_models_manager::manager::RefreshStrategy; use codex_protocol::models::ContentItem; use codex_protocol::models::ReasoningItemReasoningSummary; use codex_protocol::models::ResponseItem; diff --git a/codex-rs/core/src/tools/events.rs b/codex-rs/core/src/tools/events.rs index b664235405..58438cf563 100644 --- a/codex-rs/core/src/tools/events.rs +++ b/codex-rs/core/src/tools/events.rs @@ -1,11 +1,11 @@ use crate::codex::Session; use crate::codex::TurnContext; -use crate::error::CodexErr; -use crate::error::SandboxErr; -use crate::exec::ExecToolCallOutput; use crate::function_tool::FunctionCallError; use crate::tools::context::SharedTurnDiffTracker; use crate::tools::sandboxing::ToolError; +use codex_protocol::error::CodexErr; +use codex_protocol::error::SandboxErr; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::parse_command::ParsedCommand; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ExecCommandBeginEvent; diff --git a/codex-rs/core/src/tools/handlers/agent_jobs.rs b/codex-rs/core/src/tools/handlers/agent_jobs.rs index 044e2072f9..fe30f3d750 100644 --- a/codex-rs/core/src/tools/handlers/agent_jobs.rs +++ b/codex-rs/core/src/tools/handlers/agent_jobs.rs @@ -4,7 +4,6 @@ use crate::agent::status::is_final; use crate::codex::Session; use crate::codex::TurnContext; use crate::config::Config; -use crate::error::CodexErr; use crate::function_tool::FunctionCallError; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolInvocation; @@ -14,6 +13,7 @@ use crate::tools::handlers::parse_arguments; use crate::tools::registry::ToolHandler; use crate::tools::registry::ToolKind; use codex_protocol::ThreadId; +use codex_protocol::error::CodexErr; use codex_protocol::protocol::AgentStatus; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::SubAgentSource; diff --git a/codex-rs/core/src/tools/handlers/js_repl.rs b/codex-rs/core/src/tools/handlers/js_repl.rs index cf8d0e8620..5493a7a904 100644 --- a/codex-rs/core/src/tools/handlers/js_repl.rs +++ b/codex-rs/core/src/tools/handlers/js_repl.rs @@ -3,8 +3,6 @@ use std::sync::Arc; use std::time::Duration; use std::time::Instant; -use crate::exec::ExecToolCallOutput; -use crate::exec::StreamOutput; use crate::function_tool::FunctionCallError; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolInvocation; @@ -19,6 +17,8 @@ use crate::tools::js_repl::JsReplArgs; use crate::tools::registry::ToolHandler; use crate::tools::registry::ToolKind; use codex_features::Feature; +use codex_protocol::exec_output::ExecToolCallOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::models::FunctionCallOutputContentItem; use codex_protocol::protocol::ExecCommandSource; diff --git a/codex-rs/core/src/tools/handlers/multi_agents/wait.rs b/codex-rs/core/src/tools/handlers/multi_agents/wait.rs index 8102b97329..77fa5f83a2 100644 --- a/codex-rs/core/src/tools/handlers/multi_agents/wait.rs +++ b/codex-rs/core/src/tools/handlers/multi_agents/wait.rs @@ -1,6 +1,6 @@ use super::*; use crate::agent::status::is_final; -use crate::error::CodexErr; +use codex_protocol::error::CodexErr; use futures::FutureExt; use futures::StreamExt; use futures::stream::FuturesUnordered; diff --git a/codex-rs/core/src/tools/handlers/multi_agents_common.rs b/codex-rs/core/src/tools/handlers/multi_agents_common.rs index f32fdf4312..2078c229b9 100644 --- a/codex-rs/core/src/tools/handlers/multi_agents_common.rs +++ b/codex-rs/core/src/tools/handlers/multi_agents_common.rs @@ -2,15 +2,15 @@ use crate::agent::AgentStatus; use crate::codex::Session; use crate::codex::TurnContext; use crate::config::Config; -use crate::error::CodexErr; use crate::function_tool::FunctionCallError; -use crate::models_manager::manager::RefreshStrategy; use crate::tools::context::FunctionToolOutput; use crate::tools::context::ToolOutput; use crate::tools::context::ToolPayload; use codex_features::Feature; +use codex_models_manager::manager::RefreshStrategy; use codex_protocol::AgentPath; use codex_protocol::ThreadId; +use codex_protocol::error::CodexErr; use codex_protocol::models::BaseInstructions; use codex_protocol::models::ResponseInputItem; use codex_protocol::openai_models::ReasoningEffort; 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 fa231e66b8..8250d84f31 100644 --- a/codex-rs/core/src/tools/handlers/multi_agents_tests.rs +++ b/codex-rs/core/src/tools/handlers/multi_agents_tests.rs @@ -1,6 +1,5 @@ use super::*; 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::function_tool::FunctionCallError; @@ -20,6 +19,7 @@ use codex_config::types::ShellEnvironmentPolicy; use codex_features::Feature; use codex_login::AuthManager; use codex_login::CodexAuth; +use codex_model_provider_info::built_in_model_providers; use codex_protocol::AgentPath; use codex_protocol::ThreadId; use codex_protocol::models::BaseInstructions; diff --git a/codex-rs/core/src/tools/mod.rs b/codex-rs/core/src/tools/mod.rs index e866d1f5f7..f94f896d20 100644 --- a/codex-rs/core/src/tools/mod.rs +++ b/codex-rs/core/src/tools/mod.rs @@ -12,7 +12,7 @@ pub mod runtimes; pub mod sandboxing; pub mod spec; -use crate::exec::ExecToolCallOutput; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_utils_output_truncation::TruncationPolicy; use codex_utils_output_truncation::formatted_truncate_text; use codex_utils_output_truncation::truncate_text; diff --git a/codex-rs/core/src/tools/orchestrator.rs b/codex-rs/core/src/tools/orchestrator.rs index 09f0dc5959..b1f64cfc74 100644 --- a/codex-rs/core/src/tools/orchestrator.rs +++ b/codex-rs/core/src/tools/orchestrator.rs @@ -6,9 +6,6 @@ simple sequence for any ToolRuntime: approval → select sandbox → attempt → retry with an escalated sandbox strategy on denial (no re‑approval thanks to caching). */ -use crate::error::CodexErr; -use crate::error::SandboxErr; -use crate::exec::ExecToolCallOutput; use crate::guardian::GUARDIAN_REJECTION_MESSAGE; use crate::guardian::routes_approval_to_guardian; use crate::network_policy_decision::network_approval_context_from_payload; @@ -26,6 +23,9 @@ use crate::tools::sandboxing::ToolError; use crate::tools::sandboxing::ToolRuntime; use crate::tools::sandboxing::default_exec_approval_requirement; use codex_otel::ToolDecisionSource; +use codex_protocol::error::CodexErr; +use codex_protocol::error::SandboxErr; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::NetworkPolicyRuleAction; use codex_protocol::protocol::ReviewDecision; diff --git a/codex-rs/core/src/tools/parallel.rs b/codex-rs/core/src/tools/parallel.rs index dbcf4f6391..0e649333df 100644 --- a/codex-rs/core/src/tools/parallel.rs +++ b/codex-rs/core/src/tools/parallel.rs @@ -11,7 +11,6 @@ use tracing::trace_span; use crate::codex::Session; use crate::codex::TurnContext; -use crate::error::CodexErr; use crate::function_tool::FunctionCallError; use crate::tools::context::AbortedToolOutput; use crate::tools::context::SharedTurnDiffTracker; @@ -20,6 +19,7 @@ use crate::tools::registry::AnyToolResult; use crate::tools::router::ToolCall; use crate::tools::router::ToolCallSource; use crate::tools::router::ToolRouter; +use codex_protocol::error::CodexErr; use codex_protocol::models::ResponseInputItem; use codex_tools::ToolSpec; diff --git a/codex-rs/core/src/tools/runtimes/apply_patch.rs b/codex-rs/core/src/tools/runtimes/apply_patch.rs index 20f5cc591e..a6dc8885a4 100644 --- a/codex-rs/core/src/tools/runtimes/apply_patch.rs +++ b/codex-rs/core/src/tools/runtimes/apply_patch.rs @@ -5,7 +5,6 @@ //! `codex --codex-run-as-apply-patch`, and runs under the current //! `SandboxAttempt` with a minimal environment. use crate::exec::ExecCapturePolicy; -use crate::exec::ExecToolCallOutput; use crate::guardian::GuardianApprovalRequest; use crate::guardian::review_approval_request; use crate::guardian::routes_approval_to_guardian; @@ -22,6 +21,7 @@ use crate::tools::sandboxing::ToolRuntime; use crate::tools::sandboxing::with_cached_approval; use codex_apply_patch::ApplyPatchAction; use codex_apply_patch::CODEX_CORE_APPLY_PATCH_ARG1; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::FileChange; diff --git a/codex-rs/core/src/tools/runtimes/shell.rs b/codex-rs/core/src/tools/runtimes/shell.rs index 27645ccb74..ba8713254a 100644 --- a/codex-rs/core/src/tools/runtimes/shell.rs +++ b/codex-rs/core/src/tools/runtimes/shell.rs @@ -10,7 +10,6 @@ pub(crate) mod zsh_fork_backend; use crate::command_canonicalization::canonicalize_command_for_approval; use crate::exec::ExecCapturePolicy; -use crate::exec::ExecToolCallOutput; use crate::guardian::GuardianApprovalRequest; use crate::guardian::review_approval_request; use crate::guardian::routes_approval_to_guardian; @@ -34,6 +33,7 @@ use crate::tools::sandboxing::ToolRuntime; use crate::tools::sandboxing::sandbox_override_for_first_attempt; use crate::tools::sandboxing::with_cached_approval; use codex_network_proxy::NetworkProxy; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::ReviewDecision; use codex_sandboxing::SandboxablePreference; diff --git a/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs b/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs index ab8c8369a2..b52fd8c863 100644 --- a/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs +++ b/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs @@ -1,10 +1,6 @@ use super::ShellRequest; -use crate::error::CodexErr; -use crate::error::SandboxErr; use crate::exec::ExecCapturePolicy; use crate::exec::ExecExpiration; -use crate::exec::ExecToolCallOutput; -use crate::exec::StreamOutput; use crate::exec::is_likely_sandbox_denied; use crate::guardian::GuardianApprovalRequest; use crate::guardian::review_approval_request; @@ -24,6 +20,10 @@ use codex_execpolicy::Policy; use codex_execpolicy::RuleMatch; use codex_features::Feature; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::error::CodexErr; +use codex_protocol::error::SandboxErr; +use codex_protocol::exec_output::ExecToolCallOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::models::PermissionProfile; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; diff --git a/codex-rs/core/src/tools/runtimes/shell/zsh_fork_backend.rs b/codex-rs/core/src/tools/runtimes/shell/zsh_fork_backend.rs index 527be2d8a4..819658ecca 100644 --- a/codex-rs/core/src/tools/runtimes/shell/zsh_fork_backend.rs +++ b/codex-rs/core/src/tools/runtimes/shell/zsh_fork_backend.rs @@ -1,11 +1,11 @@ use super::ShellRequest; -use crate::exec::ExecToolCallOutput; use crate::sandboxing::ExecRequest; use crate::tools::runtimes::unified_exec::UnifiedExecRequest; use crate::tools::sandboxing::SandboxAttempt; use crate::tools::sandboxing::ToolCtx; use crate::tools::sandboxing::ToolError; use crate::unified_exec::SpawnLifecycleHandle; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_tools::ZshForkConfig; pub(crate) struct PreparedUnifiedExecSpawn { diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs index bafb614ec0..86610bbb2a 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs @@ -5,8 +5,6 @@ Handles approval + sandbox orchestration for unified exec requests, delegating t the process manager to spawn PTYs once an ExecRequest is prepared. */ use crate::command_canonicalization::canonicalize_command_for_approval; -use crate::error::CodexErr; -use crate::error::SandboxErr; use crate::exec::ExecCapturePolicy; use crate::exec::ExecExpiration; use crate::guardian::GuardianApprovalRequest; @@ -36,6 +34,8 @@ use crate::unified_exec::UnifiedExecError; use crate::unified_exec::UnifiedExecProcess; use crate::unified_exec::UnifiedExecProcessManager; use codex_network_proxy::NetworkProxy; +use codex_protocol::error::CodexErr; +use codex_protocol::error::SandboxErr; use codex_protocol::models::PermissionProfile; use codex_protocol::protocol::ReviewDecision; use codex_sandboxing::SandboxablePreference; diff --git a/codex-rs/core/src/tools/sandboxing.rs b/codex-rs/core/src/tools/sandboxing.rs index 5316501e6d..c2671aabf0 100644 --- a/codex-rs/core/src/tools/sandboxing.rs +++ b/codex-rs/core/src/tools/sandboxing.rs @@ -6,7 +6,6 @@ use crate::codex::Session; use crate::codex::TurnContext; -use crate::error::CodexErr; use crate::sandboxing::ExecOptions; use crate::sandboxing::SandboxPermissions; use crate::state::SessionServices; @@ -14,6 +13,7 @@ use crate::tools::network_approval::NetworkApprovalSpec; use codex_network_proxy::NetworkProxy; use codex_protocol::approvals::ExecPolicyAmendment; use codex_protocol::approvals::NetworkApprovalContext; +use codex_protocol::error::CodexErr; use codex_protocol::permissions::FileSystemSandboxKind; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; diff --git a/codex-rs/core/src/tools/spec_tests.rs b/codex-rs/core/src/tools/spec_tests.rs index 1c24a4287d..4615b45319 100644 --- a/codex-rs/core/src/tools/spec_tests.rs +++ b/codex-rs/core/src/tools/spec_tests.rs @@ -1,5 +1,4 @@ use crate::config::test_config; -use crate::models_manager::model_info::with_config_overrides; use crate::shell::Shell; use crate::shell::ShellType; use crate::test_support::construct_model_info_offline; @@ -10,6 +9,8 @@ use codex_app_server_protocol::AppInfo; use codex_features::Feature; use codex_features::Features; use codex_mcp::mcp::CODEX_APPS_MCP_SERVER_NAME; +use codex_models_manager::bundled_models_response; +use codex_models_manager::model_info::with_config_overrides; use codex_protocol::config_types::WebSearchMode; use codex_protocol::config_types::WindowsSandboxLevel; use codex_protocol::openai_models::ConfigShellToolType; @@ -159,7 +160,7 @@ fn find_tool<'a>(tools: &'a [ConfiguredToolSpec], expected_name: &str) -> &'a Co fn model_info_from_models_json(slug: &str) -> ModelInfo { let config = test_config(); - let response = codex_models_manager::bundled_models_response() + let response = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let model = response .models diff --git a/codex-rs/core/src/unified_exec/async_watcher.rs b/codex-rs/core/src/unified_exec/async_watcher.rs index 45cbc0d670..a5da040976 100644 --- a/codex-rs/core/src/unified_exec/async_watcher.rs +++ b/codex-rs/core/src/unified_exec/async_watcher.rs @@ -11,14 +11,14 @@ use super::UnifiedExecContext; use super::process::UnifiedExecProcess; use crate::codex::Session; use crate::codex::TurnContext; -use crate::exec::ExecToolCallOutput; use crate::exec::MAX_EXEC_OUTPUT_DELTAS_PER_CALL; -use crate::exec::StreamOutput; 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::exec_output::ExecToolCallOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ExecCommandOutputDeltaEvent; use codex_protocol::protocol::ExecCommandSource; diff --git a/codex-rs/core/src/unified_exec/errors.rs b/codex-rs/core/src/unified_exec/errors.rs index c85210ab37..0576e7d7cf 100644 --- a/codex-rs/core/src/unified_exec/errors.rs +++ b/codex-rs/core/src/unified_exec/errors.rs @@ -1,4 +1,4 @@ -use crate::exec::ExecToolCallOutput; +use codex_protocol::exec_output::ExecToolCallOutput; use thiserror::Error; #[derive(Debug, Error)] diff --git a/codex-rs/core/src/unified_exec/process.rs b/codex-rs/core/src/unified_exec/process.rs index 658af57b14..007214c254 100644 --- a/codex-rs/core/src/unified_exec/process.rs +++ b/codex-rs/core/src/unified_exec/process.rs @@ -12,13 +12,13 @@ use tokio::task::JoinHandle; use tokio::time::Duration; use tokio_util::sync::CancellationToken; -use crate::exec::ExecToolCallOutput; -use crate::exec::StreamOutput; use crate::exec::is_likely_sandbox_denied; use codex_exec_server::ExecProcess; use codex_exec_server::ReadResponse as ExecReadResponse; use codex_exec_server::StartedExecProcess; use codex_exec_server::WriteStatus; +use codex_protocol::exec_output::ExecToolCallOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::protocol::TruncationPolicy; use codex_sandboxing::SandboxType; use codex_utils_output_truncation::formatted_truncate_text; diff --git a/codex-rs/core/src/user_shell_command.rs b/codex-rs/core/src/user_shell_command.rs index d46570e323..1678dae3e2 100644 --- a/codex-rs/core/src/user_shell_command.rs +++ b/codex-rs/core/src/user_shell_command.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use crate::exec::ExecToolCallOutput; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::models::ResponseItem; use crate::codex::TurnContext; diff --git a/codex-rs/core/src/user_shell_command_tests.rs b/codex-rs/core/src/user_shell_command_tests.rs index a034f404e5..f635aeecfb 100644 --- a/codex-rs/core/src/user_shell_command_tests.rs +++ b/codex-rs/core/src/user_shell_command_tests.rs @@ -1,6 +1,6 @@ use super::*; use crate::codex::make_session_and_context; -use crate::exec::StreamOutput; +use codex_protocol::exec_output::StreamOutput; use codex_protocol::models::ContentItem; use pretty_assertions::assert_eq; diff --git a/codex-rs/core/src/util.rs b/codex-rs/core/src/util.rs index a859bfd713..97fb44ba11 100644 --- a/codex-rs/core/src/util.rs +++ b/codex-rs/core/src/util.rs @@ -6,10 +6,6 @@ use codex_protocol::ThreadId; use rand::Rng; use tracing::error; -pub(crate) use codex_feedback::FeedbackRequestTags; -#[cfg(test)] -pub(crate) use codex_feedback::emit_feedback_request_tags; -pub(crate) use codex_feedback::emit_feedback_request_tags_with_auth_env; use codex_shell_command::parse_command::shlex_join; const INITIAL_DELAY_MS: u64 = 200; diff --git a/codex-rs/core/src/util_tests.rs b/codex-rs/core/src/util_tests.rs index 28f93b148f..3b589bb0b0 100644 --- a/codex-rs/core/src/util_tests.rs +++ b/codex-rs/core/src/util_tests.rs @@ -1,7 +1,7 @@ use super::*; -use crate::util::FeedbackRequestTags; -use crate::util::emit_feedback_request_tags; -use crate::util::emit_feedback_request_tags_with_auth_env; +use codex_feedback::FeedbackRequestTags; +use codex_feedback::emit_feedback_request_tags; +use codex_feedback::emit_feedback_request_tags_with_auth_env; use codex_login::AuthEnvTelemetry; use std::collections::BTreeMap; use std::sync::Arc; diff --git a/codex-rs/core/tests/all.rs b/codex-rs/core/tests/all.rs index ada0c3e154..ed4ead10e0 100644 --- a/codex-rs/core/tests/all.rs +++ b/codex-rs/core/tests/all.rs @@ -1,5 +1,5 @@ // Single integration test binary that aggregates all test modules. // The submodules live in `tests/all/`. -pub use codex_core::error; +pub use codex_protocol::error; mod suite; diff --git a/codex-rs/core/tests/common/Cargo.toml b/codex-rs/core/tests/common/Cargo.toml index 21f92dcdcb..e2765e8be6 100644 --- a/codex-rs/core/tests/common/Cargo.toml +++ b/codex-rs/core/tests/common/Cargo.toml @@ -19,6 +19,7 @@ codex-core = { workspace = true } codex-exec-server = { workspace = true } codex-features = { workspace = true } codex-login = { workspace = true } +codex-model-provider-info = { workspace = true } codex-models-manager = { workspace = true } codex-protocol = { workspace = true } codex-utils-absolute-path = { workspace = true } diff --git a/codex-rs/core/tests/common/test_codex.rs b/codex-rs/core/tests/common/test_codex.rs index 05527ee4ca..10957fd9f0 100644 --- a/codex-rs/core/tests/common/test_codex.rs +++ b/codex-rs/core/tests/common/test_codex.rs @@ -12,17 +12,18 @@ use anyhow::Context; use anyhow::Result; use anyhow::anyhow; use codex_core::CodexThread; -use codex_core::ModelProviderInfo; use codex_core::ThreadManager; -use codex_core::built_in_model_providers; use codex_core::config::Config; -use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_core::shell::Shell; 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_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::built_in_model_providers; +use codex_models_manager::bundled_models_response; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_protocol::config_types::ServiceTier; use codex_protocol::openai_models::ModelsResponse; use codex_protocol::protocol::AskForApproval; @@ -609,7 +610,7 @@ fn ensure_test_model_catalog(config: &mut Config) -> Result<()> { return Ok(()); } - let bundled_models = codex_models_manager::bundled_models_response() + let bundled_models = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let mut model = bundled_models .models diff --git a/codex-rs/core/tests/responses_headers.rs b/codex-rs/core/tests/responses_headers.rs index 8bed61458d..47c56357e1 100644 --- a/codex-rs/core/tests/responses_headers.rs +++ b/codex-rs/core/tests/responses_headers.rs @@ -2,11 +2,11 @@ use std::process::Command; use std::sync::Arc; 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_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::WireApi; use codex_otel::SessionTelemetry; use codex_otel::TelemetryAuthMode; use codex_protocol::ThreadId; diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index e7701abe70..95557c0207 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -1,18 +1,18 @@ -use crate::error::CodexErr; use codex_core::ModelClient; -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::built_in_model_providers; -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_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::WireApi; +use codex_model_provider_info::built_in_model_providers; +use codex_models_manager::bundled_models_response; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_otel::SessionTelemetry; use codex_otel::TelemetryAuthMode; use codex_protocol::ThreadId; @@ -22,6 +22,7 @@ use codex_protocol::config_types::ModelProviderAuthInfo; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::config_types::Settings; use codex_protocol::config_types::Verbosity; +use codex_protocol::error::CodexErr; use codex_protocol::models::ContentItem; use codex_protocol::models::FunctionCallOutputContentItem; use codex_protocol::models::FunctionCallOutputPayload; @@ -1635,7 +1636,7 @@ async fn user_turn_explicit_reasoning_summary_overrides_model_catalog_default() ) .await; - let mut model_catalog = codex_models_manager::bundled_models_response() + let mut model_catalog = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let model = model_catalog .models @@ -1748,7 +1749,7 @@ async fn reasoning_summary_none_overrides_model_catalog_default() -> anyhow::Res ) .await; - let mut model_catalog = codex_models_manager::bundled_models_response() + let mut model_catalog = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let model = model_catalog .models diff --git a/codex-rs/core/tests/suite/client_websockets.rs b/codex-rs/core/tests/suite/client_websockets.rs index f863ea0b6d..d348d4a022 100755 --- a/codex-rs/core/tests/suite/client_websockets.rs +++ b/codex-rs/core/tests/suite/client_websockets.rs @@ -3,13 +3,13 @@ use codex_api::WS_REQUEST_HEADER_TRACEPARENT_CLIENT_METADATA_KEY; use codex_api::WS_REQUEST_HEADER_TRACESTATE_CLIENT_METADATA_KEY; use codex_core::ModelClient; use codex_core::ModelClientSession; -use codex_core::ModelProviderInfo; use codex_core::Prompt; 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_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::WireApi; 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 1313c76178..df8fad124d 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -1,11 +1,12 @@ #![allow(clippy::expect_used)] -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_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::built_in_model_providers; +use codex_models_manager::bundled_models_response; use codex_protocol::items::TurnItem; use codex_protocol::openai_models::ModelInfo; use codex_protocol::openai_models::ModelsResponse; @@ -103,7 +104,7 @@ fn non_openai_model_provider(server: &MockServer) -> ModelProviderInfo { } fn model_info_with_context_window(slug: &str, context_window: i64) -> ModelInfo { - let models_response = codex_models_manager::bundled_models_response() + let models_response = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let mut model_info = models_response .models diff --git a/codex-rs/core/tests/suite/exec.rs b/codex-rs/core/tests/suite/exec.rs index e6dd109ccd..8739fd95e5 100644 --- a/codex-rs/core/tests/suite/exec.rs +++ b/codex-rs/core/tests/suite/exec.rs @@ -3,14 +3,14 @@ use std::collections::HashMap; use std::string::ToString; -use crate::error::Result; use codex_core::exec::ExecCapturePolicy; use codex_core::exec::ExecParams; -use codex_core::exec::ExecToolCallOutput; use codex_core::exec::process_exec_tool_call; use codex_core::sandboxing::SandboxPermissions; use codex_core::spawn::CODEX_SANDBOX_ENV_VAR; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::error::Result; +use codex_protocol::exec_output::ExecToolCallOutput; use codex_protocol::permissions::FileSystemSandboxPolicy; use codex_protocol::permissions::NetworkSandboxPolicy; use codex_protocol::protocol::SandboxPolicy; diff --git a/codex-rs/core/tests/suite/model_switching.rs b/codex-rs/core/tests/suite/model_switching.rs index 99cc747669..b14267af49 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_config::types::Personality; -use codex_core::models_manager::manager::RefreshStrategy; use codex_features::Feature; use codex_login::CodexAuth; +use codex_models_manager::manager::RefreshStrategy; 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 0e043bd9f6..94f2424db4 100644 --- a/codex-rs/core/tests/suite/models_cache_ttl.rs +++ b/codex-rs/core/tests/suite/models_cache_ttl.rs @@ -5,8 +5,9 @@ use anyhow::Result; use chrono::DateTime; use chrono::TimeZone; use chrono::Utc; -use codex_core::models_manager::manager::RefreshStrategy; use codex_login::CodexAuth; +use codex_models_manager::client_version_to_whole; +use codex_models_manager::manager::RefreshStrategy; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ModelInfo; @@ -153,7 +154,7 @@ async fn uses_cache_when_version_matches() -> Result<()> { let cache = ModelsCache { fetched_at: Utc::now(), etag: None, - client_version: Some(codex_core::models_manager::client_version_to_whole()), + client_version: Some(client_version_to_whole()), models: vec![cached_model], }; let cache_path = home.join(CACHE_FILE); @@ -244,7 +245,7 @@ async fn refreshes_when_cache_version_differs() -> Result<()> { let mut builder = test_codex().with_auth(CodexAuth::create_dummy_chatgpt_auth_for_testing()); builder = builder .with_pre_build_hook(move |home| { - let client_version = codex_core::models_manager::client_version_to_whole(); + let client_version = client_version_to_whole(); let cache = ModelsCache { fetched_at: Utc::now(), etag: None, diff --git a/codex-rs/core/tests/suite/personality.rs b/codex-rs/core/tests/suite/personality.rs index 22870cae73..172738ffd1 100644 --- a/codex-rs/core/tests/suite/personality.rs +++ b/codex-rs/core/tests/suite/personality.rs @@ -1,7 +1,7 @@ use codex_config::types::Personality; -use codex_core::models_manager::manager::ModelsManager; -use codex_core::models_manager::manager::RefreshStrategy; use codex_features::Feature; +use codex_models_manager::manager::ModelsManager; +use codex_models_manager::manager::RefreshStrategy; 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/remote_models.rs b/codex-rs/core/tests/suite/remote_models.rs index 0692f7efdb..9559397b7e 100644 --- a/codex-rs/core/tests/suite/remote_models.rs +++ b/codex-rs/core/tests/suite/remote_models.rs @@ -4,11 +4,12 @@ use std::sync::Arc; use anyhow::Result; -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_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::built_in_model_providers; +use codex_models_manager::bundled_models_response; +use codex_models_manager::manager::ModelsManager; +use codex_models_manager::manager::RefreshStrategy; use codex_protocol::config_types::ReasoningSummary; use codex_protocol::openai_models::ConfigShellToolType; use codex_protocol::openai_models::ModelInfo; @@ -976,7 +977,7 @@ async fn wait_for_model_available(manager: &Arc, slug: &str) -> M } fn bundled_model_slug() -> String { - let response = codex_models_manager::bundled_models_response() + let response = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); response .models diff --git a/codex-rs/core/tests/suite/rmcp_client.rs b/codex-rs/core/tests/suite/rmcp_client.rs index 4262a6aab0..68c2bc0106 100644 --- a/codex-rs/core/tests/suite/rmcp_client.rs +++ b/codex-rs/core/tests/suite/rmcp_client.rs @@ -11,8 +11,8 @@ use std::time::UNIX_EPOCH; use codex_config::types::McpServerConfig; use codex_config::types::McpServerTransportConfig; -use codex_core::models_manager::manager::RefreshStrategy; use codex_login::CodexAuth; +use codex_models_manager::manager::RefreshStrategy; 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 79fe4bff4e..d41785bd4e 100644 --- a/codex-rs/core/tests/suite/search_tool.rs +++ b/codex-rs/core/tests/suite/search_tool.rs @@ -5,6 +5,7 @@ use anyhow::Result; use codex_core::config::Config; use codex_features::Feature; use codex_login::CodexAuth; +use codex_models_manager::bundled_models_response; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::McpInvocation; @@ -93,7 +94,7 @@ fn configure_apps_without_tool_search(config: &mut Config, apps_base_url: &str) config.chatgpt_base_url = apps_base_url.to_string(); config.model = Some("gpt-5-codex".to_string()); - let mut model_catalog = codex_models_manager::bundled_models_response() + let mut model_catalog = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let model = model_catalog .models diff --git a/codex-rs/core/tests/suite/spawn_agent_description.rs b/codex-rs/core/tests/suite/spawn_agent_description.rs index 3b1cfa2002..0200a945c5 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::models_manager::manager::ModelsManager; -use codex_core::models_manager::manager::RefreshStrategy; use codex_features::Feature; use codex_login::CodexAuth; +use codex_models_manager::manager::ModelsManager; +use codex_models_manager::manager::RefreshStrategy; 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/stream_error_allows_next_turn.rs b/codex-rs/core/tests/suite/stream_error_allows_next_turn.rs index 159db302b2..19d9d27cf7 100644 --- a/codex-rs/core/tests/suite/stream_error_allows_next_turn.rs +++ b/codex-rs/core/tests/suite/stream_error_allows_next_turn.rs @@ -1,5 +1,5 @@ -use codex_core::ModelProviderInfo; -use codex_core::WireApi; +use codex_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::WireApi; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/core/tests/suite/stream_no_completed.rs b/codex-rs/core/tests/suite/stream_no_completed.rs index df711ee302..0c4d7cb49d 100644 --- a/codex-rs/core/tests/suite/stream_no_completed.rs +++ b/codex-rs/core/tests/suite/stream_no_completed.rs @@ -1,8 +1,8 @@ //! Verifies that the agent retries when the SSE stream terminates before //! delivering a `response.completed` event. -use codex_core::ModelProviderInfo; -use codex_core::WireApi; +use codex_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::WireApi; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; use codex_protocol::user_input::UserInput; diff --git a/codex-rs/core/tests/suite/tool_suggest.rs b/codex-rs/core/tests/suite/tool_suggest.rs index 73c97838b6..1269e178d2 100644 --- a/codex-rs/core/tests/suite/tool_suggest.rs +++ b/codex-rs/core/tests/suite/tool_suggest.rs @@ -7,6 +7,7 @@ use codex_config::types::ToolSuggestDiscoverableType; use codex_core::config::Config; use codex_features::Feature; use codex_login::CodexAuth; +use codex_models_manager::bundled_models_response; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::SandboxPolicy; use core_test_support::apps_test_server::AppsTestServer; @@ -77,7 +78,7 @@ fn configure_apps_without_search_tool(config: &mut Config, apps_base_url: &str) id: DISCOVERABLE_GMAIL_ID.to_string(), }]; - let mut model_catalog = codex_models_manager::bundled_models_response() + let mut model_catalog = bundled_models_response() .unwrap_or_else(|err| panic!("bundled models.json should parse: {err}")); let model = model_catalog .models diff --git a/codex-rs/core/tests/suite/websocket_fallback.rs b/codex-rs/core/tests/suite/websocket_fallback.rs index e7f33df148..c55e72ec64 100644 --- a/codex-rs/core/tests/suite/websocket_fallback.rs +++ b/codex-rs/core/tests/suite/websocket_fallback.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use codex_model_provider_info::WireApi; use codex_protocol::protocol::AskForApproval; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::Op; @@ -43,7 +44,7 @@ async fn websocket_fallback_switches_to_http_on_upgrade_required_connect() -> Re let base_url = format!("{}/v1", server.uri()); move |config| { config.model_provider.base_url = Some(base_url); - config.model_provider.wire_api = codex_core::WireApi::Responses; + config.model_provider.wire_api = WireApi::Responses; config.model_provider.supports_websockets = true; // If we don't treat 426 specially, the sampling loop would retry the WebSocket // handshake before switching to the HTTP transport. @@ -89,7 +90,7 @@ async fn websocket_fallback_switches_to_http_after_retries_exhausted() -> Result let base_url = format!("{}/v1", server.uri()); move |config| { config.model_provider.base_url = Some(base_url); - config.model_provider.wire_api = codex_core::WireApi::Responses; + config.model_provider.wire_api = WireApi::Responses; config.model_provider.supports_websockets = true; config.model_provider.stream_max_retries = Some(2); config.model_provider.request_max_retries = Some(0); @@ -134,7 +135,7 @@ async fn websocket_fallback_hides_first_websocket_retry_stream_error() -> Result let base_url = format!("{}/v1", server.uri()); move |config| { config.model_provider.base_url = Some(base_url); - config.model_provider.wire_api = codex_core::WireApi::Responses; + config.model_provider.wire_api = WireApi::Responses; config.model_provider.supports_websockets = true; config.model_provider.stream_max_retries = Some(2); config.model_provider.request_max_retries = Some(0); @@ -210,7 +211,7 @@ async fn websocket_fallback_is_sticky_across_turns() -> Result<()> { let base_url = format!("{}/v1", server.uri()); move |config| { config.model_provider.base_url = Some(base_url); - config.model_provider.wire_api = codex_core::WireApi::Responses; + config.model_provider.wire_api = WireApi::Responses; config.model_provider.supports_websockets = true; config.model_provider.stream_max_retries = Some(2); config.model_provider.request_max_retries = Some(0); diff --git a/codex-rs/exec/Cargo.toml b/codex-rs/exec/Cargo.toml index 0933f4a44d..0ec5d9b3c8 100644 --- a/codex-rs/exec/Cargo.toml +++ b/codex-rs/exec/Cargo.toml @@ -31,6 +31,7 @@ codex-core = { workspace = true } codex-feedback = { workspace = true } codex-git-utils = { workspace = true } codex-login = { workspace = true } +codex-model-provider-info = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-utils-absolute-path = { workspace = true } diff --git a/codex-rs/exec/src/event_processor_with_human_output.rs b/codex-rs/exec/src/event_processor_with_human_output.rs index 2c390b215c..ca9387727a 100644 --- a/codex-rs/exec/src/event_processor_with_human_output.rs +++ b/codex-rs/exec/src/event_processor_with_human_output.rs @@ -8,8 +8,8 @@ use codex_app_server_protocol::ServerNotification; use codex_app_server_protocol::ThreadItem; use codex_app_server_protocol::ThreadTokenUsage; use codex_app_server_protocol::TurnStatus; -use codex_core::WireApi; use codex_core::config::Config; +use codex_model_provider_info::WireApi; use codex_protocol::num_format::format_with_separators; use codex_protocol::protocol::SandboxPolicy; use codex_protocol::protocol::SessionConfiguredEvent; diff --git a/codex-rs/exec/src/lib.rs b/codex-rs/exec/src/lib.rs index 5a396a9810..000bc11a8b 100644 --- a/codex-rs/exec/src/lib.rs +++ b/codex-rs/exec/src/lib.rs @@ -49,8 +49,6 @@ use codex_app_server_protocol::TurnStartResponse; use codex_app_server_protocol::TurnStartedNotification; 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::check_execpolicy_for_warnings; use codex_core::config::Config; use codex_core::config::ConfigBuilder; @@ -69,6 +67,8 @@ 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_model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; +use codex_model_provider_info::OLLAMA_OSS_PROVIDER_ID; use codex_otel::set_parent_from_context; use codex_otel::traceparent_context_from_env; use codex_protocol::config_types::SandboxMode; diff --git a/codex-rs/linux-sandbox/src/bwrap.rs b/codex-rs/linux-sandbox/src/bwrap.rs index dfc5b1282a..0709324f64 100644 --- a/codex-rs/linux-sandbox/src/bwrap.rs +++ b/codex-rs/linux-sandbox/src/bwrap.rs @@ -16,7 +16,7 @@ use std::os::fd::AsRawFd; use std::path::Path; use std::path::PathBuf; -use codex_core::error::Result; +use codex_protocol::error::Result; use codex_protocol::protocol::FileSystemSandboxPolicy; use codex_utils_absolute_path::AbsolutePathBuf; diff --git a/codex-rs/linux-sandbox/src/landlock.rs b/codex-rs/linux-sandbox/src/landlock.rs index 9a0e2c100c..5794982530 100644 --- a/codex-rs/linux-sandbox/src/landlock.rs +++ b/codex-rs/linux-sandbox/src/landlock.rs @@ -5,9 +5,9 @@ use std::collections::BTreeMap; use std::path::Path; -use codex_core::error::CodexErr; -use codex_core::error::Result; -use codex_core::error::SandboxErr; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; +use codex_protocol::error::SandboxErr; use codex_protocol::protocol::NetworkSandboxPolicy; use codex_protocol::protocol::SandboxPolicy; use codex_utils_absolute_path::AbsolutePathBuf; diff --git a/codex-rs/linux-sandbox/tests/suite/landlock.rs b/codex-rs/linux-sandbox/tests/suite/landlock.rs index bb214905f2..ffe0d9e57d 100644 --- a/codex-rs/linux-sandbox/tests/suite/landlock.rs +++ b/codex-rs/linux-sandbox/tests/suite/landlock.rs @@ -1,15 +1,15 @@ #![cfg(target_os = "linux")] #![allow(clippy::unwrap_used)] use codex_config::types::ShellEnvironmentPolicy; -use codex_core::error::CodexErr; -use codex_core::error::Result; -use codex_core::error::SandboxErr; use codex_core::exec::ExecCapturePolicy; use codex_core::exec::ExecParams; use codex_core::exec::process_exec_tool_call; use codex_core::exec_env::create_env; use codex_core::sandboxing::SandboxPermissions; use codex_protocol::config_types::WindowsSandboxLevel; +use codex_protocol::error::CodexErr; +use codex_protocol::error::Result; +use codex_protocol::error::SandboxErr; use codex_protocol::permissions::FileSystemAccessMode; use codex_protocol::permissions::FileSystemPath; use codex_protocol::permissions::FileSystemSandboxEntry; @@ -63,7 +63,7 @@ async fn run_cmd_output( cmd: &[&str], writable_roots: &[PathBuf], timeout_ms: u64, -) -> codex_core::exec::ExecToolCallOutput { +) -> codex_protocol::exec_output::ExecToolCallOutput { run_cmd_result_with_writable_roots( cmd, writable_roots, @@ -81,7 +81,7 @@ async fn run_cmd_result_with_writable_roots( timeout_ms: u64, use_legacy_landlock: bool, network_access: bool, -) -> Result { +) -> Result { let sandbox_policy = SandboxPolicy::WorkspaceWrite { writable_roots: writable_roots .iter() @@ -116,7 +116,7 @@ async fn run_cmd_result_with_policies( network_sandbox_policy: NetworkSandboxPolicy, timeout_ms: u64, use_legacy_landlock: bool, -) -> Result { +) -> Result { let cwd = std::env::current_dir().expect("cwd should exist"); let sandbox_cwd = cwd.clone(); let params = ExecParams { @@ -148,7 +148,7 @@ async fn run_cmd_result_with_policies( .await } -fn is_bwrap_unavailable_output(output: &codex_core::exec::ExecToolCallOutput) -> bool { +fn is_bwrap_unavailable_output(output: &codex_protocol::exec_output::ExecToolCallOutput) -> bool { output.stderr.text.contains(BWRAP_UNAVAILABLE_ERR) || (output .stderr @@ -181,9 +181,9 @@ async fn should_skip_bwrap_tests() -> bool { } fn expect_denied( - result: Result, + result: Result, context: &str, -) -> codex_core::exec::ExecToolCallOutput { +) -> codex_protocol::exec_output::ExecToolCallOutput { match result { Ok(output) => { assert_ne!(output.exit_code, 0, "{context}: expected nonzero exit code"); diff --git a/codex-rs/lmstudio/Cargo.toml b/codex-rs/lmstudio/Cargo.toml index 5f4849638a..66ae4dc5f5 100644 --- a/codex-rs/lmstudio/Cargo.toml +++ b/codex-rs/lmstudio/Cargo.toml @@ -11,6 +11,7 @@ path = "src/lib.rs" [dependencies] codex-core = { path = "../core" } +codex-model-provider-info = { path = "../model-provider-info" } reqwest = { version = "0.12", features = ["json", "stream"] } serde_json = "1" tokio = { version = "1", features = ["rt"] } diff --git a/codex-rs/lmstudio/src/client.rs b/codex-rs/lmstudio/src/client.rs index 1d0c04c1ac..baad560115 100644 --- a/codex-rs/lmstudio/src/client.rs +++ b/codex-rs/lmstudio/src/client.rs @@ -1,5 +1,5 @@ -use codex_core::LMSTUDIO_OSS_PROVIDER_ID; use codex_core::config::Config; +use codex_model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; use std::io; use std::path::Path; diff --git a/codex-rs/login/src/api_bridge.rs b/codex-rs/login/src/api_bridge.rs index ebb451e160..4c432ff18d 100644 --- a/codex-rs/login/src/api_bridge.rs +++ b/codex-rs/login/src/api_bridge.rs @@ -1,8 +1,6 @@ +use codex_api::api_bridge::CoreAuthProvider; use codex_model_provider_info::ModelProviderInfo; -pub use codex_api::api_bridge::CoreAuthProvider; -pub use codex_api::api_bridge::map_api_error; - use crate::CodexAuth; pub fn auth_provider_from_auth( diff --git a/codex-rs/login/src/auth/auth_tests.rs b/codex-rs/login/src/auth/auth_tests.rs index 2388e5c15f..27064b6831 100644 --- a/codex-rs/login/src/auth/auth_tests.rs +++ b/codex-rs/login/src/auth/auth_tests.rs @@ -2,6 +2,7 @@ use super::*; use crate::auth::storage::FileAuthStorage; use crate::auth::storage::get_auth_file; use crate::token_data::IdTokenInfo; +use codex_app_server_protocol::AuthMode; use codex_protocol::account::PlanType as AccountPlanType; use codex_protocol::auth::KnownPlan as InternalKnownPlan; use codex_protocol::auth::PlanType as InternalPlanType; @@ -107,7 +108,7 @@ async fn pro_account_with_no_api_key_uses_chatgpt_auth() { .unwrap() .unwrap(); assert_eq!(None, auth.api_key()); - assert_eq!(crate::AuthMode::Chatgpt, auth.auth_mode()); + assert_eq!(AuthMode::Chatgpt, auth.auth_mode()); assert_eq!(auth.get_chatgpt_user_id().as_deref(), Some("user-12345")); let auth_dot_json = auth @@ -157,7 +158,7 @@ async fn loads_api_key_from_auth_json() { ) .unwrap() .unwrap(); - assert_eq!(auth.auth_mode(), crate::AuthMode::ApiKey); + assert_eq!(auth.auth_mode(), AuthMode::ApiKey); assert_eq!(auth.api_key(), Some("sk-test-key")); assert!(auth.get_token_data().is_err()); @@ -283,7 +284,7 @@ async fn external_bearer_only_auth_manager_uses_cached_provider_token() { assert_eq!(first.as_deref(), Some("provider-token")); assert_eq!(second.as_deref(), Some("provider-token")); - assert_eq!(manager.auth_mode(), Some(crate::AuthMode::ApiKey)); + assert_eq!(manager.auth_mode(), Some(AuthMode::ApiKey)); assert_eq!(manager.get_api_auth_mode(), Some(ApiAuthMode::ApiKey)); } diff --git a/codex-rs/login/src/auth/external_bearer.rs b/codex-rs/login/src/auth/external_bearer.rs index 32cd024dc1..c179f48619 100644 --- a/codex-rs/login/src/auth/external_bearer.rs +++ b/codex-rs/login/src/auth/external_bearer.rs @@ -2,6 +2,7 @@ use super::manager::ExternalAuth; use super::manager::ExternalAuthRefreshContext; use super::manager::ExternalAuthTokens; use async_trait::async_trait; +use codex_app_server_protocol::AuthMode; use codex_protocol::config_types::ModelProviderAuthInfo; use std::fmt; use std::io; @@ -28,8 +29,8 @@ impl BearerTokenRefresher { #[async_trait] impl ExternalAuth for BearerTokenRefresher { - fn auth_mode(&self) -> crate::AuthMode { - crate::AuthMode::ApiKey + fn auth_mode(&self) -> AuthMode { + AuthMode::ApiKey } async fn resolve(&self) -> io::Result> { diff --git a/codex-rs/login/src/auth/manager.rs b/codex-rs/login/src/auth/manager.rs index 286966558d..9f58f0f090 100644 --- a/codex-rs/login/src/auth/manager.rs +++ b/codex-rs/login/src/auth/manager.rs @@ -14,6 +14,7 @@ use std::sync::Mutex; use std::sync::RwLock; use tokio::sync::Mutex as AsyncMutex; +use codex_app_server_protocol::AuthMode; use codex_app_server_protocol::AuthMode as ApiAuthMode; use codex_protocol::config_types::ForcedLoginMethod; use codex_protocol::config_types::ModelProviderAuthInfo; @@ -149,7 +150,7 @@ pub struct ExternalAuthRefreshContext { /// credentials on demand via `refresh()`. pub trait ExternalAuth: Send + Sync { /// Indicates which top-level auth mode this external provider supplies. - fn auth_mode(&self) -> crate::AuthMode; + fn auth_mode(&self) -> AuthMode; /// Returns cached or immediately available auth, if this provider can resolve it synchronously /// from the caller's perspective. @@ -226,10 +227,10 @@ impl CodexAuth { ) } - pub fn auth_mode(&self) -> crate::AuthMode { + pub fn auth_mode(&self) -> AuthMode { match self { - Self::ApiKey(_) => crate::AuthMode::ApiKey, - Self::Chatgpt(_) | Self::ChatgptAuthTokens(_) => crate::AuthMode::Chatgpt, + Self::ApiKey(_) => AuthMode::ApiKey, + Self::Chatgpt(_) | Self::ChatgptAuthTokens(_) => AuthMode::Chatgpt, } } @@ -242,11 +243,11 @@ impl CodexAuth { } pub fn is_api_key_auth(&self) -> bool { - self.auth_mode() == crate::AuthMode::ApiKey + self.auth_mode() == AuthMode::ApiKey } pub fn is_chatgpt_auth(&self) -> bool { - self.auth_mode() == crate::AuthMode::Chatgpt + self.auth_mode() == AuthMode::Chatgpt } pub fn is_external_chatgpt_tokens(&self) -> bool { @@ -503,15 +504,15 @@ pub fn enforce_login_restrictions(config: &AuthConfig) -> std::io::Result<()> { if let Some(required_method) = config.forced_login_method { let method_violation = match (required_method, auth.auth_mode()) { - (ForcedLoginMethod::Api, crate::AuthMode::ApiKey) => None, - (ForcedLoginMethod::Chatgpt, crate::AuthMode::Chatgpt) - | (ForcedLoginMethod::Chatgpt, crate::AuthMode::ChatgptAuthTokens) => None, - (ForcedLoginMethod::Api, crate::AuthMode::Chatgpt) - | (ForcedLoginMethod::Api, crate::AuthMode::ChatgptAuthTokens) => Some( + (ForcedLoginMethod::Api, AuthMode::ApiKey) => None, + (ForcedLoginMethod::Chatgpt, AuthMode::Chatgpt) + | (ForcedLoginMethod::Chatgpt, AuthMode::ChatgptAuthTokens) => None, + (ForcedLoginMethod::Api, AuthMode::Chatgpt) + | (ForcedLoginMethod::Api, AuthMode::ChatgptAuthTokens) => Some( "API key login is required, but ChatGPT is currently being used. Logging out." .to_string(), ), - (ForcedLoginMethod::Chatgpt, crate::AuthMode::ApiKey) => Some( + (ForcedLoginMethod::Chatgpt, AuthMode::ApiKey) => Some( "ChatGPT login is required, but an API key is currently being used. Logging out." .to_string(), ), @@ -1429,14 +1430,14 @@ impl AuthManager { .and_then(|guard| guard.as_ref().cloned()) } - fn external_auth_mode(&self) -> Option { + fn external_auth_mode(&self) -> Option { self.external_auth() .as_ref() .map(|external_auth| external_auth.auth_mode()) } fn has_external_api_key_auth(&self) -> bool { - self.external_auth_mode() == Some(crate::AuthMode::ApiKey) + self.external_auth_mode() == Some(AuthMode::ApiKey) } async fn resolve_external_api_key_auth(&self) -> Option { @@ -1550,9 +1551,9 @@ impl AuthManager { self.auth_cached().as_ref().map(CodexAuth::api_auth_mode) } - pub fn auth_mode(&self) -> Option { + pub fn auth_mode(&self) -> Option { if self.has_external_api_key_auth() { - return Some(crate::AuthMode::ApiKey); + return Some(AuthMode::ApiKey); } self.auth_cached().as_ref().map(CodexAuth::auth_mode) } @@ -1602,7 +1603,7 @@ impl AuthManager { .refresh(context) .await .map_err(RefreshTokenError::Transient)?; - if external_auth.auth_mode() == crate::AuthMode::ApiKey { + if external_auth.auth_mode() == AuthMode::ApiKey { return Ok(()); } let Some(chatgpt_metadata) = refreshed.chatgpt_metadata() else { diff --git a/codex-rs/login/src/auth_env_telemetry.rs b/codex-rs/login/src/auth_env_telemetry.rs index a17bceb02a..f8824268a4 100644 --- a/codex-rs/login/src/auth_env_telemetry.rs +++ b/codex-rs/login/src/auth_env_telemetry.rs @@ -1,7 +1,7 @@ +use codex_model_provider_info::ModelProviderInfo; use codex_otel::AuthEnvTelemetryMetadata; use crate::CODEX_API_KEY_ENV_VAR; -use crate::ModelProviderInfo; use crate::OPENAI_API_KEY_ENV_VAR; use crate::REFRESH_TOKEN_URL_OVERRIDE_ENV_VAR; @@ -53,7 +53,7 @@ fn env_var_present(name: &str) -> bool { #[cfg(test)] mod tests { use super::*; - use crate::WireApi; + use codex_model_provider_info::WireApi; use pretty_assertions::assert_eq; #[test] diff --git a/codex-rs/login/src/lib.rs b/codex-rs/login/src/lib.rs index d74cc0c7f2..ad77d82389 100644 --- a/codex-rs/login/src/lib.rs +++ b/codex-rs/login/src/lib.rs @@ -18,9 +18,7 @@ pub use server::ServerOptions; pub use server::ShutdownHandle; pub use server::run_login_server; -pub use api_bridge::CoreAuthProvider; pub use api_bridge::auth_provider_from_auth; -pub use api_bridge::map_api_error; pub use auth::AuthConfig; pub use auth::AuthCredentialsStoreMode; pub use auth::AuthDotJson; @@ -46,17 +44,6 @@ pub use auth::read_openai_api_key_from_env; pub use auth::save_auth; pub use auth_env_telemetry::AuthEnvTelemetry; pub use auth_env_telemetry::collect_auth_env_telemetry; -pub use codex_app_server_protocol::AuthMode; -pub use codex_model_provider_info as model_provider_info; -pub use codex_model_provider_info::DEFAULT_LMSTUDIO_PORT; -pub use codex_model_provider_info::DEFAULT_OLLAMA_PORT; -pub use codex_model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; -pub use codex_model_provider_info::ModelProviderInfo; -pub use codex_model_provider_info::OLLAMA_OSS_PROVIDER_ID; -pub use codex_model_provider_info::OPENAI_PROVIDER_ID; -pub use codex_model_provider_info::WireApi; -pub use codex_model_provider_info::built_in_model_providers; -pub use codex_model_provider_info::create_oss_provider_with_base_url; pub use provider_auth::auth_manager_for_provider; pub use provider_auth::required_auth_manager_for_provider; pub use token_data::TokenData; diff --git a/codex-rs/login/src/provider_auth.rs b/codex-rs/login/src/provider_auth.rs index 5a6719760c..5a4bb6d82b 100644 --- a/codex-rs/login/src/provider_auth.rs +++ b/codex-rs/login/src/provider_auth.rs @@ -1,7 +1,8 @@ use std::sync::Arc; +use codex_model_provider_info::ModelProviderInfo; + use crate::AuthManager; -use crate::ModelProviderInfo; /// Returns the provider-scoped auth manager when this provider uses command-backed auth. /// diff --git a/codex-rs/mcp-server/Cargo.toml b/codex-rs/mcp-server/Cargo.toml index a463d9bbe2..29de014d4a 100644 --- a/codex-rs/mcp-server/Cargo.toml +++ b/codex-rs/mcp-server/Cargo.toml @@ -23,6 +23,7 @@ codex-core = { workspace = true } codex-exec-server = { workspace = true } codex-features = { workspace = true } codex-login = { workspace = true } +codex-models-manager = { 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 a41c6ddcff..a0d4321173 100644 --- a/codex-rs/mcp-server/src/message_processor.rs +++ b/codex-rs/mcp-server/src/message_processor.rs @@ -4,12 +4,12 @@ use std::sync::Arc; use codex_arg0::Arg0DispatchPaths; use codex_core::ThreadManager; use codex_core::config::Config; -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_models_manager::collaboration_mode_presets::CollaborationModesConfig; use codex_protocol::ThreadId; use codex_protocol::protocol::SessionSource; use codex_protocol::protocol::Submission; diff --git a/codex-rs/models-manager/Cargo.toml b/codex-rs/models-manager/Cargo.toml index 93a9886c66..fbd5d5f3e8 100644 --- a/codex-rs/models-manager/Cargo.toml +++ b/codex-rs/models-manager/Cargo.toml @@ -15,9 +15,11 @@ workspace = true [dependencies] chrono = { workspace = true, features = ["serde"] } codex-api = { workspace = true } +codex-app-server-protocol = { workspace = true } codex-collaboration-mode-templates = { workspace = true } codex-feedback = { workspace = true } codex-login = { workspace = true } +codex-model-provider-info = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-response-debug-context = { workspace = true } diff --git a/codex-rs/models-manager/src/lib.rs b/codex-rs/models-manager/src/lib.rs index 14db37161f..5f26b37f89 100644 --- a/codex-rs/models-manager/src/lib.rs +++ b/codex-rs/models-manager/src/lib.rs @@ -5,12 +5,12 @@ pub mod manager; pub mod model_info; pub mod model_presets; +pub use codex_app_server_protocol::AuthMode; pub use codex_login::AuthCredentialsStoreMode; pub use codex_login::AuthManager; -pub use codex_login::AuthMode; pub use codex_login::CodexAuth; -pub use codex_login::ModelProviderInfo; -pub use codex_login::WireApi; +pub use codex_model_provider_info::ModelProviderInfo; +pub use codex_model_provider_info::WireApi; pub use config::ModelsManagerConfig; /// Load the bundled model catalog shipped with `codex-models-manager`. diff --git a/codex-rs/models-manager/src/manager.rs b/codex-rs/models-manager/src/manager.rs index 9429515a6a..984c612296 100644 --- a/codex-rs/models-manager/src/manager.rs +++ b/codex-rs/models-manager/src/manager.rs @@ -7,18 +7,18 @@ use codex_api::ModelsClient; use codex_api::RequestTelemetry; use codex_api::ReqwestTransport; use codex_api::TransportError; +use codex_api::api_bridge::map_api_error; +use codex_app_server_protocol::AuthMode; use codex_feedback::FeedbackRequestTags; use codex_feedback::emit_feedback_request_tags_with_auth_env; use codex_login::AuthEnvTelemetry; use codex_login::AuthManager; -use codex_login::AuthMode; use codex_login::CodexAuth; -use codex_login::ModelProviderInfo; use codex_login::auth_provider_from_auth; use codex_login::collect_auth_env_telemetry; use codex_login::default_client::build_reqwest_client; -use codex_login::map_api_error; use codex_login::required_auth_manager_for_provider; +use codex_model_provider_info::ModelProviderInfo; use codex_otel::TelemetryAuthMode; use codex_protocol::config_types::CollaborationModeMask; use codex_protocol::error::CodexErr; diff --git a/codex-rs/models-manager/src/manager_tests.rs b/codex-rs/models-manager/src/manager_tests.rs index 7b6dfe182f..b955786cc5 100644 --- a/codex-rs/models-manager/src/manager_tests.rs +++ b/codex-rs/models-manager/src/manager_tests.rs @@ -6,7 +6,7 @@ use codex_api::TransportError; use codex_login::AuthCredentialsStoreMode; use codex_login::AuthManager; use codex_login::CodexAuth; -use codex_login::WireApi; +use codex_model_provider_info::WireApi; use codex_protocol::config_types::ModelProviderAuthInfo; use codex_protocol::openai_models::ModelsResponse; use codex_utils_absolute_path::AbsolutePathBuf; diff --git a/codex-rs/ollama/Cargo.toml b/codex-rs/ollama/Cargo.toml index 56e8d6e5d8..cd6380b83b 100644 --- a/codex-rs/ollama/Cargo.toml +++ b/codex-rs/ollama/Cargo.toml @@ -15,6 +15,7 @@ workspace = true async-stream = { workspace = true } bytes = { workspace = true } codex-core = { workspace = true } +codex-model-provider-info = { workspace = true } futures = { workspace = true } reqwest = { workspace = true, features = ["json", "stream"] } semver = { workspace = true } diff --git a/codex-rs/ollama/src/client.rs b/codex-rs/ollama/src/client.rs index a0ab2d04fb..96601d0862 100644 --- a/codex-rs/ollama/src/client.rs +++ b/codex-rs/ollama/src/client.rs @@ -11,9 +11,13 @@ use crate::pull::PullEvent; use crate::pull::PullProgressReporter; use crate::url::base_url_to_host_root; use crate::url::is_openai_compatible_base_url; -use codex_core::ModelProviderInfo; -use codex_core::OLLAMA_OSS_PROVIDER_ID; use codex_core::config::Config; +use codex_model_provider_info::ModelProviderInfo; +use codex_model_provider_info::OLLAMA_OSS_PROVIDER_ID; +#[cfg(test)] +use codex_model_provider_info::WireApi; +#[cfg(test)] +use codex_model_provider_info::create_oss_provider_with_base_url; const OLLAMA_CONNECTION_ERROR: &str = "No running Ollama server detected. Start it with: `ollama serve` (after installing). Install instructions: https://github.com/ollama/ollama?tab=readme-ov-file#ollama"; @@ -47,8 +51,7 @@ impl OllamaClient { #[cfg(test)] async fn try_from_provider_with_base_url(base_url: &str) -> io::Result { - let provider = - codex_core::create_oss_provider_with_base_url(base_url, codex_core::WireApi::Responses); + let provider = create_oss_provider_with_base_url(base_url, WireApi::Responses); Self::try_from_provider(&provider).await } diff --git a/codex-rs/ollama/src/lib.rs b/codex-rs/ollama/src/lib.rs index 02f3754580..75800845b4 100644 --- a/codex-rs/ollama/src/lib.rs +++ b/codex-rs/ollama/src/lib.rs @@ -4,8 +4,8 @@ mod pull; mod url; pub use client::OllamaClient; -use codex_core::ModelProviderInfo; use codex_core::config::Config; +use codex_model_provider_info::ModelProviderInfo; pub use pull::CliProgressReporter; pub use pull::PullEvent; pub use pull::PullProgressReporter; diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 951187c8a4..696ab503b3 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -38,6 +38,8 @@ codex-feedback = { workspace = true } codex-file-search = { workspace = true } codex-git-utils = { workspace = true } codex-login = { workspace = true } +codex-model-provider-info = { workspace = true } +codex-models-manager = { workspace = true } codex-otel = { workspace = true } codex-protocol = { workspace = true } codex-rollout = { workspace = true } @@ -133,7 +135,6 @@ arboard = { workspace = true } codex-cli = { workspace = true } codex-core = { workspace = true } codex-mcp = { workspace = true } -codex-models-manager = { workspace = true } codex-utils-cargo-bin = { workspace = true } codex-utils-pty = { workspace = true } assert_matches = { workspace = true } diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index e262b55a31..299c296372 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -91,12 +91,12 @@ use codex_core::config::edit::ConfigEdit; use codex_core::config::edit::ConfigEditsBuilder; use codex_core::config_loader::ConfigLayerStackOrdering; use codex_core::message_history; -use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; -use codex_core::models_manager::model_presets::HIDE_GPT_5_1_CODEX_MAX_MIGRATION_PROMPT_CONFIG; -use codex_core::models_manager::model_presets::HIDE_GPT5_1_MIGRATION_PROMPT_CONFIG; #[cfg(target_os = "windows")] use codex_core::windows_sandbox::WindowsSandboxLevelExt; use codex_features::Feature; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; +use codex_models_manager::model_presets::HIDE_GPT_5_1_CODEX_MAX_MIGRATION_PROMPT_CONFIG; +use codex_models_manager::model_presets::HIDE_GPT5_1_MIGRATION_PROMPT_CONFIG; use codex_otel::SessionTelemetry; use codex_protocol::ThreadId; use codex_protocol::approvals::ExecApprovalRequestEvent; diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 9af2cd30a7..c231a4e4c2 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -93,12 +93,12 @@ pub(super) use codex_core::config_loader::ConfigLayerStack; pub(super) use codex_core::config_loader::ConfigRequirements; pub(super) use codex_core::config_loader::ConfigRequirementsToml; pub(super) use codex_core::config_loader::RequirementSource; -pub(super) use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; pub(super) use codex_core::plugins::OPENAI_CURATED_MARKETPLACE_NAME; pub(super) use codex_core::skills::model::SkillMetadata; pub(super) use codex_features::FEATURES; pub(super) use codex_features::Feature; pub(super) use codex_git_utils::CommitLogEntry; +pub(super) use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; pub(super) use codex_otel::RuntimeMetricsSummary; pub(super) use codex_otel::SessionTelemetry; pub(super) use codex_protocol::ThreadId; diff --git a/codex-rs/tui/src/model_catalog.rs b/codex-rs/tui/src/model_catalog.rs index 0025293fe0..0d161ab275 100644 --- a/codex-rs/tui/src/model_catalog.rs +++ b/codex-rs/tui/src/model_catalog.rs @@ -1,5 +1,5 @@ -use codex_core::models_manager::collaboration_mode_presets::CollaborationModesConfig; -use codex_core::models_manager::collaboration_mode_presets::builtin_collaboration_mode_presets; +use codex_models_manager::collaboration_mode_presets::CollaborationModesConfig; +use codex_models_manager::collaboration_mode_presets::builtin_collaboration_mode_presets; use codex_protocol::config_types::CollaborationModeMask; use codex_protocol::openai_models::ModelPreset; use std::convert::Infallible; diff --git a/codex-rs/tui/src/oss_selection.rs b/codex-rs/tui/src/oss_selection.rs index c73b4e332a..15c092c73e 100644 --- a/codex-rs/tui/src/oss_selection.rs +++ b/codex-rs/tui/src/oss_selection.rs @@ -1,11 +1,11 @@ use std::io; use std::sync::LazyLock; -use codex_core::DEFAULT_LMSTUDIO_PORT; -use codex_core::DEFAULT_OLLAMA_PORT; -use codex_core::LMSTUDIO_OSS_PROVIDER_ID; -use codex_core::OLLAMA_OSS_PROVIDER_ID; use codex_core::config::set_default_oss_provider; +use codex_model_provider_info::DEFAULT_LMSTUDIO_PORT; +use codex_model_provider_info::DEFAULT_OLLAMA_PORT; +use codex_model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; +use codex_model_provider_info::OLLAMA_OSS_PROVIDER_ID; use crossterm::event::Event; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; diff --git a/codex-rs/tui/src/status/card.rs b/codex-rs/tui/src/status/card.rs index 9fa851422f..781f4ae311 100644 --- a/codex-rs/tui/src/status/card.rs +++ b/codex-rs/tui/src/status/card.rs @@ -5,8 +5,8 @@ use crate::history_cell::with_border_with_inner_width; use crate::version::CODEX_CLI_VERSION; use chrono::DateTime; use chrono::Local; -use codex_core::WireApi; use codex_core::config::Config; +use codex_model_provider_info::WireApi; use codex_protocol::ThreadId; use codex_protocol::account::PlanType; use codex_protocol::openai_models::ReasoningEffort; diff --git a/codex-rs/tui/tests/suite/model_availability_nux.rs b/codex-rs/tui/tests/suite/model_availability_nux.rs index 04e66a1575..c787c0c108 100644 --- a/codex-rs/tui/tests/suite/model_availability_nux.rs +++ b/codex-rs/tui/tests/suite/model_availability_nux.rs @@ -3,6 +3,7 @@ use std::time::Duration; use anyhow::Context; use anyhow::Result; +use codex_models_manager::bundled_models_response; use serde_json::Value as JsonValue; use tempfile::tempdir; use tokio::select; @@ -19,8 +20,7 @@ async fn resume_startup_does_not_consume_model_availability_nux_count() -> Resul let repo_root = codex_utils_cargo_bin::repo_root()?; let codex_home = tempdir()?; - let mut source_catalog: JsonValue = - serde_json::to_value(codex_models_manager::bundled_models_response()?)?; + let mut source_catalog: JsonValue = serde_json::to_value(bundled_models_response()?)?; let models = source_catalog .get_mut("models") .and_then(JsonValue::as_array_mut) diff --git a/codex-rs/utils/oss/Cargo.toml b/codex-rs/utils/oss/Cargo.toml index 93623615e6..d02202b69e 100644 --- a/codex-rs/utils/oss/Cargo.toml +++ b/codex-rs/utils/oss/Cargo.toml @@ -10,4 +10,5 @@ workspace = true [dependencies] codex-core = { workspace = true } codex-lmstudio = { workspace = true } +codex-model-provider-info = { workspace = true } codex-ollama = { workspace = true } diff --git a/codex-rs/utils/oss/src/lib.rs b/codex-rs/utils/oss/src/lib.rs index a44a6a7d32..4a56af083f 100644 --- a/codex-rs/utils/oss/src/lib.rs +++ b/codex-rs/utils/oss/src/lib.rs @@ -1,8 +1,8 @@ //! OSS provider utilities shared between TUI and exec. -use codex_core::LMSTUDIO_OSS_PROVIDER_ID; -use codex_core::OLLAMA_OSS_PROVIDER_ID; use codex_core::config::Config; +use codex_model_provider_info::LMSTUDIO_OSS_PROVIDER_ID; +use codex_model_provider_info::OLLAMA_OSS_PROVIDER_ID; /// Returns the default model for a given OSS provider. pub fn get_default_model_for_oss_provider(provider_id: &str) -> Option<&'static str> { diff --git a/codex-rs/utils/sandbox-summary/Cargo.toml b/codex-rs/utils/sandbox-summary/Cargo.toml index 202dfaf22b..ade36985c0 100644 --- a/codex-rs/utils/sandbox-summary/Cargo.toml +++ b/codex-rs/utils/sandbox-summary/Cargo.toml @@ -9,6 +9,7 @@ workspace = true [dependencies] codex-core = { workspace = true } +codex-model-provider-info = { workspace = true } codex-protocol = { workspace = true } [dev-dependencies] diff --git a/codex-rs/utils/sandbox-summary/src/config_summary.rs b/codex-rs/utils/sandbox-summary/src/config_summary.rs index 0f6b192979..47f4ca770b 100644 --- a/codex-rs/utils/sandbox-summary/src/config_summary.rs +++ b/codex-rs/utils/sandbox-summary/src/config_summary.rs @@ -1,5 +1,5 @@ -use codex_core::WireApi; use codex_core::config::Config; +use codex_model_provider_info::WireApi; use crate::sandbox_summary::summarize_sandbox_policy;