158 lines
3.5 KiB
JavaScript
158 lines
3.5 KiB
JavaScript
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,
|
|
};
|
|
});
|