{"repo":"NousResearch/hermes-agent","public_id":"2011","display_label":"Discord slash command routing fix in threads","summary":"A bug was identified where Discord native slash commands did not work correctly inside threads. Related fixes address slash event routing in that context, alongside a broader multi-platform patch that includes this among other issues.","subsystem":"gateway","counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":2460,"merged_at":"2026-03-22T11:28:54+00:00"},"resolution":{"state":"resolved","by":"pr-2460"},"freshness":{"state":"stale","last_verified_at":"2026-03-22T11:28:54+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":2011,"pr_number":2460,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-03-22T11:28:54+00:00"}],"members":[{"kind":"issue","number":2011,"title":"[Bug]: Discord native slash commands broken inside threads","url":null,"state":"closed"},{"kind":"pr","number":2017,"title":"fix(discord): properly route slash event handling in threads","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#2460","number":2460}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":2460,"title":"fix(discord): properly route slash event handling in threads","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/discord.py","tests/gateway/test_discord_slash_commands.py"],"fix_hunks":[{"file":"gateway/platforms/discord.py","hunks":["@@ -1500,7 +1500,17 @@ async def slash_thread(\n     def _build_slash_event(self, interaction: discord.Interaction, text: str) -> MessageEvent:\n         \"\"\"Build a MessageEvent from a Discord slash command interaction.\"\"\"\n         is_dm = isinstance(interaction.channel, discord.DMChannel)\n-        chat_type = \"dm\" if is_dm else \"group\"\n+        is_thread = isinstance(interaction.channel, discord.Thread)\n+        thread_id = None\n+\n+        if is_dm:\n+            chat_type = \"dm\"\n+        elif is_thread:\n+            chat_type = \"thread\"\n+            thread_id = str(interaction.channel_id)\n+        else:\n+            chat_type = \"group\"\n+\n         chat_name = \"\"\n         if not is_dm and hasattr(interaction.channel, \"name\"):\n             chat_name = interaction.channel.name","@@ -1516,6 +1526,7 @@ def _build_slash_event(self, interaction: discord.Interaction, text: str) -> Mes\n             chat_type=chat_type,\n             user_id=str(interaction.user.id),\n             user_name=interaction.user.display_name,\n+            thread_id=thread_id,\n             chat_topic=chat_topic,\n         )\n "]},{"file":"tests/gateway/test_discord_slash_commands.py","hunks":["@@ -241,6 +241,42 @@ async def capture_handle(event):\n     assert \"TestGuild\" in event.source.chat_name\n \n \n+# ------------------------------------------------------------------\n+# _build_slash_event — preserve thread context for native slash commands\n+# ------------------------------------------------------------------\n+\n+\n+def test_build_slash_event_preserves_thread_context(adapter):\n+    interaction = SimpleNamespace(\n+        channel=_FakeThreadChannel(channel_id=555, name=\"Planning\"),\n+        channel_id=555,\n+        user=SimpleNamespace(display_name=\"Jezza\", id=42),\n+    )\n+\n+    event = adapter._build_slash_event(interaction, \"/status\")\n+\n+    assert event.text == \"/status\"\n+    assert event.source.chat_id == \"555\"\n+    assert event.source.chat_type == \"thread\"\n+    assert event.source.thread_id == \"555\"\n+    assert \"TestGuild\" in event.source.chat_name\n+\n+\n+def test_build_slash_event_uses_group_context_for_channels(adapter):\n+    interaction = SimpleNamespace(\n+        channel=_FakeTextChannel(channel_id=123, name=\"general\"),\n+        channel_id=123,\n+        user=SimpleNamespace(display_name=\"Jezza\", id=42),\n+    )\n+\n+    event = adapter._build_slash_event(interaction, \"/status\")\n+\n+    assert event.source.chat_id == \"123\"\n+    assert event.source.chat_type == \"group\"\n+    assert event.source.thread_id is None\n+    assert \"TestGuild / #general\" == event.source.chat_name\n+\n+\n # ------------------------------------------------------------------\n # Auto-thread: _auto_create_thread\n # ------------------------------------------------------------------\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}