Browse Source

Revert "Remove the ask promise error" (#2126)

Revert "Remove the ask promise error (#2123)"

This reverts commit b788aa1ec4f2f683b4f6d5a14befaadc33ad4d36.
Matt Rubens 9 months ago
parent
commit
520326648b
1 changed files with 19 additions and 1 deletions
  1. 19 1
      src/core/Cline.ts

+ 19 - 1
src/core/Cline.ts

@@ -142,6 +142,7 @@ export class Cline extends EventEmitter<ClineEvents> {
 	private askResponse?: ClineAskResponse
 	private askResponse?: ClineAskResponse
 	private askResponseText?: string
 	private askResponseText?: string
 	private askResponseImages?: string[]
 	private askResponseImages?: string[]
+	private lastMessageTs?: number
 	// Not private since it needs to be accessible by tools
 	// Not private since it needs to be accessible by tools
 	consecutiveMistakeCount: number = 0
 	consecutiveMistakeCount: number = 0
 	consecutiveMistakeCountForApplyDiff: Map<string, number> = new Map()
 	consecutiveMistakeCountForApplyDiff: Map<string, number> = new Map()
@@ -440,6 +441,7 @@ export class Cline extends EventEmitter<ClineEvents> {
 					// This is a new partial message, so add it with partial
 					// This is a new partial message, so add it with partial
 					// state.
 					// state.
 					askTs = Date.now()
 					askTs = Date.now()
+					this.lastMessageTs = askTs
 					await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text, partial })
 					await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text, partial })
 					throw new Error("Current ask promise was ignored (#2)")
 					throw new Error("Current ask promise was ignored (#2)")
 				}
 				}
@@ -458,6 +460,8 @@ export class Cline extends EventEmitter<ClineEvents> {
 					So in this case we must make sure that the message ts is never altered after first setting it.
 					So in this case we must make sure that the message ts is never altered after first setting it.
 					*/
 					*/
 					askTs = lastMessage.ts
 					askTs = lastMessage.ts
+					this.lastMessageTs = askTs
+					// lastMessage.ts = askTs
 					lastMessage.text = text
 					lastMessage.text = text
 					lastMessage.partial = false
 					lastMessage.partial = false
 					lastMessage.progressStatus = progressStatus
 					lastMessage.progressStatus = progressStatus
@@ -469,6 +473,7 @@ export class Cline extends EventEmitter<ClineEvents> {
 					this.askResponseText = undefined
 					this.askResponseText = undefined
 					this.askResponseImages = undefined
 					this.askResponseImages = undefined
 					askTs = Date.now()
 					askTs = Date.now()
+					this.lastMessageTs = askTs
 					await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text })
 					await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text })
 				}
 				}
 			}
 			}
@@ -478,10 +483,18 @@ export class Cline extends EventEmitter<ClineEvents> {
 			this.askResponseText = undefined
 			this.askResponseText = undefined
 			this.askResponseImages = undefined
 			this.askResponseImages = undefined
 			askTs = Date.now()
 			askTs = Date.now()
+			this.lastMessageTs = askTs
 			await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text })
 			await this.addToClineMessages({ ts: askTs, type: "ask", ask: type, text })
 		}
 		}
 
 
-		await pWaitFor(() => this.askResponse !== undefined, { interval: 100 })
+		await pWaitFor(() => this.askResponse !== undefined || this.lastMessageTs !== askTs, { interval: 100 })
+
+		if (this.lastMessageTs !== askTs) {
+			// Could happen if we send multiple asks in a row i.e. with
+			// command_output. It's important that when we know an ask could
+			// fail, it is handled gracefully.
+			throw new Error("Current ask promise was ignored")
+		}
 
 
 		const result = { response: this.askResponse!, text: this.askResponseText, images: this.askResponseImages }
 		const result = { response: this.askResponse!, text: this.askResponseText, images: this.askResponseImages }
 		this.askResponse = undefined
 		this.askResponse = undefined
@@ -524,6 +537,7 @@ export class Cline extends EventEmitter<ClineEvents> {
 				} else {
 				} else {
 					// this is a new partial message, so add it with partial state
 					// this is a new partial message, so add it with partial state
 					const sayTs = Date.now()
 					const sayTs = Date.now()
+					this.lastMessageTs = sayTs
 					await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images, partial })
 					await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images, partial })
 				}
 				}
 			} else {
 			} else {
@@ -531,6 +545,8 @@ export class Cline extends EventEmitter<ClineEvents> {
 				if (isUpdatingPreviousPartial) {
 				if (isUpdatingPreviousPartial) {
 					// This is the complete version of a previously partial
 					// This is the complete version of a previously partial
 					// message, so replace the partial with the complete version.
 					// message, so replace the partial with the complete version.
+					this.lastMessageTs = lastMessage.ts
+					// lastMessage.ts = sayTs
 					lastMessage.text = text
 					lastMessage.text = text
 					lastMessage.images = images
 					lastMessage.images = images
 					lastMessage.partial = false
 					lastMessage.partial = false
@@ -543,12 +559,14 @@ export class Cline extends EventEmitter<ClineEvents> {
 				} else {
 				} else {
 					// This is a new and complete message, so add it like normal.
 					// This is a new and complete message, so add it like normal.
 					const sayTs = Date.now()
 					const sayTs = Date.now()
+					this.lastMessageTs = sayTs
 					await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images })
 					await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images })
 				}
 				}
 			}
 			}
 		} else {
 		} else {
 			// this is a new non-partial message, so add it like normal
 			// this is a new non-partial message, so add it like normal
 			const sayTs = Date.now()
 			const sayTs = Date.now()
+			this.lastMessageTs = sayTs
 			await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images, checkpoint })
 			await this.addToClineMessages({ ts: sayTs, type: "say", say: type, text, images, checkpoint })
 		}
 		}
 	}
 	}