























@@ -1641,6 +1641,89 @@ describe("dispatchTelegramMessage draft streaming", () => {
16411641expect(groupHistories.get(historyKey)).toHaveLength(1);
16421642});
164316431644+it("does not let room events supersede active user-request dispatch", async () => {
1645+const historyKey = "telegram:group:-100123";
1646+const groupHistories = new Map([[historyKey, []]]);
1647+let firstStarted: (() => void) | undefined;
1648+const firstStartGate = new Promise<void>((resolve) => {
1649+firstStarted = resolve;
1650+});
1651+let releaseFirst: (() => void) | undefined;
1652+const firstGate = new Promise<void>((resolve) => {
1653+releaseFirst = resolve;
1654+});
1655+let roomEventStarted: (() => void) | undefined;
1656+const roomEventStartGate = new Promise<void>((resolve) => {
1657+roomEventStarted = resolve;
1658+});
1659+dispatchReplyWithBufferedBlockDispatcher
1660+.mockImplementationOnce(async ({ dispatcherOptions }) => {
1661+firstStarted?.();
1662+await firstGate;
1663+await dispatcherOptions.deliver({ text: "visible request answer" }, { kind: "final" });
1664+return {
1665+queuedFinal: true,
1666+counts: { block: 0, final: 1, tool: 0 },
1667+};
1668+})
1669+.mockImplementationOnce(async () => {
1670+roomEventStarted?.();
1671+return {
1672+queuedFinal: false,
1673+counts: { block: 0, final: 0, tool: 0 },
1674+sourceReplyDeliveryMode: "message_tool_only",
1675+};
1676+});
1677+1678+const createGroupContext = (
1679+kind: "user_request" | "room_event",
1680+messageId: number,
1681+body: string,
1682+) =>
1683+createContext({
1684+ctxPayload: {
1685+InboundTurnKind: kind,
1686+SessionKey: "agent:main:telegram:group:-100123",
1687+ChatType: "group",
1688+MessageSid: String(messageId),
1689+RawBody: body,
1690+BodyForAgent: body,
1691+CommandBody: body,
1692+CommandAuthorized: true,
1693+} as unknown as TelegramMessageContext["ctxPayload"],
1694+msg: {
1695+chat: { id: -100123, type: "supergroup" },
1696+message_id: messageId,
1697+} as unknown as TelegramMessageContext["msg"],
1698+chatId: -100123,
1699+isGroup: true,
1700+ historyKey,
1701+historyLimit: 10,
1702+ groupHistories,
1703+threadSpec: { id: undefined, scope: "none" },
1704+});
1705+1706+const userRequestPromise = dispatchWithContext({
1707+context: createGroupContext("user_request", 99, "@bot answer this"),
1708+streamMode: "off",
1709+});
1710+await firstStartGate;
1711+const roomEventPromise = dispatchWithContext({
1712+context: createGroupContext("room_event", 100, "ambient chatter"),
1713+streamMode: "off",
1714+});
1715+await roomEventStartGate;
1716+releaseFirst?.();
1717+await Promise.all([userRequestPromise, roomEventPromise]);
1718+1719+const deliveredTexts = deliverReplies.mock.calls.flatMap((call) =>
1720+((call[0] as { replies?: Array<{ text?: string }> }).replies ?? []).map(
1721+(reply) => reply.text,
1722+),
1723+);
1724+expect(deliveredTexts).toContain("visible request answer");
1725+});
1726+16441727it("does not send visible error fallbacks for room events", async () => {
16451728const historyKey = "telegram:group:-100123";
16461729const groupHistories = new Map([
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。