mirror of
https://github.com/openai/codex.git
synced 2026-10-23 18:08:45 +00:00
## Why #27198 made the extension-owned `codex_apps` MCP connection the hosted plugin runtime, but its `mcp/skill` resources still bypassed the skills extension. App-server could list and read those resources through generic MCP APIs, but a thread with no selected environment did not expose them in the model's skills catalog or load their `SKILL.md` through `$skill`. Hosted skills should stay remote while using the same typed catalog, source authority, deduplication, bounded contextual catalog, and selected-skill prompt injection as host and executor skills. They should not be downloaded or exposed as ambient filesystem paths. ## What changed - Add a session-scoped `McpResourceClient` over the replaceable MCP connection manager so resource list/read calls follow startup and refresh replacements. - Add a `BackendSkillProvider` that pages `codex_apps` resources, accepts bounded and validated `mcp/skill` entries, and reads a selected skill's `SKILL.md` through the same MCP connection. - Register the remote provider in app-server and include it in the skills catalog even when a thread has no selected capability roots or executor. - Contribute hosted skill metadata through the bounded `AvailableSkillsInstructions` developer-context path, exclude remote entries from per-turn catalog injection, and classify `<skills>` messages as contextual developer content so rollback can trim and rebuild them correctly. ## Testing - Extend the app-server MCP resource integration test with `environments: []` to exercise two-page discovery, filter a non-`mcp/skill` resource, verify the escaped developer catalog entry and user-role `<skill>` fragment containing the fetched `SKILL.md`, and preserve generic MCP resource reads. - Add core event-mapping coverage that classifies `<skills>` developer messages as contextual history.
69 lines
3.3 KiB
Rust
69 lines
3.3 KiB
Rust
//! Context fragments injected into model input.
|
|
|
|
mod approved_command_prefix_saved;
|
|
mod apps_instructions;
|
|
mod available_plugins_instructions;
|
|
mod available_skills_instructions;
|
|
mod collaboration_mode_instructions;
|
|
mod contextual_user_message;
|
|
mod environment_context;
|
|
mod guardian_followup_review_reminder;
|
|
mod hook_additional_context;
|
|
mod image_generation_instructions;
|
|
mod internal_model_context;
|
|
mod legacy_apply_patch_exec_command_warning;
|
|
mod legacy_model_mismatch_warning;
|
|
mod legacy_unified_exec_process_limit_warning;
|
|
mod model_switch_instructions;
|
|
mod network_rule_saved;
|
|
mod permissions_instructions;
|
|
mod personality_spec_instructions;
|
|
mod plugin_instructions;
|
|
mod realtime_end_instructions;
|
|
mod realtime_start_instructions;
|
|
mod realtime_start_with_instructions;
|
|
mod subagent_notification;
|
|
mod token_budget_context;
|
|
mod turn_aborted;
|
|
mod user_instructions;
|
|
mod user_shell_command;
|
|
|
|
pub(crate) use approved_command_prefix_saved::ApprovedCommandPrefixSaved;
|
|
pub(crate) use apps_instructions::AppsInstructions;
|
|
pub(crate) use available_plugins_instructions::AvailablePluginsInstructions;
|
|
pub use available_skills_instructions::AvailableSkillsInstructions;
|
|
pub(crate) use codex_context_fragments::AdditionalContextDeveloperFragment;
|
|
pub(crate) use codex_context_fragments::AdditionalContextUserFragment;
|
|
pub use codex_context_fragments::ContextualUserFragment;
|
|
pub(crate) use codex_context_fragments::FragmentRegistration;
|
|
pub(crate) use codex_context_fragments::FragmentRegistrationProxy;
|
|
pub(crate) use codex_core_skills::SkillInstructions;
|
|
pub(crate) use collaboration_mode_instructions::CollaborationModeInstructions;
|
|
pub(crate) use contextual_user_message::is_contextual_user_fragment;
|
|
pub(crate) use contextual_user_message::parse_visible_hook_prompt_message;
|
|
pub(crate) use environment_context::EnvironmentContext;
|
|
pub(crate) use guardian_followup_review_reminder::GuardianFollowupReviewReminder;
|
|
pub(crate) use hook_additional_context::HookAdditionalContext;
|
|
pub(crate) use image_generation_instructions::ImageGenerationInstructions;
|
|
pub use image_generation_instructions::extension_image_generation_output_hint;
|
|
pub use internal_model_context::InternalContextSource;
|
|
pub use internal_model_context::InternalModelContextFragment;
|
|
pub use internal_model_context::InvalidInternalContextSource;
|
|
pub(crate) use legacy_apply_patch_exec_command_warning::LegacyApplyPatchExecCommandWarning;
|
|
pub(crate) use legacy_model_mismatch_warning::LegacyModelMismatchWarning;
|
|
pub(crate) use legacy_unified_exec_process_limit_warning::LegacyUnifiedExecProcessLimitWarning;
|
|
pub(crate) use model_switch_instructions::ModelSwitchInstructions;
|
|
pub(crate) use network_rule_saved::NetworkRuleSaved;
|
|
pub use permissions_instructions::PermissionsInstructions;
|
|
pub(crate) use personality_spec_instructions::PersonalitySpecInstructions;
|
|
pub(crate) use plugin_instructions::PluginInstructions;
|
|
pub(crate) use realtime_end_instructions::RealtimeEndInstructions;
|
|
pub(crate) use realtime_start_instructions::RealtimeStartInstructions;
|
|
pub(crate) use realtime_start_with_instructions::RealtimeStartWithInstructions;
|
|
pub(crate) use subagent_notification::SubagentNotification;
|
|
pub(crate) use token_budget_context::TokenBudgetContext;
|
|
pub(crate) use token_budget_context::TokenBudgetRemainingContext;
|
|
pub(crate) use turn_aborted::TurnAborted;
|
|
pub(crate) use user_instructions::UserInstructions;
|
|
pub(crate) use user_shell_command::UserShellCommand;
|