refactor(crates): kernel/generation module split + DeerFlow optimizations + middleware + dead code cleanup
- 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
This commit is contained in:
79
crates/zclaw-kernel/src/kernel/skills.rs
Normal file
79
crates/zclaw-kernel/src/kernel/skills.rs
Normal file
@@ -0,0 +1,79 @@
|
||||
//! 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user