Codex Handbook
core/src/plugins/render.rs 62 lines
#[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> {    AvailablePluginsInstructions::from_plugins(plugins).map(|instructions| instructions.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;