agentic-qe
Version:
Agentic Quality Engineering Fleet System - AI-driven quality management platform
147 lines (145 loc) • 6.33 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MonitorDashboard = void 0;
const fs = __importStar(require("fs/promises"));
class MonitorDashboard {
constructor(dataDir, config) {
this.metricsHistory = [];
this.dataDir = dataDir;
this.config = {
refreshInterval: config?.refreshInterval ?? 1000,
maxDataPoints: config?.maxDataPoints ?? 100,
displayFormat: config?.displayFormat ?? 'table',
};
}
async initialize() {
await fs.mkdir(this.dataDir, { recursive: true });
return { success: true, config: this.config };
}
getConfig() {
return { ...this.config };
}
async update(metrics) {
this.metricsHistory.push(metrics);
// Keep only maxDataPoints to prevent memory leaks
if (this.metricsHistory.length > this.config.maxDataPoints) {
this.metricsHistory = this.metricsHistory.slice(-this.config.maxDataPoints);
}
}
async render(metrics, format) {
const displayFormat = format ?? this.config.displayFormat;
switch (displayFormat) {
case 'table':
return this.renderTable(metrics);
case 'graph':
return this.renderGraph(metrics);
case 'compact':
return this.renderCompact(metrics);
default:
return this.renderTable(metrics);
}
}
renderTable(metrics) {
const cpuAvg = this.average(metrics.cpu);
const memAvg = this.average(metrics.memory);
const netAvg = this.average(metrics.network);
return `
╔════════════════════════════════════════╗
║ MONITORING DASHBOARD ║
╠════════════════════════════════════════╣
║ Metric │ Current │ Avg │ Trend ║
╟────────────┼─────────┼───────┼─────────╢
║ CPU │ ${this.formatPercent(metrics.cpu[metrics.cpu.length - 1])} │ ${this.formatPercent(cpuAvg)} │ ${this.getTrendArrow(metrics.cpu)} ║
║ Memory │ ${this.formatPercent(metrics.memory[metrics.memory.length - 1])} │ ${this.formatPercent(memAvg)} │ ${this.getTrendArrow(metrics.memory)} ║
║ Network │ ${this.formatMbps(metrics.network[metrics.network.length - 1])} │ ${this.formatMbps(netAvg)} │ ${this.getTrendArrow(metrics.network)} ║
╚════════════════════════════════════════╝
Updated: ${new Date(metrics.timestamp).toLocaleString()}
`.trim();
}
renderGraph(metrics) {
const cpuGraph = this.createSparkline(metrics.cpu, 20);
const memGraph = this.createSparkline(metrics.memory, 20);
const netGraph = this.createSparkline(metrics.network, 20);
return `
MONITORING DASHBOARD - GRAPHICAL VIEW
CPU Usage: ${cpuGraph} ${this.formatPercent(this.average(metrics.cpu))}
Memory Usage: ${memGraph} ${this.formatPercent(this.average(metrics.memory))}
Network Usage: ${netGraph} ${this.formatMbps(this.average(metrics.network))}
Updated: ${new Date(metrics.timestamp).toLocaleString()}
`.trim();
}
renderCompact(metrics) {
const cpuAvg = this.average(metrics.cpu);
const memAvg = this.average(metrics.memory);
const netAvg = this.average(metrics.network);
return `CPU: ${this.formatPercent(cpuAvg)} | MEM: ${this.formatPercent(memAvg)} | NET: ${this.formatMbps(netAvg)}`;
}
createSparkline(data, width) {
const blocks = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
const max = Math.max(...data);
const min = Math.min(...data);
const range = max - min || 1;
// Sample data to fit width
const step = Math.max(1, Math.floor(data.length / width));
const sampledData = [];
for (let i = 0; i < data.length; i += step) {
sampledData.push(data[i]);
}
return sampledData
.map(value => {
const normalized = (value - min) / range;
const blockIndex = Math.floor(normalized * (blocks.length - 1));
return blocks[blockIndex];
})
.join('');
}
average(values) {
return values.reduce((a, b) => a + b, 0) / values.length;
}
getTrendArrow(values) {
if (values.length < 2)
return '→';
const recent = values.slice(-3);
const older = values.slice(-6, -3);
if (older.length === 0)
return '→';
const recentAvg = this.average(recent);
const olderAvg = this.average(older);
if (recentAvg > olderAvg * 1.1)
return '↑';
if (recentAvg < olderAvg * 0.9)
return '↓';
return '→';
}
formatPercent(value) {
return `${value.toFixed(1).padStart(5)}%`;
}
formatMbps(value) {
return `${value.toFixed(0).padStart(4)}Mb`;
}
}
exports.MonitorDashboard = MonitorDashboard;
//# sourceMappingURL=dashboard.js.map