Files
HarborForge.OpenclawPlugin/plugin/core/managed-monitor.ts

60 lines
2.0 KiB
TypeScript

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'}`);
}