From e17af3008e80e828ca8b92d15c6634278ba12590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 16 Sep 2026 23:59:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E5=B1=8F=E5=8E=86=E5=8F=B2=E5=88=87?= =?UTF-8?q?=E7=89=87=E6=94=B9=E5=88=B0=20staleness=20=E5=AE=88=E5=8D=AB?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E5=86=8D=E5=B9=B6=E5=85=A5=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=20reducer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - loadProjectConversation 不再在 read_direct_project_history_slice 的 then 回调里直接写 directThreadChat - 切片先暂存,等 loadVersion / localProjectPathRef 守卫通过后再与 hasMore、锚点一起落到状态 - 现有 launcher 按项目路径 key 重挂载 App,跨项目污染暂不可复现;本次只是让这条写入与其它状态写入的时序一致 --- apps/ai-game-creator-shell/src/App.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index 72285aa78..2abc16df0 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -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( @@ -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 分支同样不能丢掉尚未落盘的运行时消息(初始需求)。