PersonaExporter.tsโข3.39 kB
/**
* Persona export functionality
*/
import { Persona } from '../../types/persona.js';
import { logger } from '../../utils/logger.js';
import { isDefaultPersona } from '../../constants/defaultPersonas.js';
import { MAX_PERSONA_SIZE, MAX_BUNDLE_SIZE, MAX_PERSONAS_PER_BUNDLE } from '../../constants/limits.js';
export interface ExportedPersona {
metadata: any;
content: string;
filename: string;
exportedAt: string;
exportedBy?: string;
}
export interface ExportBundle {
version: string;
exportedAt: string;
exportedBy?: string;
personaCount: number;
personas: ExportedPersona[];
}
export class PersonaExporter {
constructor(
private currentUser: string | null
) {}
/**
* Export a single persona to JSON format
*/
exportPersona(persona: Persona): ExportedPersona {
// 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: Persona[], includeDefaults: boolean = true): ExportBundle {
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: ExportedPersona | ExportBundle): string {
const json = JSON.stringify(data, null, 2);
return Buffer.from(json).toString('base64');
}
/**
* Format export result for display
*/
formatExportResult(persona: Persona, base64: string): string {
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: ExportBundle, base64: string): string {
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"`;
}
}