





























@@ -1292,6 +1292,42 @@ describe("processDiscordMessage session routing", () => {
12921292expect(emojis).toContain(DEFAULT_EMOJIS.done);
12931293});
129412941295+it("suppresses Discord reactions for room events even when status reactions are explicit", async () => {
1296+vi.useFakeTimers();
1297+dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
1298+await params?.replyOptions?.onReasoningStream?.();
1299+await new Promise((resolve) => setTimeout(resolve, 1_000));
1300+return createNoQueuedDispatchResult();
1301+});
1302+const ctx = await createBaseContext({
1303+shouldRequireMention: false,
1304+effectiveWasMentioned: false,
1305+inboundEventKind: "room_event",
1306+ackReactionScope: "all",
1307+cfg: {
1308+messages: {
1309+ackReaction: "👀",
1310+ackReactionScope: "all",
1311+statusReactions: {
1312+enabled: true,
1313+timing: { debounceMs: 0 },
1314+},
1315+},
1316+session: { store: "/tmp/openclaw-discord-process-test-sessions.json" },
1317+},
1318+route: BASE_CHANNEL_ROUTE,
1319+});
1320+1321+const runPromise = runProcessDiscordMessage(ctx);
1322+await vi.advanceTimersByTimeAsync(1_000);
1323+await vi.runAllTimersAsync();
1324+await runPromise;
1325+1326+expect(getLastDispatchReplyOptions()?.sourceReplyDeliveryMode).toBe("message_tool_only");
1327+expect(getReactionEmojis()).toEqual([]);
1328+expect(sendMocks.removeReactionDiscord).not.toHaveBeenCalled();
1329+});
1330+12951331it("uses PluralKit original ids for inbound dedupe while preserving the Discord message id", async () => {
12961332const ctx = await createBaseContext({
12971333canonicalMessageId: "orig-123",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。