Files
DevFlow/src-tauri/src/commands/ai/audit/data_change.rs
T

56 lines
2.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! AR-11(方案A):数据变更联动刷新。
//!
//! 工具执行成功后按映射 emit "df-data-changed" { entity, action }
//! 前端 store listen 该事件按 entity 调 loadProjects/loadTasks/loadIdeas 刷新列表,
//! 取代工具执行后需手动刷新。
//!
//! 第四批从 audit/mod.rs 抽离,行为零变更。
use tauri::{AppHandle, Emitter};
/// AR-11(方案A):工具名 → (entity, action) 映射,用于数据变更联动刷新。
///
/// 仅数据变更类工具返回 Some,其余工具返回 None(不 emit df-data-changed)。
/// 映射规则:
/// - create_project/create_idea/create_task → (project/idea/task, create)
/// - update_project/update_task/update_idea → (..., update)
/// - delete_project/delete_task/delete_idea/purge_project → (..., delete)
/// - restore_project → (project, update)(恢复等同状态变更,前端走 update 刷新)
/// - bind_directory → (project, update)(绑定目录属项目字段更新)
pub(super) fn data_change_for_tool(name: &str) -> Option<(&'static str, &'static str)> {
let (entity, action) = match name {
"create_project" => ("project", "create"),
"create_task" => ("task", "create"),
"create_idea" => ("idea", "create"),
"update_project" => ("project", "update"),
"update_task" => ("task", "update"),
"update_idea" => ("idea", "update"),
// P0-2:advance_task 改任务状态 = 任务数据变更,MCP 走 HTTP 形态时让 GUI 前端
// listen df-data-changed 刷新任务列表(此前不在映射 → 状态推进后 GUI 不刷新)。
// 数据变更机制是 entity 级(无 id),映射到 (task, update) 对齐 update_task。
"advance_task" => ("task", "update"),
"delete_project" | "purge_project" => ("project", "delete"),
"delete_task" => ("task", "delete"),
"delete_idea" => ("idea", "delete"),
"restore_project" => ("project", "update"),
"bind_directory" => ("project", "update"),
"write_file" | "patch_file" => ("file", "update"),
_ => return None,
};
Some((entity, action))
}
/// AR-11(方案A):工具执行成功后按映射 emit "df-data-changed" { entity, action }。
///
/// 前端 store listen 该事件,按 entity 调 loadProjects/loadTasks/loadIdeas 刷新列表,
/// 取代工具执行后需手动刷新。仅工具名命中 data_change_for_tool 映射才 emit
/// 其余工具(run_workflow/list_tasks 等)不 emit。emit 失败不阻断(let _ =)。
pub(crate) fn emit_data_changed(app_handle: &AppHandle, tool_name: &str) {
if let Some((entity, action)) = data_change_for_tool(tool_name) {
let _ = app_handle.emit(
"df-data-changed",
serde_json::json!({ "entity": entity, "action": action }),
);
}
}