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.

119 lines 13 kB
/** * Standardized message templates for element operations * * Issue #24 (LOW PRIORITY): Consistent error message formatting across all managers * * This utility provides consistent message formatting for common element operations * across all manager implementations (SkillManager, AgentManager, MemoryManager, EnsembleManager). * * USAGE: * - Use ElementMessages.notFound() for element not found errors * - Use ElementMessages.activated() for successful activation * - Use ElementMessages.deactivated() for successful deactivation * - Use ElementMessages.alreadyExists() for duplicate element errors * * BENEFITS: * - Consistent UX across all element types * - Single source of truth for message formatting * - Easier to update message formats in the future * - Better i18n support if needed later */ import { ElementType } from '../portfolio/types.js'; /** * Get human-readable label for element type (singular form) */ function getElementLabel(elementType) { const labels = { [ElementType.PERSONA]: 'persona', [ElementType.SKILL]: 'skill', [ElementType.TEMPLATE]: 'template', [ElementType.AGENT]: 'agent', [ElementType.MEMORY]: 'memory', [ElementType.ENSEMBLE]: 'ensemble' }; return labels[elementType] || 'element'; } /** * Get capitalized element label */ function getElementLabelCapitalized(elementType) { const label = getElementLabel(elementType); return label.charAt(0).toUpperCase() + label.slice(1); } /** * Standardized message templates for element operations */ export const ElementMessages = { /** * Element not found error message * @param elementType - Type of element * @param identifier - Name or ID that was searched for * @returns Formatted error message */ notFound(elementType, identifier) { const label = getElementLabelCapitalized(elementType); return `${label} '${identifier}' not found`; }, /** * Element successfully activated message * @param elementType - Type of element * @param name - Name of the activated element * @returns Formatted success message */ activated(elementType, name) { const label = getElementLabelCapitalized(elementType); return `${label} '${name}' activated`; }, /** * Element successfully deactivated message * @param elementType - Type of element * @param name - Name of the deactivated element * @returns Formatted success message */ deactivated(elementType, name) { const label = getElementLabelCapitalized(elementType); return `${label} '${name}' deactivated`; }, /** * Element already exists error message * @param elementType - Type of element * @param name - Name of the existing element * @returns Formatted error message */ alreadyExists(elementType, name) { const label = getElementLabelCapitalized(elementType); return `${label} '${name}' already exists`; }, /** * Invalid element name error message * @param elementType - Type of element * @returns Formatted error message */ invalidName(elementType) { const label = getElementLabelCapitalized(elementType); return `Invalid ${label.toLowerCase()} name. Use only letters, numbers, hyphens, and underscores.`; }, /** * Element created success message * @param elementType - Type of element * @param name - Name of the created element * @param author - Author of the element (optional) * @returns Formatted success message */ created(elementType, name, author) { const icon = elementType === ElementType.AGENT ? '🤖' : '✓'; const authorSuffix = author ? ` by ${author}` : ''; return `${icon} **${name}**${authorSuffix}`; }, /** * Element validation failed error message * @param elementType - Type of element * @param errors - Array of validation error messages * @returns Formatted error message */ validationFailed(elementType, errors) { const label = getElementLabelCapitalized(elementType); return `Invalid ${label.toLowerCase()}: ${errors.join(', ')}`; } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudE1lc3NhZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLFdBQXdCO0lBQy9DLE1BQU0sTUFBTSxHQUFnQztRQUMxQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTO1FBQ2hDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU87UUFDNUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVTtRQUNsQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO1FBQzVCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVE7UUFDOUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVTtLQUNuQyxDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksU0FBUyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsMEJBQTBCLENBQUMsV0FBd0I7SUFDMUQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3Qjs7Ozs7T0FLRztJQUNILFFBQVEsQ0FBQyxXQUF3QixFQUFFLFVBQWtCO1FBQ25ELE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sR0FBRyxLQUFLLEtBQUssVUFBVSxhQUFhLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFdBQXdCLEVBQUUsSUFBWTtRQUM5QyxNQUFNLEtBQUssR0FBRywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RCxPQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksYUFBYSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxXQUF3QixFQUFFLElBQVk7UUFDaEQsTUFBTSxLQUFLLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsV0FBd0IsRUFBRSxJQUFZO1FBQ2xELE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sR0FBRyxLQUFLLEtBQUssSUFBSSxrQkFBa0IsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxXQUF3QjtRQUNsQyxNQUFNLEtBQUssR0FBRywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RCxPQUFPLFdBQVcsS0FBSyxDQUFDLFdBQVcsRUFBRSw2REFBNkQsQ0FBQztJQUNyRyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUFDLFdBQXdCLEVBQUUsSUFBWSxFQUFFLE1BQWU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsV0FBVyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ELE9BQU8sR0FBRyxJQUFJLE1BQU0sSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFDLFdBQXdCLEVBQUUsTUFBZ0I7UUFDekQsTUFBTSxLQUFLLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsT0FBTyxXQUFXLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDaEUsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YW5kYXJkaXplZCBtZXNzYWdlIHRlbXBsYXRlcyBmb3IgZWxlbWVudCBvcGVyYXRpb25zXG4gKlxuICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZyBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gKlxuICogVGhpcyB1dGlsaXR5IHByb3ZpZGVzIGNvbnNpc3RlbnQgbWVzc2FnZSBmb3JtYXR0aW5nIGZvciBjb21tb24gZWxlbWVudCBvcGVyYXRpb25zXG4gKiBhY3Jvc3MgYWxsIG1hbmFnZXIgaW1wbGVtZW50YXRpb25zIChTa2lsbE1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlciwgRW5zZW1ibGVNYW5hZ2VyKS5cbiAqXG4gKiBVU0FHRTpcbiAqIC0gVXNlIEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZCgpIGZvciBlbGVtZW50IG5vdCBmb3VuZCBlcnJvcnNcbiAqIC0gVXNlIEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoKSBmb3Igc3VjY2Vzc2Z1bCBhY3RpdmF0aW9uXG4gKiAtIFVzZSBFbGVtZW50TWVzc2FnZXMuZGVhY3RpdmF0ZWQoKSBmb3Igc3VjY2Vzc2Z1bCBkZWFjdGl2YXRpb25cbiAqIC0gVXNlIEVsZW1lbnRNZXNzYWdlcy5hbHJlYWR5RXhpc3RzKCkgZm9yIGR1cGxpY2F0ZSBlbGVtZW50IGVycm9yc1xuICpcbiAqIEJFTkVGSVRTOlxuICogLSBDb25zaXN0ZW50IFVYIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICogLSBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBtZXNzYWdlIGZvcm1hdHRpbmdcbiAqIC0gRWFzaWVyIHRvIHVwZGF0ZSBtZXNzYWdlIGZvcm1hdHMgaW4gdGhlIGZ1dHVyZVxuICogLSBCZXR0ZXIgaTE4biBzdXBwb3J0IGlmIG5lZWRlZCBsYXRlclxuICovXG5cbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcblxuLyoqXG4gKiBHZXQgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIGVsZW1lbnQgdHlwZSAoc2luZ3VsYXIgZm9ybSlcbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudExhYmVsKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxhYmVsczogUmVjb3JkPEVsZW1lbnRUeXBlLCBzdHJpbmc+ID0ge1xuICAgIFtFbGVtZW50VHlwZS5QRVJTT05BXTogJ3BlcnNvbmEnLFxuICAgIFtFbGVtZW50VHlwZS5TS0lMTF06ICdza2lsbCcsXG4gICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJ3RlbXBsYXRlJyxcbiAgICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnYWdlbnQnLFxuICAgIFtFbGVtZW50VHlwZS5NRU1PUlldOiAnbWVtb3J5JyxcbiAgICBbRWxlbWVudFR5cGUuRU5TRU1CTEVdOiAnZW5zZW1ibGUnXG4gIH07XG4gIHJldHVybiBsYWJlbHNbZWxlbWVudFR5cGVdIHx8ICdlbGVtZW50Jztcbn1cblxuLyoqXG4gKiBHZXQgY2FwaXRhbGl6ZWQgZWxlbWVudCBsYWJlbFxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZChlbGVtZW50VHlwZTogRWxlbWVudFR5cGUpOiBzdHJpbmcge1xuICBjb25zdCBsYWJlbCA9IGdldEVsZW1lbnRMYWJlbChlbGVtZW50VHlwZSk7XG4gIHJldHVybiBsYWJlbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxhYmVsLnNsaWNlKDEpO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkaXplZCBtZXNzYWdlIHRlbXBsYXRlcyBmb3IgZWxlbWVudCBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBFbGVtZW50TWVzc2FnZXMgPSB7XG4gIC8qKlxuICAgKiBFbGVtZW50IG5vdCBmb3VuZCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFR5cGUgb2YgZWxlbWVudFxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIE5hbWUgb3IgSUQgdGhhdCB3YXMgc2VhcmNoZWQgZm9yXG4gICAqIEByZXR1cm5zIEZvcm1hdHRlZCBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBub3RGb3VuZChlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZChlbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuIGAke2xhYmVsfSAnJHtpZGVudGlmaWVyfScgbm90IGZvdW5kYDtcbiAgfSxcblxuICAvKipcbiAgICogRWxlbWVudCBzdWNjZXNzZnVsbHkgYWN0aXZhdGVkIG1lc3NhZ2VcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVHlwZSBvZiBlbGVtZW50XG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgYWN0aXZhdGVkIGVsZW1lbnRcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKi9cbiAgYWN0aXZhdGVkKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9IGdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKGVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4gYCR7bGFiZWx9ICcke25hbWV9JyBhY3RpdmF0ZWRgO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFbGVtZW50IHN1Y2Nlc3NmdWxseSBkZWFjdGl2YXRlZCBtZXNzYWdlXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFR5cGUgb2YgZWxlbWVudFxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGRlYWN0aXZhdGVkIGVsZW1lbnRcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKi9cbiAgZGVhY3RpdmF0ZWQoZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsID0gZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoZWxlbWVudFR5cGUpO1xuICAgIHJldHVybiBgJHtsYWJlbH0gJyR7bmFtZX0nIGRlYWN0aXZhdGVkYDtcbiAgfSxcblxuICAvKipcbiAgICogRWxlbWVudCBhbHJlYWR5IGV4aXN0cyBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFR5cGUgb2YgZWxlbWVudFxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGV4aXN0aW5nIGVsZW1lbnRcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGFscmVhZHlFeGlzdHMoZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsID0gZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoZWxlbWVudFR5cGUpO1xuICAgIHJldHVybiBgJHtsYWJlbH0gJyR7bmFtZX0nIGFscmVhZHkgZXhpc3RzYDtcbiAgfSxcblxuICAvKipcbiAgICogSW52YWxpZCBlbGVtZW50IG5hbWUgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgLSBUeXBlIG9mIGVsZW1lbnRcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGludmFsaWROYW1lKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZChlbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuIGBJbnZhbGlkICR7bGFiZWwudG9Mb3dlckNhc2UoKX0gbmFtZS4gVXNlIG9ubHkgbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzLmA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVsZW1lbnQgY3JlYXRlZCBzdWNjZXNzIG1lc3NhZ2VcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVHlwZSBvZiBlbGVtZW50XG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgY3JlYXRlZCBlbGVtZW50XG4gICAqIEBwYXJhbSBhdXRob3IgLSBBdXRob3Igb2YgdGhlIGVsZW1lbnQgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3VjY2VzcyBtZXNzYWdlXG4gICAqL1xuICBjcmVhdGVkKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgbmFtZTogc3RyaW5nLCBhdXRob3I/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGljb24gPSBlbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQgPyAn8J+klicgOiAn4pyTJztcbiAgICBjb25zdCBhdXRob3JTdWZmaXggPSBhdXRob3IgPyBgIGJ5ICR7YXV0aG9yfWAgOiAnJztcbiAgICByZXR1cm4gYCR7aWNvbn0gKioke25hbWV9Kioke2F1dGhvclN1ZmZpeH1gO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFbGVtZW50IHZhbGlkYXRpb24gZmFpbGVkIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVHlwZSBvZiBlbGVtZW50XG4gICAqIEBwYXJhbSBlcnJvcnMgLSBBcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzXG4gICAqIEByZXR1cm5zIEZvcm1hdHRlZCBlcnJvciBtZXNzYWdlXG4gICAqL1xuICB2YWxpZGF0aW9uRmFpbGVkKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgZXJyb3JzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZChlbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuIGBJbnZhbGlkICR7bGFiZWwudG9Mb3dlckNhc2UoKX06ICR7ZXJyb3JzLmpvaW4oJywgJyl9YDtcbiAgfVxufTtcbiJdfQ==