use codex_config::McpServerConfig;
use codex_exec_server_protocol::ExecutorCapabilityDiscoverySnapshot;
use codex_protocol::capabilities::SelectedCapabilityRoot;
use crate::ExtensionData;
use crate::ExtensionDataInit;
pub struct McpServerContributionContext<'a, C> {
config: &'a C,
thread_store: Option<&'a ExtensionData>,
thread_init: Option<&'a ExtensionDataInit>,
originator: Option<&'a str>,
ready_selected_capability_roots: Option<&'a [SelectedCapabilityRoot]>,
executor_capability_discovery: Option<&'a ExecutorCapabilityDiscoverySnapshot>,
}
impl<C> Clone for McpServerContributionContext<'_, C> {
fn clone(&self) -> Self {
*self
}
}
impl<C> Copy for McpServerContributionContext<'_, C> {}
impl<'a, C> McpServerContributionContext<'a, C> {
pub fn global(config: &'a C) -> Self {
Self {
config,
thread_store: None,
thread_init: None,
originator: None,
ready_selected_capability_roots: None,
executor_capability_discovery: None,
}
}
pub fn for_step(
config: &'a C,
thread_init: &'a ExtensionDataInit,
thread_store: &'a ExtensionData,
originator: &'a str,
ready_selected_capability_roots: &'a [SelectedCapabilityRoot],
executor_capability_discovery: Option<&'a ExecutorCapabilityDiscoverySnapshot>,
) -> Self {
Self {
config,
thread_store: Some(thread_store),
thread_init: Some(thread_init),
originator: Some(originator),
ready_selected_capability_roots: Some(ready_selected_capability_roots),
executor_capability_discovery,
}
}
pub fn config(&self) -> &'a C {
self.config
}
pub fn thread_store(&self) -> Option<&'a ExtensionData> {
self.thread_store
}
pub fn thread_init(&self) -> Option<&'a ExtensionDataInit> {
self.thread_init
}
pub fn originator(&self) -> Option<&'a str> {
self.originator
}
pub fn ready_selected_capability_roots(&self) -> Option<&'a [SelectedCapabilityRoot]> {
self.ready_selected_capability_roots
}
pub fn executor_capability_discovery(&self) -> Option<&'a ExecutorCapabilityDiscoverySnapshot> {
self.executor_capability_discovery
}
}
#[derive(Clone, Debug)]
pub enum McpServerContribution {
Set {
name: String,
config: Box<McpServerConfig>,
},
SelectedPlugin {
name: String,
plugin_id: String,
plugin_display_name: String,
selection_order: usize,
config: Box<McpServerConfig>,
},
SelectedPluginPackage {
plugin_id: String,
plugin_display_name: String,
connector_ids: Vec<String>,
},
Remove { name: String },
}