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.

105 lines (98 loc) • 11.8 kB
/** * 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==