|
|
@@ -195,6 +195,9 @@
|
|
|
|
|
|
const taskList = ref<Task[]>([]);
|
|
|
|
|
|
+ // 已从接口拉取过的会话 id,用于识别流式期间后端新建的会话
|
|
|
+ const knownApiSessionIds = new Set<string>();
|
|
|
+
|
|
|
// 从接口获取会话列表
|
|
|
const fetchSessionList = async () => {
|
|
|
try {
|
|
|
@@ -211,18 +214,35 @@
|
|
|
sortOrder: item.sort_order,
|
|
|
}));
|
|
|
|
|
|
- const mergedTasks = apiTasks.map((apiTask) => {
|
|
|
+ // 流式中的空白任务:后端已为其创建会话,但前端要等流结束才拿到 session_id。
|
|
|
+ // 该会话在接口里是一条全新记录,归并回空白任务而不是单独插入,避免列表出现重复条目
|
|
|
+ let blankStreamingTask: Task | null = taskList.value.find((t) => !t.sessionId && t.isStreaming) || null;
|
|
|
+
|
|
|
+ const mergedTasks: Task[] = [];
|
|
|
+ for (const apiTask of apiTasks) {
|
|
|
+ if (blankStreamingTask && (blankStreamingTask.pendingSessionId === apiTask.id || !knownApiSessionIds.has(apiTask.id))) {
|
|
|
+ blankStreamingTask.pendingSessionId = apiTask.id;
|
|
|
+ blankStreamingTask.name = apiTask.name;
|
|
|
+ blankStreamingTask.updatedAt = apiTask.updatedAt;
|
|
|
+ blankStreamingTask.sortOrder = apiTask.sortOrder;
|
|
|
+ blankStreamingTask = null;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
const existing = taskList.value.find((t) => t.id === apiTask.id);
|
|
|
if (existing) {
|
|
|
- return {
|
|
|
+ mergedTasks.push({
|
|
|
...apiTask,
|
|
|
messages: existing.messages,
|
|
|
attachedFiles: existing.attachedFiles,
|
|
|
wordUrl: existing.wordUrl,
|
|
|
- };
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ mergedTasks.push(apiTask);
|
|
|
}
|
|
|
- return apiTask;
|
|
|
- });
|
|
|
+ }
|
|
|
+
|
|
|
+ apiTasks.forEach((apiTask) => knownApiSessionIds.add(apiTask.id));
|
|
|
|
|
|
const localOnlyTasks = taskList.value.filter((t) => !t.sessionId && !apiTasks.find((a) => a.id === t.id));
|
|
|
|
|
|
@@ -1359,7 +1379,11 @@
|
|
|
const originTask = taskList.value.find((t) => t.id === originTaskId);
|
|
|
if (originTask && !originTask.sessionId) {
|
|
|
originTask.sessionId = result.session_id;
|
|
|
- originTask.name = userInput.substring(0, 20) + (userInput.length > 20 ? '...' : '');
|
|
|
+ // 流式期间若列表已用后端标题归并过该任务,则保留后端标题;否则用首条消息命名
|
|
|
+ if (originTask.pendingSessionId !== result.session_id) {
|
|
|
+ originTask.name = userInput.substring(0, 20) + (userInput.length > 20 ? '...' : '');
|
|
|
+ }
|
|
|
+ originTask.pendingSessionId = undefined;
|
|
|
if (originTask.id !== result.session_id) {
|
|
|
taskList.value = taskList.value.filter((t) => t.id !== result.session_id);
|
|
|
originTask.id = result.session_id;
|
|
|
@@ -1465,9 +1489,12 @@
|
|
|
if (result.session_id) {
|
|
|
const originTask = taskList.value.find((t) => t.id === originTaskId);
|
|
|
if (originTask && !originTask.sessionId) {
|
|
|
- const taskName = userInput || `文件:${file.name}`;
|
|
|
originTask.sessionId = result.session_id;
|
|
|
- originTask.name = taskName.substring(0, 20) + (taskName.length > 20 ? '...' : '');
|
|
|
+ if (originTask.pendingSessionId !== result.session_id) {
|
|
|
+ const taskName = userInput || `文件:${file.name}`;
|
|
|
+ originTask.name = taskName.substring(0, 20) + (taskName.length > 20 ? '...' : '');
|
|
|
+ }
|
|
|
+ originTask.pendingSessionId = undefined;
|
|
|
if (originTask.id !== result.session_id) {
|
|
|
taskList.value = taskList.value.filter((t) => t.id !== result.session_id);
|
|
|
originTask.id = result.session_id;
|
|
|
@@ -1536,11 +1563,14 @@
|
|
|
return index === taskList.value.findIndex((t) => !t.sessionId);
|
|
|
});
|
|
|
|
|
|
- // 默认选中第一条历史记录
|
|
|
+ // 优先回到关闭前所在的任务(如流式中的新任务),否则默认选中第一条历史记录
|
|
|
const firstHistoryTask = taskList.value.find((t) => t.sessionId);
|
|
|
+ const prevTask = taskList.value.find((t) => t.id === currentTaskId.value);
|
|
|
|
|
|
let targetTask: Task;
|
|
|
- if (firstHistoryTask) {
|
|
|
+ if (prevTask) {
|
|
|
+ targetTask = prevTask;
|
|
|
+ } else if (firstHistoryTask) {
|
|
|
targetTask = firstHistoryTask;
|
|
|
} else {
|
|
|
// 没有历史记录时才创建空白新任务
|