Files
electron-opencode/src/renderer/stores/app.js
2026-04-12 11:47:48 +08:00

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,
};
});