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.

99 lines (92 loc) • 10.7 kB
/** * Persona export functionality */ import { isDefaultPersona } from '../../constants/defaultPersonas.js'; import { MAX_PERSONA_SIZE } from '../../constants/limits.js'; export class PersonaExporter { currentUser; constructor(currentUser) { this.currentUser = 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, content: persona.content, filename: persona.filename, exportedAt: new Date().toISOString(), exportedBy: this.currentUser || 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.currentUser || 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYUV4cG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9QZXJzb25hRXhwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFJSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQTRDLE1BQU0sMkJBQTJCLENBQUM7QUFrQnZHLE1BQU0sT0FBTyxlQUFlO0lBRWhCO0lBRFYsWUFDVSxXQUEwQjtRQUExQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtJQUNqQyxDQUFDO0lBRUo7O09BRUc7SUFDSCxhQUFhLENBQUMsT0FBZ0I7UUFDNUIsbUJBQW1CO1FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzVDLElBQUksSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLHdCQUF3QixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1SCxDQUFDO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsUUFBbUIsRUFBRSxrQkFBMkIsSUFBSTtRQUMvRCxNQUFNLGdCQUFnQixHQUFHLGVBQWU7WUFDdEMsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFeEQsT0FBTztZQUNMLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTO1lBQ3pDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO1lBQ3JDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsSUFBb0M7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxNQUFjO1FBQ2pELE9BQU8sNEJBQTRCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTs7O2NBRzlDLE9BQU8sQ0FBQyxRQUFRO2FBQ2pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEtBQUs7WUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUztVQUN0QyxNQUFNLENBQUMsTUFBTTs7OztFQUlyQixNQUFNOzs7OztpRUFLeUQsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxNQUFvQixFQUFFLE1BQWM7UUFDckQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVE7YUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUM7YUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWQsT0FBTywyQkFBMkIsTUFBTSxDQUFDLFlBQVk7OztvQkFHckMsTUFBTSxDQUFDLE9BQU87aUJBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxjQUFjLEVBQUU7aUJBQzVDLE1BQU0sQ0FBQyxVQUFVLElBQUksV0FBVztnQkFDakMsTUFBTSxDQUFDLE1BQU07OztFQUczQixXQUFXOzs7O0VBSVgsTUFBTTs7Ozs7bUVBSzJELENBQUM7SUFDbEUsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXJzb25hIGV4cG9ydCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuaW1wb3J0IHsgUGVyc29uYSB9IGZyb20gJy4uLy4uL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGlzRGVmYXVsdFBlcnNvbmEgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdFBlcnNvbmFzLmpzJztcbmltcG9ydCB7IE1BWF9QRVJTT05BX1NJWkUsIE1BWF9CVU5ETEVfU0laRSwgTUFYX1BFUlNPTkFTX1BFUl9CVU5ETEUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbGltaXRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRlZFBlcnNvbmEge1xuICBtZXRhZGF0YTogYW55O1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGV4cG9ydGVkQXQ6IHN0cmluZztcbiAgZXhwb3J0ZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRCdW5kbGUge1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGV4cG9ydGVkQXQ6IHN0cmluZztcbiAgZXhwb3J0ZWRCeT86IHN0cmluZztcbiAgcGVyc29uYUNvdW50OiBudW1iZXI7XG4gIHBlcnNvbmFzOiBFeHBvcnRlZFBlcnNvbmFbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBlcnNvbmFFeHBvcnRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBzaW5nbGUgcGVyc29uYSB0byBKU09OIGZvcm1hdFxuICAgKi9cbiAgZXhwb3J0UGVyc29uYShwZXJzb25hOiBQZXJzb25hKTogRXhwb3J0ZWRQZXJzb25hIHtcbiAgICAvLyBDaGVjayBzaXplIGxpbWl0XG4gICAgY29uc3Qgc2l6ZSA9IEpTT04uc3RyaW5naWZ5KHBlcnNvbmEpLmxlbmd0aDtcbiAgICBpZiAoc2l6ZSA+IE1BWF9QRVJTT05BX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGVyc29uYSB0b28gbGFyZ2UgKCR7TWF0aC5yb3VuZChzaXplLzEwMjQpfUtCKS4gTWF4aW11bSBzaXplIGlzICR7TWF0aC5yb3VuZChNQVhfUEVSU09OQV9TSVpFLzEwMjQpfUtCYCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcGVyc29uYS5tZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHBlcnNvbmEuY29udGVudCxcbiAgICAgIGZpbGVuYW1lOiBwZXJzb25hLmZpbGVuYW1lLFxuICAgICAgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZXhwb3J0ZWRCeTogdGhpcy5jdXJyZW50VXNlciB8fCB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBtdWx0aXBsZSBwZXJzb25hcyB0byBhIGJ1bmRsZVxuICAgKi9cbiAgZXhwb3J0QnVuZGxlKHBlcnNvbmFzOiBQZXJzb25hW10sIGluY2x1ZGVEZWZhdWx0czogYm9vbGVhbiA9IHRydWUpOiBFeHBvcnRCdW5kbGUge1xuICAgIGNvbnN0IGZpbHRlcmVkUGVyc29uYXMgPSBpbmNsdWRlRGVmYXVsdHMgXG4gICAgICA/IHBlcnNvbmFzIFxuICAgICAgOiBwZXJzb25hcy5maWx0ZXIocCA9PiAhaXNEZWZhdWx0UGVyc29uYShwLmZpbGVuYW1lKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGV4cG9ydGVkQnk6IHRoaXMuY3VycmVudFVzZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgcGVyc29uYUNvdW50OiBmaWx0ZXJlZFBlcnNvbmFzLmxlbmd0aCxcbiAgICAgIHBlcnNvbmFzOiBmaWx0ZXJlZFBlcnNvbmFzLm1hcChwID0+IHRoaXMuZXhwb3J0UGVyc29uYShwKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgZXhwb3J0IHRvIGJhc2U2NCBmb3IgZWFzeSBzaGFyaW5nXG4gICAqL1xuICB0b0Jhc2U2NChkYXRhOiBFeHBvcnRlZFBlcnNvbmEgfCBFeHBvcnRCdW5kbGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oanNvbikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBleHBvcnQgcmVzdWx0IGZvciBkaXNwbGF5XG4gICAqL1xuICBmb3JtYXRFeHBvcnRSZXN1bHQocGVyc29uYTogUGVyc29uYSwgYmFzZTY0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBg4pyFIFN1Y2Nlc3NmdWxseSBleHBvcnRlZCBcIiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfVwiXG5cbvCfk6YgRXhwb3J0IERldGFpbHM6XG4tIEZpbGVuYW1lOiAke3BlcnNvbmEuZmlsZW5hbWV9XG4tIFZlcnNpb246ICR7cGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxuLSBBdXRob3I6ICR7cGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgJ3Vua25vd24nfVxuLSBTaXplOiAke2Jhc2U2NC5sZW5ndGh9IGNoYXJhY3RlcnMgKGJhc2U2NClcblxu8J+TiyBFeHBvcnQgRGF0YSAoQ29weSB0aGlzIHRvIHNoYXJlKTpcblxcYFxcYFxcYFxuJHtiYXNlNjR9XG5cXGBcXGBcXGBcblxu8J+SoSBUbyBpbXBvcnQgdGhpcyBwZXJzb25hOlxuLSBVc2U6IGltcG9ydF9wZXJzb25hIFwiPHBhc3RlIHRoZSBiYXNlNjQgZGF0YSBoZXJlPlwiXG4tIE9yIHNhdmUgdG8gYSBmaWxlIGFuZCB1c2U6IGltcG9ydF9wZXJzb25hIFwiL3BhdGgvdG8vZmlsZS5qc29uXCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBidW5kbGUgZXhwb3J0IHJlc3VsdFxuICAgKi9cbiAgZm9ybWF0QnVuZGxlUmVzdWx0KGJ1bmRsZTogRXhwb3J0QnVuZGxlLCBiYXNlNjQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGVyc29uYUxpc3QgPSBidW5kbGUucGVyc29uYXNcbiAgICAgIC5tYXAocCA9PiBgICAtICR7cC5tZXRhZGF0YS5uYW1lfSAoJHtwLmZpbGVuYW1lfSlgKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgcmV0dXJuIGDinIUgU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkICR7YnVuZGxlLnBlcnNvbmFDb3VudH0gcGVyc29uYXNcblxu8J+TpiBCdW5kbGUgRGV0YWlsczpcbi0gRXhwb3J0IFZlcnNpb246ICR7YnVuZGxlLnZlcnNpb259XG4tIEV4cG9ydGVkIEF0OiAke25ldyBEYXRlKGJ1bmRsZS5leHBvcnRlZEF0KS50b0xvY2FsZVN0cmluZygpfVxuLSBFeHBvcnRlZCBCeTogJHtidW5kbGUuZXhwb3J0ZWRCeSB8fCAnYW5vbnltb3VzJ31cbi0gVG90YWwgU2l6ZTogJHtiYXNlNjQubGVuZ3RofSBjaGFyYWN0ZXJzIChiYXNlNjQpXG5cbvCfk4sgUGVyc29uYXMgSW5jbHVkZWQ6XG4ke3BlcnNvbmFMaXN0fVxuXG7wn5K+IEV4cG9ydCBEYXRhIChDb3B5IHRoaXMgdG8gc2hhcmUpOlxuXFxgXFxgXFxgXG4ke2Jhc2U2NH1cblxcYFxcYFxcYFxuXG7wn5KhIFRvIGltcG9ydCB0aGlzIGJ1bmRsZTpcbi0gVXNlOiBpbXBvcnRfcGVyc29uYSBcIjxwYXN0ZSB0aGUgYmFzZTY0IGRhdGEgaGVyZT5cIlxuLSBPciBzYXZlIHRvIGEgZmlsZSBhbmQgdXNlOiBpbXBvcnRfcGVyc29uYSBcIi9wYXRoL3RvL2J1bmRsZS5qc29uXCJgO1xuICB9XG5cbn0iXX0=