|
@@ -231,12 +231,11 @@
|
|
|
|
|
|
|
|
const existing = taskList.value.find((t) => t.id === apiTask.id);
|
|
const existing = taskList.value.find((t) => t.id === apiTask.id);
|
|
|
if (existing) {
|
|
if (existing) {
|
|
|
- mergedTasks.push({
|
|
|
|
|
- ...apiTask,
|
|
|
|
|
- messages: existing.messages,
|
|
|
|
|
- attachedFiles: existing.attachedFiles,
|
|
|
|
|
- wordUrl: existing.wordUrl,
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ // 原地更新以保持对象引用,避免流式回调持有的任务引用失效(isStreaming 等状态丢失)
|
|
|
|
|
+ existing.name = apiTask.name;
|
|
|
|
|
+ existing.updatedAt = apiTask.updatedAt;
|
|
|
|
|
+ existing.sortOrder = apiTask.sortOrder;
|
|
|
|
|
+ mergedTasks.push(existing);
|
|
|
} else {
|
|
} else {
|
|
|
mergedTasks.push(apiTask);
|
|
mergedTasks.push(apiTask);
|
|
|
}
|
|
}
|
|
@@ -735,6 +734,8 @@
|
|
|
console.error('拒绝操作失败:', error);
|
|
console.error('拒绝操作失败:', error);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ rejectTask.isStreaming = false;
|
|
|
|
|
+
|
|
|
if (currentTaskId.value === rejectTask.id) {
|
|
if (currentTaskId.value === rejectTask.id) {
|
|
|
messages.value = rejectTask.messages;
|
|
messages.value = rejectTask.messages;
|
|
|
await scrollToBottom();
|
|
await scrollToBottom();
|
|
@@ -1237,6 +1238,7 @@
|
|
|
timestamp: Date.now(),
|
|
timestamp: Date.now(),
|
|
|
});
|
|
});
|
|
|
aiMsg.isLoading = false;
|
|
aiMsg.isLoading = false;
|
|
|
|
|
+ streamingTask.isStreaming = false;
|
|
|
// 后端未返回耗时,冻结前端伪计时
|
|
// 后端未返回耗时,冻结前端伪计时
|
|
|
aiMsg.durationMs = (aiMsg.baseDurationMs || 0) + (aiMsg.generateStartTime ? Date.now() - aiMsg.generateStartTime : 0);
|
|
aiMsg.durationMs = (aiMsg.baseDurationMs || 0) + (aiMsg.generateStartTime ? Date.now() - aiMsg.generateStartTime : 0);
|
|
|
break;
|
|
break;
|
|
@@ -1271,6 +1273,8 @@
|
|
|
const elapsedMs = (aiMsg.baseDurationMs || 0) + (aiMsg.generateStartTime ? Date.now() - aiMsg.generateStartTime : 0);
|
|
const elapsedMs = (aiMsg.baseDurationMs || 0) + (aiMsg.generateStartTime ? Date.now() - aiMsg.generateStartTime : 0);
|
|
|
aiMsg.baseDurationMs = elapsedMs;
|
|
aiMsg.baseDurationMs = elapsedMs;
|
|
|
aiMsg.isLoading = false;
|
|
aiMsg.isLoading = false;
|
|
|
|
|
+ // 流已结束,等待审批;批准继续时 handleApprove 会重新置为流式中
|
|
|
|
|
+ streamingTask.isStreaming = false;
|
|
|
aiMsg.isPendingApproval = true;
|
|
aiMsg.isPendingApproval = true;
|
|
|
const interruptSessionId = data.session_id || streamingTask.sessionId;
|
|
const interruptSessionId = data.session_id || streamingTask.sessionId;
|
|
|
aiMsg.pendingApprovalData = {
|
|
aiMsg.pendingApprovalData = {
|
|
@@ -1419,7 +1423,7 @@
|
|
|
activeAbortController.value = null;
|
|
activeAbortController.value = null;
|
|
|
}
|
|
}
|
|
|
streaming.value = false;
|
|
streaming.value = false;
|
|
|
- const originTask = taskList.value.find((t) => t.id === originTaskId);
|
|
|
|
|
|
|
+ // 任务在流结束时可能已被改名为后端 session_id,用发送时捕获的对象引用重置状态
|
|
|
if (originTask) originTask.isStreaming = false;
|
|
if (originTask) originTask.isStreaming = false;
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
@@ -1530,7 +1534,7 @@
|
|
|
activeAbortController.value = null;
|
|
activeAbortController.value = null;
|
|
|
}
|
|
}
|
|
|
streaming.value = false;
|
|
streaming.value = false;
|
|
|
- const originTask = taskList.value.find((t) => t.id === originTaskId);
|
|
|
|
|
|
|
+ // 任务在流结束时可能已被改名为后端 session_id,用发送时捕获的对象引用重置状态
|
|
|
if (originTask) originTask.isStreaming = false;
|
|
if (originTask) originTask.isStreaming = false;
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|