fix: allow discord ack reactions in tool-only guilds

This commit is contained in:
Peter Steinberger
2026-05-02 09:48:28 +01:00
parent e9cd362cd8
commit ae31aa6f84
3 changed files with 7 additions and 4 deletions

View File

@@ -34,6 +34,7 @@ Docs: https://docs.openclaw.ai
- MCP/OpenAI: normalize parameter-free tool schemas whose top-level object `properties` is missing, null, or invalid before sending tools to OpenAI, so MCP tools without params stay usable. Fixes #75362. Thanks @tolkonepiu and @SymbolStar.
- TTS: honor explicit short `[[tts:text]]...[[/tts:text]]` blocks while keeping untagged short auto-TTS suppressed, so tagged voice replies are synthesized instead of being dropped as empty voice-only payloads. Fixes #73758. Thanks @yfge.
- Proxy/audio: convert standard `FormData` bodies before proxy-backed undici fetches, so audio transcription and multipart uploads no longer send `[object FormData]` when `HTTP_PROXY` or `HTTPS_PROXY` is configured. Fixes #48554. Thanks @dco5.
- Discord: allow explicitly configured ack reactions in tool-only guild channels while keeping automatic lifecycle/status reactions suppressed. Fixes #74922. Thanks @samvilian and @BlueBirdBack.
- Gateway/diagnostics: include a bounded redacted startup error message in stability bundles, so crash-loop reports identify the failing plugin or contract without exposing secrets. Refs #75797. Thanks @ymebosma.
- Gateway/pricing: abort in-flight model pricing catalog fetches when Gateway shutdown stops the refresh loop, and avoid post-stop cache writes or refresh timers. Fixes #72208. Thanks @rzcq.
- Codex/app-server: make startup retry cleanup ownership-aware so concurrent Codex lanes cannot close another lane's freshly restarted shared app-server client. Thanks @vincentkoc.

View File

@@ -900,7 +900,7 @@ describe("processDiscordMessage session routing", () => {
expect(createDiscordDraftStream).not.toHaveBeenCalled();
});
it("suppresses automatic status reactions for always-on guild replies", async () => {
it("sends the configured ack while suppressing automatic status reactions for always-on guild replies", async () => {
const ctx = await createBaseContext({
shouldRequireMention: false,
effectiveWasMentioned: false,
@@ -921,7 +921,7 @@ describe("processDiscordMessage session routing", () => {
await runProcessDiscordMessage(ctx);
expect(getLastDispatchReplyOptions()?.sourceReplyDeliveryMode).toBe("message_tool_only");
expect(sendMocks.reactMessageDiscord).not.toHaveBeenCalled();
expect(getReactionEmojis()).toEqual(["👀"]);
expect(sendMocks.removeReactionDiscord).not.toHaveBeenCalled();
});

View File

@@ -176,9 +176,11 @@ export async function processDiscordMessage(
shouldBypassMention,
}),
);
const shouldSendAckReaction = !sourceRepliesAreToolOnly && shouldAckReaction();
const shouldSendAckReaction = shouldAckReaction();
const statusReactionsEnabled =
shouldSendAckReaction && cfg.messages?.statusReactions?.enabled !== false;
!sourceRepliesAreToolOnly &&
shouldSendAckReaction &&
cfg.messages?.statusReactions?.enabled !== false;
const feedbackRest = createDiscordRestClient({
cfg,
token,