mirror of
https://github.com/openai/codex.git
synced 2026-11-13 21:30:47 +00:00
## Why Generic plugin guidance is currently emitted only with initial context from host plugin state. An executor-selected plugin can become available later in the same turn, making its skills and tools usable without ever telling the model how plugin capabilities should be used. ## What - project every ready selected plugin package, including skill-only plugins - carry plugin availability with the exact MCP runtime projection while preserving MCP manager reuse when servers and connectors are unchanged - move generic plugin guidance from the static initial-context path into persisted World State - recognize legacy and retained plugin fragments so resume and compaction do not duplicate guidance ## Testing - `just test -p codex-mcp-extension` - `just test -p codex-core plugins_instructions` - `just test -p codex-core plugin_availability_change_reuses_the_mcp_manager` - `just test -p codex-app-server --test all selected_capabilit`
63 lines
1.7 KiB
Rust
63 lines
1.7 KiB
Rust
#[cfg(test)]
|
|
use crate::context::AvailablePluginsInstructions;
|
|
#[cfg(test)]
|
|
use crate::context::ContextualUserFragment;
|
|
use crate::plugins::PluginCapabilitySummary;
|
|
|
|
#[cfg(test)]
|
|
pub(crate) fn render_plugins_section(plugins: &[PluginCapabilitySummary]) -> Option<String> {
|
|
(!plugins.is_empty()).then(|| AvailablePluginsInstructions.render())
|
|
}
|
|
|
|
pub(crate) fn render_explicit_plugin_instructions(
|
|
plugin: &PluginCapabilitySummary,
|
|
available_mcp_servers: &[String],
|
|
available_apps: &[String],
|
|
) -> Option<String> {
|
|
let mut lines = vec![format!(
|
|
"Capabilities from the `{}` plugin:",
|
|
plugin.display_name
|
|
)];
|
|
|
|
if plugin.has_skills {
|
|
lines.push(format!(
|
|
"- Skills from this plugin are prefixed with `{}:`.",
|
|
plugin.display_name
|
|
));
|
|
}
|
|
|
|
if !available_mcp_servers.is_empty() {
|
|
lines.push(format!(
|
|
"- MCP servers from this plugin available in this session: {}.",
|
|
available_mcp_servers
|
|
.iter()
|
|
.map(|server| format!("`{server}`"))
|
|
.collect::<Vec<_>>()
|
|
.join(", ")
|
|
));
|
|
}
|
|
|
|
if !available_apps.is_empty() {
|
|
lines.push(format!(
|
|
"- Apps from this plugin available in this session: {}.",
|
|
available_apps
|
|
.iter()
|
|
.map(|app| format!("`{app}`"))
|
|
.collect::<Vec<_>>()
|
|
.join(", ")
|
|
));
|
|
}
|
|
|
|
if lines.len() == 1 {
|
|
return None;
|
|
}
|
|
|
|
lines.push("Use these plugin-associated capabilities to help solve the task.".to_string());
|
|
|
|
Some(lines.join("\n"))
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "render_tests.rs"]
|
|
mod tests;
|