@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
JavaScript
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==