Browse Source

Merge pull request #564 from andrescastane/fix/companion-process-leak

fix: kill companion process on exit to prevent zombie accumulation
Alvin 1 tháng trước cách đây
mục cha
commit
5f28de39fc
1 tập tin đã thay đổi với 9 bổ sung1 xóa
  1. 9 1
      src/companion/manager.ts

+ 9 - 1
src/companion/manager.ts

@@ -1,4 +1,4 @@
-import { spawn } from 'node:child_process';
+import { spawn, type ChildProcess } from 'node:child_process';
 import {
 import {
   existsSync,
   existsSync,
   mkdirSync,
   mkdirSync,
@@ -143,6 +143,7 @@ export class CompanionManager {
   /** sessionId → agent name, for sessions currently busy. */
   /** sessionId → agent name, for sessions currently busy. */
   private readonly busyAgentSessions = new Map<string, string>();
   private readonly busyAgentSessions = new Map<string, string>();
   private readonly config?: CompanionConfig;
   private readonly config?: CompanionConfig;
+  private companionProcess: ChildProcess | null = null;
 
 
   constructor(sessionId: string, cwd: string, config?: CompanionConfig) {
   constructor(sessionId: string, cwd: string, config?: CompanionConfig) {
     this.id = sessionId;
     this.id = sessionId;
@@ -223,6 +224,12 @@ export class CompanionManager {
 
 
   onExit(): void {
   onExit(): void {
     if (this.config?.enabled !== true) return;
     if (this.config?.enabled !== true) return;
+    if (this.companionProcess) {
+      try {
+        this.companionProcess.kill();
+      } catch {}
+      this.companionProcess = null;
+    }
     writeState((state) => {
     writeState((state) => {
       state.sessions = state.sessions.filter((s) => s.session_id !== this.id);
       state.sessions = state.sessions.filter((s) => s.session_id !== this.id);
     });
     });
@@ -304,6 +311,7 @@ export class CompanionManager {
         },
         },
         stdio: 'ignore',
         stdio: 'ignore',
       });
       });
+      this.companionProcess = child;
       child.unref();
       child.unref();
       log(
       log(
         '[companion] spawned',
         '[companion] spawned',