@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.
92 lines • 7.75 kB
JavaScript
/**
* NormalizerRegistry - Central registry for parameter normalizers
*
* Manages registration and retrieval of normalizers by name.
* Normalizers are registered at startup and looked up during
* schema-driven dispatch.
*
* @see Issue #243 - Unified search with normalizer architecture
*/
/**
* Registry for managing parameter normalizers.
*
* Provides a centralized location for registering and retrieving
* normalizers used by the schema-driven dispatch system.
*
* @example
* ```typescript
* // Register a normalizer
* NormalizerRegistry.register(new SearchParamsNormalizer());
*
* // Retrieve by name
* const normalizer = NormalizerRegistry.get('searchParams');
* ```
*/
export class NormalizerRegistry {
static normalizers = new Map();
/**
* Register a normalizer.
*
* @param normalizer - The normalizer to register
* @throws Error if a normalizer with the same name is already registered
*/
static register(normalizer) {
if (this.normalizers.has(normalizer.name)) {
throw new Error(`Normalizer '${normalizer.name}' is already registered. ` +
'Use unregister() first if you need to replace it.');
}
this.normalizers.set(normalizer.name, normalizer);
}
/**
* Unregister a normalizer by name.
*
* @param name - The normalizer name to unregister
* @returns true if the normalizer was removed, false if not found
*/
static unregister(name) {
return this.normalizers.delete(name);
}
/**
* Get a normalizer by name.
*
* @param name - The normalizer name
* @returns The normalizer, or undefined if not found
*/
static get(name) {
return this.normalizers.get(name);
}
/**
* Check if a normalizer is registered.
*
* @param name - The normalizer name
* @returns true if registered
*/
static has(name) {
return this.normalizers.has(name);
}
/**
* Get all registered normalizer names.
*
* @returns Array of normalizer names
*/
static list() {
return Array.from(this.normalizers.keys());
}
/**
* Clear all registered normalizers.
*
* Primarily used for testing.
*/
static clear() {
this.normalizers.clear();
}
/**
* Get the count of registered normalizers.
*
* @returns Number of registered normalizers
*/
static get size() {
return this.normalizers.size;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9ybWFsaXplclJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvbm9ybWFsaXplcnMvTm9ybWFsaXplclJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBSUg7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLE1BQU0sQ0FBVSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7SUFFcEU7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQXNCO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDYixlQUFlLFVBQVUsQ0FBQyxJQUFJLDJCQUEyQjtnQkFDekQsbURBQW1ELENBQ3BELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxJQUFJO1FBQ1QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLO1FBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sS0FBSyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOb3JtYWxpemVyUmVnaXN0cnkgLSBDZW50cmFsIHJlZ2lzdHJ5IGZvciBwYXJhbWV0ZXIgbm9ybWFsaXplcnNcbiAqXG4gKiBNYW5hZ2VzIHJlZ2lzdHJhdGlvbiBhbmQgcmV0cmlldmFsIG9mIG5vcm1hbGl6ZXJzIGJ5IG5hbWUuXG4gKiBOb3JtYWxpemVycyBhcmUgcmVnaXN0ZXJlZCBhdCBzdGFydHVwIGFuZCBsb29rZWQgdXAgZHVyaW5nXG4gKiBzY2hlbWEtZHJpdmVuIGRpc3BhdGNoLlxuICpcbiAqIEBzZWUgSXNzdWUgIzI0MyAtIFVuaWZpZWQgc2VhcmNoIHdpdGggbm9ybWFsaXplciBhcmNoaXRlY3R1cmVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5vcm1hbGl6ZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBSZWdpc3RyeSBmb3IgbWFuYWdpbmcgcGFyYW1ldGVyIG5vcm1hbGl6ZXJzLlxuICpcbiAqIFByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgbG9jYXRpb24gZm9yIHJlZ2lzdGVyaW5nIGFuZCByZXRyaWV2aW5nXG4gKiBub3JtYWxpemVycyB1c2VkIGJ5IHRoZSBzY2hlbWEtZHJpdmVuIGRpc3BhdGNoIHN5c3RlbS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUmVnaXN0ZXIgYSBub3JtYWxpemVyXG4gKiBOb3JtYWxpemVyUmVnaXN0cnkucmVnaXN0ZXIobmV3IFNlYXJjaFBhcmFtc05vcm1hbGl6ZXIoKSk7XG4gKlxuICogLy8gUmV0cmlldmUgYnkgbmFtZVxuICogY29uc3Qgbm9ybWFsaXplciA9IE5vcm1hbGl6ZXJSZWdpc3RyeS5nZXQoJ3NlYXJjaFBhcmFtcycpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVyUmVnaXN0cnkge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBub3JtYWxpemVycyA9IG5ldyBNYXA8c3RyaW5nLCBOb3JtYWxpemVyPigpO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5vcm1hbGl6ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBub3JtYWxpemVyIC0gVGhlIG5vcm1hbGl6ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHRocm93cyBFcnJvciBpZiBhIG5vcm1hbGl6ZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKG5vcm1hbGl6ZXI6IE5vcm1hbGl6ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ub3JtYWxpemVycy5oYXMobm9ybWFsaXplci5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9ybWFsaXplciAnJHtub3JtYWxpemVyLm5hbWV9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIGAgK1xuICAgICAgICAnVXNlIHVucmVnaXN0ZXIoKSBmaXJzdCBpZiB5b3UgbmVlZCB0byByZXBsYWNlIGl0LidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubm9ybWFsaXplcnMuc2V0KG5vcm1hbGl6ZXIubmFtZSwgbm9ybWFsaXplcik7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhIG5vcm1hbGl6ZXIgYnkgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbm9ybWFsaXplciBuYW1lIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9ybWFsaXplciB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgdW5yZWdpc3RlcihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVycy5kZWxldGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbm9ybWFsaXplciBieSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBub3JtYWxpemVyIG5hbWVcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZXIsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQobmFtZTogc3RyaW5nKTogTm9ybWFsaXplciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubm9ybWFsaXplcnMuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbm9ybWFsaXplciBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBub3JtYWxpemVyIG5hbWVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiByZWdpc3RlcmVkXG4gICAqL1xuICBzdGF0aWMgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZXJzLmhhcyhuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgbm9ybWFsaXplciBuYW1lcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9ybWFsaXplciBuYW1lc1xuICAgKi9cbiAgc3RhdGljIGxpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubm9ybWFsaXplcnMua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcmVnaXN0ZXJlZCBub3JtYWxpemVycy5cbiAgICpcbiAgICogUHJpbWFyaWx5IHVzZWQgZm9yIHRlc3RpbmcuXG4gICAqL1xuICBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5ub3JtYWxpemVycy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY291bnQgb2YgcmVnaXN0ZXJlZCBub3JtYWxpemVycy5cbiAgICpcbiAgICogQHJldHVybnMgTnVtYmVyIG9mIHJlZ2lzdGVyZWQgbm9ybWFsaXplcnNcbiAgICovXG4gIHN0YXRpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZXJzLnNpemU7XG4gIH1cbn1cbiJdfQ==