@@ -22,8 +22,11 @@ import { app } from "electron";
2222import { 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" ;
26+ import { MAIN_TOKENS } from "../../di/tokens.js" ;
2527import { logger } from "../../lib/logger.js" ;
2628import { TypedEventEmitter } from "../../lib/typed-event-emitter.js" ;
29+ import type { SleepService } from "../sleep/service.js" ;
2730import {
2831 AgentServiceEvent ,
2932 type AgentServiceEvents ,
@@ -215,6 +218,10 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
215218 private currentToken : string | null = null ;
216219 private pendingPermissions = new Map < string , PendingPermission > ( ) ;
217220
221+ private get sleepService ( ) {
222+ return container . get < SleepService > ( MAIN_TOKENS . SleepService ) ;
223+ }
224+
218225 public updateToken ( newToken : string ) : void {
219226 this . currentToken = newToken ;
220227
@@ -595,6 +602,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
595602
596603 session . lastActivityAt = Date . now ( ) ;
597604 session . promptPending = true ;
605+ this . sleepService . acquire ( sessionId ) ;
598606
599607 try {
600608 const result = await session . clientSideConnection . prompt ( {
@@ -621,6 +629,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
621629 throw err ;
622630 } finally {
623631 session . promptPending = false ;
632+ this . sleepService . release ( sessionId ) ;
624633 }
625634 }
626635
@@ -867,6 +876,7 @@ For git operations while detached:
867876 private async cleanupSession ( taskRunId : string ) : Promise < void > {
868877 const session = this . sessions . get ( taskRunId ) ;
869878 if ( session ) {
879+ this . sleepService . release ( taskRunId ) ;
870880 try {
871881 await session . agent . cleanup ( ) ;
872882 } catch {
@@ -936,21 +946,28 @@ For git operations while detached:
936946 // The claude.ts adapter only calls requestPermission when user input is needed.
937947 // (It handles auto-approve internally for acceptEdits/bypassPermissions modes)
938948 if ( toolCallId ) {
939- return new Promise ( ( resolve , reject ) => {
940- const key = `${ taskRunId } :${ toolCallId } ` ;
941- service . pendingPermissions . set ( key , {
942- resolve,
943- reject,
944- sessionId : taskRunId ,
945- toolCallId,
946- } ) ;
947-
948- log . info ( "Emitting permission request to renderer" , {
949- sessionId : taskRunId ,
950- toolCallId,
951- } ) ;
952- service . emit ( AgentServiceEvent . PermissionRequest , params ) ;
953- } ) ;
949+ service . sleepService . release ( taskRunId ) ;
950+ try {
951+ return await new Promise < RequestPermissionResponse > (
952+ ( resolve , reject ) => {
953+ const key = `${ taskRunId } :${ toolCallId } ` ;
954+ service . pendingPermissions . set ( key , {
955+ resolve,
956+ reject,
957+ sessionId : taskRunId ,
958+ toolCallId,
959+ } ) ;
960+
961+ log . info ( "Emitting permission request to renderer" , {
962+ sessionId : taskRunId ,
963+ toolCallId,
964+ } ) ;
965+ service . emit ( AgentServiceEvent . PermissionRequest , params ) ;
966+ } ,
967+ ) ;
968+ } finally {
969+ service . sleepService . acquire ( taskRunId ) ;
970+ }
954971 }
955972
956973 // Fallback: no toolCallId means we can't track the response, auto-approve
0 commit comments