import { defineStore } from 'pinia'; import { ref, computed } from 'vue'; import { sseManager } from '@/http/sse.js'; export const useAppStore = defineStore('app', () => { // 服务运行状态常量 const SERVICE_STATUS = { IDLE: 'idle', // 未启动 CONNECTING: 'connecting', // 连接中 RUNNING: 'running', // 服务运行中 FAILED: 'failed', // 连接失败 }; const title = ref('智聚超脑'); const collapsed = ref(false); const serviceStatus = ref(SERVICE_STATUS.IDLE); const startServiceFlag = ref(0); // 用于触发外部启动服务的标记 function triggerStartService() { startServiceFlag.value++; } // SSE 相关状态 const sseConnected = ref(false); const currentSessionEvents = ref([]); const assistantMessageIds = ref(new Set()); function toggleSidebar() { collapsed.value = !collapsed.value; } /** * 初始化 SSE 连接 * 在连接 OpenCode 成功后调用 */ function initSSE() { if (sseConnected.value) { console.log('[AppStore] SSE 已连接,跳过初始化'); return; } console.log('[AppStore] 初始化 SSE 连接...'); // 监听连接状态 sseManager.on('sse.error', () => { sseConnected.value = false; }); // 监听消息部分更新事件 sseManager.on('message.part.updated', (data) => { const props = data.properties || {}; const part = props.part; if (!part || part.type !== 'text') return; currentSessionEvents.value.push({ type: 'message.part.updated', data: props, timestamp: Date.now(), }); }); // 监听消息更新事件 sseManager.on('message.updated', (data) => { const props = data.properties || {}; const info = props.info; if (info && info.role === 'assistant') { assistantMessageIds.value.add(info.id); } currentSessionEvents.value.push({ type: 'message.updated', data: props, timestamp: Date.now(), }); }); // 监听会话空闲事件 sseManager.on('session.idle', (data) => { const props = data.properties || {}; currentSessionEvents.value.push({ type: 'session.idle', data: props, timestamp: Date.now(), }); }); // 建立连接 sseManager.connect(); sseConnected.value = true; } /** * 关闭 SSE 连接 */ function closeSSE() { sseManager.disconnect(); sseConnected.value = false; } /** * 重新连接 SSE */ function reconnectSSE() { sseManager.reconnect(); sseConnected.value = true; } /** * 清空当前会话的事件 */ function clearSessionEvents() { currentSessionEvents.value = []; } /** * 检查消息 ID 是否是助手消息 */ function isAssistantMessage(messageId) { return assistantMessageIds.value.has(messageId); } /** * 添加助手消息 ID */ function addAssistantMessageId(messageId) { assistantMessageIds.value.add(messageId); } /** * 清空助手消息 ID 集合 */ function clearAssistantMessageIds() { assistantMessageIds.value.clear(); } return { title, collapsed, toggleSidebar, // SSE sseConnected, currentSessionEvents, assistantMessageIds, initSSE, closeSSE, reconnectSSE, clearSessionEvents, isAssistantMessage, addAssistantMessageId, clearAssistantMessageIds, // 服务运行状态 serviceStatus, SERVICE_STATUS, startServiceFlag, triggerStartService, }; });