diff --git a/extensions/copilot/src/extension/chat/vscode-node/chatHookService.ts b/extensions/copilot/src/extension/chat/vscode-node/chatHookService.ts index a35158b37d2..b6b9501a871 100644 --- a/extensions/copilot/src/extension/chat/vscode-node/chatHookService.ts +++ b/extensions/copilot/src/extension/chat/vscode-node/chatHookService.ts @@ -501,6 +501,16 @@ export class ChatHookService implements IChatHookService { token ); + // Running the hook can take a long time because it spawns external, user-configured + // commands. If the request was cancelled while the hook ran, the response stream is + // already closed and writing hook progress to it throws "Response stream has been + // closed". The caller only checks cancellation before invoking the hook, so re-check + // here after the await and skip result processing - a cancelled turn never consumes + // the result anyway. + if (token?.isCancellationRequested) { + return undefined; + } + if (results.length === 0) { return undefined; }