






















@@ -6,6 +6,7 @@ import {
66createSequencedTestDraftStream,
77createTestDraftStream,
88} from "./draft-stream.test-helpers.js";
9+import { notifyTelegramInboundTurnOutboundSuccess } from "./inbound-turn-delivery.js";
9101011type DispatchReplyWithBufferedBlockDispatcherArgs = Parameters<
1112TelegramBotDeps["dispatchReplyWithBufferedBlockDispatcher"]
@@ -1641,6 +1642,87 @@ describe("dispatchTelegramMessage draft streaming", () => {
16411642expect(groupHistories.get(historyKey)).toHaveLength(1);
16421643});
164316441645+it("clears delivered room-event history when a newer turn supersedes dispatch", async () => {
1646+const historyKey = "telegram:group:-100123";
1647+const groupHistories = new Map([
1648+[historyKey, [{ sender: "Alice", body: "lunch at two", timestamp: 1 }]],
1649+]);
1650+let firstStarted: (() => void) | undefined;
1651+const firstStartGate = new Promise<void>((resolve) => {
1652+firstStarted = resolve;
1653+});
1654+let releaseFirst: (() => void) | undefined;
1655+const firstGate = new Promise<void>((resolve) => {
1656+releaseFirst = resolve;
1657+});
1658+let secondStarted: (() => void) | undefined;
1659+const secondStartGate = new Promise<void>((resolve) => {
1660+secondStarted = resolve;
1661+});
1662+dispatchReplyWithBufferedBlockDispatcher
1663+.mockImplementationOnce(async () => {
1664+firstStarted?.();
1665+await firstGate;
1666+return {
1667+queuedFinal: false,
1668+counts: { block: 0, final: 0, tool: 0 },
1669+sourceReplyDeliveryMode: "message_tool_only",
1670+};
1671+})
1672+.mockImplementationOnce(async () => {
1673+secondStarted?.();
1674+return {
1675+queuedFinal: false,
1676+counts: { block: 0, final: 0, tool: 0 },
1677+sourceReplyDeliveryMode: "message_tool_only",
1678+};
1679+});
1680+1681+const createRoomContext = (messageId: number, body: string) =>
1682+createContext({
1683+ctxPayload: {
1684+InboundTurnKind: "room_event",
1685+SessionKey: "agent:main:telegram:group:-100123",
1686+ChatType: "group",
1687+MessageSid: String(messageId),
1688+RawBody: body,
1689+BodyForAgent: body,
1690+CommandBody: body,
1691+} as unknown as TelegramMessageContext["ctxPayload"],
1692+msg: {
1693+chat: { id: -100123, type: "supergroup" },
1694+message_id: messageId,
1695+} as unknown as TelegramMessageContext["msg"],
1696+chatId: -100123,
1697+isGroup: true,
1698+ historyKey,
1699+historyLimit: 10,
1700+ groupHistories,
1701+threadSpec: { id: undefined, scope: "none" },
1702+});
1703+1704+const firstPromise = dispatchWithContext({
1705+context: createRoomContext(99, "ambient one"),
1706+streamMode: "partial",
1707+});
1708+await firstStartGate;
1709+notifyTelegramInboundTurnOutboundSuccess({
1710+sessionKey: "agent:main:telegram:group:-100123",
1711+to: "telegram:-100123",
1712+inboundTurnKind: "room_event",
1713+});
1714+const secondPromise = dispatchWithContext({
1715+context: createRoomContext(100, "ambient two"),
1716+streamMode: "partial",
1717+});
1718+1719+await secondStartGate;
1720+releaseFirst?.();
1721+await Promise.all([firstPromise, secondPromise]);
1722+1723+expect(groupHistories.get(historyKey)).toHaveLength(0);
1724+});
1725+16441726it("does not let room events supersede active user-request dispatch", async () => {
16451727const historyKey = "telegram:group:-100123";
16461728const groupHistories = new Map([[historyKey, []]]);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。