优化: AI Chat 消息视图: 闪烁修复+骨架统一+过程卡降级+任务关联 chip

MessageList.vue:
1. 流式闪烁修复: _mdRenderKey 稳定化 + key 对齐, 消除流式重渲染抖动
2. 骨架统一: 过程步骤卡改用 trace 卡骨架(头部一行摘要 + 正文增量)
3. 过程卡视觉降级: 缩进收窄 + 紧贴结果, 弱化过程突出结论
4. 消息任务关联: TASK_REF_TOOLS 映射(advance_task/run_workflow) 从
   toolCalls[].args 派生任务 chip, 零数据模型改动(单一事实源), 无任务工具
   的消息不渲染 chip; 新增 .ai-trace-task-chip 样式 + go-to-task emit

AiChat.vue: goToTask(taskId) 接参, router.push('/tasks?taskId=xxx')
Tasks.vue: applyRouteTaskId 消费 query.taskId 自动开抽屉(onMounted 跨路由 +
  watch 同路由), 消费后 router.replace 清 query 保持 URL 干净
i18n zh/en: aiChat.goToTaskHint + ai.trace.taskRef 双语补键

验收: vue-tsc --noEmit EXIT 0 + build EXIT 0。
This commit is contained in:
lxy
2026-10-09 22:53:22 +08:00
parent a8c92e9619
commit 40c4a21a7e
5 changed files with 177 additions and 25 deletions
+11
View File
@@ -43,6 +43,7 @@
@start-edit="startEdit"
@send-example-prompt="sendExamplePrompt"
@go-to-settings="goToSettings"
@go-to-task="goToTask"
@toast="(p) => showToast(p.msg, p.type)"
/>
@@ -211,6 +212,16 @@ function goToSettings() {
router.push('/settings')
}
/** 跳任务详情(消息任务 chip 点击):嵌入模式 router.push('/tasks?taskId=xxx') 由 Tasks.vue
* applyRouteTaskId 消费 query 自动开抽屉;分离窗口无 Tasks 路由,降级 toast */
function goToTask(taskId: string) {
if (props.detached) {
showToast(t('aiChat.goToTaskHint'), 'warning')
return
}
router.push({ path: '/tasks', query: { taskId } })
}
/** 点击示例问题卡片:委托 ChatInput 子组件发送(填入输入框 + handleSend 同款路径) */
function sendExamplePrompt(i18nKey: string) {
chatInputRef.value?.sendExamplePrompt(i18nKey)