重构: 前端 composable 拆分+详情页 Markdown 渲染+流式 memo+状态同步+bug 修复
- composables/useMarkdown 抽(AiChat 复用)+ai/* 流式核心+useAiSend catch 回滚 user msg(B-21)+useAiStream 超时文案(B-03)+useAiConversations 切换 token(FR-R1) - views/TaskDetail 新建(F-02)+描述 md+mdReady 响应式+字段同行布局(B-24/31) - views/ProjectDetail 多选审批 UI(F-01)+描述 md+mdReady+字段同行(B-25/31) - views/Ideas+Knowledge 描述 md+mdReady(B-25) - views/Tasks 项目切换联动(B-29)+task 详情跳转 - components/AiChat toast 失败提示(B-20)+流式块级 memo(ARC-08)+clean UI(AR-7)+stop 兜底(AR-5) - components/ToolCard 审批卡片可读化(AR-3) - stores useAiStore barrel(ARC-04)+del settings mock(ARC-01)+approve options(R-PD-5) - i18n aiTool/nav 中英对称(AR-3/9)+删 nav.decisions 死链(ARC-02) - router /tasks/:id(F-02)+global.css selection 可见(R-260615-01)+api task detail+App 删 decisions nav
This commit is contained in:
@@ -23,10 +23,26 @@ export function onStreamTimeout() {
|
||||
state.generatingConvId = null
|
||||
state.currentText = ''
|
||||
clearStreamWatchdog()
|
||||
// 文案区分:若已有 completed 工具调用,说明工具执行完后续回复被中断(常见为审批后
|
||||
// 续生成卡住),引导用户继续;否则按纯流式中断处理。
|
||||
// 数据源:state.messages[].toolCalls[].status,反向扫尾部提前退出(O(1) 均,同 findToolCall);
|
||||
// 不复用 useAiEvents.findToolCall 避免反向 import 循环依赖(useAiEvents 已 import 本模块)
|
||||
let hasCompletedTool = false
|
||||
for (let i = state.messages.length - 1; i >= 0; i--) {
|
||||
const toolCalls = state.messages[i].toolCalls
|
||||
if (!toolCalls) continue
|
||||
for (let j = 0; j < toolCalls.length; j++) {
|
||||
if (toolCalls[j].status === 'completed') { hasCompletedTool = true; break }
|
||||
}
|
||||
if (hasCompletedTool) break
|
||||
}
|
||||
const content = hasCompletedTool
|
||||
? '⚠ 工具已执行完成,后续回复中断(长时间无数据流)。可点继续重试。'
|
||||
: '⚠ 响应中断(长时间无数据流)。可能是网络断连或后端异常,请重试。'
|
||||
state.messages.push({
|
||||
id: `timeout-${nextMsgId()}`,
|
||||
role: 'assistant',
|
||||
content: '⚠ 响应中断(长时间无数据流)。可能是网络断连或后端异常,请重试。',
|
||||
content,
|
||||
isError: true,
|
||||
timestamp: Date.now(),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user