{"repo":"NousResearch/hermes-agent","public_id":"6016","display_label":"Matrix typing indicator lingering after response is sent","summary":"One issue reports the Matrix typing indicator staying visible for up to 30 seconds after a response is sent. Two pull requests propose changes (adding a stop_typing call, and a gateway fix) aimed at clearing that indicator.","subsystem":null,"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":10239,"merged_at":"2026-04-15T11:16:16+00:00"},"resolution":{"state":"resolved","by":"pr-10239"},"freshness":{"state":"stale","last_verified_at":"2026-04-15T11:16:16+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":6016,"pr_number":10239,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-04-15T11:16:16+00:00"}],"members":[{"kind":"issue","number":6016,"title":"[Bug]: Matrix typing indicator lingers for up to 30 seconds after response is sent","url":null,"state":"closed"},{"kind":"pr","number":6020,"title":"fix(matrix): add stop_typing to clear typing indicator after response","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#10239","number":10239},{"kind":"pr","value":"#6016","number":6016}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":10239,"title":"fix(gateway): fix matrix lingering typing indicator","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/matrix.py","tests/gateway/test_matrix.py"],"fix_hunks":[{"file":"gateway/platforms/matrix.py","hunks":["@@ -729,6 +729,14 @@ async def send_typing(\n             except Exception:\n                 pass\n \n+    async def stop_typing(self, chat_id: str) -> None:\n+        \"\"\"Stop the Matrix typing indicator.\"\"\"\n+        if self._client:\n+            try:\n+                await self._client.set_typing(RoomID(chat_id), timeout=0)\n+            except Exception:\n+                pass\n+\n     async def edit_message(\n         self, chat_id: str, message_id: str, content: str\n     ) -> SendResult:"]},{"file":"tests/gateway/test_matrix.py","hunks":["@@ -335,6 +335,29 @@ def _make_adapter():\n     return adapter\n \n \n+# ---------------------------------------------------------------------------\n+# Typing indicator\n+# ---------------------------------------------------------------------------\n+\n+class TestMatrixTypingIndicator:\n+    def setup_method(self):\n+        self.adapter = _make_adapter()\n+        self.adapter._client = MagicMock()\n+        self.adapter._client.set_typing = AsyncMock()\n+\n+    @pytest.mark.asyncio\n+    async def test_stop_typing_clears_matrix_typing_state(self):\n+        \"\"\"stop_typing() should send typing=false instead of waiting for timeout expiry.\"\"\"\n+        from gateway.platforms.matrix import RoomID\n+\n+        await self.adapter.stop_typing(\"!room:example.org\")\n+\n+        self.adapter._client.set_typing.assert_awaited_once_with(\n+            RoomID(\"!room:example.org\"),\n+            timeout=0,\n+        )\n+\n+\n # ---------------------------------------------------------------------------\n # mxc:// URL conversion\n # ---------------------------------------------------------------------------","@@ -1831,4 +1854,3 @@ async def test_set_presence_no_client(self):\n         assert result is False\n \n \n-\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}