import { ref } from 'vue' import { defineStore } from 'pinia' import { v4 as uuidv4 } from 'uuid' import { store } from '../index' import type { IRawStepTask, IApiStepTask } from './agents' import type { Node, Edge } from '@vue-flow/core' // 分支节点数据接口 - 用于存储流程图中的节点和边 export interface IBranchData { id: string // 分支唯一ID parentNodeId: string // 父节点ID(根节点或任务节点) branchContent: string // 分支需求内容 branchType: 'root' | 'task' // 分支类型 nodes: Node[] // 分支包含的所有节点 edges: Edge[] // 分支包含的所有边 tasks: IRawStepTask[] // 分支的任务数据 createdAt: number // 创建时间 } export const useSelectionStore = defineStore('selection', () => { // ==================== 任务大纲探索分支数据存储 ==================== const flowBranches = ref([]) // 任务大纲分支管理 // 添加流程图分支 function addFlowBranch(data: { parentNodeId: string branchContent: string branchType: 'root' | 'task' nodes: Node[] edges: Edge[] tasks: IRawStepTask[] }): string { const branchId = `flow-branch-${uuidv4()}` const newBranch: IBranchData = { id: branchId, parentNodeId: data.parentNodeId, branchContent: data.branchContent, branchType: data.branchType, nodes: data.nodes, edges: data.edges, tasks: data.tasks, createdAt: Date.now(), } flowBranches.value.push(newBranch) console.log('📂 保存流程图分支到 store:', newBranch) return branchId } // 获取所有流程图分支 function getAllFlowBranches(): IBranchData[] { return flowBranches.value } // 根据父节点ID获取流程图分支 function getFlowBranchesByParent(parentNodeId: string): IBranchData[] { return flowBranches.value.filter((branch) => branch.parentNodeId === parentNodeId) } // 删除流程图分支 function removeFlowBranch(branchId: string): boolean { const index = flowBranches.value.findIndex((branch) => branch.id === branchId) if (index > -1) { flowBranches.value.splice(index, 1) console.log('🗑️ 删除流程图分支:', branchId) return true } return false } // 清除所有流程图分支 function clearFlowBranches() { flowBranches.value = [] console.log('🗑️ 清除所有流程图分支') } // 根据父节点ID清除流程图分支 function clearFlowBranchesByParent(parentNodeId: string) { flowBranches.value = flowBranches.value.filter((branch) => branch.parentNodeId !== parentNodeId) console.log('🗑️ 清除父节点为', parentNodeId, '的流程图分支') } // ==================== 任务过程探索分支数据存储 ==================== // 用于存储任务过程探索中的分支数据 // 结构: Map> // - taskStepId: 任务步骤ID // - agentGroupKey: agent 组合的唯一标识(排序后的 JSON 字符串) // - IBranchData[]: 该 agent 组合在该任务下的所有分支数据 const taskProcessBranchesMap = ref>>(new Map()) // 添加任务过程分支 function addTaskProcessBranch( taskStepId: string, agents: string[], // 🆕 新增:需要传入 agents 列表 data: { parentNodeId: string branchContent: string branchType: 'root' | 'task' nodes: Node[] edges: Edge[] tasks: IRawStepTask[] }, ): string { const branchId = `task-process-branch-${uuidv4()}` const agentGroupKey = getAgentGroupKey(agents) // 🆕 生成 agent 组合 key const newBranch: IBranchData = { id: branchId, parentNodeId: data.parentNodeId, branchContent: data.branchContent, branchType: data.branchType, nodes: data.nodes, edges: data.edges, tasks: data.tasks, createdAt: Date.now(), } // 获取或创建该任务步骤的 Map if (!taskProcessBranchesMap.value.has(taskStepId)) { taskProcessBranchesMap.value.set(taskStepId, new Map()) } // 获取或创建该 agent 组合的分支列表 const agentMap = taskProcessBranchesMap.value.get(taskStepId)! if (!agentMap.has(agentGroupKey)) { agentMap.set(agentGroupKey, []) } agentMap.get(agentGroupKey)!.push(newBranch) console.log('📂 保存任务过程分支到 store:', { taskStepId, agents, agentGroupKey, branch: newBranch }) return branchId } // 获取指定任务步骤和 agent 组合的所有分支 function getTaskProcessBranches(taskStepId: string, agents: string[]): IBranchData[] { const agentGroupKey = getAgentGroupKey(agents) return taskProcessBranchesMap.value.get(taskStepId)?.get(agentGroupKey) || [] } // 获取所有任务过程分支 function getAllTaskProcessBranches(): Map> { return taskProcessBranchesMap.value } // 根据父节点ID获取任务过程分支 function getTaskProcessBranchesByParent(taskStepId: string, agents: string[], parentNodeId: string): IBranchData[] { const agentGroupKey = getAgentGroupKey(agents) const branches = taskProcessBranchesMap.value.get(taskStepId)?.get(agentGroupKey) || [] return branches.filter((branch) => branch.parentNodeId === parentNodeId) } // 删除任务过程分支 function removeTaskProcessBranch(taskStepId: string, agents: string[], branchId: string): boolean { const agentGroupKey = getAgentGroupKey(agents) const branches = taskProcessBranchesMap.value.get(taskStepId)?.get(agentGroupKey) if (branches) { const index = branches.findIndex((branch) => branch.id === branchId) if (index > -1) { branches.splice(index, 1) console.log('🗑️ 删除任务过程分支:', { taskStepId, agents, branchId }) return true } } return false } // 清除指定任务步骤和 agent 组合的所有分支 function clearTaskProcessBranches(taskStepId: string, agents?: string[]) { if (agents) { // 清除指定 agent 组合的分支 const agentGroupKey = getAgentGroupKey(agents) const agentMap = taskProcessBranchesMap.value.get(taskStepId) if (agentMap) { agentMap.delete(agentGroupKey) console.log('🗑️ 清除任务步骤的 agent 组合分支:', { taskStepId, agents }) } } else { // 清除该任务步骤的所有分支(所有 agent 组合) taskProcessBranchesMap.value.delete(taskStepId) console.log('🗑️ 清除任务步骤的所有分支:', taskStepId) } } // ==================== Agent 组合 TaskProcess 数据存储 ==================== // 用于存储 fill_stepTask_TaskProcess 接口返回的数据 // 结构: Map> // - taskId: 任务ID // - agentGroupKey: agent 组合的唯一标识(排序后的 JSON 字符串) // - IApiStepTask: 该 agent 组合的完整 TaskProcess 数据 const agentTaskProcessMap = ref>>(new Map()) // 生成 agent 组合的唯一 key(排序后保证一致性) function getAgentGroupKey(agents: string[]): string { // 🆕 处理 undefined 或 null 的情况 if (!agents || !Array.isArray(agents)) { return JSON.stringify([]) } return JSON.stringify([...agents].sort()) } // 存储 agent 组合的 TaskProcess 数据 function setAgentTaskProcess(taskId: string, agents: string[], taskProcess: IApiStepTask) { const groupKey = getAgentGroupKey(agents) // 获取或创建该任务的 Map if (!agentTaskProcessMap.value.has(taskId)) { agentTaskProcessMap.value.set(taskId, new Map()) } // 存储该 agent 组合的 TaskProcess 数据 agentTaskProcessMap.value.get(taskId)!.set(groupKey, taskProcess) console.log(`📦 存储 agent 组合 TaskProcess [任务: ${taskId}, agents: ${agents.join(', ')}]`) } // 获取 agent 组合的 TaskProcess 数据 function getAgentTaskProcess(taskId: string, agents: string[]): IApiStepTask | undefined { const groupKey = getAgentGroupKey(agents) return agentTaskProcessMap.value.get(taskId)?.get(groupKey) } // 检查 agent 组合是否已有 TaskProcess 数据 function hasAgentTaskProcess(taskId: string, agents: string[]): boolean { const groupKey = getAgentGroupKey(agents) return agentTaskProcessMap.value.get(taskId)?.has(groupKey) || false } // 清除指定任务的所有 agent 组合 TaskProcess 数据 function clearAgentTaskProcess(taskId: string) { agentTaskProcessMap.value.delete(taskId) console.log(`🗑️ 清除任务的 agent 组合 TaskProcess 数据: ${taskId}`) } // 清除所有任务的 agent 组合 TaskProcess 数据 function clearAllAgentTaskProcess() { agentTaskProcessMap.value.clear() console.log('🗑️ 清除所有任务的 agent 组合 TaskProcess 数据') } // ==================== 当前生效的任务过程分支 ==================== // 记录每个任务步骤和 agent 组合当前生效的分支 ID(持久化选中状态) // 结构: Map> // - taskStepId: 任务步骤ID // - agentGroupKey: agent 组合的唯一标识 // - branchId: 当前选中的分支ID const activeTaskProcessBranchMap = ref>>(new Map()) // 🆕 当前生效的 TaskProcess 数据(用于外部组件显示职责分配) // 结构: Map> const activeTaskProcessDataMap = ref>>(new Map()) // 设置当前生效的分支 function setActiveTaskProcessBranch(taskStepId: string, agents: string[], branchId: string) { const agentGroupKey = getAgentGroupKey(agents) // 获取或创建该任务步骤的 Map if (!activeTaskProcessBranchMap.value.has(taskStepId)) { activeTaskProcessBranchMap.value.set(taskStepId, new Map()) } activeTaskProcessBranchMap.value.get(taskStepId)!.set(agentGroupKey, branchId) console.log('✅ 设置当前生效分支:', { taskStepId, agents, agentGroupKey, branchId }) } // 🆕 设置当前生效的 TaskProcess 数据 function setActiveTaskProcessData(taskStepId: string, agents: string[], taskProcess: any[]) { const agentGroupKey = getAgentGroupKey(agents) // 获取或创建该任务步骤的 Map if (!activeTaskProcessDataMap.value.has(taskStepId)) { activeTaskProcessDataMap.value.set(taskStepId, new Map()) } activeTaskProcessDataMap.value.get(taskStepId)!.set(agentGroupKey, taskProcess) console.log('✅ 设置当前生效的 TaskProcess 数据:', { taskStepId, agents, agentGroupKey, taskProcess }) } // 获取当前生效的分支 ID function getActiveTaskProcessBranch(taskStepId: string, agents: string[]): string | undefined { const agentGroupKey = getAgentGroupKey(agents) return activeTaskProcessBranchMap.value.get(taskStepId)?.get(agentGroupKey) } // 🆕 获取当前生效的 TaskProcess 数据 function getActiveTaskProcessData(taskStepId: string, agents: string[]): any[] | undefined { const agentGroupKey = getAgentGroupKey(agents) return activeTaskProcessDataMap.value.get(taskStepId)?.get(agentGroupKey) } // 清除生效分支 function clearActiveTaskProcessBranch(taskStepId: string, agents?: string[]) { if (agents) { // 清除指定 agent 组合的生效分支 const agentGroupKey = getAgentGroupKey(agents) activeTaskProcessBranchMap.value.get(taskStepId)?.delete(agentGroupKey) activeTaskProcessDataMap.value.get(taskStepId)?.delete(agentGroupKey) console.log('🗑️ 清除任务步骤的 agent 组合生效分支:', { taskStepId, agents }) } else { // 清除该任务步骤的所有生效分支(所有 agent 组合) activeTaskProcessBranchMap.value.delete(taskStepId) activeTaskProcessDataMap.value.delete(taskStepId) console.log('🗑️ 清除任务步骤的所有生效分支:', taskStepId) } } return { // 状态 flowBranches, taskProcessBranchesMap, agentTaskProcessMap, activeTaskProcessBranchMap, activeTaskProcessDataMap, // 🆕 新增 // 任务大纲分支管理方法 addFlowBranch, getAllFlowBranches, getFlowBranchesByParent, removeFlowBranch, clearFlowBranches, clearFlowBranchesByParent, // 任务过程分支管理方法 addTaskProcessBranch, getTaskProcessBranches, getAllTaskProcessBranches, getTaskProcessBranchesByParent, removeTaskProcessBranch, clearTaskProcessBranches, // 🆕 任务过程分支生效状态管理方法 setActiveTaskProcessBranch, setActiveTaskProcessData, // 🆕 新增 getActiveTaskProcessBranch, getActiveTaskProcessData, // 🆕 新增 clearActiveTaskProcessBranch, // Agent 组合 TaskProcess 数据管理方法 getAgentGroupKey, setAgentTaskProcess, getAgentTaskProcess, hasAgentTaskProcess, clearAgentTaskProcess, clearAllAgentTaskProcess, } }) /** * 用于在组件外部使用 Selection Store */ export function useSelectionStoreHook() { return useSelectionStore(store) }