From 5d68d8cda59ae24a213f828aef5e1de9b92b1d6f Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 22 Jan 2026 20:16:00 +0000 Subject: [PATCH] fix(core): Resolve AbortSignal MaxListenersExceededWarning (#5950) (#16735) --- .../core/src/agents/local-executor.test.ts | 22 ++++++++++++++----- .../services/sessionSummaryService.test.ts | 16 +++++++++----- packages/core/src/tools/mcp-client.test.ts | 11 ++++++---- packages/core/src/tools/tools.ts | 2 +- .../core/src/utils/llm-edit-fixer.test.ts | 10 ++++++--- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/packages/core/src/agents/local-executor.test.ts b/packages/core/src/agents/local-executor.test.ts index e2269e815a..4578bfab8d 100644 --- a/packages/core/src/agents/local-executor.test.ts +++ b/packages/core/src/agents/local-executor.test.ts @@ -1369,9 +1369,13 @@ describe('LocalAgentExecutor', () => { (async function* () { await new Promise((resolve) => { // This promise resolves when aborted, ending the generator. - signal?.addEventListener('abort', () => { - resolve(); - }); + signal?.addEventListener( + 'abort', + () => { + resolve(); + }, + { once: true }, + ); }); })(), ); @@ -1681,7 +1685,9 @@ describe('LocalAgentExecutor', () => { (async function* () { // This promise never resolves, it waits for abort. await new Promise((resolve) => { - signal?.addEventListener('abort', () => resolve()); + signal?.addEventListener('abort', () => resolve(), { + once: true, + }); }); })(), ); @@ -1734,7 +1740,9 @@ describe('LocalAgentExecutor', () => { // eslint-disable-next-line require-yield (async function* () { await new Promise((resolve) => - signal?.addEventListener('abort', () => resolve()), + signal?.addEventListener('abort', () => resolve(), { + once: true, + }), ); })(), ); @@ -1745,7 +1753,9 @@ describe('LocalAgentExecutor', () => { // eslint-disable-next-line require-yield (async function* () { await new Promise((resolve) => - signal?.addEventListener('abort', () => resolve()), + signal?.addEventListener('abort', () => resolve(), { + once: true, + }), ); })(), ); diff --git a/packages/core/src/services/sessionSummaryService.test.ts b/packages/core/src/services/sessionSummaryService.test.ts index c3362a63c9..1e16c6c120 100644 --- a/packages/core/src/services/sessionSummaryService.test.ts +++ b/packages/core/src/services/sessionSummaryService.test.ts @@ -346,12 +346,16 @@ describe('SessionSummaryService', () => { 10000, ); - abortSignal?.addEventListener('abort', () => { - clearTimeout(timeoutId); - const abortError = new Error('This operation was aborted'); - abortError.name = 'AbortError'; - reject(abortError); - }); + abortSignal?.addEventListener( + 'abort', + () => { + clearTimeout(timeoutId); + const abortError = new Error('This operation was aborted'); + abortError.name = 'AbortError'; + reject(abortError); + }, + { once: true }, + ); }), ); diff --git a/packages/core/src/tools/mcp-client.test.ts b/packages/core/src/tools/mcp-client.test.ts index eb63779bc2..45e06a43c6 100644 --- a/packages/core/src/tools/mcp-client.test.ts +++ b/packages/core/src/tools/mcp-client.test.ts @@ -1043,10 +1043,13 @@ describe('mcp-client', () => { if (options?.signal?.aborted) { return reject(new Error('Operation aborted')); } - options?.signal?.addEventListener('abort', () => { - reject(new Error('Operation aborted')); - }); - // Intentionally do not resolve immediately to simulate lag + options?.signal?.addEventListener( + 'abort', + () => { + reject(new Error('Operation aborted')); + }, + { once: true }, + ); }), ), listPrompts: vi.fn().mockResolvedValue({ prompts: [] }), diff --git a/packages/core/src/tools/tools.ts b/packages/core/src/tools/tools.ts index 6029ba6673..82a980aeef 100644 --- a/packages/core/src/tools/tools.ts +++ b/packages/core/src/tools/tools.ts @@ -242,7 +242,7 @@ export abstract class BaseToolInvocation< } }; - abortSignal.addEventListener('abort', abortHandler); + abortSignal.addEventListener('abort', abortHandler, { once: true }); timeoutId = setTimeout(() => { cleanup(); diff --git a/packages/core/src/utils/llm-edit-fixer.test.ts b/packages/core/src/utils/llm-edit-fixer.test.ts index d4fc95e400..a1215428a1 100644 --- a/packages/core/src/utils/llm-edit-fixer.test.ts +++ b/packages/core/src/utils/llm-edit-fixer.test.ts @@ -350,9 +350,13 @@ describe('FixLLMEditWithInstruction', () => { if (abortSignal?.aborted) { return reject(new DOMException('Aborted', 'AbortError')); } - abortSignal?.addEventListener('abort', () => { - reject(new DOMException('Aborted', 'AbortError')); - }); + abortSignal?.addEventListener( + 'abort', + () => { + reject(new DOMException('Aborted', 'AbortError')); + }, + { once: true }, + ); }), );