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.

108 lines 16.4 kB
import { logger } from '../../utils/logger.js'; export class ActionTriggerExtractor { context; constructor(context) { this.context = context; } extract(elementDef, elementName) { if (!elementDef) { return { triggers: [], extractedCount: 0 }; } const config = this.context.getConfig(); const patterns = this.context.getPatterns(); const elementTriggers = new Set(); this.extractFromSearchField(elementDef, elementName, elementTriggers, config); this.extractFromActions(elementDef, elementName, elementTriggers, config); this.extractFromKeywords(elementDef, elementName, elementTriggers, config, patterns); return { triggers: Array.from(elementTriggers), extractedCount: elementTriggers.size }; } extractFromSearchField(elementDef, elementName, elementTriggers, config) { if (!elementDef.search?.triggers) return; const triggerArray = this.normalizeToArray(elementDef.search.triggers); for (const trigger of triggerArray) { if (this.hasReachedTriggerLimit(elementTriggers, elementName, config)) { break; } const normalizedTrigger = this.normalizeTrigger(trigger, config); if (!normalizedTrigger) continue; elementTriggers.add(normalizedTrigger); } } extractFromActions(elementDef, elementName, elementTriggers, config) { if (!elementDef.actions) return; for (const [actionKey, action] of Object.entries(elementDef.actions)) { if (this.hasReachedTriggerLimit(elementTriggers, elementName, config)) { break; } const verb = action.verb || actionKey; const normalizedVerb = this.normalizeTrigger(verb, config); if (!normalizedVerb) continue; elementTriggers.add(normalizedVerb); } } extractFromKeywords(elementDef, elementName, elementTriggers, config, patterns) { if (!elementDef.search?.keywords) return; const keywords = this.normalizeToArray(elementDef.search.keywords); const limit = Math.min(keywords.length, config.limits.maxKeywordsToCheck); for (let i = 0; i < limit; i++) { const keyword = keywords[i]; if (this.hasReachedTriggerLimit(elementTriggers, elementName, config)) { break; } const normalizedKeyword = this.normalizeTrigger(keyword, config); if (!normalizedKeyword || !this.looksLikeVerb(normalizedKeyword, patterns)) { continue; } elementTriggers.add(normalizedKeyword); } } normalizeToArray(value) { if (!value) return []; if (Array.isArray(value)) { return value.filter(v => typeof v === 'string'); } if (typeof value === 'string') { return [value]; } return []; } normalizeTrigger(trigger, config) { if (typeof trigger !== 'string') return null; const normalized = trigger.trim().toLowerCase(); if (!normalized || normalized.length > config.limits.maxTriggerLength || !/^[a-z][a-z-]*$/.test(normalized)) { return null; } return normalized; } hasReachedTriggerLimit(elementTriggers, elementName, config) { if (elementTriggers.size < config.limits.maxTriggersPerElement) { return false; } logger.warn('Trigger limit exceeded for element', { elementName, limit: config.limits.maxTriggersPerElement }); return true; } looksLikeVerb(word, patterns) { const lowerWord = word.toLowerCase(); if (patterns.nounSuffixPattern.test(lowerWord)) { return false; } return patterns.verbPrefixPattern.test(lowerWord) || patterns.verbSuffixPattern.test(lowerWord); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uVHJpZ2dlckV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb3J0Zm9saW8vZW5oYW5jZWQtaW5kZXgvQWN0aW9uVHJpZ2dlckV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFtQy9DLE1BQU0sT0FBTyxzQkFBc0I7SUFDSjtJQUE3QixZQUE2QixPQUFzQztRQUF0QyxZQUFPLEdBQVAsT0FBTyxDQUErQjtJQUFHLENBQUM7SUFFaEUsT0FBTyxDQUNaLFVBQWdELEVBQ2hELFdBQW1CO1FBRW5CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRTFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVyRixPQUFPO1lBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3JDLGNBQWMsRUFBRSxlQUFlLENBQUMsSUFBSTtTQUNy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QztJQUVPLGFBQWEsQ0FBQyxJQUFZLEVBQUUsUUFBbUM7UUFDckUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXJDLElBQUksUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uL3R5cGVzL0luZGV4VHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWdnZXJFeHRyYWN0aW9uQ29uZmlnIHtcbiAgbGltaXRzOiB7XG4gICAgbWF4VHJpZ2dlcnNQZXJFbGVtZW50OiBudW1iZXI7XG4gICAgbWF4VHJpZ2dlckxlbmd0aDogbnVtYmVyO1xuICAgIG1heEtleXdvcmRzVG9DaGVjazogbnVtYmVyO1xuICB9O1xuICB2ZXJiUHJlZml4ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgdmVyYlN1ZmZpeGVzOiBzdHJpbmdbXTtcbiAgbm91blN1ZmZpeGVzOiBzdHJpbmdbXTtcbiAgdGVsZW1ldHJ5OiB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBzYW1wbGVSYXRlOiBudW1iZXI7XG4gICAgbWV0cmljc0ludGVydmFsOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpZ2dlckV4dHJhY3Rpb25QYXR0ZXJucyB7XG4gIHZlcmJQcmVmaXhQYXR0ZXJuOiBSZWdFeHA7XG4gIHZlcmJTdWZmaXhQYXR0ZXJuOiBSZWdFeHA7XG4gIG5vdW5TdWZmaXhQYXR0ZXJuOiBSZWdFeHA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpZ2dlckV4dHJhY3Rpb25SZXN1bHQge1xuICB0cmlnZ2Vyczogc3RyaW5nW107XG4gIGV4dHJhY3RlZENvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVHJpZ2dlckV4dHJhY3RvckNvbnRleHQge1xuICBnZXRDb25maWc6ICgpID0+IFRyaWdnZXJFeHRyYWN0aW9uQ29uZmlnO1xuICBnZXRQYXR0ZXJuczogKCkgPT4gVHJpZ2dlckV4dHJhY3Rpb25QYXR0ZXJucztcbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblRyaWdnZXJFeHRyYWN0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IEFjdGlvblRyaWdnZXJFeHRyYWN0b3JDb250ZXh0KSB7fVxuXG4gIHB1YmxpYyBleHRyYWN0KFxuICAgIGVsZW1lbnREZWY6IEVsZW1lbnREZWZpbml0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nXG4gICk6IFRyaWdnZXJFeHRyYWN0aW9uUmVzdWx0IHtcbiAgICBpZiAoIWVsZW1lbnREZWYpIHtcbiAgICAgIHJldHVybiB7IHRyaWdnZXJzOiBbXSwgZXh0cmFjdGVkQ291bnQ6IDAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbnRleHQuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmNvbnRleHQuZ2V0UGF0dGVybnMoKTtcbiAgICBjb25zdCBlbGVtZW50VHJpZ2dlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRoaXMuZXh0cmFjdEZyb21TZWFyY2hGaWVsZChlbGVtZW50RGVmLCBlbGVtZW50TmFtZSwgZWxlbWVudFRyaWdnZXJzLCBjb25maWcpO1xuICAgIHRoaXMuZXh0cmFjdEZyb21BY3Rpb25zKGVsZW1lbnREZWYsIGVsZW1lbnROYW1lLCBlbGVtZW50VHJpZ2dlcnMsIGNvbmZpZyk7XG4gICAgdGhpcy5leHRyYWN0RnJvbUtleXdvcmRzKGVsZW1lbnREZWYsIGVsZW1lbnROYW1lLCBlbGVtZW50VHJpZ2dlcnMsIGNvbmZpZywgcGF0dGVybnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyaWdnZXJzOiBBcnJheS5mcm9tKGVsZW1lbnRUcmlnZ2VycyksXG4gICAgICBleHRyYWN0ZWRDb3VudDogZWxlbWVudFRyaWdnZXJzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0RnJvbVNlYXJjaEZpZWxkKFxuICAgIGVsZW1lbnREZWY6IEVsZW1lbnREZWZpbml0aW9uLFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgZWxlbWVudFRyaWdnZXJzOiBTZXQ8c3RyaW5nPixcbiAgICBjb25maWc6IFRyaWdnZXJFeHRyYWN0aW9uQ29uZmlnXG4gICk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudERlZi5zZWFyY2g/LnRyaWdnZXJzKSByZXR1cm47XG4gICAgY29uc3QgdHJpZ2dlckFycmF5ID0gdGhpcy5ub3JtYWxpemVUb0FycmF5KGVsZW1lbnREZWYuc2VhcmNoLnRyaWdnZXJzKTtcblxuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGlmICh0aGlzLmhhc1JlYWNoZWRUcmlnZ2VyTGltaXQoZWxlbWVudFRyaWdnZXJzLCBlbGVtZW50TmFtZSwgY29uZmlnKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFRyaWdnZXIgPSB0aGlzLm5vcm1hbGl6ZVRyaWdnZXIodHJpZ2dlciwgY29uZmlnKTtcbiAgICAgIGlmICghbm9ybWFsaXplZFRyaWdnZXIpIGNvbnRpbnVlO1xuXG4gICAgICBlbGVtZW50VHJpZ2dlcnMuYWRkKG5vcm1hbGl6ZWRUcmlnZ2VyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RGcm9tQWN0aW9ucyhcbiAgICBlbGVtZW50RGVmOiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUcmlnZ2VyczogU2V0PHN0cmluZz4sXG4gICAgY29uZmlnOiBUcmlnZ2VyRXh0cmFjdGlvbkNvbmZpZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoIWVsZW1lbnREZWYuYWN0aW9ucykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBbYWN0aW9uS2V5LCBhY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnREZWYuYWN0aW9ucykpIHtcbiAgICAgIGlmICh0aGlzLmhhc1JlYWNoZWRUcmlnZ2VyTGltaXQoZWxlbWVudFRyaWdnZXJzLCBlbGVtZW50TmFtZSwgY29uZmlnKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmVyYiA9IGFjdGlvbi52ZXJiIHx8IGFjdGlvbktleTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWZXJiID0gdGhpcy5ub3JtYWxpemVUcmlnZ2VyKHZlcmIsIGNvbmZpZyk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWRWZXJiKSBjb250aW51ZTtcblxuICAgICAgZWxlbWVudFRyaWdnZXJzLmFkZChub3JtYWxpemVkVmVyYik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0RnJvbUtleXdvcmRzKFxuICAgIGVsZW1lbnREZWY6IEVsZW1lbnREZWZpbml0aW9uLFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgZWxlbWVudFRyaWdnZXJzOiBTZXQ8c3RyaW5nPixcbiAgICBjb25maWc6IFRyaWdnZXJFeHRyYWN0aW9uQ29uZmlnLFxuICAgIHBhdHRlcm5zOiBUcmlnZ2VyRXh0cmFjdGlvblBhdHRlcm5zXG4gICk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudERlZi5zZWFyY2g/LmtleXdvcmRzKSByZXR1cm47XG5cbiAgICBjb25zdCBrZXl3b3JkcyA9IHRoaXMubm9ybWFsaXplVG9BcnJheShlbGVtZW50RGVmLnNlYXJjaC5rZXl3b3Jkcyk7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihrZXl3b3Jkcy5sZW5ndGgsIGNvbmZpZy5saW1pdHMubWF4S2V5d29yZHNUb0NoZWNrKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykge1xuICAgICAgY29uc3Qga2V5d29yZCA9IGtleXdvcmRzW2ldO1xuICAgICAgaWYgKHRoaXMuaGFzUmVhY2hlZFRyaWdnZXJMaW1pdChlbGVtZW50VHJpZ2dlcnMsIGVsZW1lbnROYW1lLCBjb25maWcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5d29yZCA9IHRoaXMubm9ybWFsaXplVHJpZ2dlcihrZXl3b3JkLCBjb25maWcpO1xuICAgICAgaWYgKCFub3JtYWxpemVkS2V5d29yZCB8fCAhdGhpcy5sb29rc0xpa2VWZXJiKG5vcm1hbGl6ZWRLZXl3b3JkLCBwYXR0ZXJucykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRUcmlnZ2Vycy5hZGQobm9ybWFsaXplZEtleXdvcmQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVG9BcnJheSh2YWx1ZTogYW55KTogc3RyaW5nW10ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5maWx0ZXIodiA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVHJpZ2dlcih0cmlnZ2VyOiBhbnksIGNvbmZpZzogVHJpZ2dlckV4dHJhY3Rpb25Db25maWcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIHRyaWdnZXIgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0cmlnZ2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghbm9ybWFsaXplZCB8fFxuICAgICAgICBub3JtYWxpemVkLmxlbmd0aCA+IGNvbmZpZy5saW1pdHMubWF4VHJpZ2dlckxlbmd0aCB8fFxuICAgICAgICAhL15bYS16XVthLXotXSokLy50ZXN0KG5vcm1hbGl6ZWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUmVhY2hlZFRyaWdnZXJMaW1pdChcbiAgICBlbGVtZW50VHJpZ2dlcnM6IFNldDxzdHJpbmc+LFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnOiBUcmlnZ2VyRXh0cmFjdGlvbkNvbmZpZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoZWxlbWVudFRyaWdnZXJzLnNpemUgPCBjb25maWcubGltaXRzLm1heFRyaWdnZXJzUGVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKCdUcmlnZ2VyIGxpbWl0IGV4Y2VlZGVkIGZvciBlbGVtZW50Jywge1xuICAgICAgZWxlbWVudE5hbWUsXG4gICAgICBsaW1pdDogY29uZmlnLmxpbWl0cy5tYXhUcmlnZ2Vyc1BlckVsZW1lbnRcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbG9va3NMaWtlVmVyYih3b3JkOiBzdHJpbmcsIHBhdHRlcm5zOiBUcmlnZ2VyRXh0cmFjdGlvblBhdHRlcm5zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbG93ZXJXb3JkID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHBhdHRlcm5zLm5vdW5TdWZmaXhQYXR0ZXJuLnRlc3QobG93ZXJXb3JkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXR0ZXJucy52ZXJiUHJlZml4UGF0dGVybi50ZXN0KGxvd2VyV29yZCkgfHxcbiAgICAgICAgICAgcGF0dGVybnMudmVyYlN1ZmZpeFBhdHRlcm4udGVzdChsb3dlcldvcmQpO1xuICB9XG59XG4iXX0=