


















@@ -931,6 +931,43 @@ describe("processDiscordMessage session routing", () => {
931931expect(sendMocks.removeReactionDiscord).not.toHaveBeenCalled();
932932});
933933934+it("honors explicit status reactions for always-on guild replies", async () => {
935+vi.useFakeTimers();
936+dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
937+await params?.replyOptions?.onReasoningStream?.();
938+await new Promise((resolve) => setTimeout(resolve, 1_000));
939+return createNoQueuedDispatchResult();
940+});
941+const ctx = await createBaseContext({
942+shouldRequireMention: false,
943+effectiveWasMentioned: false,
944+ackReactionScope: "all",
945+cfg: {
946+messages: {
947+ackReaction: "👀",
948+ackReactionScope: "all",
949+statusReactions: {
950+enabled: true,
951+timing: { debounceMs: 0 },
952+},
953+},
954+session: { store: "/tmp/openclaw-discord-process-test-sessions.json" },
955+},
956+route: BASE_CHANNEL_ROUTE,
957+});
958+959+const runPromise = runProcessDiscordMessage(ctx);
960+await vi.advanceTimersByTimeAsync(1_000);
961+await vi.runAllTimersAsync();
962+await runPromise;
963+964+expect(getLastDispatchReplyOptions()?.sourceReplyDeliveryMode).toBe("message_tool_only");
965+const emojis = getReactionEmojis();
966+expect(emojis).toContain("👀");
967+expect(emojis).toContain(DEFAULT_EMOJIS.thinking);
968+expect(emojis).toContain(DEFAULT_EMOJIS.done);
969+});
970+934971it("uses PluralKit original ids for inbound dedupe while preserving the Discord message id", async () => {
935972const ctx = await createBaseContext({
936973canonicalMessageId: "orig-123",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。