新增: 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:
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user