fix(runtime,kernel): HandTool 空壳修复 — 桥接到 HandRegistry 真实执行
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
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
B-HAND-1 修复: LLM 调用 hand_quiz/hand_researcher 等 Hand 工具后,
HandTool::execute() 原来返回假成功 JSON, 实际 Hand 并不执行.
修复方案 (沿用 SkillExecutor 模式):
- tool.rs: 新增 HandExecutor trait + ToolContext.hand_executor 字段
- hand_tool.rs: execute() 通过 context.hand_executor 分发到真实执行
- loop_runner.rs: AgentLoop 新增 hand_executor 字段 + builder + 3处 ToolContext 传递
- adapters.rs: 新增 KernelHandExecutor 桥接 HandRegistry.execute()
- kernel/mod.rs: 初始化 KernelHandExecutor + 注册到 AgentLoop
- messaging.rs: 两处 AgentLoop 构建添加 .with_hand_executor()
数据流: LLM tool call → HandTool::execute() → ToolContext.hand_executor
→ KernelHandExecutor → HandRegistry.execute() → Hand trait impl
809 tests passed, 0 failed.
This commit is contained in:
@@ -7,7 +7,7 @@ use zclaw_types::{AgentId, SessionId, Message, Result};
|
||||
|
||||
use crate::driver::{LlmDriver, CompletionRequest, ContentBlock};
|
||||
use crate::stream::StreamChunk;
|
||||
use crate::tool::{ToolRegistry, ToolContext, SkillExecutor};
|
||||
use crate::tool::{ToolRegistry, ToolContext, SkillExecutor, HandExecutor};
|
||||
use crate::tool::builtin::PathValidator;
|
||||
use crate::growth::GrowthIntegration;
|
||||
use crate::compaction::{self, CompactionConfig};
|
||||
@@ -28,6 +28,7 @@ pub struct AgentLoop {
|
||||
max_tokens: u32,
|
||||
temperature: f32,
|
||||
skill_executor: Option<Arc<dyn SkillExecutor>>,
|
||||
hand_executor: Option<Arc<dyn HandExecutor>>,
|
||||
path_validator: Option<PathValidator>,
|
||||
/// Growth system integration (optional)
|
||||
growth: Option<GrowthIntegration>,
|
||||
@@ -64,6 +65,7 @@ impl AgentLoop {
|
||||
max_tokens: 16384,
|
||||
temperature: 0.7,
|
||||
skill_executor: None,
|
||||
hand_executor: None,
|
||||
path_validator: None,
|
||||
growth: None,
|
||||
compaction_threshold: 0,
|
||||
@@ -81,6 +83,12 @@ impl AgentLoop {
|
||||
self
|
||||
}
|
||||
|
||||
/// Set the hand executor for dispatching Hand tool calls to HandRegistry
|
||||
pub fn with_hand_executor(mut self, executor: Arc<dyn HandExecutor>) -> Self {
|
||||
self.hand_executor = Some(executor);
|
||||
self
|
||||
}
|
||||
|
||||
/// Set the path validator for file system operations
|
||||
pub fn with_path_validator(mut self, validator: PathValidator) -> Self {
|
||||
self.path_validator = Some(validator);
|
||||
@@ -199,6 +207,7 @@ impl AgentLoop {
|
||||
working_directory: working_dir,
|
||||
session_id: Some(session_id.to_string()),
|
||||
skill_executor: self.skill_executor.clone(),
|
||||
hand_executor: self.hand_executor.clone(),
|
||||
path_validator: Some(path_validator),
|
||||
event_sender: None,
|
||||
}
|
||||
@@ -567,6 +576,7 @@ impl AgentLoop {
|
||||
let tools = self.tools.clone();
|
||||
let middleware_chain = self.middleware_chain.clone();
|
||||
let skill_executor = self.skill_executor.clone();
|
||||
let hand_executor = self.hand_executor.clone();
|
||||
let path_validator = self.path_validator.clone();
|
||||
let agent_id = self.agent_id.clone();
|
||||
let model = self.model.clone();
|
||||
@@ -849,6 +859,7 @@ impl AgentLoop {
|
||||
working_directory: working_dir,
|
||||
session_id: Some(session_id_clone.to_string()),
|
||||
skill_executor: skill_executor.clone(),
|
||||
hand_executor: hand_executor.clone(),
|
||||
path_validator: Some(pv),
|
||||
event_sender: Some(tx.clone()),
|
||||
};
|
||||
@@ -903,6 +914,7 @@ impl AgentLoop {
|
||||
working_directory: working_dir,
|
||||
session_id: Some(session_id_clone.to_string()),
|
||||
skill_executor: skill_executor.clone(),
|
||||
hand_executor: hand_executor.clone(),
|
||||
path_validator: Some(pv),
|
||||
event_sender: Some(tx.clone()),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user