Skip to content

Commit 13370f9

Browse files
committed
fix: resolve 'Current ask promise was ignored' error in multi-file diffs
- Modified Task.ts ask() method to return placeholder responses for partial updates instead of throwing errors - Improved error handling in multiApplyDiffTool.ts with better logging and user feedback - Added proper error recovery for batch diff approval failures - Prevents disruption of multi-file concurrent diff operations Fixes #8046
1 parent 2263d86 commit 13370f9

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

src/core/task/Task.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -739,14 +739,18 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
739739
// saves, and only post parts of partial message instead of
740740
// whole array in new listener.
741741
this.updateClineMessage(lastMessage)
742-
throw new Error("Current ask promise was ignored (#1)")
742+
// Return a placeholder response for partial updates
743+
// This prevents the error from disrupting the flow
744+
return { response: "messageResponse" as ClineAskResponse, text: undefined, images: undefined }
743745
} else {
744746
// This is a new partial message, so add it with partial
745747
// state.
746748
askTs = Date.now()
747749
this.lastMessageTs = askTs
748750
await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text, partial, isProtected })
749-
throw new Error("Current ask promise was ignored (#2)")
751+
// Return a placeholder response for partial updates
752+
// This prevents the error from disrupting the flow
753+
return { response: "messageResponse" as ClineAskResponse, text: undefined, images: undefined }
750754
}
751755
} else {
752756
if (isUpdatingPreviousPartial) {

src/core/tools/multiApplyDiffTool.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { TelemetryService } from "@roo-code/telemetry"
55
import { DEFAULT_WRITE_DELAY_MS } from "@roo-code/types"
66

77
import { ClineSayTool } from "../../shared/ExtensionMessage"
8+
import { ClineAskResponse } from "../../shared/WebviewMessage"
89
import { getReadablePath } from "../../utils/path"
910
import { Task } from "../task/Task"
1011
import { ToolUse, RemoveClosingTag, AskApproval, HandleError, PushToolResult } from "../../shared/tools"
@@ -101,7 +102,13 @@ export async function applyDiffTool(
101102
path: getReadablePath(cline.cwd, filePath),
102103
}
103104
const partialMessage = JSON.stringify(sharedMessageProps)
104-
await cline.ask("tool", partialMessage, block.partial).catch(() => {})
105+
// Handle partial message updates gracefully
106+
try {
107+
await cline.ask("tool", partialMessage, block.partial)
108+
} catch (error) {
109+
// Log the error for debugging but don't disrupt the flow
110+
console.debug(`Partial message update handled: ${error instanceof Error ? error.message : String(error)}`)
111+
}
105112
return
106113
}
107114

@@ -306,7 +313,23 @@ Original error: ${errorMessage}`
306313
isProtected: hasProtectedFiles,
307314
} satisfies ClineSayTool)
308315

309-
const { response, text, images } = await cline.ask("tool", completeMessage, hasProtectedFiles)
316+
let response: ClineAskResponse
317+
let text: string | undefined
318+
let images: string[] | undefined
319+
320+
try {
321+
const askResult = await cline.ask("tool", completeMessage, hasProtectedFiles)
322+
response = askResult.response
323+
text = askResult.text
324+
images = askResult.images
325+
} catch (error) {
326+
// If ask fails, provide clear feedback to the model
327+
const errorMessage = `Failed to get approval for batch diff operations: ${error instanceof Error ? error.message : String(error)}`
328+
await cline.say("error", errorMessage)
329+
pushToolResult(errorMessage)
330+
cline.processQueuedMessages()
331+
return
332+
}
310333

311334
// Process batch response
312335
if (response === "yesButtonClicked") {

0 commit comments

Comments
 (0)