diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 18c0260123..88f29ad0f2 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -2726,7 +2726,6 @@ dependencies = [ "codex-connectors", "codex-context-fragments", "codex-core-plugins", - "codex-core-skills", "codex-diagnostics", "codex-exec-server", "codex-exec-server-test-support", @@ -2907,16 +2906,6 @@ dependencies = [ "zip", ] -[[package]] -name = "codex-core-skills" -version = "0.0.0" -dependencies = [ - "codex-exec-server", - "codex-skills", - "codex-utils-absolute-path", - "codex-utils-path-uri", -] - [[package]] name = "codex-diagnostics" version = "0.0.0" @@ -4118,7 +4107,6 @@ name = "codex-skills-extension" version = "0.0.0" dependencies = [ "codex-config", - "codex-core-skills", "codex-exec-server", "codex-extension-api", "codex-mcp", diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index c3ad0d023d..8ce32222e2 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -41,7 +41,6 @@ members = [ "core", "core-api", "core-plugins", - "core-skills", "diagnostics", "hooks", "http-client", @@ -184,7 +183,6 @@ codex-context-fragments = { path = "context-fragments" } codex-core = { path = "core" } codex-core-api = { path = "core-api" } codex-core-plugins = { path = "core-plugins" } -codex-core-skills = { path = "core-skills" } codex-diagnostics = { path = "diagnostics" } codex-exec = { path = "exec" } codex-file-system = { path = "file-system" } diff --git a/codex-rs/core-skills/BUILD.bazel b/codex-rs/core-skills/BUILD.bazel deleted file mode 100644 index 77c4253e73..0000000000 --- a/codex-rs/core-skills/BUILD.bazel +++ /dev/null @@ -1,15 +0,0 @@ -load("//:defs.bzl", "codex_rust_crate") - -codex_rust_crate( - name = "core-skills", - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - "BUILD.bazel", - "Cargo.toml", - ], - ), - crate_name = "codex_core_skills", -) diff --git a/codex-rs/core-skills/Cargo.toml b/codex-rs/core-skills/Cargo.toml deleted file mode 100644 index f72b4ef8f7..0000000000 --- a/codex-rs/core-skills/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -edition.workspace = true -license.workspace = true -name = "codex-core-skills" -version.workspace = true - -[lib] -doctest = false -name = "codex_core_skills" -path = "src/lib.rs" -test = false - -[lints] -workspace = true - -[dependencies] -codex-exec-server = { workspace = true } -codex-skills = { workspace = true } -codex-utils-absolute-path = { workspace = true } -codex-utils-path-uri = { workspace = true } diff --git a/codex-rs/core-skills/src/invocation_utils.rs b/codex-rs/core-skills/src/invocation_utils.rs deleted file mode 100644 index 760b2e5f82..0000000000 --- a/codex-rs/core-skills/src/invocation_utils.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::collections::HashMap; - -use crate::SkillMetadata; -use codex_utils_absolute_path::AbsolutePathBuf; - -pub(crate) fn build_implicit_skill_path_indexes( - skills: Vec, -) -> ( - HashMap, - HashMap, -) { - let mut by_scripts_dir = HashMap::new(); - let mut by_skill_doc_path = HashMap::new(); - for skill in skills { - let skill_doc_path = canonicalize_if_exists(&skill.path_to_skills_md); - by_skill_doc_path.insert(skill_doc_path, skill.clone()); - - if let Some(skill_dir) = skill.path_to_skills_md.parent() { - let scripts_dir = canonicalize_if_exists(&skill_dir.join("scripts")); - by_scripts_dir.insert(scripts_dir, skill); - } - } - - (by_scripts_dir, by_skill_doc_path) -} - -fn canonicalize_if_exists(path: &AbsolutePathBuf) -> AbsolutePathBuf { - path.canonicalize().unwrap_or_else(|_| path.clone()) -} diff --git a/codex-rs/core-skills/src/lib.rs b/codex-rs/core-skills/src/lib.rs deleted file mode 100644 index abcf5fa6bb..0000000000 --- a/codex-rs/core-skills/src/lib.rs +++ /dev/null @@ -1,17 +0,0 @@ -pub(crate) mod invocation_utils; -pub mod model; - -/// Hard byte limit for one model-visible skill instruction body. -/// -/// Both the legacy explicit-injection path and the skills extension use this -/// limit so a skill cannot bypass context bounds by changing how it is loaded. -pub const MAX_SKILL_PROMPT_BYTES: usize = 8_000; - -pub use codex_skills::ImplicitSkillLookup; -pub use codex_skills::build_skill_name_counts; -pub use codex_skills::detect_implicit_skill_invocation_for_command; -pub(crate) use invocation_utils::build_implicit_skill_path_indexes; -pub use model::SkillError; -pub use model::SkillLoadOutcome; -pub use model::SkillMetadata; -pub use model::SkillPolicy; diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index bb9292bf0d..7e6e4576d0 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -34,7 +34,6 @@ codex-connectors = { workspace = true } codex-context-fragments = { workspace = true } codex-config = { workspace = true } codex-core-plugins = { workspace = true } -codex-core-skills = { workspace = true } codex-diagnostics = { workspace = true } codex-exec-server = { workspace = true } codex-extension-api = { workspace = true } diff --git a/codex-rs/core/src/mcp_skill_dependencies.rs b/codex-rs/core/src/mcp_skill_dependencies.rs index f07d9778d0..cef8c86076 100644 --- a/codex-rs/core/src/mcp_skill_dependencies.rs +++ b/codex-rs/core/src/mcp_skill_dependencies.rs @@ -21,7 +21,6 @@ use crate::SkillMetadata; use crate::config::edit::ConfigEditsBuilder; use crate::session::session::Session; use crate::session::turn_context::TurnContext; -use crate::skills::model::SkillToolDependency; use codex_mcp::ElicitationReviewerHandle; use codex_mcp::McpOAuthLoginSupport; use codex_mcp::McpPermissionPromptAutoApproveContext; @@ -29,6 +28,7 @@ use codex_mcp::mcp_permission_prompt_is_auto_approved; use codex_mcp::oauth_login_support; use codex_mcp::resolve_oauth_scopes; use codex_mcp::should_retry_without_scopes; +use codex_skills::SkillToolDependency; const SKILL_MCP_DEPENDENCY_PROMPT_ID: &str = "skill_mcp_dependency_install"; const MCP_DEPENDENCY_OPTION_INSTALL: &str = "Install"; diff --git a/codex-rs/core/src/skills.rs b/codex-rs/core/src/skills.rs index dea0437c59..4b7656404e 100644 --- a/codex-rs/core/src/skills.rs +++ b/codex-rs/core/src/skills.rs @@ -14,9 +14,7 @@ use codex_utils_plugins::PluginSkillRoot; use std::collections::HashSet; use tokio::sync::Mutex; -pub use codex_core_skills::SkillError; -pub use codex_core_skills::SkillLoadOutcome; -pub use codex_core_skills::model; +pub use codex_skills::SkillError; pub use codex_skills::SkillMetadata; pub use codex_skills::SkillPolicy; pub use codex_skills::build_skill_name_counts; @@ -24,6 +22,7 @@ pub use codex_skills::collect_explicit_skill_mentions; pub use codex_skills::detect_implicit_skill_invocation_for_command; pub use codex_skills_extension::HostSkillsLoadInput; pub use codex_skills_extension::HostSkillsService; +pub use codex_skills_extension::SkillLoadOutcome; pub use codex_skills_extension::bundled_skills_enabled_from_stack; #[derive(Debug, Default)] diff --git a/codex-rs/ext/skills/Cargo.toml b/codex-rs/ext/skills/Cargo.toml index c1f09ccbbf..15e38a9e7a 100644 --- a/codex-rs/ext/skills/Cargo.toml +++ b/codex-rs/ext/skills/Cargo.toml @@ -14,7 +14,6 @@ workspace = true [dependencies] codex-config = { workspace = true } -codex-core-skills = { workspace = true } codex-exec-server = { workspace = true } codex-extension-api = { workspace = true } codex-mcp = { workspace = true } diff --git a/codex-rs/ext/skills/src/dynamic_skill_selector/character_routing_card_tests.rs b/codex-rs/ext/skills/src/dynamic_skill_selector/character_routing_card_tests.rs index 9d1b869c99..697b46da96 100644 --- a/codex-rs/ext/skills/src/dynamic_skill_selector/character_routing_card_tests.rs +++ b/codex-rs/ext/skills/src/dynamic_skill_selector/character_routing_card_tests.rs @@ -1,4 +1,4 @@ -use codex_core_skills::SkillLoadOutcome; +use crate::SkillLoadOutcome; use codex_protocol::protocol::SkillScope; use codex_skills::SkillDependencies; use codex_skills::SkillInterface; diff --git a/codex-rs/core-skills/src/model.rs b/codex-rs/ext/skills/src/host_outcome.rs similarity index 88% rename from codex-rs/core-skills/src/model.rs rename to codex-rs/ext/skills/src/host_outcome.rs index a26916da27..18d8d1bd0f 100644 --- a/codex-rs/core-skills/src/model.rs +++ b/codex-rs/ext/skills/src/host_outcome.rs @@ -6,12 +6,8 @@ use std::sync::Arc; use codex_exec_server::ExecutorFileSystem; use codex_exec_server::LOCAL_FS; -pub use codex_skills::SkillDependencies; -pub use codex_skills::SkillError; -pub use codex_skills::SkillInterface; -pub use codex_skills::SkillMetadata; -pub use codex_skills::SkillPolicy; -pub use codex_skills::SkillToolDependency; +use codex_skills::SkillError; +use codex_skills::SkillMetadata; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_path_uri::PathUri; @@ -76,13 +72,21 @@ impl SkillLoadOutcome { pub fn with_disabled_paths(mut self, disabled_paths: HashSet) -> Self { self.disabled_paths = disabled_paths; - let (by_scripts_dir, by_doc_path) = crate::build_implicit_skill_path_indexes( - self.skills - .iter() - .filter(|skill| self.is_skill_enabled(skill)) - .cloned() - .collect(), - ); + let mut by_scripts_dir = HashMap::new(); + let mut by_doc_path = HashMap::new(); + for skill in self + .skills + .iter() + .filter(|skill| self.is_skill_enabled(skill)) + { + let skill_doc_path = canonicalize_if_exists(&skill.path_to_skills_md); + by_doc_path.insert(skill_doc_path, skill.clone()); + + if let Some(skill_dir) = skill.path_to_skills_md.parent() { + let scripts_dir = canonicalize_if_exists(&skill_dir.join("scripts")); + by_scripts_dir.insert(scripts_dir, skill.clone()); + } + } self.implicit_skills_by_scripts_dir = Arc::new(by_scripts_dir); self.implicit_skills_by_doc_path = Arc::new(by_doc_path); self @@ -181,3 +185,7 @@ impl fmt::Debug for SkillFileSystemsByPath { .finish() } } + +fn canonicalize_if_exists(path: &AbsolutePathBuf) -> AbsolutePathBuf { + path.canonicalize().unwrap_or_else(|_| path.clone()) +} diff --git a/codex-rs/ext/skills/src/host_roots_tests.rs b/codex-rs/ext/skills/src/host_roots_tests.rs index 76b91e0ef7..d7a1ba22c4 100644 --- a/codex-rs/ext/skills/src/host_roots_tests.rs +++ b/codex-rs/ext/skills/src/host_roots_tests.rs @@ -7,7 +7,6 @@ use codex_config::ConfigLayerEntry; use codex_config::ConfigLayerSource; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirementsToml; -use codex_core_skills::SkillMetadata; use codex_exec_server::CopyOptions; use codex_exec_server::CreateDirectoryOptions; use codex_exec_server::ExecutorFileSystem; @@ -21,6 +20,7 @@ use codex_exec_server::RemoveOptions; use codex_exec_server::WalkOptions; use codex_exec_server::WalkOutcome; use codex_protocol::protocol::SkillScope; +use codex_skills::SkillMetadata; use codex_utils_absolute_path::AbsolutePathBuf; use codex_utils_path_uri::PathUri; use codex_utils_plugins::PluginIdentity; diff --git a/codex-rs/ext/skills/src/host_service.rs b/codex-rs/ext/skills/src/host_service.rs index a3c6d54e65..199c6a0184 100644 --- a/codex-rs/ext/skills/src/host_service.rs +++ b/codex-rs/ext/skills/src/host_service.rs @@ -22,7 +22,6 @@ use tracing::instrument; use tracing::warn; use codex_config::SkillsConfig; -use codex_core_skills::SkillLoadOutcome; use codex_skills::LoadedSkills; use codex_skills::SkillLoadFuture; use codex_skills::SkillRootLoadRequest; @@ -31,6 +30,7 @@ use codex_skills::SkillRootSnapshots; use codex_skills::install_system_skills; use crate::HostSkillsSnapshot; +use crate::SkillLoadOutcome; use crate::host_roots::resolve_skill_roots; use crate::loader::HostSkillRoot; use crate::loader::MAX_CONCURRENT_ROOT_SCANS; diff --git a/codex-rs/ext/skills/src/host_snapshot.rs b/codex-rs/ext/skills/src/host_snapshot.rs index 3f44dc3f80..1bdabb033a 100644 --- a/codex-rs/ext/skills/src/host_snapshot.rs +++ b/codex-rs/ext/skills/src/host_snapshot.rs @@ -1,7 +1,7 @@ use std::io; use std::sync::Arc; -use codex_core_skills::SkillLoadOutcome; +use crate::SkillLoadOutcome; use codex_skills::SkillMetadata; /// Immutable snapshot of host-owned skills and their source filesystems. diff --git a/codex-rs/ext/skills/src/lib.rs b/codex-rs/ext/skills/src/lib.rs index b657abde1b..6c770c28f3 100644 --- a/codex-rs/ext/skills/src/lib.rs +++ b/codex-rs/ext/skills/src/lib.rs @@ -6,6 +6,7 @@ mod dynamic_skill_selector; mod extension; mod fragments; mod host_aliases; +mod host_outcome; mod host_prompt; mod host_roots; mod host_service; @@ -27,6 +28,7 @@ pub use config::SkillsExtensionConfig; pub use extension::install; pub use extension::install_with_providers; pub use extension::install_with_providers_and_metrics; +pub use host_outcome::SkillLoadOutcome; pub use host_prompt::HostSkillPrompts; pub use host_prompt::InjectedHostSkillPrompts; pub use host_service::HostSkillsLoadInput; diff --git a/codex-rs/ext/skills/src/loader/host_merge.rs b/codex-rs/ext/skills/src/loader/host_merge.rs index 6fcb5a4b03..9db69bb8a7 100644 --- a/codex-rs/ext/skills/src/loader/host_merge.rs +++ b/codex-rs/ext/skills/src/loader/host_merge.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::collections::HashSet; use std::sync::Arc; -use codex_core_skills::SkillLoadOutcome; use codex_exec_server::ExecutorFileSystem; use codex_protocol::protocol::Product; use codex_protocol::protocol::SkillScope; @@ -20,6 +19,7 @@ use super::HostSkillRoot; use super::MAX_CONCURRENT_ROOT_SCANS; use super::host::HostSkillRootSnapshot; use super::load_host_skill_root; +use crate::SkillLoadOutcome; pub(crate) async fn load_and_merge_host_skill_roots( roots: Vec, diff --git a/codex-rs/ext/skills/src/provider/host.rs b/codex-rs/ext/skills/src/provider/host.rs index b3c4865f3d..5469ae8ddb 100644 --- a/codex-rs/ext/skills/src/provider/host.rs +++ b/codex-rs/ext/skills/src/provider/host.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use codex_core_skills::SkillLoadOutcome; +use crate::SkillLoadOutcome; use codex_skills::SkillMetadata; use crate::catalog::SkillAuthority; diff --git a/codex-rs/ext/skills/src/render.rs b/codex-rs/ext/skills/src/render.rs index f918521a71..42ed9eacbb 100644 --- a/codex-rs/ext/skills/src/render.rs +++ b/codex-rs/ext/skills/src/render.rs @@ -1,6 +1,5 @@ use std::borrow::Cow; -use codex_core_skills::MAX_SKILL_PROMPT_BYTES; use codex_protocol::protocol::SkillScope; use codex_utils_string::approx_token_count; use codex_utils_string::take_bytes_at_char_boundary; @@ -15,6 +14,7 @@ use crate::fragments::AvailableSkillsInstructions; use crate::host_aliases::shared_host_alias_roots; const DEFAULT_SKILL_METADATA_CHAR_BUDGET: usize = 8_000; +const MAX_SKILL_PROMPT_BYTES: usize = 8_000; const SKILL_METADATA_CONTEXT_WINDOW_PERCENT: usize = 2; const MAX_CATALOG_SKILL_DESCRIPTION_CHARS: usize = 1_024; const TRUNCATED_SKILL_DESCRIPTION_SUFFIX: &str = "..."; diff --git a/codex-rs/ext/skills/tests/skills_extension.rs b/codex-rs/ext/skills/tests/skills_extension.rs index 59b9ad990c..97cca95428 100644 --- a/codex-rs/ext/skills/tests/skills_extension.rs +++ b/codex-rs/ext/skills/tests/skills_extension.rs @@ -6,7 +6,6 @@ use std::sync::atomic::Ordering; use codex_config::ConfigLayerStack; use codex_config::ConfigRequirementsToml; -use codex_core_skills::SkillLoadOutcome; use codex_exec_server::LOCAL_FS; use codex_extension_api::ConversationHistory; use codex_extension_api::ExtensionData; @@ -46,6 +45,7 @@ use codex_skills_extension::HostSkillsLoadInput; use codex_skills_extension::HostSkillsService; use codex_skills_extension::HostSkillsSnapshot; use codex_skills_extension::InjectedHostSkillPrompts; +use codex_skills_extension::SkillLoadOutcome; use codex_skills_extension::SkillProviders; use codex_skills_extension::SkillsExtensionConfig; use codex_skills_extension::catalog::SkillAuthority;