{"repo":"NousResearch/hermes-agent","public_id":"1594","display_label":"Reply/quote context propagation across chat adapters","summary":"These issues and PRs address missing or dropped reply-to and quoted message context across multiple chat platforms including Google Chat, WhatsApp, Matrix, and Telegram. Work spans adapter-level fixes and gateway-level logic to ensure reply context reaches agents and LLM prompts.","subsystem":"gateway","counts":{"members":15,"open_issues":2,"open_issues_distinct":2,"open_prs":5,"closed_issues":2,"merged_prs":1,"attempt_prs":10},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":1662},"resolution":{"state":"partially_resolved","by":"pr-1662"},"freshness":{"state":"stale","last_verified_at":"2026-03-17T09:31:27+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.11504761904761905},"fix_edges":[{"issue_number":1594,"pr_number":1662,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":1594,"title":"feat(gateway): inject reply-to message context when quoted message is not in session history","url":null,"state":"closed"},{"kind":"issue","number":27946,"title":"Matrix: quoted reply content not passed to LLM prompt","url":null,"state":"open"},{"kind":"issue","number":28823,"title":"[Bug]: WhatsApp: quotedMessageId/context is not forwarded to agent — reply context is lost","url":null,"state":"closed"},{"kind":"issue","number":56607,"title":"[Bug]: Google Chat adapter drops `quotedMessageMetadata` — replies to a quoted message lose all context","url":null,"state":"open"},{"kind":"pr","number":1596,"title":"feat(gateway): inject reply-to message context for out-of-session replies","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#1662","number":1662}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":1662,"title":"feat(gateway): inject reply-to message context for out-of-session replies (#1594)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/base.py","gateway/platforms/telegram.py","gateway/run.py"],"fix_hunks":[{"file":"gateway/platforms/base.py","hunks":["@@ -294,6 +294,7 @@ class MessageEvent:\n     \n     # Reply context\n     reply_to_message_id: Optional[str] = None\n+    reply_to_text: Optional[str] = None  # Text of the replied-to message (for context injection)\n     \n     # Timestamps\n     timestamp: datetime = field(default_factory=datetime.now)"]},{"file":"gateway/platforms/telegram.py","hunks":["@@ -1185,11 +1185,20 @@ def _build_message_event(self, message: Message, msg_type: MessageType) -> Messa\n             thread_id=str(message.message_thread_id) if message.message_thread_id else None,\n         )\n         \n+        # Extract reply context if this message is a reply\n+        reply_to_id = None\n+        reply_to_text = None\n+        if message.reply_to_message:\n+            reply_to_id = str(message.reply_to_message.message_id)\n+            reply_to_text = message.reply_to_message.text or message.reply_to_message.caption or None\n+\n         return MessageEvent(\n             text=message.text or \"\",\n             message_type=msg_type,\n             source=source,\n             raw_message=message,\n             message_id=str(message.message_id),\n+            reply_to_message_id=reply_to_id,\n+            reply_to_text=reply_to_text,\n             timestamp=message.date,\n         )"]},{"file":"gateway/run.py","hunks":["@@ -1849,6 +1849,23 @@ async def _handle_message(self, event: MessageEvent) -> Optional[str]:\n                     )\n                 message_text = f\"{context_note}\\n\\n{message_text}\"\n \n+        # -----------------------------------------------------------------\n+        # Inject reply context when user replies to a message not in history.\n+        # Telegram (and other platforms) let users reply to specific messages,\n+        # but if the quoted message is from a previous session, cron delivery,\n+        # or background task, the agent has no context about what's being\n+        # referenced. Prepend the quoted text so the agent understands. (#1594)\n+        # -----------------------------------------------------------------\n+        if getattr(event, 'reply_to_text', None) and event.reply_to_message_id:\n+            reply_snippet = event.reply_to_text[:500]\n+            found_in_history = any(\n+                reply_snippet[:200] in (msg.get(\"content\") or \"\")\n+                for msg in history\n+                if msg.get(\"role\") in (\"assistant\", \"user\", \"tool\")\n+            )\n+            if not found_in_history:\n+                message_text = f'[Replying to: \"{reply_snippet}\"]\\n\\n{message_text}'\n+\n         try:\n             # Emit agent:start hook\n             hook_ctx = {\n"]}]},{"kind":"pr","number":16552,"title":"fix: propagate WhatsApp reply context","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"11627fdcb92a0ad57c9b637538f8fbea39142272","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":27983,"title":"fix(matrix): re-inject quoted reply context into LLM prompt (#27946)","url":null,"state":"closed","close_reason":{"category":"stale_abandoned","implication":"active"},"merged":false},{"kind":"pr","number":28878,"title":"fix(whatsapp): forward quotedMessageId/context to agent prompt","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"11627fdcb92a0ad57c9b637538f8fbea39142272","number":0},{"kind":"pr","value":"#28823","number":28823}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":28962,"title":"fix(matrix): preserve Element reply quote context","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"7744377a41245c237a704f87b452739d1bad028a","number":0}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":56614,"title":"fix(gateway): populate reply_to_text/reply_to_message_id from Google Chat quotedMessageMetadata","url":null,"state":"open","close_reason":{"refs":[{"kind":"pr","value":"#105137","number":105137}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":56622,"title":"fix(google_chat): populate reply_to_* fields from quotedMessageMetadata (#56607)","url":null,"state":"open","close_reason":{"refs":[{"kind":"pr","value":"#56614","number":56614},{"kind":"pr","value":"#56607","number":56607}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":57171,"title":"fix(google-chat): preserve quoted reply context","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#56614","number":56614}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":68428,"title":"fix: treat [object Object] sentinel as absent in Telegram reply_to_text","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"854c2ce30922200aedb96e0f609697433efd2ec6","number":0},{"kind":"commit","value":"854c2ce309","number":0},{"kind":"commit","value":"e889332c99","number":0},{"kind":"commit","value":"eaef9c99934f","number":0},{"kind":"pr","value":"#1596","number":1596},{"kind":"pr","value":"#1662","number":1662},{"kind":"pr","value":"#2694","number":2694},{"kind":"pr","value":"#22632","number":22632},{"kind":"pr","value":"#22633","number":22633},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#22709","number":22709},{"kind":"pr","value":"#23091","number":23091},{"kind":"pr","value":"#70631","number":70631},{"kind":"pr","value":"#43200","number":43200},{"kind":"pr","value":"#47487","number":47487},{"kind":"pr","value":"#54262","number":54262},{"kind":"pr","value":"#56203","number":56203},{"kind":"pr","value":"#68428","number":68428},{"kind":"pr","value":"#1596","number":1596},{"kind":"pr","value":"#1662","number":1662},{"kind":"pr","value":"#1662","number":1662},{"kind":"pr","value":"#1594","number":1594},{"kind":"pr","value":"#1596","number":1596},{"kind":"pr","value":"#1594","number":1594},{"kind":"pr","value":"#2694","number":2694},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#22632","number":22632},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#22633","number":22633},{"kind":"pr","value":"#22632","number":22632},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#22632","number":22632},{"kind":"pr","value":"#22619","number":22619},{"kind":"pr","value":"#22709","number":22709},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#23091","number":23091},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#43200","number":43200},{"kind":"pr","value":"#47487","number":47487},{"kind":"pr","value":"#54262","number":54262},{"kind":"pr","value":"#56203","number":56203},{"kind":"pr","value":"#68428","number":68428},{"kind":"pr","value":"#70631","number":70631},{"kind":"pr","value":"#1596","number":1596},{"kind":"pr","value":"#1662","number":1662},{"kind":"pr","value":"#1594","number":1594},{"kind":"pr","value":"#1662","number":1662},{"kind":"pr","value":"#22632","number":22632},{"kind":"pr","value":"#22633","number":22633},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#22709","number":22709},{"kind":"pr","value":"#23091","number":23091},{"kind":"pr","value":"#22619","number":22619},{"kind":"pr","value":"#22676","number":22676},{"kind":"pr","value":"#2694","number":2694},{"kind":"pr","value":"#70631","number":70631},{"kind":"pr","value":"#68428","number":68428},{"kind":"pr","value":"#43200","number":43200},{"kind":"pr","value":"#47487","number":47487},{"kind":"pr","value":"#54262","number":54262},{"kind":"pr","value":"#56203","number":56203},{"kind":"pr","value":"#1662","number":1662},{"kind":"pr","value":"#22676","number":22676}],"category":"partial_fix","implication":"needs_llm"},"merged":false},{"kind":"pr","number":105137,"title":"fix(google-chat): preserve quoted reply context","url":null,"state":"open","close_reason":{"refs":[{"kind":"pr","value":"#56614","number":56614},{"kind":"pr","value":"#56622","number":56622},{"kind":"pr","value":"#56607","number":56607},{"kind":"pr","value":"#105111","number":105111},{"kind":"pr","value":"#56614","number":56614},{"kind":"pr","value":"#56614","number":56614},{"kind":"pr","value":"#56622","number":56622},{"kind":"pr","value":"#105137","number":105137}],"category":"uncategorized","implication":"needs_llm"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}