UNPKG

@dollhousemcp/mcp-server

Version:

DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.

141 lines 16.5 kB
/** * Collects search-performance and system-resource metrics from a PerformanceMonitor * instance. Returns an empty array (never throws) when the source is unavailable. */ const SOURCE = 'PerformanceMonitor'; export class PerformanceMonitorCollector { monitor; name = 'performance-monitor'; description = 'Search performance timings, cache hit rate, and system memory/CPU from PerformanceMonitor'; constructor(monitor) { this.monitor = monitor; } collect() { try { const metrics = this.monitor.getMetrics(); const searchStats = this.monitor.getSearchStats(); const memStats = this.monitor.getMemoryStats(); const searchTimes = metrics.searchTimes ?? []; const histCount = searchTimes.length; const histSum = searchTimes.reduce((s, v) => s + v, 0); const entries = [ { type: 'counter', name: 'performance.search.searches_total', source: SOURCE, unit: 'count', description: 'Total number of searches performed', value: searchStats.totalSearches, }, { type: 'histogram', name: 'performance.search.duration', source: SOURCE, unit: 'milliseconds', description: 'Distribution of search durations', value: { count: histCount, sum: histSum, avg: searchStats.averageTime, p50: searchStats.medianTime, p95: searchStats.p95Time, p99: searchStats.p99Time, }, }, { type: 'counter', name: 'performance.search.slow_query_count', source: SOURCE, unit: 'count', description: 'Number of searches that exceeded the slow-query threshold', value: searchStats.slowQueries, }, { type: 'gauge', name: 'performance.search.cache_hit_rate', source: SOURCE, unit: 'ratio', description: 'Fraction of searches served from cache', value: searchStats.cacheHitRate, }, { type: 'gauge', name: 'system.memory.heap_used_bytes', source: SOURCE, unit: 'bytes', description: 'V8 heap used (bytes)', value: memStats.currentUsage.heapUsed, }, { type: 'gauge', name: 'system.memory.heap_total_bytes', source: SOURCE, unit: 'bytes', description: 'V8 heap total (bytes)', value: memStats.currentUsage.heapTotal, }, { type: 'gauge', name: 'system.memory.rss_bytes', source: SOURCE, unit: 'bytes', description: 'Process resident set size (bytes)', value: memStats.currentUsage.rss, }, { type: 'gauge', name: 'system.memory.external_bytes', source: SOURCE, unit: 'bytes', description: 'V8 external memory (bytes)', value: memStats.currentUsage.external, }, { type: 'gauge', name: 'system.memory.growth_rate', source: SOURCE, unit: 'megabytes', description: 'Heap growth rate (MB/s)', value: memStats.growthRate, }, { type: 'counter', name: 'system.cpu.usage_seconds', source: SOURCE, unit: 'seconds', description: 'CPU time consumed by the process (seconds)', value: metrics.systemStats.cpuUsage, }, { type: 'counter', name: 'system.uptime_seconds', source: SOURCE, unit: 'seconds', description: 'Process uptime (seconds)', value: metrics.systemStats.uptime, }, { type: 'gauge', name: 'system.memory.free_bytes', source: SOURCE, unit: 'bytes', description: 'System free memory (bytes)', value: metrics.systemStats.freeMemory, }, { type: 'gauge', name: 'system.memory.total_bytes', source: SOURCE, unit: 'bytes', description: 'System total memory (bytes)', value: metrics.systemStats.totalMemory, }, ]; return entries; } catch { return []; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyZm9ybWFuY2VNb25pdG9yQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21ldHJpY3MvY29sbGVjdG9ycy9QZXJmb3JtYW5jZU1vbml0b3JDb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBS0gsTUFBTSxNQUFNLEdBQUcsb0JBQTZCLENBQUM7QUFFN0MsTUFBTSxPQUFPLDJCQUEyQjtJQUtUO0lBSnBCLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUM3QixXQUFXLEdBQ2xCLDJGQUEyRixDQUFDO0lBRTlGLFlBQTZCLE9BQTJCO1FBQTNCLFlBQU8sR0FBUCxPQUFPLENBQW9CO0lBQUcsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFL0MsTUFBTSxXQUFXLEdBQWEsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDeEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV2RCxNQUFNLE9BQU8sR0FBa0I7Z0JBQzdCO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLG1DQUFtQztvQkFDekMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxL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S0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTTtpQkFDbEM7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSw0QkFBNEI7b0JBQ3pDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVU7aUJBQ3RDO2dCQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXO2lCQUN2QzthQUNGLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2xsZWN0cyBzZWFyY2gtcGVyZm9ybWFuY2UgYW5kIHN5c3RlbS1yZXNvdXJjZSBtZXRyaWNzIGZyb20gYSBQZXJmb3JtYW5jZU1vbml0b3JcbiAqIGluc3RhbmNlLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IChuZXZlciB0aHJvd3MpIHdoZW4gdGhlIHNvdXJjZSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElNZXRyaWNDb2xsZWN0b3IsIE1ldHJpY0VudHJ5IH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJmb3JtYW5jZU1vbml0b3IgfSBmcm9tICcuLi8uLi91dGlscy9QZXJmb3JtYW5jZU1vbml0b3IuanMnO1xuXG5jb25zdCBTT1VSQ0UgPSAnUGVyZm9ybWFuY2VNb25pdG9yJyBhcyBjb25zdDtcblxuZXhwb3J0IGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvckNvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ3BlcmZvcm1hbmNlLW1vbml0b3InO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9XG4gICAgJ1NlYXJjaCBwZXJmb3JtYW5jZSB0aW1pbmdzLCBjYWNoZSBoaXQgcmF0ZSwgYW5kIHN5c3RlbSBtZW1vcnkvQ1BVIGZyb20gUGVyZm9ybWFuY2VNb25pdG9yJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1vbml0b3I6IFBlcmZvcm1hbmNlTW9uaXRvcikge31cblxuICBjb2xsZWN0KCk6IE1ldHJpY0VudHJ5W10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5tb25pdG9yLmdldE1ldHJpY3MoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFN0YXRzID0gdGhpcy5tb25pdG9yLmdldFNlYXJjaFN0YXRzKCk7XG4gICAgICBjb25zdCBtZW1TdGF0cyA9IHRoaXMubW9uaXRvci5nZXRNZW1vcnlTdGF0cygpO1xuXG4gICAgICBjb25zdCBzZWFyY2hUaW1lczogbnVtYmVyW10gPSBtZXRyaWNzLnNlYXJjaFRpbWVzID8/IFtdO1xuICAgICAgY29uc3QgaGlzdENvdW50ID0gc2VhcmNoVGltZXMubGVuZ3RoO1xuICAgICAgY29uc3QgaGlzdFN1bSA9IHNlYXJjaFRpbWVzLnJlZHVjZSgocywgdikgPT4gcyArIHYsIDApO1xuXG4gICAgICBjb25zdCBlbnRyaWVzOiBNZXRyaWNFbnRyeVtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guc2VhcmNoZXNfdG90YWwnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2Ygc2VhcmNoZXMgcGVyZm9ybWVkJyxcbiAgICAgICAgICB2YWx1ZTogc2VhcmNoU3RhdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdoaXN0b2dyYW0nIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guZHVyYXRpb24nLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdtaWxsaXNlY29uZHMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRGlzdHJpYnV0aW9uIG9mIHNlYXJjaCBkdXJhdGlvbnMnLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBjb3VudDogaGlzdENvdW50LFxuICAgICAgICAgICAgc3VtOiBoaXN0U3VtLFxuICAgICAgICAgICAgYXZnOiBzZWFyY2hTdGF0cy5hdmVyYWdlVGltZSxcbiAgICAgICAgICAgIHA1MDogc2VhcmNoU3RhdHMubWVkaWFuVGltZSxcbiAgICAgICAgICAgIHA5NTogc2VhcmNoU3RhdHMucDk1VGltZSxcbiAgICAgICAgICAgIHA5OTogc2VhcmNoU3RhdHMucDk5VGltZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdwZXJmb3JtYW5jZS5zZWFyY2guc2xvd19xdWVyeV9jb3VudCcsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBzZWFyY2hlcyB0aGF0IGV4Y2VlZGVkIHRoZSBzbG93LXF1ZXJ5IHRocmVzaG9sZCcsXG4gICAgICAgICAgdmFsdWU6IHNlYXJjaFN0YXRzLnNsb3dRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAncGVyZm9ybWFuY2Uuc2VhcmNoLmNhY2hlX2hpdF9yYXRlJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAncmF0aW8nIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRnJhY3Rpb24gb2Ygc2VhcmNoZXMgc2VydmVkIGZyb20gY2FjaGUnLFxuICAgICAgICAgIHZhbHVlOiBzZWFyY2hTdGF0cy5jYWNoZUhpdFJhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0ubWVtb3J5LmhlYXBfdXNlZF9ieXRlcycsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ2J5dGVzJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1Y4IGhlYXAgdXNlZCAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLmhlYXBVc2VkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnc3lzdGVtLm1lbW9yeS5oZWFwX3RvdGFsX2J5dGVzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVjggaGVhcCB0b3RhbCAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLmhlYXBUb3RhbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkucnNzX2J5dGVzJyxcbiAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICB1bml0OiAnYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUHJvY2VzcyByZXNpZGVudCBzZXQgc2l6ZSAoYnl0ZXMpJyxcbiAgICAgICAgICB2YWx1ZTogbWVtU3RhdHMuY3VycmVudFVzYWdlLnJzcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkuZXh0ZXJuYWxfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdWOCBleHRlcm5hbCBtZW1vcnkgKGJ5dGVzKScsXG4gICAgICAgICAgdmFsdWU6IG1lbVN0YXRzLmN1cnJlbnRVc2FnZS5leHRlcm5hbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkuZ3Jvd3RoX3JhdGUnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdtZWdhYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSGVhcCBncm93dGggcmF0ZSAoTUIvcyknLFxuICAgICAgICAgIHZhbHVlOiBtZW1TdGF0cy5ncm93dGhSYXRlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NvdW50ZXInIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0uY3B1LnVzYWdlX3NlY29uZHMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdzZWNvbmRzJyBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NQVSB0aW1lIGNvbnN1bWVkIGJ5IHRoZSBwcm9jZXNzIChzZWNvbmRzKScsXG4gICAgICAgICAgdmFsdWU6IG1ldHJpY3Muc3lzdGVtU3RhdHMuY3B1VXNhZ2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS51cHRpbWVfc2Vjb25kcycsXG4gICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgdW5pdDogJ3NlY29uZHMnIGFzIGNvbnN0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUHJvY2VzcyB1cHRpbWUgKHNlY29uZHMpJyxcbiAgICAgICAgICB2YWx1ZTogbWV0cmljcy5zeXN0ZW1TdGF0cy51cHRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgIG5hbWU6ICdzeXN0ZW0ubWVtb3J5LmZyZWVfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTeXN0ZW0gZnJlZSBtZW1vcnkgKGJ5dGVzKScsXG4gICAgICAgICAgdmFsdWU6IG1ldHJpY3Muc3lzdGVtU3RhdHMuZnJlZU1lbW9yeSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgbmFtZTogJ3N5c3RlbS5tZW1vcnkudG90YWxfYnl0ZXMnLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdieXRlcycgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdTeXN0ZW0gdG90YWwgbWVtb3J5IChieXRlcyknLFxuICAgICAgICAgIHZhbHVlOiBtZXRyaWNzLnN5c3RlbVN0YXRzLnRvdGFsTWVtb3J5LFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=