@@ -22,10 +22,12 @@ import { app } from "electron";
2222import { inject , injectable , preDestroy } from "inversify" ;
2323import type { ExecutionMode } from "@/shared/types.js" ;
2424import type { AcpMessage } from "../../../shared/types/session-events.js" ;
25+ import { container } from "../../di/container.js" ;
2526import { MAIN_TOKENS } from "../../di/tokens.js" ;
2627import { logger } from "../../lib/logger.js" ;
2728import { TypedEventEmitter } from "../../lib/typed-event-emitter.js" ;
2829import type { ProcessTrackingService } from "../process-tracking/service.js" ;
30+ import type { SleepService } from "../sleep/service.js" ;
2931import {
3032 AgentServiceEvent ,
3133 type AgentServiceEvents ,
@@ -227,6 +229,10 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
227229 this . processTracking = processTracking ;
228230 }
229231
232+ private get sleepService ( ) {
233+ return container . get < SleepService > ( MAIN_TOKENS . SleepService ) ;
234+ }
235+
230236 public updateToken ( newToken : string ) : void {
231237 this . currentToken = newToken ;
232238
@@ -637,6 +643,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
637643
638644 session . lastActivityAt = Date . now ( ) ;
639645 session . promptPending = true ;
646+ this . sleepService . acquire ( sessionId ) ;
640647
641648 try {
642649 const result = await session . clientSideConnection . prompt ( {
@@ -663,6 +670,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
663670 throw err ;
664671 } finally {
665672 session . promptPending = false ;
673+ this . sleepService . release ( sessionId ) ;
666674 }
667675 }
668676
@@ -917,6 +925,7 @@ For git operations while detached:
917925 private async cleanupSession ( taskRunId : string ) : Promise < void > {
918926 const session = this . sessions . get ( taskRunId ) ;
919927 if ( session ) {
928+ this . sleepService . release ( taskRunId ) ;
920929 try {
921930 await session . agent . cleanup ( ) ;
922931 } catch {
@@ -986,21 +995,28 @@ For git operations while detached:
986995 // The claude.ts adapter only calls requestPermission when user input is needed.
987996 // (It handles auto-approve internally for acceptEdits/bypassPermissions modes)
988997 if ( toolCallId ) {
989- return new Promise ( ( resolve , reject ) => {
990- const key = `${ taskRunId } :${ toolCallId } ` ;
991- service . pendingPermissions . set ( key , {
992- resolve,
993- reject,
994- sessionId : taskRunId ,
995- toolCallId,
996- } ) ;
997-
998- log . info ( "Emitting permission request to renderer" , {
999- sessionId : taskRunId ,
1000- toolCallId,
1001- } ) ;
1002- service . emit ( AgentServiceEvent . PermissionRequest , params ) ;
1003- } ) ;
998+ service . sleepService . release ( taskRunId ) ;
999+ try {
1000+ return await new Promise < RequestPermissionResponse > (
1001+ ( resolve , reject ) => {
1002+ const key = `${ taskRunId } :${ toolCallId } ` ;
1003+ service . pendingPermissions . set ( key , {
1004+ resolve,
1005+ reject,
1006+ sessionId : taskRunId ,
1007+ toolCallId,
1008+ } ) ;
1009+
1010+ log . info ( "Emitting permission request to renderer" , {
1011+ sessionId : taskRunId ,
1012+ toolCallId,
1013+ } ) ;
1014+ service . emit ( AgentServiceEvent . PermissionRequest , params ) ;
1015+ } ,
1016+ ) ;
1017+ } finally {
1018+ service . sleepService . acquire ( taskRunId ) ;
1019+ }
10041020 }
10051021
10061022 // Fallback: no toolCallId means we can't track the response, auto-approve
0 commit comments