





























@@ -4,6 +4,14 @@ import { HEARTBEAT_TOKEN, SILENT_REPLY_TOKEN } from "../tokens.js";
44import { createReplyDispatcher } from "./reply-dispatcher.js";
55import { createReplyToModeFilter } from "./reply-threading.js";
667+type DeliverPayload = Parameters<Parameters<typeof createReplyDispatcher>[0]["deliver"]>[0];
8+type DeliverMock = { mock: { calls: unknown[][] } };
9+10+function deliveredText(deliver: DeliverMock, index = 0) {
11+const payload = deliver.mock.calls.at(index)?.at(0) as DeliverPayload | undefined;
12+return payload?.text;
13+}
14+715describe("createReplyDispatcher", () => {
816it("drops empty payloads and exact silent tokens without media", async () => {
917const deliver = vi.fn().mockResolvedValue(undefined);
@@ -17,8 +25,8 @@ describe("createReplyDispatcher", () => {
17251826await dispatcher.waitForIdle();
1927expect(deliver).toHaveBeenCalledTimes(2);
20-expect(deliver.mock.calls[0]?.[0]?.text).toBe(`${SILENT_REPLY_TOKEN} -- nope`);
21-expect(deliver.mock.calls[1]?.[0]?.text).toBe(`interject.${SILENT_REPLY_TOKEN}`);
28+expect(deliveredText(deliver)).toBe(`${SILENT_REPLY_TOKEN} -- nope`);
29+expect(deliveredText(deliver, 1)).toBe(`interject.${SILENT_REPLY_TOKEN}`);
2230});
23312432it("rewrites exact NO_REPLY final payloads for direct sessions where rewrite is enabled", async () => {
@@ -50,7 +58,7 @@ describe("createReplyDispatcher", () => {
50585159await dispatcher.waitForIdle();
5260expect(deliver).toHaveBeenCalledTimes(1);
53-expect(deliver.mock.calls[0]?.[0]?.text).toBe("No further response from me.");
61+expect(deliveredText(deliver)).toBe("No further response from me.");
5462});
55635664it("preserves exact NO_REPLY final payloads for direct sessions where rewrite is disabled", async () => {
@@ -82,7 +90,7 @@ describe("createReplyDispatcher", () => {
82908391await dispatcher.waitForIdle();
8492expect(deliver).toHaveBeenCalledTimes(1);
85-expect(deliver.mock.calls[0]?.[0]?.text).toBe(SILENT_REPLY_TOKEN);
93+expect(deliveredText(deliver)).toBe(SILENT_REPLY_TOKEN);
8694});
87958896it("still drops exact NO_REPLY final payloads for group sessions where silence is allowed", async () => {
@@ -130,7 +138,7 @@ describe("createReplyDispatcher", () => {
130138await dispatcher.waitForIdle();
131139132140expect(deliver).toHaveBeenCalledTimes(1);
133-expect(deliver.mock.calls[0][0].text).toBe("PFX hello");
141+expect(deliveredText(deliver)).toBe("PFX hello");
134142expect(onHeartbeatStrip).toHaveBeenCalledTimes(2);
135143});
136144@@ -163,9 +171,9 @@ describe("createReplyDispatcher", () => {
163171await dispatcher.waitForIdle();
164172165173expect(deliver).toHaveBeenCalledTimes(3);
166-expect(deliver.mock.calls[0][0].text).toBe("PFX already");
167-expect(deliver.mock.calls[1][0].text).toBe("");
168-expect(deliver.mock.calls[2][0].text).toBe(`PFX ${SILENT_REPLY_TOKEN} -- explanation`);
174+expect(deliveredText(deliver)).toBe("PFX already");
175+expect(deliveredText(deliver, 1)).toBe("");
176+expect(deliveredText(deliver, 2)).toBe(`PFX ${SILENT_REPLY_TOKEN} -- explanation`);
169177});
170178171179it("preserves ordering across tool, block, and final replies", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。