Fix Telegram inbound reply threading

This commit is contained in:
Dmitrii Balabanov 2026-03-23 10:31:26 +02:00
parent 6cd3fdc18f
commit e4703c73d6
3 changed files with 55 additions and 1 deletions

View file

@ -1577,6 +1577,8 @@ func (al *AgentLoop) processSystemMessage(
UserMessage: fmt.Sprintf("[System: %s] %s", msg.SenderID, msg.Content), UserMessage: fmt.Sprintf("[System: %s] %s", msg.SenderID, msg.Content),
DefaultResponse: "Background task completed.", DefaultResponse: "Background task completed.",
EnableSummary: false, EnableSummary: false,
// System messages are synthetic inbound events, so there is no delivery
// callback chain from a channel send to feed assistant message IDs back.
SendResponse: true, SendResponse: true,
}) })
} }

View file

@ -708,6 +708,9 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, message *telego.Mes
"first_name": user.FirstName, "first_name": user.FirstName,
"is_group": fmt.Sprintf("%t", message.Chat.Type != "private"), "is_group": fmt.Sprintf("%t", message.Chat.Type != "private"),
} }
if message.ReplyToMessage != nil {
metadata["reply_to_message_id"] = fmt.Sprintf("%d", message.ReplyToMessage.MessageID)
}
// Set parent_peer metadata for per-topic agent binding. // Set parent_peer metadata for per-topic agent binding.
if message.Chat.IsForum && threadID != 0 { if message.Chat.IsForum && threadID != 0 {

View file

@ -686,6 +686,21 @@ func TestHandleMessage_EmptyContent_Ignored(t *testing.T) {
From: &telego.User{ From: &telego.User{
ID: 789, ID: 789,
FirstName: "User", FirstName: "User",
=======
msg := &telego.Message{
Text: "reply in group",
MessageID: 30,
Chat: telego.Chat{
ID: -100999,
Type: "supergroup",
},
From: &telego.User{
ID: 10,
FirstName: "Dana",
},
ReplyToMessage: &telego.Message{
MessageID: 25,
>>>>>>> 7b6328f (Fix Telegram inbound reply threading)
}, },
} }
@ -699,3 +714,37 @@ func TestHandleMessage_EmptyContent_Ignored(t *testing.T) {
default: default:
} }
} }
func TestHandleMessage_ReplyToMessageID_Preserved(t *testing.T) {
messageBus := bus.NewMessageBus()
ch := &TelegramChannel{
BaseChannel: channels.NewBaseChannel("telegram", nil, messageBus, nil),
chatIDs: make(map[string]int64),
ctx: context.Background(),
}
msg := &telego.Message{
Text: "reply in group",
MessageID: 30,
Chat: telego.Chat{
ID: -100999,
Type: "supergroup",
},
From: &telego.User{
ID: 10,
FirstName: "Dana",
},
ReplyToMessage: &telego.Message{
MessageID: 25,
},
}
err := ch.handleMessage(context.Background(), msg)
require.NoError(t, err)
inbound, ok := <-messageBus.InboundChan()
require.True(t, ok)
assert.Equal(t, "30", inbound.MessageID)
assert.Equal(t, "25", inbound.ReplyToMessageID)
assert.Equal(t, "25", inbound.Metadata["reply_to_message_id"])
}