diff --git a/src/core/Cline.ts b/src/core/Cline.ts index bacade3f741..33865601aaa 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -732,13 +732,18 @@ export class Cline { } async abortTask() { - this.abort = true // Will stop any autonomously running promises. + // Will stop any autonomously running promises. + this.abort = true + this.terminalManager.disposeAll() this.urlContentFetcher.closeBrowser() this.browserSession.closeBrowser() - // Need to await for when we want to make sure directories/files are - // reverted before re-starting the task from a checkpoint. - await this.diffViewProvider.revertChanges() + + // If we're not streaming then `abortStream` (which reverts the diff + // view changes) won't be called, so we need to revert the changes here. + if (this.isStreaming && this.diffViewProvider.isEditing) { + await this.diffViewProvider.revertChanges() + } } // Tools @@ -2817,6 +2822,8 @@ export class Cline { } const abortStream = async (cancelReason: ClineApiReqCancelReason, streamingFailedMessage?: string) => { + console.log(`[Cline#abortStream] cancelReason = ${cancelReason}`) + if (this.diffViewProvider.isEditing) { await this.diffViewProvider.revertChanges() // closes diff view } @@ -2871,6 +2878,7 @@ export class Cline { const stream = this.attemptApiRequest(previousApiReqIndex) // yields only if the first chunk is successful, otherwise will allow the user to retry the request (most likely due to rate limit error, which gets thrown on the first chunk) let assistantMessage = "" let reasoningMessage = "" + this.isStreaming = true try { for await (const chunk of stream) { if (!chunk) { @@ -2903,11 +2911,13 @@ export class Cline { } if (this.abort) { - console.log("aborting stream...") + console.log(`aborting stream, this.abandoned = ${this.abandoned}`) + if (!this.abandoned) { // only need to gracefully abort if this instance isn't abandoned (sometimes openrouter stream hangs, in which case this would affect future instances of cline) await abortStream("user_cancelled") } + break // aborts the stream } @@ -2940,6 +2950,8 @@ export class Cline { // await this.providerRef.deref()?.postStateToWebview() } } + } finally { + this.isStreaming = false } // need to call here in case the stream was aborted