diff --git a/src/discord/monitor/agent-components.ts b/src/discord/monitor/agent-components.ts index 1db4c77e64..2d52653750 100644 --- a/src/discord/monitor/agent-components.ts +++ b/src/discord/monitor/agent-components.ts @@ -49,6 +49,44 @@ type DiscordChannelContext = { parentSlug: string; }; +function resolveAgentComponentRoute(params: { + ctx: AgentComponentContext; + rawGuildId: string | undefined; + memberRoleIds: string[]; + isDirectMessage: boolean; + userId: string; + channelId: string; + parentId: string | undefined; +}) { + return resolveAgentRoute({ + cfg: params.ctx.cfg, + channel: "discord", + accountId: params.ctx.accountId, + guildId: params.rawGuildId, + memberRoleIds: params.memberRoleIds, + peer: { + kind: params.isDirectMessage ? "direct" : "channel", + id: params.isDirectMessage ? params.userId : params.channelId, + }, + parentPeer: params.parentId ? { kind: "channel", id: params.parentId } : undefined, + }); +} + +async function ackComponentInteraction(params: { + interaction: AgentComponentInteraction; + replyOpts: { ephemeral?: boolean }; + label: string; +}) { + try { + await params.interaction.reply({ + content: "✓", + ...params.replyOpts, + }); + } catch (err) { + logError(`${params.label}: failed to acknowledge interaction: ${String(err)}`); + } +} + function resolveDiscordChannelContext( interaction: AgentComponentInteraction, ): DiscordChannelContext { @@ -482,18 +520,14 @@ export class AgentComponentButton extends Button { } const { parentId } = allowed; - // Resolve route with full context (guildId, proper peer kind, parentPeer) - const route = resolveAgentRoute({ - cfg: this.ctx.cfg, - channel: "discord", - accountId: this.ctx.accountId, - guildId: rawGuildId, + const route = resolveAgentComponentRoute({ + ctx: this.ctx, + rawGuildId, memberRoleIds, - peer: { - kind: isDirectMessage ? "direct" : "channel", - id: isDirectMessage ? userId : channelId, - }, - parentPeer: parentId ? { kind: "channel", id: parentId } : undefined, + isDirectMessage, + userId, + channelId, + parentId, }); const eventText = `[Discord component: ${componentId} clicked by ${username} (${userId})]`; @@ -505,15 +539,7 @@ export class AgentComponentButton extends Button { contextKey: `discord:agent-button:${channelId}:${componentId}:${userId}`, }); - // Acknowledge the interaction - try { - await interaction.reply({ - content: "✓", - ...replyOpts, - }); - } catch (err) { - logError(`agent button: failed to acknowledge interaction: ${String(err)}`); - } + await ackComponentInteraction({ interaction, replyOpts, label: "agent button" }); } } @@ -586,18 +612,14 @@ export class AgentSelectMenu extends StringSelectMenu { const values = interaction.values ?? []; const valuesText = values.length > 0 ? ` (selected: ${values.join(", ")})` : ""; - // Resolve route with full context (guildId, proper peer kind, parentPeer) - const route = resolveAgentRoute({ - cfg: this.ctx.cfg, - channel: "discord", - accountId: this.ctx.accountId, - guildId: rawGuildId, + const route = resolveAgentComponentRoute({ + ctx: this.ctx, + rawGuildId, memberRoleIds, - peer: { - kind: isDirectMessage ? "direct" : "channel", - id: isDirectMessage ? userId : channelId, - }, - parentPeer: parentId ? { kind: "channel", id: parentId } : undefined, + isDirectMessage, + userId, + channelId, + parentId, }); const eventText = `[Discord select menu: ${componentId} interacted by ${username} (${userId})${valuesText}]`; @@ -609,15 +631,7 @@ export class AgentSelectMenu extends StringSelectMenu { contextKey: `discord:agent-select:${channelId}:${componentId}:${userId}`, }); - // Acknowledge the interaction - try { - await interaction.reply({ - content: "✓", - ...replyOpts, - }); - } catch (err) { - logError(`agent select: failed to acknowledge interaction: ${String(err)}`); - } + await ackComponentInteraction({ interaction, replyOpts, label: "agent select" }); } }