Skip to content

Commit c26ee40

Browse files
fix(gateway): preserve delivered error replay messages
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 380c233 commit c26ee40

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

src/gateway/server-methods/chat.directive-tags.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,27 @@ describe("chat directive tag stripping for non-streaming final payloads", () =>
796796
});
797797
expect(findUserUpdate()).toBeDefined();
798798
expect(mockState.eventOrder).toEqual(["user-transcript", "chat-error"]);
799+
800+
(context.broadcast as unknown as ReturnType<typeof vi.fn>).mockClear();
801+
respond.mockClear();
802+
await runNonStreamingChatSend({
803+
context,
804+
respond,
805+
idempotencyKey: "idem-agent-error-payload",
806+
waitFor: "none",
807+
});
808+
809+
const replay = lastRespondCall(respond);
810+
expect(replay?.[0]).toBe(false);
811+
expect(replay?.[1]).toMatchObject({
812+
runId: "idem-agent-error-payload",
813+
status: "error",
814+
summary: "LLM idle timeout (120s): no response from model",
815+
});
816+
expect(responseErrorMessage(replay?.[2])).toBe(
817+
"LLM idle timeout (120s): no response from model",
818+
);
819+
expect(context.broadcast).not.toHaveBeenCalled();
799820
});
800821

801822
it("joins multiple agent-run error payloads before broadcasting", async () => {

src/gateway/server-methods/chat.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2931,6 +2931,9 @@ export const chatHandlers: GatewayRequestHandlers = {
29312931
summary: deliveredReplyErrorMessage,
29322932
}
29332933
: { runId: clientRunId, status: "ok" as const },
2934+
...(deliveredReplyErrorMessage
2935+
? { error: errorShape(ErrorCodes.UNAVAILABLE, deliveredReplyErrorMessage) }
2936+
: {}),
29342937
},
29352938
});
29362939
}

0 commit comments

Comments
 (0)