


























@@ -201,6 +201,55 @@ describe("handleChatEvent", () => {
201201expect(state.chatMessages).toEqual([]);
202202});
203203204+it("keeps active stream for unowned final payloads", () => {
205+const state = createActiveStreamingState();
206+const payload: ChatEventPayload = {
207+sessionKey: "main",
208+state: "final",
209+};
210+211+expect(handleChatEvent(state, payload)).toBe("final");
212+expect(state.chatRunId).toBe("run-user");
213+expect(state.chatStream).toBe("Working...");
214+expect(state.chatStreamStartedAt).toBe(123);
215+expect(state.chatMessages).toEqual([]);
216+});
217+218+it("keeps active stream while appending unowned assistant finals", () => {
219+const state = createActiveStreamingState();
220+const payload: ChatEventPayload = {
221+sessionKey: "main",
222+state: "final",
223+message: {
224+role: "assistant",
225+content: [{ type: "text", text: "Injected note" }],
226+},
227+};
228+229+expect(handleChatEvent(state, payload)).toBe(null);
230+expect(state.chatRunId).toBe("run-user");
231+expect(state.chatStream).toBe("Working...");
232+expect(state.chatStreamStartedAt).toBe(123);
233+expect(state.chatMessages).toEqual([payload.message]);
234+});
235+236+it.each(["aborted", "error"] as const)(
237+"keeps active stream for unowned %s payloads",
238+(terminalState) => {
239+const state = createActiveStreamingState();
240+const payload: ChatEventPayload = {
241+sessionKey: "main",
242+state: terminalState,
243+};
244+245+expect(handleChatEvent(state, payload)).toBe(null);
246+expect(state.chatRunId).toBe("run-user");
247+expect(state.chatStream).toBe("Working...");
248+expect(state.chatStreamStartedAt).toBe(123);
249+expect(state.chatMessages).toEqual([]);
250+},
251+);
252+204253it("persists streamed text when final event carries no message", () => {
205254const existingMessage = {
206255role: "user",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。