ext/skills/src/provider.rs
66 lines
use std::future::Future;use std::pin::Pin;use std::sync::Arc;mod executor;mod host;mod orchestrator;use codex_core_skills::HostLoadedSkills;use codex_mcp::McpResourceClient;use codex_protocol::capabilities::SelectedCapabilityRoot;use crate::catalog::SkillAuthority;use crate::catalog::SkillCatalog;use crate::catalog::SkillPackageId;use crate::catalog::SkillProviderResult;use crate::catalog::SkillReadResult;use crate::catalog::SkillResourceId;use crate::catalog::SkillSearchResult;pub use executor::ExecutorSkillProvider;pub use host::HostSkillProvider;pub use orchestrator::OrchestratorSkillProvider;#[derive(Clone, Debug)]pub struct SkillListQuery { pub turn_id: String, pub executor_roots: Vec<SelectedCapabilityRoot>, pub host: Option<Arc<HostLoadedSkills>>, pub include_host_skills: bool, pub include_bundled_skills: bool, pub include_orchestrator_skills: bool, pub mcp_resources: Option<Arc<McpResourceClient>>,}#[derive(Clone, Debug)]pub struct SkillReadRequest { pub authority: SkillAuthority, pub package: SkillPackageId, pub resource: SkillResourceId, pub host: Option<Arc<HostLoadedSkills>>, pub mcp_resources: Option<Arc<McpResourceClient>>,}#[derive(Clone, Debug, PartialEq, Eq)]pub struct SkillSearchRequest { pub authority: SkillAuthority, pub package: SkillPackageId, pub query: String,}pub type SkillProviderFuture<'a, T> = Pin<Box<dyn Future<Output = SkillProviderResult<T>> + Send + 'a>>;/// Source-specific skill catalog and resource access.////// Implementations must preserve authority boundaries: a resource listed by a/// provider must be read or searched through the same provider/authority rather/// than converted into an ambient local path.pub trait SkillProvider: Send + Sync { fn list(&self, query: SkillListQuery) -> SkillProviderFuture<'_, SkillCatalog>; fn read(&self, request: SkillReadRequest) -> SkillProviderFuture<'_, SkillReadResult>; fn search(&self, request: SkillSearchRequest) -> SkillProviderFuture<'_, SkillSearchResult>;}