diff --git a/gateway/platforms/base.py b/gateway/platforms/base.py index 67ecb51d5c..8c43c9006e 100644 --- a/gateway/platforms/base.py +++ b/gateway/platforms/base.py @@ -294,6 +294,7 @@ class MessageEvent: # Reply context reply_to_message_id: Optional[str] = None + reply_to_text: Optional[str] = None # Text of the replied-to message (for context injection) # Timestamps timestamp: datetime = field(default_factory=datetime.now) diff --git a/gateway/platforms/telegram.py b/gateway/platforms/telegram.py index cec1d7b685..b4ef75f8ec 100644 --- a/gateway/platforms/telegram.py +++ b/gateway/platforms/telegram.py @@ -1185,11 +1185,20 @@ class TelegramAdapter(BasePlatformAdapter): thread_id=str(message.message_thread_id) if message.message_thread_id else None, ) + # Extract reply context if this message is a reply + reply_to_id = None + reply_to_text = None + if message.reply_to_message: + reply_to_id = str(message.reply_to_message.message_id) + reply_to_text = message.reply_to_message.text or message.reply_to_message.caption or None + return MessageEvent( text=message.text or "", message_type=msg_type, source=source, raw_message=message, message_id=str(message.message_id), + reply_to_message_id=reply_to_id, + reply_to_text=reply_to_text, timestamp=message.date, ) diff --git a/gateway/run.py b/gateway/run.py index 1c7a037519..f4c23c12cb 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -1849,6 +1849,23 @@ class GatewayRunner: ) message_text = f"{context_note}\n\n{message_text}" + # ----------------------------------------------------------------- + # Inject reply context when user replies to a message not in history. + # Telegram (and other platforms) let users reply to specific messages, + # but if the quoted message is from a previous session, cron delivery, + # or background task, the agent has no context about what's being + # referenced. Prepend the quoted text so the agent understands. (#1594) + # ----------------------------------------------------------------- + if getattr(event, 'reply_to_text', None) and event.reply_to_message_id: + reply_snippet = event.reply_to_text[:500] + found_in_history = any( + reply_snippet[:200] in (msg.get("content") or "") + for msg in history + if msg.get("role") in ("assistant", "user", "tool") + ) + if not found_in_history: + message_text = f'[Replying to: "{reply_snippet}"]\n\n{message_text}' + try: # Emit agent:start hook hook_ctx = {