





















@@ -383,9 +383,11 @@ describe("agent event handler", () => {
383383expect(chatCalls).toHaveLength(1);
384384const payload = chatCalls[0]?.[1] as {
385385state?: string;
386+deltaText?: string;
386387message?: { content?: Array<{ text?: string }> };
387388};
388389expect(payload.state).toBe("delta");
390+expect(payload.deltaText).toBe("Hello world");
389391expect(payload.message?.content?.[0]?.text).toBe("Hello world");
390392expect(sessionChatCalls(nodeSendToSession)).toHaveLength(1);
391393nowSpy?.mockRestore();
@@ -619,14 +621,17 @@ describe("agent event handler", () => {
619621620622const chatCalls = chatBroadcastCalls(broadcast);
621623expect(chatCalls).toHaveLength(3);
622-const firstPayload = chatCalls[0]?.[1] as { state?: string };
624+const firstPayload = chatCalls[0]?.[1] as { state?: string; deltaText?: string };
623625const secondPayload = chatCalls[1]?.[1] as {
624626state?: string;
627+deltaText?: string;
625628message?: { content?: Array<{ text?: string }> };
626629};
627630const thirdPayload = chatCalls[2]?.[1] as { state?: string };
628631expect(firstPayload.state).toBe("delta");
632+expect(firstPayload.deltaText).toBe("Hello");
629633expect(secondPayload.state).toBe("delta");
634+expect(secondPayload.deltaText).toBe(" world");
630635expect(secondPayload.message?.content?.[0]?.text).toBe("Hello world");
631636expect(thirdPayload.state).toBe("final");
632637expect(sessionChatCalls(nodeSendToSession)).toHaveLength(3);
@@ -665,13 +670,15 @@ describe("agent event handler", () => {
665670expect(chatCalls).toHaveLength(3);
666671const secondPayload = chatCalls[1]?.[1] as {
667672state?: string;
673+deltaText?: string;
668674message?: { content?: Array<{ text?: string }> };
669675};
670676const finalPayload = chatCalls[2]?.[1] as {
671677state?: string;
672678message?: { content?: Array<{ text?: string }> };
673679};
674680expect(secondPayload.state).toBe("delta");
681+expect(secondPayload.deltaText).toBe("\nAfter tool call");
675682expect(secondPayload.message?.content?.[0]?.text).toBe("Before tool call\nAfter tool call");
676683expect(finalPayload.state).toBe("final");
677684expect(finalPayload.message?.content?.[0]?.text).toBe("Before tool call\nAfter tool call");
@@ -711,13 +718,15 @@ describe("agent event handler", () => {
711718expect(chatCalls).toHaveLength(3);
712719const flushPayload = chatCalls[1]?.[1] as {
713720state?: string;
721+deltaText?: string;
714722message?: { content?: Array<{ text?: string }> };
715723};
716724const finalPayload = chatCalls[2]?.[1] as {
717725state?: string;
718726message?: { content?: Array<{ text?: string }> };
719727};
720728expect(flushPayload.state).toBe("delta");
729+expect(flushPayload.deltaText).toBe("\nAfter tool call");
721730expect(flushPayload.message?.content?.[0]?.text).toBe("Before tool call\nAfter tool call");
722731expect(finalPayload.state).toBe("final");
723732expect(finalPayload.message?.content?.[0]?.text).toBe("Before tool call\nAfter tool call");
@@ -764,6 +773,46 @@ describe("agent event handler", () => {
764773nowSpy.mockRestore();
765774});
766775776+it("omits deltaText when a non-prefix replacement is broadcast", () => {
777+let now = 11_300;
778+const nowSpy = vi.spyOn(Date, "now").mockImplementation(() => now);
779+const { broadcast, nodeSendToSession, chatRunState, handler } = createHarness();
780+chatRunState.registry.add("run-replacement", {
781+sessionKey: "session-replacement",
782+clientRunId: "client-replacement",
783+});
784+785+handler({
786+runId: "run-replacement",
787+seq: 1,
788+stream: "assistant",
789+ts: Date.now(),
790+data: { text: "Hello world" },
791+});
792+793+now = 11_500;
794+handler({
795+runId: "run-replacement",
796+seq: 2,
797+stream: "assistant",
798+ts: Date.now(),
799+data: { text: "Goodbye world" },
800+});
801+802+const chatCalls = chatBroadcastCalls(broadcast);
803+expect(chatCalls).toHaveLength(2);
804+const firstPayload = chatCalls[0]?.[1] as { deltaText?: string };
805+const replacementPayload = chatCalls[1]?.[1] as {
806+deltaText?: string;
807+message?: { content?: Array<{ text?: string }> };
808+};
809+expect(firstPayload.deltaText).toBe("Hello world");
810+expect(replacementPayload.message?.content?.[0]?.text).toBe("Goodbye world");
811+expect(replacementPayload.deltaText).toBeUndefined();
812+expect(sessionChatCalls(nodeSendToSession)).toHaveLength(2);
813+nowSpy.mockRestore();
814+});
815+767816it("cleans up agent run sequence tracking when lifecycle completes", () => {
768817const { agentRunSeq, chatRunState, handler, nowSpy } = createHarness({ now: 2_500 });
769818chatRunState.registry.add("run-cleanup", {
@@ -887,9 +936,11 @@ describe("agent event handler", () => {
887936expect(chatCalls).toHaveLength(2);
888937const flushedPayload = chatCalls[1]?.[1] as {
889938state?: string;
939+deltaText?: string;
890940message?: { content?: Array<{ text?: string }> };
891941};
892942expect(flushedPayload.state).toBe("delta");
943+expect(flushedPayload.deltaText).toBe(" expanded");
893944expect(flushedPayload.message?.content?.[0]?.text).toBe("Before tool expanded");
894945expect(sessionChatCalls(nodeSendToSession)).toHaveLength(2);
895946此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。