From c766367fdce6b8f630c3fe81ab2986afdd06a576 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Thu, 15 Oct 2026 10:55:08 -0700 Subject: [PATCH 1/2] fix(telegram): refuse non-connected fallback relay rows Co-authored-by: kai Agent-Model: codex/gpt-6-sol/medium --- .../services/telegramBridgeService.test.js | 18 ++++++++++++++++++ backend/services/telegramBridgeService.ts | 3 +++ 2 files changed, 21 insertions(+) diff --git a/backend/__tests__/unit/services/telegramBridgeService.test.js b/backend/__tests__/unit/services/telegramBridgeService.test.js index 8af8206b78..89997f59b6 100644 --- a/backend/__tests__/unit/services/telegramBridgeService.test.js +++ b/backend/__tests__/unit/services/telegramBridgeService.test.js @@ -145,6 +145,7 @@ describe('telegramBridgeService — user-scope outbound gate', () => { podId: 'active-pod', type: 'telegram', isActive: true, + status: 'connected', config: { liveRelay: true, chatType: 'private', @@ -207,6 +208,7 @@ describe('telegramBridgeService — multi-pod routing', () => { podId: ORIGINAL_POD, type: 'telegram', isActive: true, + status: 'connected', config: { liveRelay: true, chatType: 'private', @@ -294,6 +296,22 @@ describe('telegramBridgeService — multi-pod routing', () => { })); }); + it('does not relay through an error row found by the Telegram fallback', async () => { + IntegrationModel.findOne.mockReturnValue({ + lean: jest.fn().mockResolvedValue({ ...userScoped({ relayAllAgentMessages: true }), status: 'error' }), + }); + + await relayAgentMessageToTelegram({ + podId: GATED_POD, + agentUsername: 'kai', + displayName: 'Kai', + content: 'Must stay in Commonly', + }); + + expect(IntegrationModel.findOne).toHaveBeenCalledWith(expect.objectContaining({ status: 'connected' })); + expect(telegramSend.sendMessage).not.toHaveBeenCalled(); + }); + it('posts a quote-reply into the quoted pod, not the active one', async () => { const result = await inbound(userScoped(), { reply_to_message: { message_id: 101 } }); diff --git a/backend/services/telegramBridgeService.ts b/backend/services/telegramBridgeService.ts index db728ef3ae..ecdc080221 100644 --- a/backend/services/telegramBridgeService.ts +++ b/backend/services/telegramBridgeService.ts @@ -55,6 +55,7 @@ interface TelegramIntegrationDoc { scope?: 'pod' | 'user'; type?: string; isActive?: boolean; + status?: 'connected' | 'disconnected' | 'error' | 'pending'; config?: { chatId?: string; chatType?: string; @@ -156,6 +157,7 @@ const findLiveIntegration = async (podId: unknown): Promise Date: Thu, 15 Oct 2026 10:59:27 -0700 Subject: [PATCH 2/2] fix(telegram): match dispatcher error-row policy Co-authored-by: kai Agent-Model: codex/gpt-6-sol/medium --- .../unit/services/telegramBridgeService.test.js | 14 +++++++++++++- backend/services/telegramBridgeService.ts | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/__tests__/unit/services/telegramBridgeService.test.js b/backend/__tests__/unit/services/telegramBridgeService.test.js index 89997f59b6..1e046a2296 100644 --- a/backend/__tests__/unit/services/telegramBridgeService.test.js +++ b/backend/__tests__/unit/services/telegramBridgeService.test.js @@ -296,6 +296,18 @@ describe('telegramBridgeService — multi-pod routing', () => { })); }); + it('keeps relaying a pending dispatcher-selected row', async () => { + await relayAgentMessageToTelegram({ + podId: GATED_POD, + agentUsername: 'kai', + displayName: 'Kai', + content: 'deploy is green', + integration: { ...userScoped({ relayAllAgentMessages: true }), status: 'pending' }, + }); + + expect(telegramSend.sendMessage).toHaveBeenCalledTimes(1); + }); + it('does not relay through an error row found by the Telegram fallback', async () => { IntegrationModel.findOne.mockReturnValue({ lean: jest.fn().mockResolvedValue({ ...userScoped({ relayAllAgentMessages: true }), status: 'error' }), @@ -308,7 +320,7 @@ describe('telegramBridgeService — multi-pod routing', () => { content: 'Must stay in Commonly', }); - expect(IntegrationModel.findOne).toHaveBeenCalledWith(expect.objectContaining({ status: 'connected' })); + expect(IntegrationModel.findOne).toHaveBeenCalledWith(expect.objectContaining({ status: { $ne: 'error' } })); expect(telegramSend.sendMessage).not.toHaveBeenCalled(); }); diff --git a/backend/services/telegramBridgeService.ts b/backend/services/telegramBridgeService.ts index ecdc080221..04c5577047 100644 --- a/backend/services/telegramBridgeService.ts +++ b/backend/services/telegramBridgeService.ts @@ -157,7 +157,7 @@ const findLiveIntegration = async (podId: unknown): Promise