优化: 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 递增)。
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<!-- 从 TaskDetail.vue 抽出(L131-144 模板 + L214-262 脚本 + L643-670 样式),零行为变更。 -->
|
||||
<!-- 自包含:JSON 解析 / Markdown 渲染(复用 useMarkdown 模块单例)/ review verdict 计算 / i18n 全部内聚。 -->
|
||||
<div v-if="parsedOutput" class="info-item info-block output-block">
|
||||
<span class="label">{{ $t('taskDetail.output') }}</span>
|
||||
<div class="value output-body">
|
||||
<!-- AI 自审结论卡(若有 review 子字段) -->
|
||||
<div v-if="parsedOutput.review" class="review-card" :class="reviewVerdictClass">
|
||||
|
||||
Reference in New Issue
Block a user