diff --git a/packages/core/src/hook/hook-manager.ts b/packages/core/src/hook/hook-manager.ts index 808a3b23..0933babb 100644 --- a/packages/core/src/hook/hook-manager.ts +++ b/packages/core/src/hook/hook-manager.ts @@ -76,9 +76,7 @@ export class HookManager { async listProcesses(): Promise { const processes = listHookProcesses(); - const seen = new Set(); for (const proc of processes) { - seen.add(proc.pid); const state = this.ensureState(proc.pid); state.name = proc.name || state.name; state.path = proc.path || state.path; @@ -87,11 +85,6 @@ export class HookManager { for (const proc of processes) { result.push(this.toPublicInfo(this.ensureState(proc.pid))); } - for (const state of this.states.values()) { - if (!seen.has(state.pid) && (state.injected || state.client)) { - result.push(this.toPublicInfo(state)); - } - } return result.sort((a, b) => a.pid - b.pid); } @@ -316,6 +309,7 @@ export class HookManager { try { const livePipes = await QqHookClient.listLivePipes(); const processes = listHookProcesses(); + const runningSet = new Set(processes.map(p => p.pid)); // Refresh metadata + ensure a state entry exists for each known PID. for (const proc of processes) { @@ -325,6 +319,7 @@ export class HookManager { } // Auto-detect hooks that survived a SnowLuma restart or failed unload. for (const pid of livePipes) { + if (!runningSet.has(pid)) continue; const state = this.ensureState(pid); if (!state.injected) { state.injected = true; @@ -334,14 +329,15 @@ export class HookManager { } } - const runningSet = new Set(processes.map(p => p.pid)); const tasks: Promise[] = []; for (const state of [...this.states.values()]) { const alivePipe = livePipes.has(state.pid); const aliveProc = runningSet.has(state.pid); - // Reap stale state entries that have nothing left to do. - if (!aliveProc && !alivePipe && !state.injected && !state.client) { + if (!aliveProc) { + const wasLoggedIn = state.loggedIn; + this.tearDownClient(state); + if (wasLoggedIn) this.bridgeManager.onPidDisconnected(state.pid); this.states.delete(state.pid); continue; }