diff --git a/src/channels/allowlists/resolve-utils.test.ts b/src/channels/allowlists/resolve-utils.test.ts index 496ac7a224..7d8cc21234 100644 --- a/src/channels/allowlists/resolve-utils.test.ts +++ b/src/channels/allowlists/resolve-utils.test.ts @@ -1,5 +1,8 @@ import { describe, expect, it } from "vitest"; -import { buildAllowlistResolutionSummary } from "./resolve-utils.js"; +import { + addAllowlistUserEntriesFromConfigEntry, + buildAllowlistResolutionSummary, +} from "./resolve-utils.js"; describe("buildAllowlistResolutionSummary", () => { it("returns mapping, additions, and unresolved (including missing ids)", () => { @@ -23,3 +26,17 @@ describe("buildAllowlistResolutionSummary", () => { expect(result.mapping).toEqual(["a→1 (note)"]); }); }); + +describe("addAllowlistUserEntriesFromConfigEntry", () => { + it("adds trimmed users and skips '*' and blanks", () => { + const target = new Set(); + addAllowlistUserEntriesFromConfigEntry(target, { users: [" a ", "*", "", "b"] }); + expect(Array.from(target).toSorted()).toEqual(["a", "b"]); + }); + + it("ignores non-objects", () => { + const target = new Set(["a"]); + addAllowlistUserEntriesFromConfigEntry(target, null); + expect(Array.from(target)).toEqual(["a"]); + }); +}); diff --git a/src/channels/allowlists/resolve-utils.ts b/src/channels/allowlists/resolve-utils.ts index 054b9cdfdd..46b439093c 100644 --- a/src/channels/allowlists/resolve-utils.ts +++ b/src/channels/allowlists/resolve-utils.ts @@ -96,6 +96,22 @@ export function patchAllowlistUsersInConfigEntries< return nextEntries as TEntries; } +export function addAllowlistUserEntriesFromConfigEntry(target: Set, entry: unknown): void { + if (!entry || typeof entry !== "object") { + return; + } + const users = (entry as { users?: Array }).users; + if (!Array.isArray(users)) { + return; + } + for (const value of users) { + const trimmed = String(value).trim(); + if (trimmed && trimmed !== "*") { + target.add(trimmed); + } + } +} + export function summarizeMapping( label: string, mapping: string[], diff --git a/src/discord/monitor/provider.ts b/src/discord/monitor/provider.ts index f90d11de33..2996eb18c9 100644 --- a/src/discord/monitor/provider.ts +++ b/src/discord/monitor/provider.ts @@ -8,6 +8,7 @@ import { resolveTextChunkLimit } from "../../auto-reply/chunk.js"; import { listNativeCommandSpecsForConfig } from "../../auto-reply/commands-registry.js"; import { listSkillCommandsForAgents } from "../../auto-reply/skill-commands.js"; import { + addAllowlistUserEntriesFromConfigEntry, buildAllowlistResolutionSummary, mergeAllowlist, resolveAllowlistIdAdditions, @@ -294,30 +295,10 @@ export async function monitorDiscordProvider(opts: MonitorDiscordOpts = {}) { if (!guild || typeof guild !== "object") { continue; } - const users = (guild as { users?: Array }).users; - if (Array.isArray(users)) { - for (const entry of users) { - const trimmed = String(entry).trim(); - if (trimmed && trimmed !== "*") { - userEntries.add(trimmed); - } - } - } + addAllowlistUserEntriesFromConfigEntry(userEntries, guild); const channels = (guild as { channels?: Record }).channels ?? {}; for (const channel of Object.values(channels)) { - if (!channel || typeof channel !== "object") { - continue; - } - const channelUsers = (channel as { users?: Array }).users; - if (!Array.isArray(channelUsers)) { - continue; - } - for (const entry of channelUsers) { - const trimmed = String(entry).trim(); - if (trimmed && trimmed !== "*") { - userEntries.add(trimmed); - } - } + addAllowlistUserEntriesFromConfigEntry(userEntries, channel); } } diff --git a/src/slack/monitor/provider.ts b/src/slack/monitor/provider.ts index 9a15e87e76..0533647abd 100644 --- a/src/slack/monitor/provider.ts +++ b/src/slack/monitor/provider.ts @@ -5,6 +5,7 @@ import type { MonitorSlackOpts } from "./types.js"; import { resolveTextChunkLimit } from "../../auto-reply/chunk.js"; import { DEFAULT_GROUP_HISTORY_LIMIT } from "../../auto-reply/reply/history.js"; import { + addAllowlistUserEntriesFromConfigEntry, buildAllowlistResolutionSummary, mergeAllowlist, patchAllowlistUsersInConfigEntries, @@ -305,19 +306,7 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) { if (channelsConfig && Object.keys(channelsConfig).length > 0) { const userEntries = new Set(); for (const channel of Object.values(channelsConfig)) { - if (!channel || typeof channel !== "object") { - continue; - } - const channelUsers = (channel as { users?: Array }).users; - if (!Array.isArray(channelUsers)) { - continue; - } - for (const entry of channelUsers) { - const trimmed = String(entry).trim(); - if (trimmed && trimmed !== "*") { - userEntries.add(trimmed); - } - } + addAllowlistUserEntriesFromConfigEntry(userEntries, channel); } if (userEntries.size > 0) {