@@ -1265,6 +1265,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
12651265 // So in this case we must make sure that the message ts is
12661266 // never altered after first setting it.
12671267 askTs = lastMessage . ts
1268+ this . pendingHeadlessAskId = askTs
12681269 this . lastMessageTs = askTs
12691270 lastMessage . text = text
12701271 lastMessage . partial = false
@@ -1286,6 +1287,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
12861287 this . askResponseText = undefined
12871288 this . askResponseImages = undefined
12881289 askTs = Date . now ( )
1290+ this . pendingHeadlessAskId = askTs
12891291 this . lastMessageTs = askTs
12901292 await this . addToClineMessages ( {
12911293 ts : askTs ,
@@ -1304,6 +1306,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
13041306 this . askResponseText = undefined
13051307 this . askResponseImages = undefined
13061308 askTs = Date . now ( )
1309+ this . pendingHeadlessAskId = askTs
13071310 this . lastMessageTs = askTs
13081311 await this . addToClineMessages ( {
13091312 ts : askTs ,
@@ -1316,6 +1319,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
13161319 } )
13171320 }
13181321
1322+ this . pendingHeadlessAskId = askTs
13191323 const timeouts : NodeJS . Timeout [ ] = [ ]
13201324
13211325 if ( approval . decision === "approve" ) {
@@ -1429,10 +1433,14 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
14291433
14301434 /* v8 ignore next 3 -- abort-while-waiting path; covered by e2e standalone-resume test */
14311435 if ( this . abort ) {
1436+ timeouts . forEach ( ( timeout ) => clearTimeout ( timeout ) )
1437+ if ( this . pendingHeadlessAskId === askTs ) this . pendingHeadlessAskId = undefined
14321438 throw new Error ( `[ZooCode#ask] task ${ this . taskId } .${ this . instanceId } aborted` )
14331439 }
14341440
14351441 if ( this . lastMessageTs !== askTs ) {
1442+ timeouts . forEach ( ( timeout ) => clearTimeout ( timeout ) )
1443+ if ( this . pendingHeadlessAskId === askTs ) this . pendingHeadlessAskId = undefined
14361444 // Could happen if we send multiple asks in a row i.e. with
14371445 // command_output. It's important that when we know an ask could
14381446 // fail, it is handled gracefully.
@@ -1443,6 +1451,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
14431451 this . askResponse = undefined
14441452 this . askResponseText = undefined
14451453 this . askResponseImages = undefined
1454+ if ( this . pendingHeadlessAskId === askTs ) this . pendingHeadlessAskId = undefined
14461455
14471456 // Cancel the timeouts if they are still running.
14481457 timeouts . forEach ( ( timeout ) => clearTimeout ( timeout ) )
@@ -1510,6 +1519,19 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
15101519 }
15111520 }
15121521
1522+ private pendingHeadlessAskId : number | undefined
1523+
1524+ public get pendingAskId ( ) : number | undefined {
1525+ return this . pendingHeadlessAskId
1526+ }
1527+
1528+ public respondToAsk ( askId : number , askResponse : ClineAskResponse , text ?: string , images ?: string [ ] ) : boolean {
1529+ if ( this . abort || this . pendingHeadlessAskId !== askId ) return false
1530+ this . pendingHeadlessAskId = undefined
1531+ this . handleWebviewAskResponse ( askResponse , text , images )
1532+ return true
1533+ }
1534+
15131535 /**
15141536 * Cancel any pending auto-approval timeout.
15151537 * Called when user interacts (types, clicks buttons, etc.) to prevent the timeout from firing.
0 commit comments