2026-02-24 13:53:01 +08:00
|
|
|
|
// 每一个存储的模块,命名规则use开头,store结尾
|
|
|
|
|
|
import router from '@/router'
|
|
|
|
|
|
import { defineStore } from 'pinia'
|
|
|
|
|
|
import { ref, computed } from 'vue'
|
|
|
|
|
|
import { removeLocal, setLocal } from '@/utils/local'
|
|
|
|
|
|
import MyEvent from '@/utils/myEvent'
|
|
|
|
|
|
|
|
|
|
|
|
// Agent 项目初始数据 store
|
2026-03-10 16:28:11 +08:00
|
|
|
|
type InitialProjectData = {
|
|
|
|
|
|
text: string
|
|
|
|
|
|
images: Array<{ url: string; name: string }>
|
|
|
|
|
|
type: string
|
|
|
|
|
|
area: string
|
|
|
|
|
|
style: string
|
2026-04-02 10:05:29 +08:00
|
|
|
|
useReport: boolean
|
|
|
|
|
|
needSuggestion: boolean
|
2026-03-24 16:57:40 +08:00
|
|
|
|
quoteList: Array<string>
|
|
|
|
|
|
tempImages: any[]
|
2026-03-10 16:28:11 +08:00
|
|
|
|
}
|
2026-02-24 13:53:01 +08:00
|
|
|
|
export const useAgentStore = defineStore('agent', () => {
|
2026-04-02 10:05:29 +08:00
|
|
|
|
const initialProjectData = ref<InitialProjectData | null>(null)
|
2026-02-24 13:53:01 +08:00
|
|
|
|
|
|
|
|
|
|
// 保存项目初始数据
|
2026-03-10 16:28:11 +08:00
|
|
|
|
const setInitialProjectData = (data: InitialProjectData) => {
|
2026-02-24 13:53:01 +08:00
|
|
|
|
initialProjectData.value = data
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取项目初始数据
|
|
|
|
|
|
const getInitialProjectData = computed(() => initialProjectData.value)
|
|
|
|
|
|
|
|
|
|
|
|
// 清空项目初始数据
|
|
|
|
|
|
const clearInitialProjectData = () => {
|
|
|
|
|
|
initialProjectData.value = null
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-02 10:05:29 +08:00
|
|
|
|
// 会话缓存管理,最多保存 10 条会话
|
|
|
|
|
|
const conversationCache = new Map<string, any>()
|
|
|
|
|
|
const MAX_CACHE_ENTRIES = 10
|
|
|
|
|
|
const SESSION_KEY_PREFIX = 'agent_session_'
|
|
|
|
|
|
|
|
|
|
|
|
const pruneCache = () => {
|
|
|
|
|
|
const keys = Array.from(conversationCache.keys())
|
|
|
|
|
|
const total = conversationCache.size
|
|
|
|
|
|
if (total <= MAX_CACHE_ENTRIES) return
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < total - MAX_CACHE_ENTRIES; i++) {
|
|
|
|
|
|
conversationCache.delete(keys[i])
|
|
|
|
|
|
sessionStorage.removeItem(SESSION_KEY_PREFIX + keys[i])
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const saveCacheConversation = (projectId: string, data: any) => {
|
|
|
|
|
|
if (!projectId) return
|
|
|
|
|
|
|
|
|
|
|
|
const finalData = {
|
|
|
|
|
|
...data,
|
|
|
|
|
|
updatedAt: Date.now()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (conversationCache.has(projectId)) {
|
|
|
|
|
|
conversationCache.delete(projectId)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
conversationCache.set(projectId, finalData)
|
|
|
|
|
|
try {
|
|
|
|
|
|
sessionStorage.setItem(SESSION_KEY_PREFIX + projectId, JSON.stringify(finalData))
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('saveCacheConversation sessionStorage failed', e)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pruneCache()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getCacheConversation = (projectId: string) => {
|
|
|
|
|
|
if (!projectId) return null
|
|
|
|
|
|
|
|
|
|
|
|
let data = conversationCache.get(projectId)
|
|
|
|
|
|
if (data) return data
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
const raw = sessionStorage.getItem(SESSION_KEY_PREFIX + projectId)
|
|
|
|
|
|
if (!raw) return null
|
|
|
|
|
|
data = JSON.parse(raw)
|
|
|
|
|
|
conversationCache.set(projectId, data)
|
|
|
|
|
|
return data
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('getCacheConversation failed', e)
|
|
|
|
|
|
return null
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const clearAllCacheConversations = () => {
|
|
|
|
|
|
conversationCache.value.clear()
|
|
|
|
|
|
for (const key in window.sessionStorage) {
|
|
|
|
|
|
if (key.startsWith(SESSION_KEY_PREFIX)) {
|
|
|
|
|
|
sessionStorage.removeItem(key)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const removeCacheConversation = (projectId: string) => {
|
|
|
|
|
|
if (!projectId) return
|
|
|
|
|
|
conversationCache.value.delete(projectId)
|
|
|
|
|
|
sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getCacheStats = () => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
total: conversationCache.value.size,
|
|
|
|
|
|
keys: Array.from(conversationCache.value.keys())
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-24 13:53:01 +08:00
|
|
|
|
return {
|
|
|
|
|
|
initialProjectData,
|
|
|
|
|
|
setInitialProjectData,
|
|
|
|
|
|
getInitialProjectData,
|
2026-04-02 10:05:29 +08:00
|
|
|
|
clearInitialProjectData,
|
|
|
|
|
|
conversationCache,
|
|
|
|
|
|
saveCacheConversation,
|
|
|
|
|
|
getCacheConversation,
|
|
|
|
|
|
removeCacheConversation,
|
|
|
|
|
|
clearAllCacheConversations,
|
|
|
|
|
|
getCacheStats
|
2026-02-24 13:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|