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.

95 lines 11.5 kB
/** * 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==