This commit is contained in:
hy
2026-08-03 17:09:22 +08:00
parent 85ecfc4c5b
commit 9965f2772d
2 changed files with 154 additions and 40 deletions

View File

@@ -161,6 +161,21 @@ export const useSocketStore = defineStore('socket', () => {
// 调试日志:明确输出 type 和 data
console.log(`[handleMessage] type = ${type}, data = ${JSON.stringify(data)}`);
const eventConversationId =
conversation_id ||
data?.conversation_id ||
data?.page?.conversation?.conversation_id ||
data?.page?.conversation?.id ||
''
if (
eventConversationId &&
config.value.conversationId &&
String(eventConversationId) !== String(config.value.conversationId)
) {
addLog('info', `忽略非当前会话消息: ${eventConversationId}`)
return
}
switch (type) {
case 'auth_ok':
addLog('success', '连接成功')
@@ -176,6 +191,42 @@ export const useSocketStore = defineStore('socket', () => {
addLog('warn', 'AI成功收到用户发送的消息')
break
case 'forbid_input':
addLog('warn', '收到封框指令')
isThinking.value = true
break
case 'relieve_input':
addLog('warn', '收到解框指令')
isThinking.value = false
break
case 'turn_status': {
const status = String(messageData.status || data?.status || '').toLowerCase()
if (status === 'locked') {
addLog('warn', '后端确认程序封框')
isThinking.value = true
} else if (status === 'finished' || status === 'cancelled' || status === 'unlocked' || status === 'relieved') {
addLog('warn', `后端确认当前轮结束/解框: ${status}`)
isThinking.value = false
}
break
}
case 'prompt':
if ((messageData.info || data?.info) === '结束等待') {
addLog('warn', '收到结束等待信号')
isThinking.value = false
}
break
case 'refresh':
if (messageData.page?.waiting === false || data?.page?.waiting === false) {
addLog('warn', 'refresh 确认 waiting=false释放输入框')
isThinking.value = false
}
break
case 'render':
addLog('warn', 'AI正在回复信息')
handleBusinessMessage(data)
@@ -183,6 +234,8 @@ export const useSocketStore = defineStore('socket', () => {
case 'pc_offline':
addLog('warn', 'PC 端已离线')
isThinking.value = false
authFailReason.value = 'pc offline'
break
default:
@@ -229,6 +282,46 @@ export const useSocketStore = defineStore('socket', () => {
// 处理 data 为对象的情况
if (!data || typeof data !== 'object') return
const msgType = String(data.type || '').trim()
if (msgType === 'forbid_input') {
console.log("收到后端封框指令");
isThinking.value = true
return
}
if (msgType === 'relieve_input') {
console.log("收到后端解框指令");
isThinking.value = false
return
}
if (data.cmd === 'turn_status') {
const status = String(data.status || '').toLowerCase()
if (status === 'locked') {
console.log("后端确认程序封框");
isThinking.value = true
return
}
if (status === 'finished' || status === 'cancelled' || status === 'unlocked' || status === 'relieved') {
console.log("后端确认当前轮结束/解框:", status);
isThinking.value = false
return
}
}
if (data.cmd === 'prompt' && data.info === '结束等待') {
console.log("收到结束等待信号");
isThinking.value = false
return
}
// refresh 也会在流式输出和工具中间消息落盘时出现,不能直接当成最终完成。
// 只有后端明确 page.waiting=false 时,才作为漏发结束信号的兜底释放。
if (data.cmd === 'refresh' && data.page?.waiting === false) {
console.log("refresh 确认 waiting=false释放输入框");
isThinking.value = false
return
}
// 中断确认:后端返回 cmd=event_callback 表示中断成功
if (data.cmd === 'event_callback' && data.info === '中断成功') {
console.log("后端确认中断成功");
@@ -303,4 +396,4 @@ export const useSocketStore = defineStore('socket', () => {
clearLogs,
getStatusText
}
})
})