import { spawn, type ChildProcess } from 'child_process'; import { existsSync } from 'fs'; export interface ManagedMonitorConfig { managedMonitor?: string; backendUrl?: string; identifier?: string; apiKey?: string; monitor_port?: number; reportIntervalSec?: 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.backendUrl) args.push('--backend-url', String(config.backendUrl)); if (config.identifier) args.push('--identifier', String(config.identifier)); if (config.apiKey) args.push('--api-key', String(config.apiKey)); if (config.monitor_port) args.push('--monitor-port', String(config.monitor_port)); if (config.reportIntervalSec) args.push('--report-interval', String(config.reportIntervalSec)); 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'}`); }