import { ref, watch } from 'vue' import { defineStore } from 'pinia' import { v4 as uuidv4 } from 'uuid' import { store } from '../index' import { useStorage } from '@vueuse/core' import type { IExecuteRawResponse } from '@/api' import { useConfigStore } from '@/stores/modules/config.ts' export interface Agent { Name: string Profile: string Icon: string Classification: string apiUrl?: string apiKey?: string apiModel?: string } type HslColorVector = [number, number, number] export interface IRichText { template: string data: Record< string, { text: string style?: Record color?: HslColorVector } > } export interface TaskProcess { ActionType: string AgentName: string Description: string ID: string ImportantInput: string[] } export interface IRawStepTask { Id?: string StepName?: string TaskContent?: string InputObject_List?: string[] OutputObject?: string AgentSelection?: string[] Collaboration_Brief_FrontEnd: IRichText TaskProcess: TaskProcess[] } export interface IRawPlanResponse { 'Initial Input Object'?: string[] | string 'General Goal'?: string 'Collaboration Process'?: IRawStepTask[] } const storageKey = '$agents' as const // 清除所有以 storageKey 开头的 localStorage function clearStorageByVersion() { Object.keys(localStorage) .filter((key) => key.startsWith(storageKey)) .forEach((key) => localStorage.removeItem(key)) } export const useAgentsStore = defineStore('agents', () => { const configStore = useConfigStore() const agents = useStorage(`${storageKey}-repository`, []) function setAgents(agent: Agent[]) { agents.value = agent } // 任务搜索的内容 const searchValue = useStorage(`${storageKey}-search-value`, '') function setSearchValue(value: string) { searchValue.value = value } const storageVersionIdentifier = useStorage( `${storageKey}-storage-version-identifier`, '', ) // 监听 configStore.config.agentRepository.storageVersionIdentifier 改变 watch( () => configStore.config.agentRepository.storageVersionIdentifier, (value) => { // value与storageVersionIdentifier不一致清除所有storageKey开头的localStorage if (value !== storageVersionIdentifier.value) { clearStorageByVersion() storageVersionIdentifier.value = value } }, { immediate: true, }, ) // 当前的展示的任务流程 const currentTask = ref() function setCurrentTask(task: IRawStepTask) { currentTask.value = task } const agentRawPlan = ref<{ data?: IRawPlanResponse; loading?: boolean }>({ loading: false }) function setAgentRawPlan(plan: { data?: IRawPlanResponse; loading?: boolean }) { if (plan.data) { plan.data['Collaboration Process'] = plan.data['Collaboration Process']?.map((item) => ({ ...item, Id: uuidv4(), })) } agentRawPlan.value = { ...agentRawPlan.value, ...plan, } } // 执行完任务的结果 const executePlan = ref([]) function setExecutePlan(plan: IExecuteRawResponse[]) { executePlan.value = plan } function resetAgent() { agentRawPlan.value = { loading: false, } currentTask.value = undefined executePlan.value = [] } // 额外的产物列表 const additionalOutputs = ref([]) // 添加新产物 function addNewOutput(outputObject: string) { if (!outputObject.trim()) return false const trimmedOutput = outputObject.trim() if (!additionalOutputs.value.includes(trimmedOutput)) { additionalOutputs.value.push(trimmedOutput) return true } return false } // 删除额外产物 function removeAdditionalOutput(outputObject: string) { const index = additionalOutputs.value.indexOf(outputObject) if (index > -1) { additionalOutputs.value.splice(index, 1) return true } return false } // 清除额外产物 function clearAdditionalOutputs() { additionalOutputs.value = [] } return { agents, setAgents, searchValue, setSearchValue, currentTask, setCurrentTask, agentRawPlan, setAgentRawPlan, executePlan, setExecutePlan, resetAgent, additionalOutputs, addNewOutput, removeAdditionalOutput, clearAdditionalOutputs, } }) /** * 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。 * 官方文档解释了如何在组件外部使用 Pinia Store: * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component */ export function useAgentsStoreHook() { return useAgentsStore(store) }