From 0cd9df7de6b8137984cac06e4dd240ae2a7d7e47 Mon Sep 17 00:00:00 2001 From: fanghanjun <17737663888@163.com> Date: Fri, 17 Apr 2026 02:59:18 -0700 Subject: [PATCH] =?UTF-8?q?fix(studio):=20=E8=8D=89=E7=A8=BF=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=EF=BC=88draft=20session=EF=BC=89=E4=B8=8D=E5=9C=A8?= =?UTF-8?q?=E4=BE=A7=E8=BE=B9=E6=A0=8F=E5=B1=95=E7=A4=BA=EF=BC=8C=E7=9B=B4?= =?UTF-8?q?=E5=88=B0=E5=8F=91=E5=87=BA=E7=AC=AC=E4=B8=80=E6=9D=A1=E6=B6=88?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前点"+ 新建会话"会立刻在侧边栏多出一条空条目,体验突兀且和"新建书籍" 草稿态(侧边栏不显示草稿节点)行为不一致。 - createDraftSession 不再把 sessionId 追加进 sessionIdsByBook,只放到 sessions map + activeSessionId(让 ChatPage 显示空对话区) - sendMessage 的 draft 分支在 POST /sessions 落盘成功那一刻才把 sessionId 写进 sessionIdsByBook,侧边栏那时才出现此会话(并带上 title) 副作用:用户点新建会话但没聊就切走/关窗,draft 彻底消失(内存都释放), 不会在磁盘和侧边栏留下空白痕迹——与"新建书籍"草稿一致。 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/store/chat/slices/message/action.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/studio/src/store/chat/slices/message/action.ts b/packages/studio/src/store/chat/slices/message/action.ts index 7e057355..a55b5ad3 100644 --- a/packages/studio/src/store/chat/slices/message/action.ts +++ b/packages/studio/src/store/chat/slices/message/action.ts @@ -156,8 +156,10 @@ export const createMessageSlice: StateCreator }, 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 ...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 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));