@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.
105 lines (98 loc) ⢠11.8 kB
JavaScript
/**
* Persona export functionality
*/
import { isDefaultPersona } from '../../constants/defaultPersonas.js';
import { MAX_PERSONA_SIZE } from '../../constants/limits.js';
export class PersonaExporter {
getCurrentUser;
constructor(currentUser) {
if (typeof currentUser === 'function') {
this.getCurrentUser = currentUser;
}
else {
this.getCurrentUser = () => currentUser;
}
}
/**
* Export a single persona to JSON format
*/
exportPersona(persona) {
// Check size limit
const size = JSON.stringify(persona).length;
if (size > MAX_PERSONA_SIZE) {
throw new Error(`Persona too large (${Math.round(size / 1024)}KB). Maximum size is ${Math.round(MAX_PERSONA_SIZE / 1024)}KB`);
}
return {
metadata: persona.metadata,
instructions: persona.instructions, // Fix #917: Preserve behavioral directives on export
content: persona.content,
filename: persona.filename,
exportedAt: new Date().toISOString(),
exportedBy: this.getCurrentUser() || undefined
};
}
/**
* Export multiple personas to a bundle
*/
exportBundle(personas, includeDefaults = true) {
const filteredPersonas = includeDefaults
? personas
: personas.filter(p => !isDefaultPersona(p.filename));
return {
version: '1.0.0',
exportedAt: new Date().toISOString(),
exportedBy: this.getCurrentUser() || undefined,
personaCount: filteredPersonas.length,
personas: filteredPersonas.map(p => this.exportPersona(p))
};
}
/**
* Convert export to base64 for easy sharing
*/
toBase64(data) {
const json = JSON.stringify(data, null, 2);
return Buffer.from(json).toString('base64');
}
/**
* Format export result for display
*/
formatExportResult(persona, base64) {
return `ā
Successfully exported "${persona.metadata.name}"
š¦ Export Details:
- Filename: ${persona.filename}
- Version: ${persona.metadata.version || '1.0'}
- Author: ${persona.metadata.author || 'unknown'}
- Size: ${base64.length} characters (base64)
š Export Data (Copy this to share):
\`\`\`
${base64}
\`\`\`
š” To import this persona:
- Use: import_persona "<paste the base64 data here>"
- Or save to a file and use: import_persona "/path/to/file.json"`;
}
/**
* Format bundle export result
*/
formatBundleResult(bundle, base64) {
const personaList = bundle.personas
.map(p => ` - ${p.metadata.name} (${p.filename})`)
.join('\n');
return `ā
Successfully exported ${bundle.personaCount} personas
š¦ Bundle Details:
- Export Version: ${bundle.version}
- Exported At: ${new Date(bundle.exportedAt).toLocaleString()}
- Exported By: ${bundle.exportedBy || 'anonymous'}
- Total Size: ${base64.length} characters (base64)
š Personas Included:
${personaList}
š¾ Export Data (Copy this to share):
\`\`\`
${base64}
\`\`\`
š” To import this bundle:
- Use: import_persona "<paste the base64 data here>"
- Or save to a file and use: import_persona "/path/to/bundle.json"`;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYUV4cG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9QZXJzb25hRXhwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFHSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQXFCN0QsTUFBTSxPQUFPLGVBQWU7SUFDVCxjQUFjLENBQXNCO0lBRXJELFlBQVksV0FBZ0Q7UUFDMUQsSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQWtDLENBQUM7UUFDM0QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLE9BQWdCO1FBQzVCLG1CQUFtQjtRQUNuQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFDLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUgsQ0FBQztRQUVELE9BQU87WUFDTCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUcscURBQXFEO1lBQzFGLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksU0FBUztTQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLFFBQW1CLEVBQUUsa0JBQTJCLElBQUk7UUFDL0QsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlO1lBQ3RDLENBQUMsQ0FBQyxRQUFRO1lBQ1YsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXhELE9BQU87WUFDTCxPQUFPLEVBQUUsT0FBTztZQUNoQixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxTQUFTO1lBQzlDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO1lBQ3JDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsSUFBb0M7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxNQUFjO1FBQ2pELE9BQU8sNEJBQTRCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTs7O2NBRzlDLE9BQU8sQ0FBQyxRQUFRO2FBQ2pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEtBQUs7WUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUztVQUN0QyxNQUFNLENBQUMsTUFBTTs7OztFQUlyQixNQUFNOzs7OztpRUFLeUQsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxNQUFvQixFQUFFLE1BQWM7UUFDckQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVE7YUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUM7YUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWQsT0FBTywyQkFBMkIsTUFBTSxDQUFDLFlBQVk7OztvQkFHckMsTUFBTSxDQUFDLE9BQU87aUJBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxjQUFjLEVBQUU7aUJBQzVDLE1BQU0sQ0FBQyxVQUFVLElBQUksV0FBVztnQkFDakMsTUFBTSxDQUFDLE1BQU07OztFQUczQixXQUFXOzs7O0VBSVgsTUFBTTs7Ozs7bUVBSzJELENBQUM7SUFDbEUsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXJzb25hIGV4cG9ydCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHsgUGVyc29uYSB9IGZyb20gJy4uLy4uL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgaXNEZWZhdWx0UGVyc29uYSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9kZWZhdWx0UGVyc29uYXMuanMnO1xuaW1wb3J0IHsgTUFYX1BFUlNPTkFfU0laRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9saW1pdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydGVkUGVyc29uYSB7XG4gIG1ldGFkYXRhOiBhbnk7XG4gIGluc3RydWN0aW9ucz86IHN0cmluZzsgIC8vIEZpeCAjOTE3OiBCZWhhdmlvcmFsIGRpcmVjdGl2ZXMg4oCUIHByZXZpb3VzbHkgb21pdHRlZCwgY2F1c2luZyBzaWxlbnQgZGF0YSBsb3NzXG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZXhwb3J0ZWRBdDogc3RyaW5nO1xuICBleHBvcnRlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEJ1bmRsZSB7XG4gIHZlcnNpb246IHN0cmluZztcbiAgZXhwb3J0ZWRBdDogc3RyaW5nO1xuICBleHBvcnRlZEJ5Pzogc3RyaW5nO1xuICBwZXJzb25hQ291bnQ6IG51bWJlcjtcbiAgcGVyc29uYXM6IEV4cG9ydGVkUGVyc29uYVtdO1xufVxuXG50eXBlIEN1cnJlbnRVc2VyUHJvdmlkZXIgPSAoKSA9PiBzdHJpbmcgfCBudWxsO1xuXG5leHBvcnQgY2xhc3MgUGVyc29uYUV4cG9ydGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRDdXJyZW50VXNlcjogQ3VycmVudFVzZXJQcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihjdXJyZW50VXNlcjogc3RyaW5nIHwgbnVsbCB8IEN1cnJlbnRVc2VyUHJvdmlkZXIpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRVc2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmdldEN1cnJlbnRVc2VyID0gY3VycmVudFVzZXIgYXMgQ3VycmVudFVzZXJQcm92aWRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRDdXJyZW50VXNlciA9ICgpID0+IGN1cnJlbnRVc2VyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBzaW5nbGUgcGVyc29uYSB0byBKU09OIGZvcm1hdFxuICAgKi9cbiAgZXhwb3J0UGVyc29uYShwZXJzb25hOiBQZXJzb25hKTogRXhwb3J0ZWRQZXJzb25hIHtcbiAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgY29uc3Qgc2l6ZSA9IEpTT04uc3RyaW5naWZ5KHBlcnNvbmEpLmxlbmd0aDtcbiAgICBpZiAoc2l6ZSA+IE1BWF9QRVJTT05BX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGVyc29uYSB0b28gbGFyZ2UgKCR7TWF0aC5yb3VuZChzaXplLzEwMjQpfUtCKS4gTWF4aW11bSBzaXplIGlzICR7TWF0aC5yb3VuZChNQVhfUEVSU09OQV9TSVpFLzEwMjQpfUtCYCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcGVyc29uYS5tZXRhZGF0YSxcbiAgICAgIGluc3RydWN0aW9uczogcGVyc29uYS5pbnN0cnVjdGlvbnMsICAvLyBGaXggIzkxNzogUHJlc2VydmUgYmVoYXZpb3JhbCBkaXJlY3RpdmVzIG9uIGV4cG9ydFxuICAgICAgY29udGVudDogcGVyc29uYS5jb250ZW50LFxuICAgICAgZmlsZW5hbWU6IHBlcnNvbmEuZmlsZW5hbWUsXG4gICAgICBleHBvcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBleHBvcnRlZEJ5OiB0aGlzLmdldEN1cnJlbnRVc2VyKCkgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgbXVsdGlwbGUgcGVyc29uYXMgdG8gYSBidW5kbGVcbiAgICovXG4gIGV4cG9ydEJ1bmRsZShwZXJzb25hczogUGVyc29uYVtdLCBpbmNsdWRlRGVmYXVsdHM6IGJvb2xlYW4gPSB0cnVlKTogRXhwb3J0QnVuZGxlIHtcbiAgICBjb25zdCBmaWx0ZXJlZFBlcnNvbmFzID0gaW5jbHVkZURlZmF1bHRzIFxuICAgICAgPyBwZXJzb25hcyBcbiAgICAgIDogcGVyc29uYXMuZmlsdGVyKHAgPT4gIWlzRGVmYXVsdFBlcnNvbmEocC5maWxlbmFtZSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICBleHBvcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBleHBvcnRlZEJ5OiB0aGlzLmdldEN1cnJlbnRVc2VyKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgcGVyc29uYUNvdW50OiBmaWx0ZXJlZFBlcnNvbmFzLmxlbmd0aCxcbiAgICAgIHBlcnNvbmFzOiBmaWx0ZXJlZFBlcnNvbmFzLm1hcChwID0+IHRoaXMuZXhwb3J0UGVyc29uYShwKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgZXhwb3J0IHRvIGJhc2U2NCBmb3IgZWFzeSBzaGFyaW5nXG4gICAqL1xuICB0b0Jhc2U2NChkYXRhOiBFeHBvcnRlZFBlcnNvbmEgfCBFeHBvcnRCdW5kbGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oanNvbikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBleHBvcnQgcmVzdWx0IGZvciBkaXNwbGF5XG4gICAqL1xuICBmb3JtYXRFeHBvcnRSZXN1bHQocGVyc29uYTogUGVyc29uYSwgYmFzZTY0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBg4pyFIFN1Y2Nlc3NmdWxseSBleHBvcnRlZCBcIiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfVwiXG5cbvCfk6YgRXhwb3J0IERldGFpbHM6XG4tIEZpbGVuYW1lOiAke3BlcnNvbmEuZmlsZW5hbWV9XG4tIFZlcnNpb246ICR7cGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxuLSBBdXRob3I6ICR7cGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgJ3Vua25vd24nfVxuLSBTaXplOiAke2Jhc2U2NC5sZW5ndGh9IGNoYXJhY3RlcnMgKGJhc2U2NClcblxu8J+TiyBFeHBvcnQgRGF0YSAoQ29weSB0aGlzIHRvIHNoYXJlKTpcblxcYFxcYFxcYFxuJHtiYXNlNjR9XG5cXGBcXGBcXGBcblxu8J+SoSBUbyBpbXBvcnQgdGhpcyBwZXJzb25hOlxuLSBVc2U6IGltcG9ydF9wZXJzb25hIFwiPHBhc3RlIHRoZSBiYXNlNjQgZGF0YSBoZXJlPlwiXG4tIE9yIHNhdmUgdG8gYSBmaWxlIGFuZCB1c2U6IGltcG9ydF9wZXJzb25hIFwiL3BhdGgvdG8vZmlsZS5qc29uXCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBidW5kbGUgZXhwb3J0IHJlc3VsdFxuICAgKi9cbiAgZm9ybWF0QnVuZGxlUmVzdWx0KGJ1bmRsZTogRXhwb3J0QnVuZGxlLCBiYXNlNjQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGVyc29uYUxpc3QgPSBidW5kbGUucGVyc29uYXNcbiAgICAgIC5tYXAocCA9PiBgICAtICR7cC5tZXRhZGF0YS5uYW1lfSAoJHtwLmZpbGVuYW1lfSlgKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgcmV0dXJuIGDinIUgU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkICR7YnVuZGxlLnBlcnNvbmFDb3VudH0gcGVyc29uYXNcblxu8J+TpiBCdW5kbGUgRGV0YWlsczpcbi0gRXhwb3J0IFZlcnNpb246ICR7YnVuZGxlLnZlcnNpb259XG4tIEV4cG9ydGVkIEF0OiAke25ldyBEYXRlKGJ1bmRsZS5leHBvcnRlZEF0KS50b0xvY2FsZVN0cmluZygpfVxuLSBFeHBvcnRlZCBCeTogJHtidW5kbGUuZXhwb3J0ZWRCeSB8fCAnYW5vbnltb3VzJ31cbi0gVG90YWwgU2l6ZTogJHtiYXNlNjQubGVuZ3RofSBjaGFyYWN0ZXJzIChiYXNlNjQpXG5cbvCfk4sgUGVyc29uYXMgSW5jbHVkZWQ6XG4ke3BlcnNvbmFMaXN0fVxuXG7wn5K+IEV4cG9ydCBEYXRhIChDb3B5IHRoaXMgdG8gc2hhcmUpOlxuXFxgXFxgXFxgXG4ke2Jhc2U2NH1cblxcYFxcYFxcYFxuXG7wn5KhIFRvIGltcG9ydCB0aGlzIGJ1bmRsZTpcbi0gVXNlOiBpbXBvcnRfcGVyc29uYSBcIjxwYXN0ZSB0aGUgYmFzZTY0IGRhdGEgaGVyZT5cIlxuLSBPciBzYXZlIHRvIGEgZmlsZSBhbmQgdXNlOiBpbXBvcnRfcGVyc29uYSBcIi9wYXRoL3RvL2J1bmRsZS5qc29uXCJgO1xuICB9XG5cbn1cbiJdfQ==