@@ -142,7 +142,7 @@ interface ManagedSession {
142142 taskId : string ;
143143 repoPath : string ;
144144 agent : Agent ;
145- connection : ClientSideConnection ;
145+ clientSideConnection : ClientSideConnection ;
146146 channel : string ;
147147 createdAt : number ;
148148 lastActivityAt : number ;
@@ -422,7 +422,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
422422 taskId,
423423 repoPath,
424424 agent,
425- connection,
425+ clientSideConnection : connection ,
426426 channel,
427427 createdAt : Date . now ( ) ,
428428 lastActivityAt : Date . now ( ) ,
@@ -438,6 +438,11 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
438438 }
439439 return session ;
440440 } catch ( err ) {
441+ try {
442+ await agent . cleanup ( ) ;
443+ } catch {
444+ log . debug ( "Agent cleanup failed during error handling" , { taskRunId } ) ;
445+ }
441446 this . cleanupMockNodeEnvironment ( mockNodeDir ) ;
442447 if ( ! isRetry && isAuthError ( err ) ) {
443448 log . warn (
@@ -518,7 +523,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
518523 session . promptPending = true ;
519524
520525 try {
521- const result = await session . connection . prompt ( {
526+ const result = await session . clientSideConnection . prompt ( {
522527 sessionId,
523528 prompt : finalPrompt ,
524529 } ) ;
@@ -530,7 +535,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
530535 if ( isAuthError ( err ) ) {
531536 log . warn ( "Auth error during prompt, recreating session" , { sessionId } ) ;
532537 session = await this . recreateSession ( sessionId ) ;
533- const result = await session . connection . prompt ( {
538+ const result = await session . clientSideConnection . prompt ( {
534539 sessionId,
535540 prompt : finalPrompt ,
536541 } ) ;
@@ -565,7 +570,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
565570 if ( ! session ) return false ;
566571
567572 try {
568- await session . connection . cancel ( {
573+ await session . clientSideConnection . cancel ( {
569574 sessionId,
570575 _meta : reason ? { interruptReason : reason } : undefined ,
571576 } ) ;
@@ -591,7 +596,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
591596 }
592597
593598 try {
594- await session . connection . extMethod ( "session/setModel" , {
599+ await session . clientSideConnection . extMethod ( "session/setModel" , {
595600 sessionId,
596601 modelId,
597602 } ) ;
@@ -609,7 +614,7 @@ export class AgentService extends TypedEventEmitter<AgentServiceEvents> {
609614 }
610615
611616 try {
612- await session . connection . extMethod ( "session/setMode" , {
617+ await session . clientSideConnection . extMethod ( "session/setMode" , {
613618 sessionId,
614619 modeId,
615620 } ) ;
@@ -722,32 +727,15 @@ For git operations while detached:
722727 }
723728
724729 async cleanupAll ( ) : Promise < void > {
730+ const sessionIds = Array . from ( this . sessions . keys ( ) ) ;
725731 log . info ( "Cleaning up all agent sessions" , {
726- sessionCount : this . sessions . size ,
732+ sessionCount : sessionIds . length ,
727733 } ) ;
728734
729- for ( const [ taskRunId , session ] of this . sessions ) {
730- // Step 1: Send ACP cancel notification for any ongoing prompt turns
731- try {
732- if ( ! session . connection . signal . aborted ) {
733- await session . connection . cancel ( { sessionId : taskRunId } ) ;
734- log . info ( "Sent ACP cancel for session" , { taskRunId } ) ;
735- }
736- } catch ( err ) {
737- log . warn ( "Failed to send ACP cancel" , { taskRunId, error : err } ) ;
738- }
739-
740- // Step 2: Cleanup agent connection (closes streams, aborts subprocess)
741- try {
742- await session . agent . cleanup ( ) ;
743- } catch ( err ) {
744- log . warn ( "Failed to cleanup agent" , { taskRunId, error : err } ) ;
745- }
746-
747- this . cleanupMockNodeEnvironment ( session . mockNodeDir ) ;
735+ for ( const taskRunId of sessionIds ) {
736+ await this . cleanupSession ( taskRunId ) ;
748737 }
749738
750- this . sessions . clear ( ) ;
751739 log . info ( "All agent sessions cleaned up" ) ;
752740 }
753741
@@ -807,22 +795,11 @@ For git operations while detached:
807795 private async cleanupSession ( taskRunId : string ) : Promise < void > {
808796 const session = this . sessions . get ( taskRunId ) ;
809797 if ( session ) {
810- // Cancel any ongoing operations
811- try {
812- if ( ! session . connection . signal . aborted ) {
813- await session . connection . cancel ( { sessionId : taskRunId } ) ;
814- }
815- } catch {
816- // Ignore cancel errors
817- }
818-
819- // Cleanup agent (closes streams, aborts subprocess)
820798 try {
821799 await session . agent . cleanup ( ) ;
822800 } catch {
823- // Ignore cleanup errors
801+ log . debug ( "Agent cleanup failed" , { taskRunId } ) ;
824802 }
825-
826803 this . cleanupMockNodeEnvironment ( session . mockNodeDir ) ;
827804 this . sessions . delete ( taskRunId ) ;
828805 }
0 commit comments