import { spawn, type ChildProcess } from 'child_process'; import { existsSync } from 'fs'; export interface ManagedMonitorConfig { managedMonitor?: string; monitor_port?: number; logLevel?: string; } let monitorProcess: ChildProcess | null = null; export function startManagedMonitor( logger: { info: (...args: any[]) => void; warn: (...args: any[]) => void; error: (...args: any[]) => void }, config: ManagedMonitorConfig, ): void { if (!config.managedMonitor) return; if (monitorProcess) { logger.info('HarborForge managed monitor already running'); return; } if (!existsSync(config.managedMonitor)) { logger.warn(`HarborForge managed monitor path not found: ${config.managedMonitor}`); return; } const args: string[] = []; if (config.monitor_port) args.push('--port', String(config.monitor_port)); if (config.logLevel) args.push('--log-level', String(config.logLevel)); monitorProcess = spawn(config.managedMonitor, args, { stdio: 'inherit', detached: false, }); monitorProcess.on('exit', (code, signal) => { logger.warn(`HarborForge managed monitor exited code=${code ?? 'null'} signal=${signal ?? 'null'}`); monitorProcess = null; }); logger.info(`HarborForge managed monitor started: ${config.managedMonitor}`); } export function stopManagedMonitor( logger: { info: (...args: any[]) => void; warn: (...args: any[]) => void }, ): void { if (!monitorProcess) return; const pid = monitorProcess.pid; monitorProcess.kill('SIGTERM'); monitorProcess = null; logger.info(`HarborForge managed monitor stopped pid=${pid ?? 'unknown'}`); }