feat: 对话功能开发
This commit is contained in:
@@ -1,13 +1,138 @@
|
||||
import { defineStore } from 'pinia';
|
||||
import { ref } from 'vue';
|
||||
import { ref, computed } from 'vue';
|
||||
import { sseManager } from '@/http/sse.js';
|
||||
|
||||
export const useAppStore = defineStore('app', () => {
|
||||
const title = ref('智聚超脑');
|
||||
const collapsed = ref(false);
|
||||
|
||||
// SSE 相关状态
|
||||
const sseConnected = ref(false);
|
||||
const currentSessionEvents = ref([]);
|
||||
const assistantMessageIds = ref(new Set());
|
||||
|
||||
function toggleSidebar() {
|
||||
collapsed.value = !collapsed.value;
|
||||
}
|
||||
|
||||
return { title, collapsed, toggleSidebar };
|
||||
/**
|
||||
* 初始化 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,
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user