优化: drainQueue并发互斥+deep watch指纹+前端打磨
This commit is contained in:
@@ -309,21 +309,25 @@ function scrollToFirstPending(): void {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除 deep:true,改在 watch source 中计算指纹(消息数 + toolCalls 的 id/status),
|
||||
* 避免 deep 每帧全量深遍历长会话数组引起掉帧。流式 delta 只改 content 不影响指纹,
|
||||
* 不触发无意义的收起重算。length 变化(新消息/截断)和 toolCall 状态翻转(新卡/完成/拒绝)
|
||||
* 均能正确触发——与 body 的快照收缩逻辑等价,无需 deep 兜底。
|
||||
*/
|
||||
let lastMsgSnapshot = ''
|
||||
watch(
|
||||
() => store.state.messages,
|
||||
(msgs) => {
|
||||
const snap = JSON.stringify({
|
||||
n: msgs.length,
|
||||
tc: msgs.map(m => (m.toolCalls || []).map(t => ({ id: t.id, s: t.status }))),
|
||||
})
|
||||
() => JSON.stringify({
|
||||
n: store.state.messages.length,
|
||||
tc: store.state.messages.map(m => (m.toolCalls || []).map(t => ({ id: t.id, s: t.status }))),
|
||||
}),
|
||||
(snap) => {
|
||||
if (snap === lastMsgSnapshot) return
|
||||
const isFirst = lastMsgSnapshot === ''
|
||||
lastMsgSnapshot = snap
|
||||
if (isFirst) return // 首次加载/切换对话不触发收起
|
||||
collapseAllToolLists(buildActiveToolIds(msgs))
|
||||
if (isFirst) return
|
||||
collapseAllToolLists(buildActiveToolIds(store.state.messages))
|
||||
},
|
||||
{ deep: true },
|
||||
)
|
||||
|
||||
// UX-260616-03: AiAgentRound 新轮次到达时收起上一轮工具卡(round 递增)。
|
||||
|
||||
Reference in New Issue
Block a user