fix(ui): keep live chat for canonical session events

This commit is contained in:
Peter Steinberger
2026-05-02 03:45:42 +01:00
parent ec55307df2
commit f739edcf4c
3 changed files with 75 additions and 2 deletions

View File

@@ -77,7 +77,7 @@ describe("handleChatEvent", () => {
expect(handleChatEvent(state, undefined)).toBe(null);
});
it("returns null when sessionKey does not match", () => {
it("returns null when sessionKey does not match and no active run is in flight", () => {
const state = createState({ sessionKey: "main" });
const payload: ChatEventPayload = {
runId: "run-1",
@@ -87,6 +87,73 @@ describe("handleChatEvent", () => {
expect(handleChatEvent(state, payload)).toBe(null);
});
it("accepts delta events for the active run when gateway emits a canonical session key", () => {
const state = createState({
sessionKey: "main",
chatRunId: "run-1",
chatStream: null,
});
const payload: ChatEventPayload = {
runId: "run-1",
sessionKey: "agent:main:main",
state: "delta",
message: {
role: "assistant",
content: [{ type: "text", text: "Live reply" }],
},
};
expect(handleChatEvent(state, payload)).toBe("delta");
expect(state.chatStream).toBe("Live reply");
expect(state.chatRunId).toBe("run-1");
});
it("accepts final events for the active run when gateway emits a canonical session key", () => {
const state = createState({
sessionKey: "main",
chatRunId: "run-1",
chatStream: "Live reply",
chatStreamStartedAt: 100,
});
const payload: ChatEventPayload = {
runId: "run-1",
sessionKey: "agent:main:main",
state: "final",
message: {
role: "assistant",
content: [{ type: "text", text: "Live reply" }],
},
};
expect(handleChatEvent(state, payload)).toBe("final");
expect(state.chatMessages).toEqual([payload.message]);
expect(state.chatRunId).toBe(null);
expect(state.chatStream).toBe(null);
expect(state.chatStreamStartedAt).toBe(null);
});
it("still drops events when neither session key nor active run id matches", () => {
const state = createState({
sessionKey: "main",
chatRunId: "run-1",
chatStream: "Working...",
});
const payload: ChatEventPayload = {
runId: "run-2",
sessionKey: "agent:main:main",
state: "delta",
message: {
role: "assistant",
content: [{ type: "text", text: "Wrong run" }],
},
};
expect(handleChatEvent(state, payload)).toBe(null);
expect(state.chatRunId).toBe("run-1");
expect(state.chatStream).toBe("Working...");
expect(state.chatMessages).toEqual([]);
});
it("returns null for delta from another run", () => {
const state = createState({
sessionKey: "main",

View File

@@ -714,7 +714,12 @@ export function handleChatEvent(state: ChatState, payload?: ChatEventPayload) {
if (!payload) {
return null;
}
if (payload.sessionKey !== state.sessionKey) {
const sessionMatches = payload.sessionKey === state.sessionKey;
const activeRunMatches =
state.chatRunId !== null &&
typeof payload.runId === "string" &&
payload.runId === state.chatRunId;
if (!sessionMatches && !activeRunMatches) {
return null;
}