feat(skill-execution): implement execute_skill tool with full execution chain
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

- Add ExecuteSkillTool for LLM to call skills during conversation
- Implement SkillExecutor trait in Kernel for skill execution
- Update AgentLoop to support tool execution with skill_executor
- Add default skills_dir configuration in KernelConfig
- Connect frontend skillMarketStore to backend skill_list command
- Update technical documentation with Skill system architecture

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-03-24 13:24:23 +08:00
parent 1441f98c5e
commit 504d5746aa
8 changed files with 698 additions and 131 deletions

View File

@@ -5,11 +5,12 @@
//! - No provider prefix or alias mapping
//! - Simple, unified configuration structure
use std::path::PathBuf;
use std::sync::Arc;
use serde::{Deserialize, Serialize};
use secrecy::SecretString;
use zclaw_types::{Result, ZclawError};
use zclaw_runtime::{LlmDriver, AnthropicDriver, OpenAiDriver, GeminiDriver, LocalDriver};
use zclaw_types::Result;
use zclaw_runtime::{LlmDriver, AnthropicDriver, OpenAiDriver};
/// API protocol type
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
@@ -119,6 +120,10 @@ pub struct KernelConfig {
/// LLM configuration
#[serde(flatten)]
pub llm: LlmConfig,
/// Skills directory path (optional, defaults to ./skills)
#[serde(default)]
pub skills_dir: Option<PathBuf>,
}
fn default_database_url() -> String {
@@ -147,10 +152,18 @@ impl Default for KernelConfig {
max_tokens: default_max_tokens(),
temperature: default_temperature(),
},
skills_dir: default_skills_dir(),
}
}
}
/// Default skills directory (./skills relative to cwd)
fn default_skills_dir() -> Option<std::path::PathBuf> {
std::env::current_dir()
.ok()
.map(|cwd| cwd.join("skills"))
}
impl KernelConfig {
/// Load configuration from file
pub async fn load() -> Result<Self> {
@@ -321,6 +334,7 @@ impl KernelConfig {
Self {
database_url: default_database_url(),
llm,
skills_dir: None,
}
}
}