Skip to main content

codex_skills_extension/
provider.rs

1use std::future::Future;
2use std::pin::Pin;
3use std::sync::Arc;
4
5mod executor;
6mod host;
7mod orchestrator;
8
9use codex_core_skills::HostSkillsSnapshot;
10use codex_exec_server::ExecutorCapabilityDiscoverySnapshot;
11use codex_mcp::McpResourceClient;
12use codex_protocol::capabilities::SelectedCapabilityRoot;
13
14use crate::catalog::SkillAuthority;
15use crate::catalog::SkillCatalog;
16use crate::catalog::SkillPackageId;
17use crate::catalog::SkillProviderResult;
18use crate::catalog::SkillReadResult;
19use crate::catalog::SkillResourceId;
20use crate::catalog::SkillSearchResult;
21
22pub use executor::ExecutorSkillProvider;
23pub use host::HostSkillProvider;
24pub use orchestrator::OrchestratorSkillProvider;
25
26#[derive(Clone, Debug)]
27pub struct SkillListQuery {
28    pub turn_id: String,
29    pub executor_roots: Vec<SelectedCapabilityRoot>,
30    pub host_snapshot: Option<Arc<HostSkillsSnapshot>>,
31    pub include_host_skills: bool,
32    pub include_bundled_skills: bool,
33    pub include_orchestrator_skills: bool,
34    pub mcp_resources: Option<Arc<McpResourceClient>>,
35    /// Present only when the opt-in high-level executor discovery path is selected.
36    pub executor_capability_discovery: Option<ExecutorCapabilityDiscoverySnapshot>,
37}
38
39#[derive(Clone, Debug)]
40pub struct SkillReadRequest {
41    pub authority: SkillAuthority,
42    pub package: SkillPackageId,
43    pub resource: SkillResourceId,
44    pub host_snapshot: Option<Arc<HostSkillsSnapshot>>,
45    pub mcp_resources: Option<Arc<McpResourceClient>>,
46}
47
48#[derive(Clone, Debug, PartialEq, Eq)]
49pub struct SkillSearchRequest {
50    pub authority: SkillAuthority,
51    pub package: SkillPackageId,
52    pub query: String,
53}
54
55pub type SkillProviderFuture<'a, T> =
56    Pin<Box<dyn Future<Output = SkillProviderResult<T>> + Send + 'a>>;
57
58/// Source-specific skill catalog and resource access.
59///
60/// Implementations must preserve authority boundaries: a resource listed by a
61/// provider must be read or searched through the same provider/authority rather
62/// than converted into an ambient local path.
63pub trait SkillProvider: Send + Sync {
64    fn list(&self, query: SkillListQuery) -> SkillProviderFuture<'_, SkillCatalog>;
65
66    fn read(&self, request: SkillReadRequest) -> SkillProviderFuture<'_, SkillReadResult>;
67
68    fn search(&self, request: SkillSearchRequest) -> SkillProviderFuture<'_, SkillSearchResult>;
69}