diff --git a/src/discord/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts b/src/discord/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts index e129a5df0..1d58e033b 100644 --- a/src/discord/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts +++ b/src/discord/monitor.tool-result.accepts-guild-messages-mentionpatterns-match.e2e.test.ts @@ -90,11 +90,42 @@ beforeEach(() => { const MENTION_PATTERNS_TEST_TIMEOUT_MS = process.platform === "win32" ? 90_000 : 60_000; +type LoadedConfig = ReturnType<(typeof import("../config/config.js"))["loadConfig"]>; + +function makeRuntime() { + return { + log: vi.fn(), + error: vi.fn(), + exit: (code: number): never => { + throw new Error(`exit ${code}`); + }, + }; +} + +async function createHandler(cfg: LoadedConfig) { + const { createDiscordMessageHandler } = await import("./monitor.js"); + return createDiscordMessageHandler({ + cfg, + discordConfig: cfg.channels.discord, + accountId: "default", + token: "token", + runtime: makeRuntime(), + botUserId: "bot-id", + guildHistories: new Map(), + historyLimit: 0, + mediaMaxBytes: 10_000, + textLimit: 2000, + replyToMode: "off", + dmEnabled: true, + groupDmEnabled: false, + guildEntries: cfg.channels.discord.guilds, + }); +} + describe("discord tool result dispatch", () => { it( "accepts guild messages when mentionPatterns match", async () => { - const { createDiscordMessageHandler } = await import("./monitor.js"); const cfg = { agents: { defaults: { @@ -116,28 +147,7 @@ describe("discord tool result dispatch", () => { }, } as ReturnType; - const handler = createDiscordMessageHandler({ - cfg, - discordConfig: cfg.channels.discord, - accountId: "default", - token: "token", - runtime: { - log: vi.fn(), - error: vi.fn(), - exit: (code: number): never => { - throw new Error(`exit ${code}`); - }, - }, - botUserId: "bot-id", - guildHistories: new Map(), - historyLimit: 0, - mediaMaxBytes: 10_000, - textLimit: 2000, - replyToMode: "off", - dmEnabled: true, - groupDmEnabled: false, - guildEntries: { "*": { requireMention: true } }, - }); + const handler = await createHandler(cfg); const client = { fetchChannel: vi.fn().mockResolvedValue({ @@ -227,7 +237,6 @@ describe("discord tool result dispatch", () => { ); it("accepts guild reply-to-bot messages as implicit mentions", async () => { - const { createDiscordMessageHandler } = await import("./monitor.js"); const cfg = { agents: { defaults: { @@ -245,28 +254,7 @@ describe("discord tool result dispatch", () => { }, } as ReturnType; - const handler = createDiscordMessageHandler({ - cfg, - discordConfig: cfg.channels.discord, - accountId: "default", - token: "token", - runtime: { - log: vi.fn(), - error: vi.fn(), - exit: (code: number): never => { - throw new Error(`exit ${code}`); - }, - }, - botUserId: "bot-id", - guildHistories: new Map(), - historyLimit: 0, - mediaMaxBytes: 10_000, - textLimit: 2000, - replyToMode: "off", - dmEnabled: true, - groupDmEnabled: false, - guildEntries: { "*": { requireMention: true } }, - }); + const handler = await createHandler(cfg); const client = { fetchChannel: vi.fn().mockResolvedValue({ @@ -327,7 +315,6 @@ describe("discord tool result dispatch", () => { }); it("forks thread sessions and injects starter context", async () => { - const { createDiscordMessageHandler } = await import("./monitor.js"); let capturedCtx: | { SessionKey?: string; @@ -360,28 +347,7 @@ describe("discord tool result dispatch", () => { }, } as ReturnType; - const handler = createDiscordMessageHandler({ - cfg, - discordConfig: cfg.channels.discord, - accountId: "default", - token: "token", - runtime: { - log: vi.fn(), - error: vi.fn(), - exit: (code: number): never => { - throw new Error(`exit ${code}`); - }, - }, - botUserId: "bot-id", - guildHistories: new Map(), - historyLimit: 0, - mediaMaxBytes: 10_000, - textLimit: 2000, - replyToMode: "off", - dmEnabled: true, - groupDmEnabled: false, - guildEntries: { "*": { requireMention: false } }, - }); + const handler = await createHandler(cfg); const threadChannel = { type: ChannelType.GuildText, @@ -441,7 +407,6 @@ describe("discord tool result dispatch", () => { }); it("skips thread starter context when disabled", async () => { - const { createDiscordMessageHandler } = await import("./monitor.js"); let capturedCtx: | { ThreadStarterBody?: string; @@ -477,28 +442,7 @@ describe("discord tool result dispatch", () => { }, } as ReturnType; - const handler = createDiscordMessageHandler({ - cfg, - discordConfig: cfg.channels.discord, - accountId: "default", - token: "token", - runtime: { - log: vi.fn(), - error: vi.fn(), - exit: (code: number): never => { - throw new Error(`exit ${code}`); - }, - }, - botUserId: "bot-id", - guildHistories: new Map(), - historyLimit: 0, - mediaMaxBytes: 10_000, - textLimit: 2000, - replyToMode: "off", - dmEnabled: true, - groupDmEnabled: false, - guildEntries: cfg.channels.discord.guilds, - }); + const handler = await createHandler(cfg); const threadChannel = { type: ChannelType.GuildText, @@ -550,7 +494,6 @@ describe("discord tool result dispatch", () => { }); it("treats forum threads as distinct sessions without channel payloads", async () => { - const { createDiscordMessageHandler } = await import("./monitor.js"); let capturedCtx: | { SessionKey?: string; @@ -578,28 +521,7 @@ describe("discord tool result dispatch", () => { routing: { allowFrom: [] }, } as ReturnType; - const handler = createDiscordMessageHandler({ - cfg, - discordConfig: cfg.channels.discord, - accountId: "default", - token: "token", - runtime: { - log: vi.fn(), - error: vi.fn(), - exit: (code: number): never => { - throw new Error(`exit ${code}`); - }, - }, - botUserId: "bot-id", - guildHistories: new Map(), - historyLimit: 0, - mediaMaxBytes: 10_000, - textLimit: 2000, - replyToMode: "off", - dmEnabled: true, - groupDmEnabled: false, - guildEntries: { "*": { requireMention: false } }, - }); + const handler = await createHandler(cfg); const fetchChannel = vi .fn() @@ -655,8 +577,6 @@ describe("discord tool result dispatch", () => { }); it("scopes thread sessions to the routed agent", async () => { - const { createDiscordMessageHandler } = await import("./monitor.js"); - let capturedCtx: | { SessionKey?: string; @@ -689,28 +609,7 @@ describe("discord tool result dispatch", () => { } as ReturnType; loadConfigMock.mockReturnValue(cfg); - const handler = createDiscordMessageHandler({ - cfg, - discordConfig: cfg.channels.discord, - accountId: "default", - token: "token", - runtime: { - log: vi.fn(), - error: vi.fn(), - exit: (code: number): never => { - throw new Error(`exit ${code}`); - }, - }, - botUserId: "bot-id", - guildHistories: new Map(), - historyLimit: 0, - mediaMaxBytes: 10_000, - textLimit: 2000, - replyToMode: "off", - dmEnabled: true, - groupDmEnabled: false, - guildEntries: { "*": { requireMention: false } }, - }); + const handler = await createHandler(cfg); const threadChannel = { type: ChannelType.GuildText,