- Split zclaw-kernel/kernel.rs (1486 lines) into 9 domain modules - Split zclaw-kernel/generation.rs (1080 lines) into 3 modules - Add DeerFlow-inspired middleware: DanglingTool, SubagentLimit, ToolError, ToolOutputGuard - Add PromptBuilder for structured system prompt assembly - Add FactStore (zclaw-memory) for persistent fact extraction - Add task builtin tool for agent task management - Driver improvements: Anthropic/OpenAI extended thinking, Gemini safety settings - Replace let _ = with proper log::warn! across SaaS handlers - Remove unused dependency (url) from zclaw-hands
80 lines
2.6 KiB
Rust
80 lines
2.6 KiB
Rust
//! Skills management methods
|
|
|
|
use std::sync::Arc;
|
|
use zclaw_types::Result;
|
|
|
|
use super::Kernel;
|
|
|
|
impl Kernel {
|
|
/// Get the skills registry
|
|
pub fn skills(&self) -> &Arc<zclaw_skills::SkillRegistry> {
|
|
&self.skills
|
|
}
|
|
|
|
/// List all discovered skills
|
|
pub async fn list_skills(&self) -> Vec<zclaw_skills::SkillManifest> {
|
|
self.skills.list().await
|
|
}
|
|
|
|
/// Refresh skills from a directory
|
|
pub async fn refresh_skills(&self, dir: Option<std::path::PathBuf>) -> Result<()> {
|
|
if let Some(path) = dir {
|
|
self.skills.add_skill_dir(path).await?;
|
|
} else if let Some(ref skills_dir) = self.config.skills_dir {
|
|
self.skills.add_skill_dir(skills_dir.clone()).await?;
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
/// Get the configured skills directory
|
|
pub fn skills_dir(&self) -> Option<&std::path::PathBuf> {
|
|
self.config.skills_dir.as_ref()
|
|
}
|
|
|
|
/// Create a new skill in the skills directory
|
|
pub async fn create_skill(&self, manifest: zclaw_skills::SkillManifest) -> Result<()> {
|
|
let skills_dir = self.config.skills_dir.as_ref()
|
|
.ok_or_else(|| zclaw_types::ZclawError::InvalidInput(
|
|
"Skills directory not configured".into()
|
|
))?;
|
|
self.skills.create_skill(skills_dir, manifest).await
|
|
}
|
|
|
|
/// Update an existing skill
|
|
pub async fn update_skill(
|
|
&self,
|
|
id: &zclaw_types::SkillId,
|
|
manifest: zclaw_skills::SkillManifest,
|
|
) -> Result<zclaw_skills::SkillManifest> {
|
|
let skills_dir = self.config.skills_dir.as_ref()
|
|
.ok_or_else(|| zclaw_types::ZclawError::InvalidInput(
|
|
"Skills directory not configured".into()
|
|
))?;
|
|
self.skills.update_skill(skills_dir, id, manifest).await
|
|
}
|
|
|
|
/// Delete a skill
|
|
pub async fn delete_skill(&self, id: &zclaw_types::SkillId) -> Result<()> {
|
|
let skills_dir = self.config.skills_dir.as_ref()
|
|
.ok_or_else(|| zclaw_types::ZclawError::InvalidInput(
|
|
"Skills directory not configured".into()
|
|
))?;
|
|
self.skills.delete_skill(skills_dir, id).await
|
|
}
|
|
|
|
/// Execute a skill with the given ID and input
|
|
pub async fn execute_skill(
|
|
&self,
|
|
id: &str,
|
|
context: zclaw_skills::SkillContext,
|
|
input: serde_json::Value,
|
|
) -> Result<zclaw_skills::SkillResult> {
|
|
// Inject LLM completer into context for PromptOnly skills
|
|
let mut ctx = context;
|
|
if ctx.llm.is_none() {
|
|
ctx.llm = Some(self.llm_completer.clone());
|
|
}
|
|
self.skills.execute(&zclaw_types::SkillId::new(id), &ctx, input).await
|
|
}
|
|
}
|