diff --git a/src/agents/session-tool-result-guard.test.ts b/src/agents/session-tool-result-guard.test.ts index 1bfcb31ed..9a630f3c6 100644 --- a/src/agents/session-tool-result-guard.test.ts +++ b/src/agents/session-tool-result-guard.test.ts @@ -52,6 +52,28 @@ describe("installSessionToolResultGuard", () => { expect(messages.map((m) => m.role)).toEqual(["assistant", "toolResult"]); }); + it("ignores tool calls from aborted assistant messages", () => { + const sm = SessionManager.inMemory(); + installSessionToolResultGuard(sm); + + sm.appendMessage({ + role: "assistant", + stopReason: "aborted", + content: [{ type: "toolCall", id: "call_abort", name: "read", arguments: {} }], + } as AgentMessage); + sm.appendMessage({ + role: "assistant", + content: [{ type: "text", text: "next" }], + } as AgentMessage); + + const messages = sm + .getEntries() + .filter((e) => e.type === "message") + .map((e) => (e as { message: AgentMessage }).message); + + expect(messages.map((m) => m.role)).toEqual(["assistant", "assistant"]); + }); + it("does not add synthetic toolResult when a matching one exists", () => { const sm = SessionManager.inMemory(); installSessionToolResultGuard(sm); diff --git a/src/agents/session-tool-result-guard.ts b/src/agents/session-tool-result-guard.ts index feb6b854c..6e32c6eb5 100644 --- a/src/agents/session-tool-result-guard.ts +++ b/src/agents/session-tool-result-guard.ts @@ -7,6 +7,7 @@ import { emitSessionTranscriptUpdate } from "../sessions/transcript-events.js"; type ToolCall = { id: string; name?: string }; function extractAssistantToolCalls(msg: Extract): ToolCall[] { + if (msg.stopReason === "aborted") return []; const content = msg.content; if (!Array.isArray(content)) return []; diff --git a/src/agents/session-transcript-repair.ts b/src/agents/session-transcript-repair.ts index d680beb4d..071fb111f 100644 --- a/src/agents/session-transcript-repair.ts +++ b/src/agents/session-transcript-repair.ts @@ -8,6 +8,7 @@ type ToolCallLike = { function extractToolCallsFromAssistant( msg: Extract, ): ToolCallLike[] { + if (msg.stopReason === "aborted") return []; const content = msg.content; if (!Array.isArray(content)) return [];