@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.
95 lines • 11.5 kB
JavaScript
/**
* Collects hit/miss/eviction and sizing metrics for one or more named LRUCache
* instances. Each cache is collected independently; a failure on one does not
* prevent the others from being reported.
*/
const SOURCE = 'LRUCache';
export class LRUCacheCollector {
caches;
name = 'lru-cache';
description = 'Hit rate, eviction counts, size, and memory usage for registered LRU caches';
constructor(caches) {
this.caches = caches;
}
collect() {
const entries = [];
for (const { name, instance } of this.caches) {
try {
const stats = instance.getStats();
const labels = { cache: name };
entries.push({
type: 'counter',
name: 'cache.lru.hits_total',
source: SOURCE,
unit: 'count',
description: 'Total cache hits',
labels,
value: stats.hitCount,
}, {
type: 'counter',
name: 'cache.lru.misses_total',
source: SOURCE,
unit: 'count',
description: 'Total cache misses',
labels,
value: stats.missCount,
}, {
type: 'counter',
name: 'cache.lru.evictions_total',
source: SOURCE,
unit: 'count',
description: 'Total entries evicted from cache',
labels,
value: stats.evictionCount,
}, {
type: 'gauge',
name: 'cache.lru.hit_rate',
source: SOURCE,
unit: 'ratio',
description: 'Fraction of lookups that resulted in a cache hit',
labels,
value: stats.hitRate,
}, {
type: 'gauge',
name: 'cache.lru.size_current',
source: SOURCE,
unit: 'count',
description: 'Current number of entries in cache',
labels,
value: stats.size,
}, {
type: 'gauge',
name: 'cache.lru.size_max',
source: SOURCE,
unit: 'count',
description: 'Maximum capacity of the cache',
labels,
value: stats.maxSize,
}, {
type: 'gauge',
name: 'cache.lru.memory_used_megabytes',
source: SOURCE,
unit: 'megabytes',
description: 'Estimated memory used by cached entries (MB)',
labels,
value: stats.memoryUsageMB,
});
}
catch (err) {
// Record failure as a metric so it's visible in the dashboard.
// Individual cache failures should not prevent other caches from reporting.
entries.push({
type: 'gauge',
name: 'cache.lru.collection_error',
source: SOURCE,
unit: 'count',
description: `Failed to collect stats: ${err instanceof Error ? err.message : String(err)}`,
labels: { cache: name },
value: 1,
});
}
}
return entries;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJVQ2FjaGVDb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWV0cmljcy9jb2xsZWN0b3JzL0xSVUNhY2hlQ29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFLSCxNQUFNLE1BQU0sR0FBRyxVQUFtQixDQUFDO0FBRW5DLE1BQU0sT0FBTyxpQkFBaUI7SUFNVDtJQUxWLElBQUksR0FBRyxXQUFXLENBQUM7SUFDbkIsV0FBVyxHQUNsQiw2RUFBNkUsQ0FBQztJQUVoRixZQUNtQixNQUE0RDtRQUE1RCxXQUFNLEdBQU4sTUFBTSxDQUFzRDtJQUM1RSxDQUFDO0lBRUosT0FBTztRQUNMLE1BQU0sT0FBTyxHQUFrQixFQUFFLENBQUM7UUFFbEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsQ0FBQztnQkFFeEMsT0FBTyxDQUFDLElBQUksQ0FDVjtvQkFDRSxJQUFJLEVBQUUsU0FBa0I7b0JBQ3hCLElBQUksRUFBRSxzQkFBc0I7b0JBQzVCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGtCQUFrQjtvQkFDL0IsTUFBTTtvQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVE7aUJBQ3RCLEVBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFNBQWtCO29CQUN4QixJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxvQkFBb0I7b0JBQ2pDLE1BQU07b0JBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTO2lCQUN2QixFQUNEO29CQUNFLElBQUksRUFBRSxTQUFrQjtvQkFDeEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsa0NBQWtDO29CQUMvQyxNQUFNO29CQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYTtpQkFDM0IsRUFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxvQkFBb0I7b0JBQzFCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsV0FBVyxFQUFFLGtEQUFrRDtvQkFDL0QsTUFBTTtvQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87aUJBQ3JCLEVBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLFdBQVcsRUFBRSxvQ0FBb0M7b0JBQ2pELE1BQU07b0JBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNsQixFQUNEO29CQUNFLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsK0JBQStCO29CQUM1QyxNQUFNO29CQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztpQkFDckIsRUFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBZ0I7b0JBQ3RCLElBQUksRUFBRSxpQ0FBaUM7b0JBQ3ZDLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxXQUFvQjtvQkFDMUIsV0FBVyxFQUFFLDhDQUE4QztvQkFDM0QsTUFBTTtvQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWE7aUJBQzNCLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLCtEQUErRDtnQkFDL0QsNEVBQTRFO2dCQUM1RSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUksRUFBRSxPQUFnQjtvQkFDdEIsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE9BQWdCO29CQUN0QixXQUFXLEVBQUUsNEJBQTRCLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDM0YsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtvQkFDdkIsS0FBSyxFQUFFLENBQUM7aUJBQ1QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbGxlY3RzIGhpdC9taXNzL2V2aWN0aW9uIGFuZCBzaXppbmcgbWV0cmljcyBmb3Igb25lIG9yIG1vcmUgbmFtZWQgTFJVQ2FjaGVcbiAqIGluc3RhbmNlcy4gRWFjaCBjYWNoZSBpcyBjb2xsZWN0ZWQgaW5kZXBlbmRlbnRseTsgYSBmYWlsdXJlIG9uIG9uZSBkb2VzIG5vdFxuICogcHJldmVudCB0aGUgb3RoZXJzIGZyb20gYmVpbmcgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJTWV0cmljQ29sbGVjdG9yLCBNZXRyaWNFbnRyeSB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTFJVQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5cbmNvbnN0IFNPVVJDRSA9ICdMUlVDYWNoZScgYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZUNvbGxlY3RvciBpbXBsZW1lbnRzIElNZXRyaWNDb2xsZWN0b3Ige1xuICByZWFkb25seSBuYW1lID0gJ2xydS1jYWNoZSc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uID1cbiAgICAnSGl0IHJhdGUsIGV2aWN0aW9uIGNvdW50cywgc2l6ZSwgYW5kIG1lbW9yeSB1c2FnZSBmb3IgcmVnaXN0ZXJlZCBMUlUgY2FjaGVzJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBMUlVDYWNoZTx1bmtub3duPiB9PixcbiAgKSB7fVxuXG4gIGNvbGxlY3QoKTogTWV0cmljRW50cnlbXSB7XG4gICAgY29uc3QgZW50cmllczogTWV0cmljRW50cnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB7IG5hbWUsIGluc3RhbmNlIH0gb2YgdGhpcy5jYWNoZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gaW5zdGFuY2UuZ2V0U3RhdHMoKTtcbiAgICAgICAgY29uc3QgbGFiZWxzID0geyBjYWNoZTogbmFtZSB9IGFzIGNvbnN0O1xuXG4gICAgICAgIGVudHJpZXMucHVzaChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1LmhpdHNfdG90YWwnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBjYWNoZSBoaXRzJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5oaXRDb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb3VudGVyJyBhcyBjb25zdCxcbiAgICAgICAgICAgIG5hbWU6ICdjYWNoZS5scnUubWlzc2VzX3RvdGFsJyxcbiAgICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgICAgdW5pdDogJ2NvdW50JyBhcyBjb25zdCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgY2FjaGUgbWlzc2VzJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5taXNzQ291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY291bnRlcicgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1LmV2aWN0aW9uc190b3RhbCcsXG4gICAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGVudHJpZXMgZXZpY3RlZCBmcm9tIGNhY2hlJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5ldmljdGlvbkNvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICAgIG5hbWU6ICdjYWNoZS5scnUuaGl0X3JhdGUnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAncmF0aW8nIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdGcmFjdGlvbiBvZiBsb29rdXBzIHRoYXQgcmVzdWx0ZWQgaW4gYSBjYWNoZSBoaXQnLFxuICAgICAgICAgICAgbGFiZWxzLFxuICAgICAgICAgICAgdmFsdWU6IHN0YXRzLmhpdFJhdGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnZ2F1Z2UnIGFzIGNvbnN0LFxuICAgICAgICAgICAgbmFtZTogJ2NhY2hlLmxydS5zaXplX2N1cnJlbnQnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50IG51bWJlciBvZiBlbnRyaWVzIGluIGNhY2hlJyxcbiAgICAgICAgICAgIGxhYmVscyxcbiAgICAgICAgICAgIHZhbHVlOiBzdGF0cy5zaXplLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICAgIG5hbWU6ICdjYWNoZS5scnUuc2l6ZV9tYXgnLFxuICAgICAgICAgICAgc291cmNlOiBTT1VSQ0UsXG4gICAgICAgICAgICB1bml0OiAnY291bnQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdNYXhpbXVtIGNhcGFjaXR5IG9mIHRoZSBjYWNoZScsXG4gICAgICAgICAgICBsYWJlbHMsXG4gICAgICAgICAgICB2YWx1ZTogc3RhdHMubWF4U2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdnYXVnZScgYXMgY29uc3QsXG4gICAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1Lm1lbW9yeV91c2VkX21lZ2FieXRlcycsXG4gICAgICAgICAgICBzb3VyY2U6IFNPVVJDRSxcbiAgICAgICAgICAgIHVuaXQ6ICdtZWdhYnl0ZXMnIGFzIGNvbnN0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFc3RpbWF0ZWQgbWVtb3J5IHVzZWQgYnkgY2FjaGVkIGVudHJpZXMgKE1CKScsXG4gICAgICAgICAgICBsYWJlbHMsXG4gICAgICAgICAgICB2YWx1ZTogc3RhdHMubWVtb3J5VXNhZ2VNQixcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFJlY29yZCBmYWlsdXJlIGFzIGEgbWV0cmljIHNvIGl0J3MgdmlzaWJsZSBpbiB0aGUgZGFzaGJvYXJkLlxuICAgICAgICAvLyBJbmRpdmlkdWFsIGNhY2hlIGZhaWx1cmVzIHNob3VsZCBub3QgcHJldmVudCBvdGhlciBjYWNoZXMgZnJvbSByZXBvcnRpbmcuXG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2dhdWdlJyBhcyBjb25zdCxcbiAgICAgICAgICBuYW1lOiAnY2FjaGUubHJ1LmNvbGxlY3Rpb25fZXJyb3InLFxuICAgICAgICAgIHNvdXJjZTogU09VUkNFLFxuICAgICAgICAgIHVuaXQ6ICdjb3VudCcgYXMgY29uc3QsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGBGYWlsZWQgdG8gY29sbGVjdCBzdGF0czogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCxcbiAgICAgICAgICBsYWJlbHM6IHsgY2FjaGU6IG5hbWUgfSxcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cbiJdfQ==