From b9a968c1deb280a195ede47cc65b986bc1dc351c Mon Sep 17 00:00:00 2001 From: Animesh Mishra Date: Tue, 24 Mar 2026 07:31:45 +0000 Subject: [PATCH] feat(slack): add reply_in_thread config option By default, Hermes always threads replies to channel messages. Teams that prefer direct channel replies had no way to opt out without patching the source. Add a reply_in_thread option (default: true) to the Slack platform extra config: platforms: slack: extra: reply_in_thread: false When false, _resolve_thread_ts() returns None for top-level channel messages, so replies go directly to the channel. Messages already inside an existing thread are still replied in-thread to preserve conversation context. Default is true for full backward compatibility. --- gateway/platforms/slack.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gateway/platforms/slack.py b/gateway/platforms/slack.py index 88540815e..be1180350 100644 --- a/gateway/platforms/slack.py +++ b/gateway/platforms/slack.py @@ -323,7 +323,18 @@ class SlackAdapter(BasePlatformAdapter): Prefers metadata thread_id (the thread parent's ts, set by the gateway) over reply_to (which may be a child message's ts). + + When ``reply_in_thread`` is ``false`` in the platform extra config, + top-level channel messages receive direct channel replies instead of + thread replies. Messages that originate inside an existing thread are + always replied to in-thread to preserve conversation context. """ + # When reply_in_thread is disabled (default: True for backward compat), + # only thread messages that are already part of an existing thread. + if not self.config.extra.get("reply_in_thread", True): + existing_thread = (metadata or {}).get("thread_id") or (metadata or {}).get("thread_ts") + return existing_thread or None + if metadata: if metadata.get("thread_id"): return metadata["thread_id"]