新增: MCP HTTP transport + 系统托盘 + 实体解析(会话前基线收尾)

- df-mcp 加 streamable HTTP transport 层(axum 0.7 + tower,server_http.rs),lib.rs pub mod 接线

- src-tauri 加 mcp.rs(spawn_mcp_http + mcp_get_status IPC + mcp-server CLI)+ tray.rs(系统托盘 show_main/setup_tray),lib.rs 集成 + main.rs mcp-server 参数路由

- AI 工具加 entity_resolve.rs(实体解析,tools/mod.rs pub mod 接线)
This commit is contained in:
lxy
2026-08-05 22:14:27 +08:00
parent c480627ba6
commit a91e950874
16 changed files with 2238 additions and 94 deletions
+33
View File
@@ -2,6 +2,9 @@
mod commands;
mod state;
// Phase3: 桌面内嵌 HTTP MCP server + 托盘常驻 + 单实例
mod mcp;
mod tray;
use tauri::{Emitter, Listener, Manager};
@@ -51,6 +54,10 @@ pub fn run() {
.plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_window_state::Builder::default().build())
// Phase3 单实例:二次启动不新开进程,唤起已有实例主窗口(防多实例抢 MCP 18765 端口)
.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
tray::show_main(app);
}))
.setup(|app| {
// 数据库放在系统应用数据目录 <app_data_dir> 下(dev/release 拆分):
// Dev 模式 devflow-dev.db(可随意改动/清空),Build 模式 devflow.db(长期保留真实运行数据)
@@ -71,6 +78,23 @@ pub fn run() {
let session_for_handshake = app_state.ai_session.clone();
app.manage(app_state);
// ── Phase3: 内嵌 HTTP MCP server + 托盘常驻 + 单实例 ──
// 1) MCP 运行时状态:先 manage 初始 running=false,spawn 绑定成功后更新为 true。
// mcp_get_status IPC 经 State<Mutex<McpStatus>> 读取,spawn 内写锁同步。
let mcp_status = std::sync::Mutex::new(mcp::McpStatus {
running: false,
port: mcp::mcp_port(),
});
app.manage(mcp_status);
// 2) 启动 HTTP MCP server(复用 AppState.db,与 GUI 共享同一连接)。
// db 经 app.state::<AppState>() 取 Arc clone(manage 已注入,setup 后续可用)。
let db_for_mcp = app.state::<AppState>().db.clone();
mcp::spawn_mcp_http(app.handle(), db_for_mcp);
// 3) 创建托盘(关窗口不退出,托盘「退出」才真正结束进程)。失败非阻断。
if let Err(e) = tray::setup_tray(app.handle()) {
tracing::error!("[tray] 托盘创建失败(非阻断): {}", e);
}
// B-260616-01: L0 握手 — 监听前端就绪事件,清除 HMR/刷新导致的残留 generating 状态
// 任务5: 3 秒防抖 —— 前端 HMR/快速连击会连发 ai-client-ready(实测 <1s 内多次),
// 每次都走完整 握手(spawn + 锁 session + emit)造成事务事并行冲突 + emit 风暴。
@@ -475,7 +499,16 @@ pub fn run() {
commands::settings::delete_template,
// CI 状态
commands::ci_status::get_commit_status,
// Phase3: 内嵌 HTTP MCP server 状态查询
crate::mcp::mcp_get_status,
])
// Phase3: 关窗口不退出,隐藏到托盘常驻(托盘「退出」菜单才真正结束进程)
.on_window_event(|window, event| {
if let tauri::WindowEvent::CloseRequested { api, .. } = event {
api.prevent_close(); // 拦截真正关闭
let _ = window.hide(); // 隐藏到托盘
}
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}