From 7b066b7056009842e43cda227266fce6a2d2fabb Mon Sep 17 00:00:00 2001 From: dale Date: Mon, 30 Mar 2026 08:12:00 +0700 Subject: [PATCH] fix: propagate TenantID in channel InboundMessage for tenant-scoped MCP resolution (#561) All channel handlers (Telegram, Discord, Slack, Feishu) bypassed BaseChannel.HandleMessage() and manually constructed InboundMessage without setting TenantID. This caused the consumer to fall back to MasterTenantID, making DB-level MCP server grants invisible on non-master tenants while config-file MCP servers worked fine. Closes #560 Co-authored-by: Claude Opus 4.6 (1M context) --- internal/channels/discord/handler.go | 1 + internal/channels/feishu/bot.go | 1 + internal/channels/slack/utils.go | 1 + internal/channels/telegram/commands.go | 3 +++ internal/channels/telegram/handlers.go | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/channels/discord/handler.go b/internal/channels/discord/handler.go index 3dee33be..47827b41 100644 --- a/internal/channels/discord/handler.go +++ b/internal/channels/discord/handler.go @@ -300,6 +300,7 @@ func (c *Channel) handleMessage(_ *discordgo.Session, m *discordgo.MessageCreate PeerKind: peerKind, UserID: senderID, AgentID: targetAgentID, + TenantID: c.TenantID(), Metadata: metadata, }) diff --git a/internal/channels/feishu/bot.go b/internal/channels/feishu/bot.go index 0f97687c..692a82b4 100644 --- a/internal/channels/feishu/bot.go +++ b/internal/channels/feishu/bot.go @@ -291,6 +291,7 @@ func (c *Channel) handleMessageEvent(ctx context.Context, event *MessageEvent) { UserID: userID, AgentID: targetAgentID, HistoryLimit: c.historyLimit, + TenantID: c.TenantID(), Metadata: metadata, }) diff --git a/internal/channels/slack/utils.go b/internal/channels/slack/utils.go index f357e80d..9db56099 100644 --- a/internal/channels/slack/utils.go +++ b/internal/channels/slack/utils.go @@ -45,6 +45,7 @@ func (c *Channel) HandleMessage(senderID, chatID, content string, mediaPaths []s Media: mediaFiles, PeerKind: peerKind, UserID: userID, + TenantID: c.TenantID(), Metadata: metadata, AgentID: c.AgentID(), }) diff --git a/internal/channels/telegram/commands.go b/internal/channels/telegram/commands.go index 811a9923..877b3875 100644 --- a/internal/channels/telegram/commands.go +++ b/internal/channels/telegram/commands.go @@ -129,6 +129,7 @@ func (c *Channel) handleBotCommand(ctx context.Context, message *telego.Message, PeerKind: peerKind, AgentID: c.AgentID(), UserID: strings.SplitN(senderID, "|", 2)[0], + TenantID: c.TenantID(), Metadata: map[string]string{ "command": "reset", "local_key": localKey, @@ -154,6 +155,7 @@ func (c *Channel) handleBotCommand(ctx context.Context, message *telego.Message, PeerKind: peerKind, AgentID: c.AgentID(), UserID: strings.SplitN(senderID, "|", 2)[0], + TenantID: c.TenantID(), Metadata: map[string]string{ "command": "stop", "local_key": localKey, @@ -177,6 +179,7 @@ func (c *Channel) handleBotCommand(ctx context.Context, message *telego.Message, PeerKind: peerKind, AgentID: c.AgentID(), UserID: strings.SplitN(senderID, "|", 2)[0], + TenantID: c.TenantID(), Metadata: map[string]string{ "command": "stopall", "local_key": localKey, diff --git a/internal/channels/telegram/handlers.go b/internal/channels/telegram/handlers.go index 72bba31a..b098e8a8 100644 --- a/internal/channels/telegram/handlers.go +++ b/internal/channels/telegram/handlers.go @@ -603,6 +603,7 @@ func (c *Channel) handleMessage(ctx context.Context, update telego.Update) { AgentID: targetAgentID, HistoryLimit: c.historyLimit, ToolAllow: topicCfg.tools, + TenantID: c.TenantID(), Metadata: metadata, }) @@ -611,4 +612,3 @@ func (c *Channel) handleMessage(ctx context.Context, update telego.Update) { c.groupHistory.Clear(localKey) } } -