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>
This commit is contained in:
fanghanjun 2026-04-17 02:59:18 -07:00 committed by Ma
parent 1b5e5dcf4e
commit fdb36bdbd4

View file

@ -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));