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.

110 lines 15.9 kB
import { RelationshipTypes } from '../types/RelationshipTypes.js'; /** * Builds normalized element definitions for the enhanced index. */ export class ElementDefinitionBuilder { build(entry, existingIndex) { const entryName = entry.metadata?.name || 'unknown'; const existing = existingIndex?.elements[entry.elementType]?.[entryName]; const definition = { core: { name: entryName, type: entry.elementType, version: entry.metadata?.version, description: entry.metadata?.description, created: entry.metadata?.created, updated: entry.metadata?.updated || new Date().toISOString() } }; if (entry.metadata?.keywords || entry.metadata?.tags || entry.metadata?.triggers) { definition.search = { keywords: entry.metadata?.keywords, tags: entry.metadata?.tags, triggers: entry.metadata?.triggers }; // Per-element trigger detail available via element inspection; // aggregate counts logged in "Enhanced index built" summary } if (existing?.custom) { definition.custom = existing.custom; } if (existing?.relationships) { definition.relationships = existing.relationships; } // Issue #749: Extract `activates` references from agent metadata as relationships const activatesRels = this.extractActivatesRelationships(entry); if (activatesRels.length > 0) { if (!definition.relationships) { definition.relationships = {}; } const existing_uses = definition.relationships[RelationshipTypes.USES] || []; definition.relationships[RelationshipTypes.USES] = [...existing_uses, ...activatesRels]; } if (existing?.actions) { definition.actions = existing.actions; } if (!definition.actions) { definition.actions = this.generateDefaultActions(entry); } return definition; } /** * Extract relationships from agent `activates` metadata. * Maps `activates: { skills: ['foo'], templates: ['bar'] }` to * BaseRelationship entries with type 'uses'. */ extractActivatesRelationships(entry) { const activates = entry.metadata?.activates; if (!activates || typeof activates !== 'object') { return []; } const relationships = []; for (const [elementType, names] of Object.entries(activates)) { if (!Array.isArray(names)) continue; for (const name of names) { if (typeof name === 'string' && name.length > 0) { relationships.push({ element: `${elementType}:${name}`, type: RelationshipTypes.USES, strength: 1.0 }); } } } return relationships; } generateDefaultActions(entry) { const actions = {}; const entryName = entry.metadata?.name || ''; if (!entryName) { return undefined; } switch (entry.elementType) { case 'personas': if (entryName.includes('debug')) { actions.debug = { verb: 'debug', behavior: 'activate', confidence: 0.8 }; actions.fix = { verb: 'fix', behavior: 'activate', confidence: 0.7 }; } if (entryName.includes('creative')) { actions.write = { verb: 'write', behavior: 'activate', confidence: 0.8 }; actions.create = { verb: 'create', behavior: 'activate', confidence: 0.8 }; } break; case 'memories': if (entryName.includes('session')) { actions.recall = { verb: 'recall', behavior: 'retrieve', confidence: 0.7 }; actions.remember = { verb: 'remember', behavior: 'retrieve', confidence: 0.7 }; } break; case 'skills': actions.use = { verb: 'use', behavior: 'execute', confidence: 0.6 }; actions.apply = { verb: 'apply', behavior: 'execute', confidence: 0.6 }; break; default: break; } return Object.keys(actions).length > 0 ? actions : undefined; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudERlZmluaXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BvcnRmb2xpby9lbmhhbmNlZC1pbmRleC9FbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBQzVCLEtBQUssQ0FDVixLQUFpQixFQUNqQixhQUFtQztRQUVuQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsYUFBYSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6RSxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDdkIsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTztnQkFDaEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVztnQkFDeEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTztnQkFDaEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQzdEO1NBQ0YsQ0FBQztRQUVGLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUNqRixVQUFVLENBQUMsTUFBTSxHQUFHO2dCQUNsQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEs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RUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUN4RSxNQUFNO1lBRVI7Z0JBQ0UsTUFBTTtRQUNWLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDL0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleEVudHJ5IH0gZnJvbSAnLi4vUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQWN0aW9uRGVmaW5pdGlvbixcbiAgRWxlbWVudERlZmluaXRpb24sXG4gIEVuaGFuY2VkSW5kZXgsXG4gIFJlbGF0aW9uc2hpcFxufSBmcm9tICcuLi90eXBlcy9JbmRleFR5cGVzLmpzJztcbmltcG9ydCB7IFJlbGF0aW9uc2hpcFR5cGVzIH0gZnJvbSAnLi4vdHlwZXMvUmVsYXRpb25zaGlwVHlwZXMuanMnO1xuXG4vKipcbiAqIEJ1aWxkcyBub3JtYWxpemVkIGVsZW1lbnQgZGVmaW5pdGlvbnMgZm9yIHRoZSBlbmhhbmNlZCBpbmRleC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVsZW1lbnREZWZpbml0aW9uQnVpbGRlciB7XG4gIHB1YmxpYyBidWlsZChcbiAgICBlbnRyeTogSW5kZXhFbnRyeSxcbiAgICBleGlzdGluZ0luZGV4OiBFbmhhbmNlZEluZGV4IHwgbnVsbFxuICApOiBFbGVtZW50RGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZW50cnlOYW1lID0gZW50cnkubWV0YWRhdGE/Lm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZXhpc3RpbmdJbmRleD8uZWxlbWVudHNbZW50cnkuZWxlbWVudFR5cGVdPy5bZW50cnlOYW1lXTtcblxuICAgIGNvbnN0IGRlZmluaXRpb246IEVsZW1lbnREZWZpbml0aW9uID0ge1xuICAgICAgY29yZToge1xuICAgICAgICBuYW1lOiBlbnRyeU5hbWUsXG4gICAgICAgIHR5cGU6IGVudHJ5LmVsZW1lbnRUeXBlLFxuICAgICAgICB2ZXJzaW9uOiBlbnRyeS5tZXRhZGF0YT8udmVyc2lvbixcbiAgICAgICAgZGVzY3JpcHRpb246IGVudHJ5Lm1ldGFkYXRhPy5kZXNjcmlwdGlvbixcbiAgICAgICAgY3JlYXRlZDogZW50cnkubWV0YWRhdGE/LmNyZWF0ZWQsXG4gICAgICAgIHVwZGF0ZWQ6IGVudHJ5Lm1ldGFkYXRhPy51cGRhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoZW50cnkubWV0YWRhdGE/LmtleXdvcmRzIHx8IGVudHJ5Lm1ldGFkYXRhPy50YWdzIHx8IGVudHJ5Lm1ldGFkYXRhPy50cmlnZ2Vycykge1xuICAgICAgZGVmaW5pdGlvbi5zZWFyY2ggPSB7XG4gICAgICAgIGtleXdvcmRzOiBlbnRyeS5tZXRhZGF0YT8ua2V5d29yZHMsXG4gICAgICAgIHRhZ3M6IGVudHJ5Lm1ldGFkYXRhPy50YWdzLFxuICAgICAgICB0cmlnZ2VyczogZW50cnkubWV0YWRhdGE/LnRyaWdnZXJzXG4gICAgICB9O1xuXG4gICAgICAvLyBQZXItZWxlbWVudCB0cmlnZ2VyIGRldGFpbCBhdmFpbGFibGUgdmlhIGVsZW1lbnQgaW5zcGVjdGlvbjtcbiAgICAgIC8vIGFnZ3JlZ2F0ZSBjb3VudHMgbG9nZ2VkIGluIFwiRW5oYW5jZWQgaW5kZXggYnVpbHRcIiBzdW1tYXJ5XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nPy5jdXN0b20pIHtcbiAgICAgIGRlZmluaXRpb24uY3VzdG9tID0gZXhpc3RpbmcuY3VzdG9tO1xuICAgIH1cblxuICAgIGlmIChleGlzdGluZz8ucmVsYXRpb25zaGlwcykge1xuICAgICAgZGVmaW5pdGlvbi5yZWxhdGlvbnNoaXBzID0gZXhpc3RpbmcucmVsYXRpb25zaGlwcztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzQ5OiBFeHRyYWN0IGBhY3RpdmF0ZXNgIHJlZmVyZW5jZXMgZnJvbSBhZ2VudCBtZXRhZGF0YSBhcyByZWxhdGlvbnNoaXBzXG4gICAgY29uc3QgYWN0aXZhdGVzUmVscyA9IHRoaXMuZXh0cmFjdEFjdGl2YXRlc1JlbGF0aW9uc2hpcHMoZW50cnkpO1xuICAgIGlmIChhY3RpdmF0ZXNSZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghZGVmaW5pdGlvbi5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGRlZmluaXRpb24ucmVsYXRpb25zaGlwcyA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgZXhpc3RpbmdfdXNlcyA9IGRlZmluaXRpb24ucmVsYXRpb25zaGlwc1tSZWxhdGlvbnNoaXBUeXBlcy5VU0VTXSB8fCBbXTtcbiAgICAgIGRlZmluaXRpb24ucmVsYXRpb25zaGlwc1tSZWxhdGlvbnNoaXBUeXBlcy5VU0VTXSA9IFsuLi5leGlzdGluZ191c2VzLCAuLi5hY3RpdmF0ZXNSZWxzXTtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3Rpbmc/LmFjdGlvbnMpIHtcbiAgICAgIGRlZmluaXRpb24uYWN0aW9ucyA9IGV4aXN0aW5nLmFjdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFkZWZpbml0aW9uLmFjdGlvbnMpIHtcbiAgICAgIGRlZmluaXRpb24uYWN0aW9ucyA9IHRoaXMuZ2VuZXJhdGVEZWZhdWx0QWN0aW9ucyhlbnRyeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCByZWxhdGlvbnNoaXBzIGZyb20gYWdlbnQgYGFjdGl2YXRlc2AgbWV0YWRhdGEuXG4gICAqIE1hcHMgYGFjdGl2YXRlczogeyBza2lsbHM6IFsnZm9vJ10sIHRlbXBsYXRlczogWydiYXInXSB9YCB0b1xuICAgKiBCYXNlUmVsYXRpb25zaGlwIGVudHJpZXMgd2l0aCB0eXBlICd1c2VzJy5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEFjdGl2YXRlc1JlbGF0aW9uc2hpcHMoZW50cnk6IEluZGV4RW50cnkpOiBSZWxhdGlvbnNoaXBbXSB7XG4gICAgY29uc3QgYWN0aXZhdGVzID0gZW50cnkubWV0YWRhdGE/LmFjdGl2YXRlcztcbiAgICBpZiAoIWFjdGl2YXRlcyB8fCB0eXBlb2YgYWN0aXZhdGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHM6IFJlbGF0aW9uc2hpcFtdID0gW107XG4gICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIG5hbWVzXSBvZiBPYmplY3QuZW50cmllcyhhY3RpdmF0ZXMpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobmFtZXMpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIG5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlbGF0aW9uc2hpcHMucHVzaCh7XG4gICAgICAgICAgICBlbGVtZW50OiBgJHtlbGVtZW50VHlwZX06JHtuYW1lfWAsXG4gICAgICAgICAgICB0eXBlOiBSZWxhdGlvbnNoaXBUeXBlcy5VU0VTLFxuICAgICAgICAgICAgc3RyZW5ndGg6IDEuMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRGVmYXVsdEFjdGlvbnMoZW50cnk6IEluZGV4RW50cnkpOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25EZWZpbml0aW9uPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWN0aW9uczogUmVjb3JkPHN0cmluZywgQWN0aW9uRGVmaW5pdGlvbj4gPSB7fTtcbiAgICBjb25zdCBlbnRyeU5hbWUgPSBlbnRyeS5tZXRhZGF0YT8ubmFtZSB8fCAnJztcblxuICAgIGlmICghZW50cnlOYW1lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZW50cnkuZWxlbWVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ3BlcnNvbmFzJzpcbiAgICAgICAgaWYgKGVudHJ5TmFtZS5pbmNsdWRlcygnZGVidWcnKSkge1xuICAgICAgICAgIGFjdGlvbnMuZGVidWcgPSB7IHZlcmI6ICdkZWJ1ZycsIGJlaGF2aW9yOiAnYWN0aXZhdGUnLCBjb25maWRlbmNlOiAwLjggfTtcbiAgICAgICAgICBhY3Rpb25zLmZpeCA9IHsgdmVyYjogJ2ZpeCcsIGJlaGF2aW9yOiAnYWN0aXZhdGUnLCBjb25maWRlbmNlOiAwLjcgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlOYW1lLmluY2x1ZGVzKCdjcmVhdGl2ZScpKSB7XG4gICAgICAgICAgYWN0aW9ucy53cml0ZSA9IHsgdmVyYjogJ3dyaXRlJywgYmVoYXZpb3I6ICdhY3RpdmF0ZScsIGNvbmZpZGVuY2U6IDAuOCB9O1xuICAgICAgICAgIGFjdGlvbnMuY3JlYXRlID0geyB2ZXJiOiAnY3JlYXRlJywgYmVoYXZpb3I6ICdhY3RpdmF0ZScsIGNvbmZpZGVuY2U6IDAuOCB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtZW1vcmllcyc6XG4gICAgICAgIGlmIChlbnRyeU5hbWUuaW5jbHVkZXMoJ3Nlc3Npb24nKSkge1xuICAgICAgICAgIGFjdGlvbnMucmVjYWxsID0geyB2ZXJiOiAncmVjYWxsJywgYmVoYXZpb3I6ICdyZXRyaWV2ZScsIGNvbmZpZGVuY2U6IDAuNyB9O1xuICAgICAgICAgIGFjdGlvbnMucmVtZW1iZXIgPSB7IHZlcmI6ICdyZW1lbWJlcicsIGJlaGF2aW9yOiAncmV0cmlldmUnLCBjb25maWRlbmNlOiAwLjcgfTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgYWN0aW9ucy51c2UgPSB7IHZlcmI6ICd1c2UnLCBiZWhhdmlvcjogJ2V4ZWN1dGUnLCBjb25maWRlbmNlOiAwLjYgfTtcbiAgICAgICAgYWN0aW9ucy5hcHBseSA9IHsgdmVyYjogJ2FwcGx5JywgYmVoYXZpb3I6ICdleGVjdXRlJywgY29uZmlkZW5jZTogMC42IH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aW9ucykubGVuZ3RoID4gMCA/IGFjdGlvbnMgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==