Files
HarborForge.OpenclawPlugin/plugin/index.ts
zhi 9f649e2b39 feat: rename plugin to harbor-forge, remove sidecar, add --install-cli
Major changes:
- Renamed plugin id from harborforge-monitor to harbor-forge (TODO 4.1)
- Removed sidecar server/ directory and spawn logic (TODO 4.2)
- Added monitorPort to plugin config schema (TODO 4.3)
- Added --install-cli flag to installer for building hf CLI (TODO 4.4)
- skills/hf/ only deployed when --install-cli is present (TODO 4.5)
- Plugin now serves telemetry data directly via tools
- Installer handles migration from old plugin name
- Bumped version to 0.2.0
2026-03-21 15:24:50 +00:00

132 lines
3.8 KiB
TypeScript

/**
* HarborForge Plugin for OpenClaw
*
* Provides monitor-related tools and exposes OpenClaw metadata
* for the HarborForge Monitor bridge (via monitor_port).
*
* Sidecar architecture has been removed. Telemetry data is now
* served directly by the plugin when Monitor queries via the
* local monitor_port communication path.
*/
import { hostname, freemem, totalmem, uptime, loadavg, platform } from 'os';
import { getLivePluginConfig, type HarborForgeMonitorConfig } from './core/live-config';
interface PluginAPI {
logger: {
info: (...args: any[]) => void;
error: (...args: any[]) => void;
debug: (...args: any[]) => void;
warn: (...args: any[]) => void;
};
version?: string;
config?: Record<string, unknown>;
pluginConfig?: Record<string, unknown>;
on: (event: string, handler: () => void) => void;
registerTool: (factory: (ctx: any) => any) => void;
}
export default {
id: 'harbor-forge',
name: 'HarborForge',
register(api: PluginAPI) {
const logger = api.logger || {
info: (...args: any[]) => console.log('[HarborForge]', ...args),
error: (...args: any[]) => console.error('[HarborForge]', ...args),
debug: (...args: any[]) => console.debug('[HarborForge]', ...args),
warn: (...args: any[]) => console.warn('[HarborForge]', ...args),
};
const baseConfig: HarborForgeMonitorConfig = {
enabled: true,
backendUrl: 'https://monitor.hangman-lab.top',
identifier: '',
reportIntervalSec: 30,
httpFallbackIntervalSec: 60,
logLevel: 'info',
...(api.pluginConfig || {}),
};
function resolveConfig() {
return getLivePluginConfig(api, baseConfig);
}
/**
* Collect current system telemetry snapshot.
* This data is exposed to the Monitor bridge when it queries the plugin.
*/
function collectTelemetry() {
const live = resolveConfig();
const load = loadavg();
return {
identifier: live.identifier || hostname(),
platform: platform(),
hostname: hostname(),
uptime: uptime(),
memory: {
total: totalmem(),
free: freemem(),
used: totalmem() - freemem(),
usagePercent: ((totalmem() - freemem()) / totalmem()) * 100,
},
load: {
avg1: load[0],
avg5: load[1],
avg15: load[2],
},
openclaw: {
version: api.version || 'unknown',
pluginVersion: '0.2.0',
},
timestamp: new Date().toISOString(),
};
}
api.on('gateway_start', () => {
logger.info('HarborForge plugin active');
});
api.on('gateway_stop', () => {
logger.info('HarborForge plugin stopping');
});
// Tool: plugin status
api.registerTool(() => ({
name: 'harborforge_status',
description: 'Get HarborForge plugin status and current telemetry snapshot',
parameters: {
type: 'object',
properties: {},
},
async execute() {
const live = resolveConfig();
return {
enabled: live.enabled !== false,
config: {
backendUrl: live.backendUrl,
identifier: live.identifier || hostname(),
monitorPort: (live as any).monitorPort || null,
reportIntervalSec: live.reportIntervalSec,
hasApiKey: Boolean(live.apiKey),
},
telemetry: collectTelemetry(),
};
},
}));
// Tool: telemetry snapshot (for Monitor bridge queries)
api.registerTool(() => ({
name: 'harborforge_telemetry',
description: 'Get current system telemetry data for HarborForge Monitor',
parameters: {
type: 'object',
properties: {},
},
async execute() {
return collectTelemetry();
},
}));
logger.info('HarborForge plugin registered (id: harbor-forge)');
},
};