From 58a2acd330964c7fdc12ca4bed8ba5b82e814f5f Mon Sep 17 00:00:00 2001 From: can1357 Date: Wed, 22 Jul 2026 21:32:12 +0200 Subject: [PATCH] test(coding-agent): align ctx fixtures with settled-component cache and todo commit-on-execute - Added transcriptMessageComponents to every InteractiveMode ctx test literal; #6033's reuse cache made the field required and addMessageToChat populates it unconditionally. - Wired setTodoPhases into the eager-todo ToolSession fixture to mirror sdk.ts; the test relied on the stale message_end todo replay #6148 removed. --- packages/coding-agent/test/agent-session-eager-todo.test.ts | 2 ++ packages/coding-agent/test/collab/chunked-welcome.test.ts | 1 + packages/coding-agent/test/collab/guest-subagent-badge.test.ts | 1 + packages/coding-agent/test/collab/guest-ui-request.test.ts | 1 + .../coding-agent/test/event-controller-abort-render.test.ts | 1 + .../coding-agent/test/event-controller-error-banner.test.ts | 1 + .../test/event-controller-mixed-assistant-render.test.ts | 1 + .../coding-agent/test/event-controller-todo-reminder.test.ts | 1 + packages/coding-agent/test/input-controller-skill-queue.test.ts | 1 + packages/coding-agent/test/interactive-mode-status.test.ts | 2 ++ packages/coding-agent/test/issue-4348-repro.test.ts | 1 + packages/coding-agent/test/job-poll-displacement.test.ts | 2 ++ .../coding-agent/test/mid-turn-rebuild-pending-tool.test.ts | 1 + .../test/modes/controllers/event-controller-args-reveal.test.ts | 1 + .../modes/controllers/event-controller-idle-compaction.test.ts | 1 + .../test/modes/controllers/event-controller-interrupt.test.ts | 1 + .../modes/controllers/event-controller-loader-recovery.test.ts | 1 + .../modes/controllers/event-controller-message-start.test.ts | 1 + .../modes/controllers/event-controller-read-grouping.test.ts | 1 + .../controllers/event-controller-superseded-agent-end.test.ts | 1 + .../controllers/event-controller-task-async-updates.test.ts | 1 + .../controllers/event-controller-toolcall-finalize.test.ts | 1 + .../test/modes/utils/render-initial-messages.test.ts | 1 + .../test/repro-issue-1955-sendmessage-double-render.test.ts | 1 + packages/coding-agent/test/usage-row-placement.test.ts | 1 + 25 files changed, 28 insertions(+) diff --git a/packages/coding-agent/test/agent-session-eager-todo.test.ts b/packages/coding-agent/test/agent-session-eager-todo.test.ts index 8a4276fa7..ca6cfab53 100644 --- a/packages/coding-agent/test/agent-session-eager-todo.test.ts +++ b/packages/coding-agent/test/agent-session-eager-todo.test.ts @@ -129,6 +129,8 @@ describe("AgentSession eager todo enforcement", () => { getSessionFile: () => sessionManager.getSessionFile() ?? null, getSessionSpawns: () => "*", settings, + // Mirrors sdk.ts wiring: TodoTool commits phases during execute (#6148 removed the message_end replay). + setTodoPhases: phases => session?.setTodoPhases(phases), }; const todoTool = new TodoTool(toolSession); const mockBashTool: AgentTool = { diff --git a/packages/coding-agent/test/collab/chunked-welcome.test.ts b/packages/coding-agent/test/collab/chunked-welcome.test.ts index 53d786845..9c110fb54 100644 --- a/packages/coding-agent/test/collab/chunked-welcome.test.ts +++ b/packages/coding-agent/test/collab/chunked-welcome.test.ts @@ -103,6 +103,7 @@ function makeFailingGuestContext(failure: Error): InteractiveModeContext { compactionQueuedMessages: [], streamingComponent: undefined, streamingMessage: undefined, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), loadingAnimation: undefined, statusLine: { diff --git a/packages/coding-agent/test/collab/guest-subagent-badge.test.ts b/packages/coding-agent/test/collab/guest-subagent-badge.test.ts index 6a35f87ca..058c7d55f 100644 --- a/packages/coding-agent/test/collab/guest-subagent-badge.test.ts +++ b/packages/coding-agent/test/collab/guest-subagent-badge.test.ts @@ -68,6 +68,7 @@ function makeGuestContext(counts: number[]): InteractiveModeContext { compactionQueuedMessages: [], streamingComponent: undefined, streamingMessage: undefined, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), loadingAnimation: undefined, statusLine: { diff --git a/packages/coding-agent/test/collab/guest-ui-request.test.ts b/packages/coding-agent/test/collab/guest-ui-request.test.ts index 76330b0d3..8c465c88b 100644 --- a/packages/coding-agent/test/collab/guest-ui-request.test.ts +++ b/packages/coding-agent/test/collab/guest-ui-request.test.ts @@ -211,6 +211,7 @@ async function makeHarness(opts?: { readOnly?: boolean }): Promise false), }; diff --git a/packages/coding-agent/test/event-controller-error-banner.test.ts b/packages/coding-agent/test/event-controller-error-banner.test.ts index e12980e7e..fccd82b91 100644 --- a/packages/coding-agent/test/event-controller-error-banner.test.ts +++ b/packages/coding-agent/test/event-controller-error-banner.test.ts @@ -110,6 +110,7 @@ function createFixture(streamingMessage?: AssistantMessage) { streamingMessage, chatContainer, proseOnlyThinking: true, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), flushCompactionQueue: vi.fn(async () => {}), showPinnedError, diff --git a/packages/coding-agent/test/event-controller-mixed-assistant-render.test.ts b/packages/coding-agent/test/event-controller-mixed-assistant-render.test.ts index 57949ccfe..1fe499def 100644 --- a/packages/coding-agent/test/event-controller-mixed-assistant-render.test.ts +++ b/packages/coding-agent/test/event-controller-mixed-assistant-render.test.ts @@ -69,6 +69,7 @@ function createFixture() { ui, settings, chatContainer, + transcriptMessageComponents: new WeakMap(), pendingTools, toolOutputExpanded: false, effectiveHideThinkingBlock: false, diff --git a/packages/coding-agent/test/event-controller-todo-reminder.test.ts b/packages/coding-agent/test/event-controller-todo-reminder.test.ts index 0c5e2836a..db95fc5b9 100644 --- a/packages/coding-agent/test/event-controller-todo-reminder.test.ts +++ b/packages/coding-agent/test/event-controller-todo-reminder.test.ts @@ -14,6 +14,7 @@ function createContext() { isInitialized: true, init: vi.fn(async () => {}), ui: { requestRender: vi.fn() }, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), statusLine: { invalidate: vi.fn(), markActivityStart: vi.fn() }, updateEditorTopBorder: vi.fn(), diff --git a/packages/coding-agent/test/input-controller-skill-queue.test.ts b/packages/coding-agent/test/input-controller-skill-queue.test.ts index 240c0ae0f..36d3db53b 100644 --- a/packages/coding-agent/test/input-controller-skill-queue.test.ts +++ b/packages/coding-agent/test/input-controller-skill-queue.test.ts @@ -775,6 +775,7 @@ function createEventControllerFixture() { updateEditorTopBorder: vi.fn(), addMessageToChat, updatePendingMessagesDisplay, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), session: {}, get viewSession() { diff --git a/packages/coding-agent/test/interactive-mode-status.test.ts b/packages/coding-agent/test/interactive-mode-status.test.ts index 542564c52..9371398a7 100644 --- a/packages/coding-agent/test/interactive-mode-status.test.ts +++ b/packages/coding-agent/test/interactive-mode-status.test.ts @@ -24,6 +24,7 @@ function createInitialRenderHarness(): { ctx: InteractiveModeContext; helpers: U pendingMessagesContainer: new Container(), pendingBashComponents: [], pendingPythonComponents: [], + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, present: (content: Component | readonly Component[]) => { @@ -136,6 +137,7 @@ describe("InteractiveMode.showStatus", () => { test("preserves optimistic user signatures when rebuilding transcript state", () => { const ctx = { chatContainer: new Container(), + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, viewSession: { isStreaming: false }, diff --git a/packages/coding-agent/test/issue-4348-repro.test.ts b/packages/coding-agent/test/issue-4348-repro.test.ts index 95cd64aef..fb06c380c 100644 --- a/packages/coding-agent/test/issue-4348-repro.test.ts +++ b/packages/coding-agent/test/issue-4348-repro.test.ts @@ -59,6 +59,7 @@ function makeRenderCtx(transcript: SessionContext): { ctx: InteractiveModeContex pendingMessagesContainer: new Container(), pendingBashComponents: [], pendingPythonComponents: [], + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), statusLine: { invalidate: vi.fn() }, updateEditorBorderColor: vi.fn(), diff --git a/packages/coding-agent/test/job-poll-displacement.test.ts b/packages/coding-agent/test/job-poll-displacement.test.ts index f1110ee89..dcd1eedb9 100644 --- a/packages/coding-agent/test/job-poll-displacement.test.ts +++ b/packages/coding-agent/test/job-poll-displacement.test.ts @@ -413,6 +413,7 @@ describe("UiHelpers.renderSessionContext collapses repeated todo snapshots", () let helpers!: UiHelpers; const ctx = { chatContainer, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, statusLine: { invalidate: vi.fn() }, @@ -489,6 +490,7 @@ describe("UiHelpers.renderSessionContext collapses repeated todo snapshots", () let helpers!: UiHelpers; const ctx = { chatContainer, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, statusLine: { invalidate: vi.fn() }, diff --git a/packages/coding-agent/test/mid-turn-rebuild-pending-tool.test.ts b/packages/coding-agent/test/mid-turn-rebuild-pending-tool.test.ts index dd7105a4f..4416b0f39 100644 --- a/packages/coding-agent/test/mid-turn-rebuild-pending-tool.test.ts +++ b/packages/coding-agent/test/mid-turn-rebuild-pending-tool.test.ts @@ -57,6 +57,7 @@ function createFixture(opts: { isStreaming: boolean }) { isInitialized: true, init: vi.fn(async () => {}), chatContainer, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, statusLine: { invalidate: vi.fn() }, diff --git a/packages/coding-agent/test/modes/controllers/event-controller-args-reveal.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-args-reveal.test.ts index fe0b63802..142250ad7 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-args-reveal.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-args-reveal.test.ts @@ -51,6 +51,7 @@ function createFixture(streamingMessage: AssistantMessage) { updateEditorTopBorder: vi.fn(), streamingComponent: { updateContent: vi.fn(), markTranscriptBlockFinalized: vi.fn() }, streamingMessage, + transcriptMessageComponents: new WeakMap(), pendingTools, noteDisplayableThinkingContent: vi.fn(() => false), chatContainer: { addChild: vi.fn() }, diff --git a/packages/coding-agent/test/modes/controllers/event-controller-idle-compaction.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-idle-compaction.test.ts index fa98f82c2..f8a1e9099 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-idle-compaction.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-idle-compaction.test.ts @@ -70,6 +70,7 @@ function createContext( loadingAnimation: undefined, streamingComponent: undefined, streamingMessage: undefined, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), flushPendingModelSwitch: async () => {}, flushPendingCommandOutput: () => {}, diff --git a/packages/coding-agent/test/modes/controllers/event-controller-interrupt.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-interrupt.test.ts index 9118e64c7..fd391daf7 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-interrupt.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-interrupt.test.ts @@ -18,6 +18,7 @@ function createContext() { settings: { get: () => false }, statusLine: { invalidate: vi.fn(), markActivityStart: vi.fn(), markActivityEnd: vi.fn() }, updateEditorTopBorder: vi.fn(), + transcriptMessageComponents: new WeakMap(), pendingTools, hideThinkingBlock: false, setWorkingMessage, diff --git a/packages/coding-agent/test/modes/controllers/event-controller-loader-recovery.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-loader-recovery.test.ts index b9545ad03..4a8c17d66 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-loader-recovery.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-loader-recovery.test.ts @@ -53,6 +53,7 @@ function createContext(options: { terminalProgress?: boolean } = {}) { statusLine: { invalidate: vi.fn(), markActivityStart: vi.fn(), markActivityEnd: vi.fn() }, updateEditorTopBorder: vi.fn(), flushPendingCommandOutput: vi.fn(), + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), hideThinkingBlock: false, setWorkingMessage: vi.fn(), diff --git a/packages/coding-agent/test/modes/controllers/event-controller-message-start.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-message-start.test.ts index 57bc880fe..8c6f5dd65 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-message-start.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-message-start.test.ts @@ -61,6 +61,7 @@ function createContext(options: { locallySubmittedUserSignatures: new Set(options.locallySubmittedSignatures ?? []), clearOptimisticUserMessage, replaceOptimisticUserMessage, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), viewSession: { isStreaming: false }, } as unknown as InteractiveModeContext; diff --git a/packages/coding-agent/test/modes/controllers/event-controller-read-grouping.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-read-grouping.test.ts index 04d1e4a9e..decdbe368 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-read-grouping.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-read-grouping.test.ts @@ -80,6 +80,7 @@ function createFixture() { updateEditorTopBorder: vi.fn(), ui: { requestRender: vi.fn(), imageBudget: undefined }, chatContainer, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), noteDisplayableThinkingContent: vi.fn(() => false), settings: { get: () => false }, diff --git a/packages/coding-agent/test/modes/controllers/event-controller-superseded-agent-end.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-superseded-agent-end.test.ts index ef10eabe3..7e38f70f7 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-superseded-agent-end.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-superseded-agent-end.test.ts @@ -20,6 +20,7 @@ function createContext() { statusLine: { invalidate: vi.fn(), markActivityStart: vi.fn(), markActivityEnd: vi.fn() }, updateEditorTopBorder: vi.fn(), flushPendingCommandOutput: vi.fn(), + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), hideThinkingBlock: false, setWorkingMessage: vi.fn(), diff --git a/packages/coding-agent/test/modes/controllers/event-controller-task-async-updates.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-task-async-updates.test.ts index 2a342e3ea..f94db4fc7 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-task-async-updates.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-task-async-updates.test.ts @@ -65,6 +65,7 @@ describe("EventController async update finalization", () => { statusLine: { invalidate: vi.fn() }, updateEditorTopBorder: vi.fn(), toolOutputExpanded: false, + transcriptMessageComponents: new WeakMap(), pendingTools, chatContainer, session: { getToolByName: () => undefined, isStreaming: true }, diff --git a/packages/coding-agent/test/modes/controllers/event-controller-toolcall-finalize.test.ts b/packages/coding-agent/test/modes/controllers/event-controller-toolcall-finalize.test.ts index db2d70d61..ecc591898 100644 --- a/packages/coding-agent/test/modes/controllers/event-controller-toolcall-finalize.test.ts +++ b/packages/coding-agent/test/modes/controllers/event-controller-toolcall-finalize.test.ts @@ -58,6 +58,7 @@ function createFixture(streamingMessage: AssistantMessage) { updateEditorTopBorder: vi.fn(), streamingComponent, streamingMessage, + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), noteDisplayableThinkingContent: vi.fn(() => false), chatContainer: { addChild: vi.fn((child: { seal?(): void }) => mountedComponents.push(child)) }, diff --git a/packages/coding-agent/test/modes/utils/render-initial-messages.test.ts b/packages/coding-agent/test/modes/utils/render-initial-messages.test.ts index 18da6ea91..926ac5f70 100644 --- a/packages/coding-agent/test/modes/utils/render-initial-messages.test.ts +++ b/packages/coding-agent/test/modes/utils/render-initial-messages.test.ts @@ -147,6 +147,7 @@ function makeRenderCtx( pendingMessagesContainer: new Container(), pendingBashComponents: [], pendingPythonComponents: [], + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), statusLine: { invalidate: vi.fn() }, updateEditorBorderColor: vi.fn(), diff --git a/packages/coding-agent/test/repro-issue-1955-sendmessage-double-render.test.ts b/packages/coding-agent/test/repro-issue-1955-sendmessage-double-render.test.ts index fbc75a45b..e762d7dc3 100644 --- a/packages/coding-agent/test/repro-issue-1955-sendmessage-double-render.test.ts +++ b/packages/coding-agent/test/repro-issue-1955-sendmessage-double-render.test.ts @@ -109,6 +109,7 @@ function createHarness(): Harness { pendingMessagesContainer: new Container(), pendingBashComponents: [], pendingPythonComponents: [], + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, isBackgrounded: false, diff --git a/packages/coding-agent/test/usage-row-placement.test.ts b/packages/coding-agent/test/usage-row-placement.test.ts index 56b78b8c6..e9a1d4928 100644 --- a/packages/coding-agent/test/usage-row-placement.test.ts +++ b/packages/coding-agent/test/usage-row-placement.test.ts @@ -58,6 +58,7 @@ function makeHarness(showTokenUsage: boolean): { ctx: InteractiveModeContext; he let helpers: UiHelpers; const ctx = { chatContainer: new Container(), + transcriptMessageComponents: new WeakMap(), pendingTools: new Map(), ui: { requestRender: vi.fn() }, statusLine: { invalidate: vi.fn() },