From b064be537bc8a3cf19396bdc062f046af413abab Mon Sep 17 00:00:00 2001 From: Mathews-Tom Date: Thu, 16 Jul 2026 01:33:46 +0530 Subject: [PATCH] fix(coding-agent): preserve history in terminal hooks --- packages/coding-agent/src/session/agent-session.ts | 5 +++-- .../coding-agent/test/agent-session-concurrent.test.ts | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/coding-agent/src/session/agent-session.ts b/packages/coding-agent/src/session/agent-session.ts index 5f95a3e96..a7bf57297 100644 --- a/packages/coding-agent/src/session/agent-session.ts +++ b/packages/coding-agent/src/session/agent-session.ts @@ -4403,8 +4403,9 @@ export class AgentSession { // Check auto-retry and auto-compaction after agent completes if (event.type === "agent_end") { const settledMessages = event.messages; + const activeMessages = this.agent.state.messages; const emitAgentEndNotification = async (isTerminal = true) => { - await this.#emitAgentEndNotification(settledMessages); + await this.#emitAgentEndNotification(activeMessages); await this.#emitSessionEvent({ ...event, isTerminal }); }; const usage = this.getSessionStats().tokens; @@ -4654,7 +4655,7 @@ export class AgentSession { await emitAgentEndNotification(false); return; } - await this.#emitSessionStopEvent(settledMessages, msg); + await this.#emitSessionStopEvent(activeMessages, msg); await emitAgentEndNotification(); } }; diff --git a/packages/coding-agent/test/agent-session-concurrent.test.ts b/packages/coding-agent/test/agent-session-concurrent.test.ts index 5d01d6b80..e7f24d7e6 100644 --- a/packages/coding-agent/test/agent-session-concurrent.test.ts +++ b/packages/coding-agent/test/agent-session-concurrent.test.ts @@ -344,6 +344,7 @@ describe("AgentSession concurrent prompt guard", () => { convertToLlm, }); const stopEvents: Array<{ + messages: AgentMessage[]; stop_hook_active: boolean; session_id: string; turn_id: number; @@ -399,6 +400,14 @@ describe("AgentSession concurrent prompt guard", () => { expect(stopEvents.map(event => event.turn_id)).toEqual([0, 0]); expect(stopEvents[0]?.session_id).toBe(session.sessionId); expect(stopEvents[0]?.last_assistant_message?.role).toBe("assistant"); + expect( + stopEvents[1]?.messages.some( + message => + message.role === "user" && + Array.isArray(message.content) && + message.content.some(block => block.type === "text" && block.text === "First message"), + ), + ).toBe(true); }); it("uses non-empty session_stop reason when additional context is empty", async () => {