优化: run_command 实时流式 + 审批浮窗修复 + 文档探索闭环(fetch_url+obscura引导+model_fetch兼容+prompt策略+厂商预设)

This commit is contained in:
lxy
2026-08-01 17:58:47 +08:00
parent 0e0c6862ba
commit d664bdc309
25 changed files with 1693 additions and 44 deletions
+22 -3
View File
@@ -457,6 +457,7 @@ pub fn build_ai_tool_registry(
register_data_tools(&mut registry, db);
register_file_tools(&mut registry, allowed_dirs, data_dir);
register_http_tools(&mut registry);
register_fetch_url_tool(&mut registry);
registry
}
@@ -476,6 +477,19 @@ fn register_http_tools(registry: &mut AiToolRegistry) {
super::tools::http::register(registry);
}
/// fetch_url AI 工具注册(1 个:URL → markdown 文档嗅探)— 只读 GET 网页文档。
/// 不持 db,纯 reqwest GET + htmd HTML→markdown 转换。SSRF 防护复用 commands/ai/http.rs
/// (validate_url / resolve_and_check_host / execute_with_redirects,经 pub(crate) 暴露)。
///
/// 风险:Low(只读 GET,无副作用)。与 http_request 分工:fetch_url 输出已清洗 markdown 供 LLM 理解文档,
/// http_request 输出原始响应 body 供 API 调用(POST/鉴权)。
///
/// tool_registry 拆分:声明式注册(tools/fetch_url.rs),handler 在 commands/ai/fetch_url.rs。
/// 基线测试 test_build_ai_tool_registry_baseline_tool_count 守护总量 + 工具名集合稳定。
fn register_fetch_url_tool(registry: &mut AiToolRegistry) {
super::tools::fetch_url::register(registry);
}
/// 数据层 AI 工具注册(25 个持 db 的 CRUD/状态机/工作流/知识图谱工具)——从 build_ai_tool_registry 抽出。
///
/// 工具闭包捕获 `db: &Arc<Database>` Arc 重建 Repo(列表/创建/更新/删除/状态推进/工作流/任务关联)。
@@ -1117,7 +1131,7 @@ mod tests {
// 任一层漏移 register 调用,此测试立即红。工具名集合也断言,防 rename 致 LLM tool 突变。
// ============================================================
/// build_ai_tool_registry 应注册恰好 41 个工具(27 data + 13 file + 1 http),且工具名集合稳定。
/// build_ai_tool_registry 应注册恰好 51 个工具(36 data + 13 file + 1 http + 1 fetch_url),且工具名集合稳定。
///
/// 用 in-memory SQLite(Database::open_in_memory 自跑迁移),构造零外部依赖的 db,
// 不实际执行任何 handler——仅断言注册阶段的定义完整性,故无需真实数据。
@@ -1151,10 +1165,13 @@ mod tests {
// update_idea/delete_idea(2026-08-01): data 层 34→36(补 AI 改/删灵感专用工具,
// idea_repo.update_field / soft_delete 早已具备,工具层此前缺失致 AI 误用 update_task)。
// 50 = 36 data + 13 file + 1 http。
// fetch_url(2026-08-01): http 层 1→2(新增 URL→markdown 文档嗅探,只读 GET,
// htmd HTML→markdown + 去噪音 + 截断,SSRF 复用 http.rs)。
// 51 = 36 data + 13 file + 1 http + 1 fetch_url。
assert_eq!(
registry.len(),
50,
"工具总数应为 50(36 data + 13 file + 1 http),实际 {}", registry.len()
51,
"工具总数应为 51(36 data + 13 file + 1 http + 1 fetch_url),实际 {}", registry.len()
);
// 工具名集合基线:防 rename / 漏注册 / 误删除。
@@ -1192,6 +1209,8 @@ mod tests {
"grep", "detect_environment",
// ── http 层 (1) ──
"http_request",
// ── fetch_url 层 (1) ──(URL → markdown 文档嗅探,只读 GET,与 http_request 分工)
"fetch_url",
];
expected.sort_unstable();