@@ -629,6 +629,7 @@ export class ServiceManager extends EventEmitter {
629629
630630 async refresh ( ) : Promise < ServiceDescriptor [ ] > {
631631 this . attachLivePtySessions ( ) ;
632+ this . reconcileExitedPtySessions ( ) ;
632633
633634 for ( const definition of this . definitions ) {
634635 const state = this . getState ( definition . id ) ;
@@ -961,6 +962,36 @@ export class ServiceManager extends EventEmitter {
961962 }
962963 }
963964
965+ private reconcileExitedPtySessions ( ) : void {
966+ const sessions = new Map ( this . pty . list ( ) . map ( ( session ) => [ session . id , session ] ) ) ;
967+
968+ for ( const definition of this . definitions ) {
969+ const state = this . getState ( definition . id ) ;
970+ if ( ! state . ptySessionId || state . status === "stopped" || state . status === "error" ) {
971+ continue ;
972+ }
973+
974+ const session = sessions . get ( state . ptySessionId ) ;
975+ if ( ! session || session . status === "starting" || session . status === "running" || session . status === "stopping" ) {
976+ continue ;
977+ }
978+
979+ const stoppedByRequest = state . status === "stopping" || ! state . desired ;
980+ this . setState ( definition . id , {
981+ ...state ,
982+ status : stoppedByRequest ? "stopped" : "error" ,
983+ health : "unknown" ,
984+ managed : false ,
985+ desired : stoppedByRequest ? false : state . desired ,
986+ pid : undefined ,
987+ ptySessionId : undefined ,
988+ error : stoppedByRequest ? undefined : ( session . error ?? `进程异常退出: ${ session . exitCode ?? "未知" } ` ) ,
989+ detail : stoppedByRequest ? "已停止" : `进程异常退出: ${ session . exitCode ?? "未知" } ` ,
990+ stoppedAt : session . endedAt ?? Date . now ( ) ,
991+ } ) ;
992+ }
993+ }
994+
964995 private handlePtyData ( event : PtyDataEvent ) : void {
965996 const serviceId = serviceIdFromSession ( event . sessionId ) ;
966997 if ( ! serviceId ) {
@@ -1006,6 +1037,7 @@ export class ServiceManager extends EventEmitter {
10061037 health : "unknown" ,
10071038 managed : false ,
10081039 pid : undefined ,
1040+ ptySessionId : undefined ,
10091041 detail : stoppedByRequest
10101042 ? "已停止"
10111043 : shouldRestart
@@ -1051,6 +1083,23 @@ export class ServiceManager extends EventEmitter {
10511083 return ;
10521084 }
10531085
1086+ if ( snapshot . status === "exited" || snapshot . status === "error" ) {
1087+ const stoppedByRequest = state . status === "stopping" || ! state . desired ;
1088+ this . setState ( serviceId , {
1089+ ...state ,
1090+ status : stoppedByRequest ? "stopped" : "error" ,
1091+ health : "unknown" ,
1092+ managed : false ,
1093+ desired : stoppedByRequest ? false : state . desired ,
1094+ pid : undefined ,
1095+ ptySessionId : undefined ,
1096+ error : stoppedByRequest ? undefined : ( snapshot . error ?? `进程异常退出: ${ snapshot . exitCode ?? "未知" } ` ) ,
1097+ detail : stoppedByRequest ? "已停止" : `进程异常退出: ${ snapshot . exitCode ?? "未知" } ` ,
1098+ stoppedAt : snapshot . endedAt ?? Date . now ( ) ,
1099+ } ) ;
1100+ return ;
1101+ }
1102+
10541103 this . setState ( serviceId , {
10551104 ...state ,
10561105 pid : snapshot . pid ,
0 commit comments