Просмотр исходного кода

fix(studio): 草稿会话(draft session)不在侧边栏展示,直到发出第一条消息

之前点"+ 新建会话"会立刻在侧边栏多出一条空条目,体验突兀且和"新建书籍"
草稿态(侧边栏不显示草稿节点)行为不一致。

- createDraftSession 不再把 sessionId 追加进 sessionIdsByBook,只放到
  sessions map + activeSessionId(让 ChatPage 显示空对话区)
- sendMessage 的 draft 分支在 POST /sessions 落盘成功那一刻才把 sessionId
  写进 sessionIdsByBook,侧边栏那时才出现此会话(并带上 title)

副作用:用户点新建会话但没聊就切走/关窗,draft 彻底消失(内存都释放),
不会在磁盘和侧边栏留下空白痕迹——与"新建书籍"草稿一致。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fanghanjun 6 месяцев назад
Родитель
Сommit
fdb36bdbd4
1 измененных файлов с 13 добавлено и 9 удалено
  1. 13 9
      packages/studio/src/store/chat/slices/message/action.ts

+ 13 - 9
packages/studio/src/store/chat/slices/message/action.ts

@@ -156,8 +156,10 @@ export const createMessageSlice: StateCreator<ChatStore, [], [], MessageActions>
   },
 
   createDraftSession: (bookId) => {
-    // 前端生成 sessionId(与后端 createBookSession 同格式),暂不持久化到磁盘。
-    // 发送第一条消息时,sendMessage 会调 POST /sessions { sessionId, bookId } 落盘。
+    // 前端生成 sessionId(与后端 createBookSession 同格式),暂不持久化到磁盘,
+    // 也暂不写入 sessionIdsByBook——侧边栏看不到这条 draft。
+    // 发送第一条消息时 sendMessage 会调 POST /sessions { sessionId, bookId } 落盘
+    // 并把 id 追加进 sessionIdsByBook,那一刻侧边栏才出现该会话(带着 title)。
     const sessionId = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
     set((state) => {
       const runtime = createSessionRuntime({
@@ -171,13 +173,6 @@ export const createMessageSlice: StateCreator<ChatStore, [], [], MessageActions>
           ...state.sessions,
           [sessionId]: runtime,
         },
-        sessionIdsByBook: {
-          ...state.sessionIdsByBook,
-          [bookKey(bookId)]: mergeSessionIds(
-            state.sessionIdsByBook[bookKey(bookId)],
-            [sessionId],
-          ),
-        },
         activeSessionId: sessionId,
       };
     });
@@ -306,8 +301,17 @@ export const createMessageSlice: StateCreator<ChatStore, [], [], MessageActions>
           headers: { "Content-Type": "application/json" },
           body: JSON.stringify({ sessionId, bookId: session.bookId }),
         });
+        // 落盘成功:把 isDraft 翻成 false,同时把 sessionId 追加进 sessionIdsByBook
+        // 让侧边栏现在才看到这条会话。
         set((state) => ({
           sessions: updateSession(state.sessions, sessionId, () => ({ isDraft: false })),
+          sessionIdsByBook: {
+            ...state.sessionIdsByBook,
+            [bookKey(session.bookId)]: mergeSessionIds(
+              state.sessionIdsByBook[bookKey(session.bookId)],
+              [sessionId],
+            ),
+          },
         }));
       } catch (err) {
         get().addErrorMessage(sessionId, err instanceof Error ? err.message : String(err));