diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 77e13632e..704377ede 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -1577,7 +1577,9 @@ func (al *AgentLoop) processSystemMessage( UserMessage: fmt.Sprintf("[System: %s] %s", msg.SenderID, msg.Content), DefaultResponse: "Background task completed.", EnableSummary: false, - SendResponse: true, + // 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, }) } diff --git a/pkg/channels/telegram/telegram.go b/pkg/channels/telegram/telegram.go index 6ca612cb0..76c7ba24c 100644 --- a/pkg/channels/telegram/telegram.go +++ b/pkg/channels/telegram/telegram.go @@ -708,6 +708,9 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, message *telego.Mes "first_name": user.FirstName, "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. if message.Chat.IsForum && threadID != 0 { diff --git a/pkg/channels/telegram/telegram_test.go b/pkg/channels/telegram/telegram_test.go index 3deaa18d3..e12ad1f5d 100644 --- a/pkg/channels/telegram/telegram_test.go +++ b/pkg/channels/telegram/telegram_test.go @@ -686,6 +686,21 @@ func TestHandleMessage_EmptyContent_Ignored(t *testing.T) { From: &telego.User{ ID: 789, 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: } } + +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"]) +}