Skip to content

Commit 06dc18b

Browse files
committed
refactor: add centralized message queue processing after file edits
- Added processQueuedMessages() method to Task class for centralized queue handling - Integrated queue processing in all file editing tools: - writeToFileTool: processes queue after completion - applyDiffTool: processes queue after completion, rejection, or error - insertContentTool: processes queue after completion - searchAndReplaceTool: processes queue after completion - multiApplyDiffTool: processes queue after completion or error - Ensures user messages typed during file edits are sent immediately after edit completes - Prevents messages from getting stuck in the queue
1 parent 716a2dc commit 06dc18b

File tree

6 files changed

+39
-64
lines changed

6 files changed

+39
-64
lines changed

src/core/task/Task.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,4 +2897,28 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
28972897
public get cwd() {
28982898
return this.workspacePath
28992899
}
2900+
2901+
/**
2902+
* Process any queued messages by dequeuing and submitting them.
2903+
* This ensures that queued user messages are sent when appropriate,
2904+
* preventing them from getting stuck in the queue.
2905+
*
2906+
* @param context - Context string for logging (e.g., the calling tool name)
2907+
*/
2908+
public processQueuedMessages(): void {
2909+
try {
2910+
if (!this.messageQueueService.isEmpty()) {
2911+
const queued = this.messageQueueService.dequeueMessage()
2912+
if (queued) {
2913+
setTimeout(() => {
2914+
this.submitUserMessage(queued.text, queued.images).catch((err) =>
2915+
console.error(`[Task] Failed to submit queued message:`, err),
2916+
)
2917+
}, 0)
2918+
}
2919+
}
2920+
} catch (e) {
2921+
console.error(`[Task] Queue processing error:`, e)
2922+
}
2923+
}
29002924
}

src/core/tools/applyDiffTool.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ export async function applyDiffToolLegacy(
207207

208208
if (!didApprove) {
209209
await cline.diffViewProvider.revertChanges() // Cline likely handles closing the diff view
210+
cline.processQueuedMessages()
210211
return
211212
}
212213

@@ -245,27 +246,15 @@ export async function applyDiffToolLegacy(
245246

246247
await cline.diffViewProvider.reset()
247248

248-
// After completing file edits, process one queued user message if present
249-
try {
250-
if (!cline.messageQueueService.isEmpty()) {
251-
const queued = cline.messageQueueService.dequeueMessage()
252-
if (queued) {
253-
setTimeout(() => {
254-
cline
255-
.submitUserMessage(queued.text, queued.images)
256-
.catch((err) => console.error("[applyDiffTool] Failed to submit queued message:", err))
257-
}, 0)
258-
}
259-
}
260-
} catch (e) {
261-
console.error("[applyDiffTool] Queue processing error:", e)
262-
}
249+
// Process any queued messages after file edit completes
250+
cline.processQueuedMessages()
263251

264252
return
265253
}
266254
} catch (error) {
267255
await handleError("applying diff", error)
268256
await cline.diffViewProvider.reset()
257+
cline.processQueuedMessages()
269258
return
270259
}
271260
}

src/core/tools/insertContentTool.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -188,21 +188,8 @@ export async function insertContentTool(
188188

189189
await cline.diffViewProvider.reset()
190190

191-
// After completing file edits, process one queued user message if present
192-
try {
193-
if (!cline.messageQueueService.isEmpty()) {
194-
const queued = cline.messageQueueService.dequeueMessage()
195-
if (queued) {
196-
setTimeout(() => {
197-
cline
198-
.submitUserMessage(queued.text, queued.images)
199-
.catch((err) => console.error("[insertContentTool] Failed to submit queued message:", err))
200-
}, 0)
201-
}
202-
}
203-
} catch (e) {
204-
console.error("[insertContentTool] Queue processing error:", e)
205-
}
191+
// Process any queued messages after file edit completes
192+
cline.processQueuedMessages()
206193
} catch (error) {
207194
handleError("insert content", error)
208195
await cline.diffViewProvider.reset()

src/core/tools/multiApplyDiffTool.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ Original error: ${errorMessage}`
172172
TelemetryService.instance.captureDiffApplicationError(cline.taskId, cline.consecutiveMistakeCount)
173173
await cline.say("diff_error", `Failed to parse apply_diff XML: ${errorMessage}`)
174174
pushToolResult(detailedError)
175+
cline.processQueuedMessages()
175176
return
176177
}
177178
} else if (legacyPath && typeof legacyDiffContent === "string") {
@@ -195,6 +196,7 @@ Original error: ${errorMessage}`
195196
"args (or legacy 'path' and 'diff' parameters)",
196197
)
197198
pushToolResult(errorMsg)
199+
cline.processQueuedMessages()
198200
return
199201
}
200202

@@ -210,6 +212,7 @@ Original error: ${errorMessage}`
210212
: "args (must contain at least one valid file element)",
211213
),
212214
)
215+
cline.processQueuedMessages()
213216
return
214217
}
215218

@@ -675,10 +678,12 @@ ${errorDetails ? `\nTechnical details:\n${errorDetails}\n` : ""}
675678

676679
// Push the final result combining all operation results
677680
pushToolResult(results.join("\n\n") + singleBlockNotice)
681+
cline.processQueuedMessages()
678682
return
679683
} catch (error) {
680684
await handleError("applying diff", error)
681685
await cline.diffViewProvider.reset()
686+
cline.processQueuedMessages()
682687
return
683688
}
684689
}

src/core/tools/searchAndReplaceTool.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -264,23 +264,8 @@ export async function searchAndReplaceTool(
264264
cline.recordToolUsage("search_and_replace")
265265
await cline.diffViewProvider.reset()
266266

267-
// After completing file edits, process one queued user message if present
268-
try {
269-
if (!cline.messageQueueService.isEmpty()) {
270-
const queued = cline.messageQueueService.dequeueMessage()
271-
if (queued) {
272-
setTimeout(() => {
273-
cline
274-
.submitUserMessage(queued.text, queued.images)
275-
.catch((err) =>
276-
console.error("[searchAndReplaceTool] Failed to submit queued message:", err),
277-
)
278-
}, 0)
279-
}
280-
}
281-
} catch (e) {
282-
console.error("[searchAndReplaceTool] Queue processing error:", e)
283-
}
267+
// Process any queued messages after file edit completes
268+
cline.processQueuedMessages()
284269
} catch (error) {
285270
handleError("search and replace", error)
286271
await cline.diffViewProvider.reset()

src/core/tools/writeToFileTool.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -308,23 +308,8 @@ export async function writeToFileTool(
308308

309309
await cline.diffViewProvider.reset()
310310

311-
// After completing file edits, process one queued user message if present
312-
try {
313-
if (!cline.messageQueueService.isEmpty()) {
314-
const queued = cline.messageQueueService.dequeueMessage()
315-
if (queued) {
316-
setTimeout(() => {
317-
cline
318-
.submitUserMessage(queued.text, queued.images)
319-
.catch((err) =>
320-
console.error("[writeToFileTool] Failed to submit queued message:", err),
321-
)
322-
}, 0)
323-
}
324-
}
325-
} catch (e) {
326-
console.error("[writeToFileTool] Queue processing error:", e)
327-
}
311+
// Process any queued messages after file edit completes
312+
cline.processQueuedMessages()
328313

329314
return
330315
}

0 commit comments

Comments
 (0)