新增: AR-11 数据变更联动(AI 工具执行后 emit df-data-changed+store listen 刷新列表)
audit.rs data_change_for_tool 映射(create_project/idea/task→create,update_*→update,delete_*/purge→delete,restore/bind_directory→update)+emit_data_changed(process_tool_calls 已有 app_handle 无需透传);commands.rs ai_approve 成功路径 emit;types.ts DfDataChangedPayload;project.ts barrel listen df-data-changed + start/stopDataChangedListener 单例;App.vue onMounted 全局挂载+onUnmounted 清理。AI 工具(create/update/delete project/task/idea)执行后前端 Projects/Tasks/Ideas 列表自动刷新。批7,cargo+vue-tsc 0
This commit is contained in:
@@ -214,6 +214,8 @@ onMounted(async () => {
|
||||
window.addEventListener('keydown', handleKeydown)
|
||||
// 加载知识库候选数(供侧栏 knowledge badge 显示)
|
||||
knowledgeStore.loadCandidates()
|
||||
// AR-11:数据变更联动监听(AI 工具 create/update/delete 后端 emit df-data-changed → store listen 刷新对应列表,全局挂载因用户可在任意页)
|
||||
await projectStore.startDataChangedListener()
|
||||
})
|
||||
|
||||
/// 一次性迁移:遍历遗留的 localStorage key,若有值则导入 appSettings(SQLite),
|
||||
@@ -254,6 +256,7 @@ const candidateCount = computed(() => knowledgeStore.candidateCount)
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('keydown', handleKeydown)
|
||||
projectStore.stopDataChangedListener?.()
|
||||
})
|
||||
|
||||
const primaryNav = [
|
||||
|
||||
@@ -145,6 +145,21 @@ export type UpdateField = {
|
||||
value: string
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// 数据变更联动刷新(AR-11 方案A)
|
||||
// ============================================================
|
||||
|
||||
/**
|
||||
* 后端 AI 工具(create/update/delete/restore/purge/bind_directory 等)执行成功后
|
||||
* emit 的 "df-data-changed" 事件负载。前端 store listen 后按 entity 调对应 load 刷新列表。
|
||||
*/
|
||||
export interface DfDataChangedPayload {
|
||||
/** 变更实体:project / task / idea */
|
||||
entity: 'project' | 'task' | 'idea'
|
||||
/** 变更动作:create / update / delete */
|
||||
action: 'create' | 'update' | 'delete'
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// AI 聊天
|
||||
// ============================================================
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { reactive, computed } from 'vue'
|
||||
import { listen } from '@tauri-apps/api/event'
|
||||
import { createProjectsStore } from './project/projects'
|
||||
import { createTasksStore } from './project/tasks'
|
||||
import { createIdeasStore } from './project/ideas'
|
||||
import { createWorkflowStore } from './project/workflow'
|
||||
import { state, clearError } from './project/state'
|
||||
import type { DfDataChangedPayload } from '../api/types'
|
||||
|
||||
// ── barrel 组合器(零行为变更,纯重构) ──
|
||||
//
|
||||
@@ -20,6 +22,39 @@ function createStore() {
|
||||
const ideasStore = createIdeasStore()
|
||||
const workflowStore = createWorkflowStore()
|
||||
|
||||
// ── AR-11(方案A):数据变更联动刷新 ──
|
||||
// 后端 AI 工具(create/update/delete/restore/purge/bind_directory)执行成功后 emit
|
||||
// "df-data-changed" { entity, action },前端按 entity 调对应 load 刷新列表,
|
||||
// 取代工具执行后需手动刷新。
|
||||
let _dataChangedUnlisten: (() => void) | null = null
|
||||
|
||||
async function startDataChangedListener() {
|
||||
if (_dataChangedUnlisten) return _dataChangedUnlisten
|
||||
_dataChangedUnlisten = await listen<DfDataChangedPayload>('df-data-changed', (event) => {
|
||||
const { entity } = event.payload
|
||||
// 按 entity 调对应 load 刷新(action 仅语义标识,刷新统一走 load 全量拉取)
|
||||
if (entity === 'project') {
|
||||
void projectsStore.loadProjects()
|
||||
} else if (entity === 'task') {
|
||||
void tasksStore.loadTasks()
|
||||
} else if (entity === 'idea') {
|
||||
void ideasStore.loadIdeas()
|
||||
}
|
||||
})
|
||||
return _dataChangedUnlisten
|
||||
}
|
||||
|
||||
function stopDataChangedListener() {
|
||||
if (_dataChangedUnlisten) {
|
||||
try {
|
||||
_dataChangedUnlisten()
|
||||
} catch (e) {
|
||||
console.error('停止数据变更监听失败:', e)
|
||||
}
|
||||
_dataChangedUnlisten = null
|
||||
}
|
||||
}
|
||||
|
||||
// ── 统计(跨领域,留在组合器) ──
|
||||
const stats = computed(() => ({
|
||||
ideas: state.ideas.length,
|
||||
@@ -70,6 +105,9 @@ function createStore() {
|
||||
clearLiveEvents: workflowStore.clearLiveEvents,
|
||||
approveHumanApproval: workflowStore.approveHumanApproval,
|
||||
cancelHumanApproval: workflowStore.cancelHumanApproval,
|
||||
// AR-11(方案A):数据变更联动刷新监听(后端工具执行后 emit df-data-changed)
|
||||
startDataChangedListener,
|
||||
stopDataChangedListener,
|
||||
pendingApproval: computed(() => state.pendingApproval),
|
||||
// computed
|
||||
stats,
|
||||
|
||||
Reference in New Issue
Block a user