diff --git a/extensions/discord/src/monitor/provider.startup.ts b/extensions/discord/src/monitor/provider.startup.ts index ad098f06ec8..a8f9947b117 100644 --- a/extensions/discord/src/monitor/provider.startup.ts +++ b/extensions/discord/src/monitor/provider.startup.ts @@ -40,6 +40,7 @@ type CreateClientFn = ( handlers: ConstructorParameters[1], plugins: ConstructorParameters[2], ) => Client; +type CarbonEventQueueOptions = NonNullable[0]["eventQueue"]>; type ListenerCompatClient = Client & { plugins?: Array<{ id: string; plugin: Plugin }>; @@ -116,7 +117,10 @@ export function createDiscordMonitorClient(params: { modals: Modal[]; voiceEnabled: boolean; discordConfig: Parameters[0] & { - eventQueue?: { listenerTimeout?: number }; + eventQueue?: Pick< + CarbonEventQueueOptions, + "listenerTimeout" | "maxQueueSize" | "maxConcurrency" + >; }; runtime: RuntimeEnv; createClient: CreateClientFn; @@ -145,8 +149,9 @@ export function createDiscordMonitorClient(params: { // Discord normalization/enqueue work). const eventQueueOpts = { listenerTimeout: 120_000, + slowListenerThreshold: 30_000, ...params.discordConfig.eventQueue, - }; + } satisfies CarbonEventQueueOptions; const readyListener = createDiscordStatusReadyListener({ discordConfig: params.discordConfig, getAutoPresenceController: () => autoPresenceController, diff --git a/extensions/discord/src/monitor/provider.test.ts b/extensions/discord/src/monitor/provider.test.ts index 01566d2aeac..9e4ceb4904a 100644 --- a/extensions/discord/src/monitor/provider.test.ts +++ b/extensions/discord/src/monitor/provider.test.ts @@ -97,21 +97,23 @@ describe("monitorDiscordProvider", () => { ) => Promise<{ status: string; reason?: string }>; }; - const getConstructedEventQueue = (): { listenerTimeout?: number } | undefined => { + const getConstructedEventQueue = (): + | { listenerTimeout?: number; slowListenerThreshold?: number } + | undefined => { expect(clientConstructorOptionsMock).toHaveBeenCalledTimes(1); const opts = clientConstructorOptionsMock.mock.calls[0]?.[0] as { - eventQueue?: { listenerTimeout?: number }; + eventQueue?: { listenerTimeout?: number; slowListenerThreshold?: number }; }; return opts.eventQueue; }; const getConstructedClientOptions = (): { - eventQueue?: { listenerTimeout?: number }; + eventQueue?: { listenerTimeout?: number; slowListenerThreshold?: number }; } => { expect(clientConstructorOptionsMock).toHaveBeenCalledTimes(1); return ( (clientConstructorOptionsMock.mock.calls[0]?.[0] as { - eventQueue?: { listenerTimeout?: number }; + eventQueue?: { listenerTimeout?: number; slowListenerThreshold?: number }; }) ?? {} ); }; @@ -573,14 +575,17 @@ describe("monitorDiscordProvider", () => { expect(drained[0]?.message).toContain("4014"); }); - it("passes default eventQueue.listenerTimeout of 120s to Carbon Client", async () => { + it("passes OpenClaw EventQueue defaults to Carbon Client", async () => { await monitorDiscordProvider({ config: baseConfig(), runtime: baseRuntime(), }); const eventQueue = getConstructedEventQueue(); - expect(eventQueue).toEqual({ listenerTimeout: 120_000 }); + expect(eventQueue).toEqual({ + listenerTimeout: 120_000, + slowListenerThreshold: 30_000, + }); }); it("forwards custom eventQueue config from discord config to Carbon Client", async () => { diff --git a/src/logging/console-capture.test.ts b/src/logging/console-capture.test.ts index 5ed6b8c33f3..b314cf1c2d7 100644 --- a/src/logging/console-capture.test.ts +++ b/src/logging/console-capture.test.ts @@ -85,20 +85,6 @@ describe("enableConsoleCapture", () => { vi.useRealTimers(); }); - it.each(["DiscordMessageListener", "DiscordReactionListener", "DiscordReactionRemoveListener"])( - "suppresses discord EventQueue slow listener duplicates for %s", - (listener) => { - setLoggerOverride({ level: "info", file: tempLogPath() }); - const warn = vi.fn(); - console.warn = warn; - enableConsoleCapture(); - console.warn( - `[EventQueue] Slow listener detected: ${listener} took 12.3 seconds for event MESSAGE_CREATE`, - ); - expect(warn).not.toHaveBeenCalled(); - }, - ); - it("does not double-prefix timestamps", () => { setLoggerOverride({ level: "info", file: tempLogPath() }); const warn = vi.fn(); diff --git a/src/logging/console.ts b/src/logging/console.ts index 0e6a70b63b5..85c7dd38ce7 100644 --- a/src/logging/console.ts +++ b/src/logging/console.ts @@ -146,12 +146,6 @@ const SUPPRESSED_CONSOLE_PREFIXES = [ "Session already open", ] as const; -const SUPPRESSED_DISCORD_EVENTQUEUE_LISTENERS = [ - "DiscordMessageListener", - "DiscordReactionListener", - "DiscordReactionRemoveListener", -] as const; - function shouldSuppressConsoleMessage(message: string): boolean { if (isVerbose()) { return false; @@ -159,12 +153,6 @@ function shouldSuppressConsoleMessage(message: string): boolean { if (SUPPRESSED_CONSOLE_PREFIXES.some((prefix) => message.startsWith(prefix))) { return true; } - if ( - message.startsWith("[EventQueue] Slow listener detected") && - SUPPRESSED_DISCORD_EVENTQUEUE_LISTENERS.some((listener) => message.includes(listener)) - ) { - return true; - } return false; }