From e0ca5ad9b93d8c3978cddf9f336586527a40dcd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 30 Sep 2026 12:43:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=20bootstrap=20=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=E8=A1=A5=E9=BD=90=EF=BC=9A=E5=9C=A8=E8=B7=91=E7=9A=84?= =?UTF-8?q?=E9=82=A3=E4=B8=80=E8=BD=AE=E4=B8=8E=E5=9C=A8=E9=98=9F=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E5=90=8C=E6=97=B6=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `directThreadChat.test.ts` 队列投影分组里新增一条:bootstrap 同时带 `turn.started` 锚点与两条 `queue.enqueued` - 断言 `turnRunning` / `turnUserItemId` / `pendingTurns` 三者同时正确,而不是各测一半 - 只加用例,不改实现 --- .../tests/directThreadChat.test.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) 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 载荷)', () => {