# NousResearch/hermes-agent · Discord slash command routing fix in threads

## Open now

- Nothing open on GitHub.

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.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #2460. Verify it addresses your case.
- **Recommended:** read PR #2460 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-2460`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #2011: \[Bug\]: Discord native slash commands broken inside threads

## Prior & competing PRs

- **#2460: fix(discord): properly route slash event handling in threads**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `gateway/platforms/discord.py`, `tests/gateway/test_discord_slash_commands.py`
  - fix hunks:
  - `gateway/platforms/discord.py`

    ```diff
    @@ -1500,7 +1500,17 @@ async def slash_thread(
         def _build_slash_event(self, interaction: discord.Interaction, text: str) -> MessageEvent:
             """Build a MessageEvent from a Discord slash command interaction."""
             is_dm = isinstance(interaction.channel, discord.DMChannel)
    -        chat_type = "dm" if is_dm else "group"
    +        is_thread = isinstance(interaction.channel, discord.Thread)
    +        thread_id = None
    +
    +        if is_dm:
    +            chat_type = "dm"
    +        elif is_thread:
    +            chat_type = "thread"
    +            thread_id = str(interaction.channel_id)
    +        else:
    +            chat_type = "group"
    +
             chat_name = ""
             if not is_dm and hasattr(interaction.channel, "name"):
                 chat_name = interaction.channel.name
    ```

    ```diff
    @@ -1516,6 +1526,7 @@ def _build_slash_event(self, interaction: discord.Interaction, text: str) -> Mes
                 chat_type=chat_type,
                 user_id=str(interaction.user.id),
                 user_name=interaction.user.display_name,
    +            thread_id=thread_id,
                 chat_topic=chat_topic,
             )
     
    ```
  - `tests/gateway/test_discord_slash_commands.py`

    ```diff
    @@ -241,6 +241,42 @@ async def capture_handle(event):
         assert "TestGuild" in event.source.chat_name
     
     
    +# ------------------------------------------------------------------
    +# _build_slash_event — preserve thread context for native slash commands
    +# ------------------------------------------------------------------
    +
    +
    +def test_build_slash_event_preserves_thread_context(adapter):
    +    interaction = SimpleNamespace(
    +        channel=_FakeThreadChannel(channel_id=555, name="Planning"),
    +        channel_id=555,
    +        user=SimpleNamespace(display_name="Jezza", id=42),
    +    )
    +
    +    event = adapter._build_slash_event(interaction, "/status")
    +
    +    assert event.text == "/status"
    +    assert event.source.chat_id == "555"
    +    assert event.source.chat_type == "thread"
    +    assert event.source.thread_id == "555"
    +    assert "TestGuild" in event.source.chat_name
    +
    +
    +def test_build_slash_event_uses_group_context_for_channels(adapter):
    +    interaction = SimpleNamespace(
    +        channel=_FakeTextChannel(channel_id=123, name="general"),
    +        channel_id=123,
    +        user=SimpleNamespace(display_name="Jezza", id=42),
    +    )
    +
    +    event = adapter._build_slash_event(interaction, "/status")
    +
    +    assert event.source.chat_id == "123"
    +    assert event.source.chat_type == "group"
    +    assert event.source.thread_id is None
    +    assert "TestGuild / #general" == event.source.chat_name
    +
    +
     # ------------------------------------------------------------------
     # Auto-thread: _auto_create_thread
     # ------------------------------------------------------------------
    ```
- **#2017: fix(discord): properly route slash event handling in threads**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#2460`

## Fix status

- Merged to main in PR #2460 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-03-22`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
- Subsystem: `gateway`
