feat(slack): add groupRequireMention for allowlist channels

Slack's groupPolicy could either restrict to specific channels
("allowlist") or require an @mention ("mention"), but not both: in
allowlist mode the bot replied to every message in approved channels.

Add a groupRequireMention flag so that, when groupPolicy is "allowlist",
the bot only responds in channels listed in groupAllowFrom AND only when
@mentioned. Mirrors Signal's group.requireMention. No effect for the
"mention"/"open" policies, so existing configs are unchanged.

Extract the mention check into _is_mention and reuse it from both the
mention and allowlist branches.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
brendanlevy
2026-06-12 00:23:27 +08:00
committed by Xubin Ren
co-authored by Cursor
parent ffae1dca6d
commit 2d9260cb9f
3 changed files with 77 additions and 5 deletions
+15 -4
View File
@@ -47,6 +47,10 @@ class SlackConfig(Base):
allow_from: list[str] = Field(default_factory=list)
group_policy: str = "mention"
group_allow_from: list[str] = Field(default_factory=list)
# When group_policy is "allowlist", also require the bot to be @mentioned
# before responding (so it only replies to mentions in approved channels,
# instead of every message). No effect for "mention"/"open" policies.
group_require_mention: bool = False
dm: SlackDMConfig = Field(default_factory=SlackDMConfig)
@@ -648,15 +652,22 @@ class SlackChannel(BaseChannel):
return chat_id in self.config.group_allow_from
return True
def _is_mention(self, event_type: str, text: str) -> bool:
if event_type == "app_mention":
return True
return self._bot_user_id is not None and f"<@{self._bot_user_id}>" in text
def _should_respond_in_channel(self, event_type: str, text: str, chat_id: str) -> bool:
if self.config.group_policy == "open":
return True
if self.config.group_policy == "mention":
if event_type == "app_mention":
return True
return self._bot_user_id is not None and f"<@{self._bot_user_id}>" in text
return self._is_mention(event_type, text)
if self.config.group_policy == "allowlist":
return chat_id in self.config.group_allow_from
if chat_id not in self.config.group_allow_from:
return False
if self.config.group_require_mention:
return self._is_mention(event_type, text)
return True
return False
def is_allowed(self, sender_id: str) -> bool: