diff --git a/apps/ai-game-creator-shell/tests/directThreadChat.test.ts b/apps/ai-game-creator-shell/tests/directThreadChat.test.ts index ceb68ede4..bf252baff 100644 --- a/apps/ai-game-creator-shell/tests/directThreadChat.test.ts +++ b/apps/ai-game-creator-shell/tests/directThreadChat.test.ts @@ -410,6 +410,32 @@ describe('DirectProject 聊天 reducer', () => { [{ type: 'input_text', text: '第二条' }], ]); }); + + it('bootstrap 同时交出在跑的那一轮与在队的那几条:顺序就是事件顺序', () => { + // 中途加入(另一个窗口、离开工作台再回来)拿到的是一份**合并快照**:锚点让"这一轮还在跑" + // 成立,后面的在队条目让队列不丢。只有其中一个都算把界面还原成了错的样子。 + const bootstrap = resolveDirectThreadBootstrap( + emptyDirectThreadChatState(), + { + subscriptionId: 'sub-1', + lastCompletedItemId: null, + events: [ + withUserItemId( + event({ type: 'turn.started', at: 1_500 }), + 'direct-codex:client-0:user', + ), + enqueued('client-1', '第一条'), + enqueued('client-2', '第二条'), + ], + } as never, + ); + expect(bootstrap.turnRunning).toBe(true); + expect(bootstrap.turnUserItemId).toBe('direct-codex:client-0:user'); + expect(bootstrap.pendingTurns.map((turn) => turn.clientTurnId)).toEqual([ + 'client-1', + 'client-2', + ]); + }); }); describe('失败终态(turn.completed 带 failure 载荷)', () => {