@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.
42 lines • 5.66 kB
JavaScript
/**
* Lightweight in-memory accumulator for Gatekeeper policy enforcement metrics.
*
* Records allowed/denied/confirmation-pending decisions, policy source
* distribution, and permission level usage. The companion
* GatekeeperMetricsCollector reads from this tracker each collection cycle.
*/
export class GatekeeperMetricsTracker {
totalDecisions = 0;
allowed = 0;
denied = 0;
confirmationsPending = 0;
byPolicySource = new Map();
byPermissionLevel = new Map();
record(decision) {
this.totalDecisions++;
if (decision.allowed) {
this.allowed++;
}
else {
this.denied++;
}
if (decision.confirmationPending) {
this.confirmationsPending++;
}
const source = decision.policySource ?? 'unknown';
this.byPolicySource.set(source, (this.byPolicySource.get(source) ?? 0) + 1);
const level = decision.permissionLevel;
this.byPermissionLevel.set(level, (this.byPermissionLevel.get(level) ?? 0) + 1);
}
getMetrics() {
return {
totalDecisions: this.totalDecisions,
allowed: this.allowed,
denied: this.denied,
confirmationsPending: this.confirmationsPending,
byPolicySource: new Map(this.byPolicySource),
byPermissionLevel: new Map(this.byPermissionLevel),
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21ldHJpY3MvR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQWtCSCxNQUFNLE9BQU8sd0JBQXdCO0lBQzNCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNaLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDWCxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDaEIsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzNDLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRS9ELE1BQU0sQ0FBQyxRQUFrQztRQUN2QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQztRQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU87WUFDTCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQy9DLGNBQWMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzVDLGlCQUFpQixFQUFFLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUNuRCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMaWdodHdlaWdodCBpbi1tZW1vcnkgYWNjdW11bGF0b3IgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50IG1ldHJpY3MuXG4gKlxuICogUmVjb3JkcyBhbGxvd2VkL2RlbmllZC9jb25maXJtYXRpb24tcGVuZGluZyBkZWNpc2lvbnMsIHBvbGljeSBzb3VyY2VcbiAqIGRpc3RyaWJ1dGlvbiwgYW5kIHBlcm1pc3Npb24gbGV2ZWwgdXNhZ2UuIFRoZSBjb21wYW5pb25cbiAqIEdhdGVrZWVwZXJNZXRyaWNzQ29sbGVjdG9yIHJlYWRzIGZyb20gdGhpcyB0cmFja2VyIGVhY2ggY29sbGVjdGlvbiBjeWNsZS5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGVrZWVwZXJEZWNpc2lvblJlY29yZCB7XG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIHBlcm1pc3Npb25MZXZlbDogc3RyaW5nO1xuICBwb2xpY3lTb3VyY2U/OiBzdHJpbmc7XG4gIGNvbmZpcm1hdGlvblBlbmRpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGVrZWVwZXJNZXRyaWNzIHtcbiAgdG90YWxEZWNpc2lvbnM6IG51bWJlcjtcbiAgYWxsb3dlZDogbnVtYmVyO1xuICBkZW5pZWQ6IG51bWJlcjtcbiAgY29uZmlybWF0aW9uc1BlbmRpbmc6IG51bWJlcjtcbiAgYnlQb2xpY3lTb3VyY2U6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gIGJ5UGVybWlzc2lvbkxldmVsOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xufVxuXG5leHBvcnQgY2xhc3MgR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyIHtcbiAgcHJpdmF0ZSB0b3RhbERlY2lzaW9ucyA9IDA7XG4gIHByaXZhdGUgYWxsb3dlZCA9IDA7XG4gIHByaXZhdGUgZGVuaWVkID0gMDtcbiAgcHJpdmF0ZSBjb25maXJtYXRpb25zUGVuZGluZyA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnlQb2xpY3lTb3VyY2UgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5UGVybWlzc2lvbkxldmVsID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICByZWNvcmQoZGVjaXNpb246IEdhdGVrZWVwZXJEZWNpc2lvblJlY29yZCk6IHZvaWQge1xuICAgIHRoaXMudG90YWxEZWNpc2lvbnMrKztcblxuICAgIGlmIChkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICB0aGlzLmFsbG93ZWQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZW5pZWQrKztcbiAgICB9XG5cbiAgICBpZiAoZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgdGhpcy5jb25maXJtYXRpb25zUGVuZGluZysrO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZSA9IGRlY2lzaW9uLnBvbGljeVNvdXJjZSA/PyAndW5rbm93bic7XG4gICAgdGhpcy5ieVBvbGljeVNvdXJjZS5zZXQoc291cmNlLCAodGhpcy5ieVBvbGljeVNvdXJjZS5nZXQoc291cmNlKSA/PyAwKSArIDEpO1xuXG4gICAgY29uc3QgbGV2ZWwgPSBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWw7XG4gICAgdGhpcy5ieVBlcm1pc3Npb25MZXZlbC5zZXQobGV2ZWwsICh0aGlzLmJ5UGVybWlzc2lvbkxldmVsLmdldChsZXZlbCkgPz8gMCkgKyAxKTtcbiAgfVxuXG4gIGdldE1ldHJpY3MoKTogR2F0ZWtlZXBlck1ldHJpY3Mge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbERlY2lzaW9uczogdGhpcy50b3RhbERlY2lzaW9ucyxcbiAgICAgIGFsbG93ZWQ6IHRoaXMuYWxsb3dlZCxcbiAgICAgIGRlbmllZDogdGhpcy5kZW5pZWQsXG4gICAgICBjb25maXJtYXRpb25zUGVuZGluZzogdGhpcy5jb25maXJtYXRpb25zUGVuZGluZyxcbiAgICAgIGJ5UG9saWN5U291cmNlOiBuZXcgTWFwKHRoaXMuYnlQb2xpY3lTb3VyY2UpLFxuICAgICAgYnlQZXJtaXNzaW9uTGV2ZWw6IG5ldyBNYXAodGhpcy5ieVBlcm1pc3Npb25MZXZlbCksXG4gICAgfTtcbiAgfVxufVxuIl19