新增: 工具工作流补全(diff_files工具 + 技能清单注入 + 工作流进度共享 + human端到端测试 + 知识库MCP工具)

This commit is contained in:
lxy
2026-08-08 21:24:53 +08:00
parent 6ba6daf188
commit 9eb2995a74
14 changed files with 807 additions and 93 deletions
+56
View File
@@ -151,6 +151,23 @@ pub const GOAL_MAX_CHARS: usize = 500;
/// 防无限膨胀:每次发消息提取的目标追加到 pinned_goals vec,超上限时淘汰最早目标。
pub const MAX_GOALS: usize = 5;
/// 技能清单注入开关:system_prompt 是否追加本机技能清单(名称+描述),让 LLM 感知可用技能(默认 true)。
///
/// 机制化:LLM 只读清单,用户请求命中某技能用途时能引导触发(/技能名),不做复杂执行逻辑。
/// 清单来自 skills.rs 进程内缓存(skills/commands/plugins 三类去重)。false(回退)→ 整块跳过,
/// system_prompt 零变化,退回改动前行为(单点回退,不影响 augmentation 的 / 联想)。
pub const SKILL_LIST_INJECT_ENABLED: bool = true;
/// 技能清单注入最大条数(默认 20)。
///
/// 防本机大量技能全量进 system_prompt 占 sys_tokens 预算;取前 N 条(name 去重序),截断描述。
pub const SKILL_LIST_MAX_ITEMS: usize = 20;
/// 技能清单单条描述截断长度(默认 80 字符)。
///
/// 清单只做提示,截断防长描述(部分技能 description 数百字)撑爆 prompt,截断后接省略号。
pub const SKILL_DESC_MAX_CHARS: usize = 80;
/// G4 目标感知降级:话题标记 insert 当 pinned_goals 存在时跳过(默认 true)。
///
/// 治 R2(话题标记反向误导):G1 目标钉扎生效后每轮 system_prompt 已含目标,topic marker 的
@@ -1044,6 +1061,45 @@ pub(crate) async fn run_agentic_loop(
);
system_prompt = format!("{}\n\n{}\n\n{}", system_prompt, env_prompt, behavior_prompt);
// 技能清单注入:把本机扫描到的技能(名称+描述)追加到 system_prompt,让 LLM 感知可用技能。
//
// 治「AI 不知道有技能可引导」:skills.rs 联想已做(前端 / 浮层),但 AI 本身对技能无感知,
// 用户需求命中某技能(如"发布flux")时 AI 不会引导。机制化——只注入清单(不执行技能逻辑,
// 执行仍由用户在 Claude Code 侧 / 技能名 触发),LLM 据此提示用户可用技能。
// 清单来自 skills_cached() 进程内缓存(懒扫描一次,后续零开销);截断条数+描述防占预算。
if SKILL_LIST_INJECT_ENABLED {
let skills = crate::commands::ai::skills::skills_cached().await;
if !skills.is_empty() {
let lines: Vec<String> = skills
.iter()
.take(SKILL_LIST_MAX_ITEMS)
.map(|s| {
let desc_flat = s.description.replace('\n', " ");
let desc: String = desc_flat.chars().take(SKILL_DESC_MAX_CHARS).collect();
let desc = if desc_flat.chars().count() > SKILL_DESC_MAX_CHARS {
format!("{}…", desc)
} else {
desc
};
format!("- {}: {}", s.name, desc)
})
.collect();
if !lines.is_empty() {
system_prompt = format!(
"{}\n\n## 可用技能\n以下为本机 Claude 技能/命令(名称: 描述)。用户请求命中某技能用途时,提示用户输入 /技能名 触发,或引导其按需使用:\n{}",
system_prompt,
lines.join("\n")
);
tracing::debug!(
conv_id = %conv_id,
count = lines.len(),
"[ai] 技能清单注入:已追加 {} 条技能到 system_prompt",
lines.len()
);
}
}
}
// T4: 工作流 DAG 注入 — 当会话关联工作流时,将活跃路径注入 system prompt
{
let session = session_arc.lock().await;