首屏历史切片改到 staleness 守卫之后再并入聊天 reducer

- loadProjectConversation 不再在 read_direct_project_history_slice 的 then 回调里直接写 directThreadChat
- 切片先暂存,等 loadVersion / localProjectPathRef 守卫通过后再与 hasMore、锚点一起落到状态
- 现有 launcher 按项目路径 key 重挂载 App,跨项目污染暂不可复现;本次只是让这条写入与其它状态写入的时序一致
This commit is contained in:
2026-09-16 23:59:29 +08:00
parent 64bd006981
commit e17af3008e
+11 -4
View File
@@ -3491,6 +3491,9 @@ export function App({
let runtimeError = '';
let loadedDirectHistoryHasMore = false;
let loadedDirectHistoryFirstItemId: string | null = null;
// 首屏切片先暂存,待下方 staleness 守卫通过后再并入聊天 reducer:
// 迟到的切片属于已经切走的项目,不能在守卫之前就写进全局聊天状态。
let loadedDirectHistorySlice: DirectThreadHistorySlice | null = null;
const projectConversation = directCodexProductRuntime
? (() => {
return invoke<DirectThreadHistorySlice>(
@@ -3502,10 +3505,7 @@ export function App({
).then((slice) => {
loadedDirectHistoryHasMore = slice.hasMore;
loadedDirectHistoryFirstItemId = slice.firstItemId;
// 首屏历史进聊天 reducer`messages` 在 DirectProject 下只剩运行期本地消息。
setDirectThreadChat((state) =>
mergeDirectThreadHistorySlice(state, slice),
);
loadedDirectHistorySlice = slice;
return {
path: nextProjectPath,
agentId: null,
@@ -3579,6 +3579,13 @@ export function App({
if (directCodexProductRuntime) {
setDirectHistoryHasMore(loadedDirectHistoryHasMore);
directHistoryOldestItemIdRef.current = loadedDirectHistoryFirstItemId;
if (loadedDirectHistorySlice) {
const slice = loadedDirectHistorySlice;
// 首屏历史进聊天 reducer`messages` 在 DirectProject 下只剩运行期本地消息。
setDirectThreadChat((state) =>
mergeDirectThreadHistorySlice(state, slice),
);
}
}
setMessages((current) => {
// replace 分支同样不能丢掉尚未落盘的运行时消息(初始需求)。