Codex Handbook
core/src/state/service.rs 100 lines
use std::collections::HashMap;use std::sync::Arc;use crate::SkillsManager;use crate::agent::AgentControl;use crate::attestation::AttestationProvider;use crate::client::ModelClient;use crate::config::NetworkProxyAuditMetadata;use crate::config::StartedNetworkProxy;use crate::environment_selection::ThreadEnvironments;use crate::exec_policy::ExecPolicyManager;use crate::guardian::GuardianRejection;use crate::guardian::GuardianRejectionCircuitBreaker;use crate::mcp::McpManager;use crate::tools::code_mode::CodeModeService;use crate::tools::handlers::ToolSearchHandlerCache;use crate::tools::network_approval::NetworkApprovalService;use crate::tools::sandboxing::ApprovalStore;use crate::unified_exec::UnifiedExecProcessManager;use anyhow::Result;use arc_swap::ArcSwap;use arc_swap::ArcSwapOption;use codex_analytics::AnalyticsEventsClient;use codex_core_plugins::PluginsManager;use codex_extension_api::ExtensionData;use codex_extension_api::ExtensionDataInit;use codex_extension_api::ExtensionRegistry;use codex_hooks::Hooks;use codex_login::AuthManager;use codex_mcp::McpConnectionManager;use codex_models_manager::manager::SharedModelsManager;use codex_otel::SessionTelemetry;use codex_rollout::state_db::StateDbHandle;use codex_rollout_trace::ThreadTraceContext;use codex_thread_store::LiveThread;use codex_thread_store::ThreadStore;use std::path::PathBuf;use tokio::runtime::Handle;use tokio::sync::Mutex;use tokio_util::sync::CancellationToken;pub(crate) struct SessionServices {    /// The latest manager; callers retain an owned handle while performing MCP I/O.    pub(crate) mcp_connection_manager: Arc<ArcSwap<McpConnectionManager>>,    pub(crate) mcp_startup_cancellation_token: Mutex<CancellationToken>,    pub(crate) unified_exec_manager: UnifiedExecProcessManager,    #[cfg_attr(not(unix), allow(dead_code))]    pub(crate) shell_zsh_path: Option<PathBuf>,    #[cfg_attr(not(unix), allow(dead_code))]    pub(crate) main_execve_wrapper_exe: Option<PathBuf>,    pub(crate) analytics_events_client: AnalyticsEventsClient,    pub(crate) hooks: ArcSwap<Hooks>,    pub(crate) rollout_thread_trace: ThreadTraceContext,    pub(crate) user_shell: Arc<crate::shell::Shell>,    pub(crate) show_raw_agent_reasoning: bool,    pub(crate) exec_policy: Arc<ExecPolicyManager>,    pub(crate) auth_manager: Arc<AuthManager>,    pub(crate) models_manager: SharedModelsManager,    pub(crate) session_telemetry: SessionTelemetry,    pub(crate) tool_approvals: Mutex<ApprovalStore>,    pub(crate) guardian_rejections: Mutex<HashMap<String, GuardianRejection>>,    pub(crate) guardian_rejection_circuit_breaker: Mutex<GuardianRejectionCircuitBreaker>,    pub(crate) runtime_handle: Handle,    pub(crate) skills_manager: Arc<SkillsManager>,    pub(crate) plugins_manager: Arc<PluginsManager>,    pub(crate) mcp_manager: Arc<McpManager>,    pub(crate) extensions: Arc<ExtensionRegistry<crate::config::Config>>,    pub(crate) session_extension_data: ExtensionData,    pub(crate) thread_extension_data: ExtensionData,    pub(crate) mcp_thread_init: ExtensionDataInit,    pub(crate) agent_control: AgentControl,    pub(crate) network_proxy: ArcSwapOption<StartedNetworkProxy>,    pub(crate) network_proxy_audit_metadata: NetworkProxyAuditMetadata,    pub(crate) managed_network_requirements_configured: bool,    pub(crate) network_approval: Arc<NetworkApprovalService>,    pub(crate) state_db: Option<StateDbHandle>,    pub(crate) live_thread: Option<LiveThread>,    pub(crate) thread_store: Arc<dyn ThreadStore>,    pub(crate) attestation_provider: Option<Arc<dyn AttestationProvider>>,    /// Session-scoped model client shared across turns.    pub(crate) model_client: ModelClient,    pub(crate) code_mode_service: CodeModeService,    pub(crate) tool_search_handler_cache: ToolSearchHandlerCache,    pub(crate) turn_environments: Arc<ThreadEnvironments>,}impl SessionServices {    /// Installs the manager before validating required servers so startup-time elicitation can    /// resolve through the session's manager while validation waits.    pub(crate) async fn install_mcp_connection_manager(        &self,        manager: McpConnectionManager,    ) -> Result<()> {        self.mcp_connection_manager.store(Arc::new(manager));        self.mcp_connection_manager            .load_full()            .validate_required_servers()            .await    }}