From 5b6348d103f4da49edf5c6d3b88c81c756b29ce3 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sat, 28 Feb 2026 19:05:56 -0500 Subject: [PATCH] fix(telegram): deduplicate attachment markers in single reply --- src/channels/telegram.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/channels/telegram.rs b/src/channels/telegram.rs index bb752b106..419e00534 100644 --- a/src/channels/telegram.rs +++ b/src/channels/telegram.rs @@ -433,7 +433,13 @@ fn parse_attachment_markers(message: &str) -> (String, Vec) }); if let Some(attachment) = parsed { - attachments.push(attachment); + // Skip duplicate targets — LLMs sometimes emit repeated markers in one reply. + if !attachments + .iter() + .any(|a: &TelegramAttachment| a.target == attachment.target) + { + attachments.push(attachment); + } } else { cleaned.push_str(&message[open..=close]); } @@ -3814,6 +3820,17 @@ mod tests { assert_eq!(attachments[1].target, "https://example.com/a.pdf"); } + #[test] + fn parse_attachment_markers_deduplicates_duplicate_targets() { + let message = "twice [IMAGE:/tmp/a.png] then again [IMAGE:/tmp/a.png] end"; + let (cleaned, attachments) = parse_attachment_markers(message); + + assert_eq!(cleaned, "twice then again end"); + assert_eq!(attachments.len(), 1); + assert_eq!(attachments[0].kind, TelegramAttachmentKind::Image); + assert_eq!(attachments[0].target, "/tmp/a.png"); + } + #[test] fn parse_attachment_markers_keeps_invalid_markers_in_text() { let message = "Report [UNKNOWN:/tmp/a.bin]";