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.

70 lines 8.6 kB
import { EventEmitter } from 'node:events'; /** * Lightweight dispatcher for element lifecycle events. * Provides minimal EventEmitter wrapper with immutable payload semantics. */ export class ElementEventDispatcher { emitter = new EventEmitter(); static shared = null; /** * Subscribe to an event. Returns an unsubscribe function. */ on(event, handler) { this.emitter.on(event, handler); return () => { this.emitter.off(event, handler); }; } /** * Subscribe once. */ once(event, handler) { this.emitter.once(event, handler); return () => { this.emitter.off(event, handler); }; } /** * Emit synchronously (used for start/veto events). */ emit(event, payload) { this.emitter.emit(event, { ...payload }); } /** * Emit asynchronously to decouple observers. */ emitAsync(event, payload) { const cloned = { ...payload }; setImmediate(() => { this.emitter.emit(event, cloned); }); } /** * Utility helper to snapshot minimal metadata from element instances. */ static snapshotMetadata(element) { if (!element) return undefined; const snapshot = { name: element.metadata?.name, description: element.metadata?.description, author: element.metadata?.author, version: element.metadata?.version, }; // Add category if it exists (not part of base interface but some elements have it) if (element.metadata?.category) { snapshot.category = element.metadata.category; } return snapshot; } /** * Shared singleton dispatcher used when managers don't inject their own. */ static getSharedDispatcher() { if (!this.shared) { this.shared = new ElementEventDispatcher(); } return this.shared; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBa0MzQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2hCLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3RDLE1BQU0sQ0FBQyxNQUFNLEdBQWtDLElBQUksQ0FBQztJQUU1RDs7T0FFRztJQUNILEVBQUUsQ0FBQyxLQUE0QixFQUFFLE9BQTRCO1FBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQyxPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsS0FBNEIsRUFBRSxPQUE0QjtRQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLEtBQTRCLEVBQUUsT0FBNEI7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUE0QixFQUFFLE9BQTRCO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUM5QixZQUFZLENBQUMsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFrQjtRQUN4QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFzRDtZQUNsRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJO1lBQzVCLFdBQVcsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFdBQVc7WUFDMUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTTtZQUNoQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPO1NBQ25DLENBQUM7UUFDRixtRkFBbUY7UUFDbkYsSUFBSyxPQUFPLENBQUMsUUFBZ0IsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUN4QyxRQUFRLENBQUMsUUFBUSxHQUFJLE9BQU8sQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ25vZGU6ZXZlbnRzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IElFbGVtZW50LCBJRWxlbWVudE1ldGFkYXRhIH0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50TGlmZWN5Y2xlRXZlbnQgPVxuICB8ICdlbGVtZW50OmxvYWQ6c3RhcnQnXG4gIHwgJ2VsZW1lbnQ6bG9hZDpzdWNjZXNzJ1xuICB8ICdlbGVtZW50OmxvYWQ6ZXJyb3InXG4gIHwgJ2VsZW1lbnQ6c2F2ZTpzdGFydCdcbiAgfCAnZWxlbWVudDpzYXZlOnN1Y2Nlc3MnXG4gIHwgJ2VsZW1lbnQ6c2F2ZTplcnJvcidcbiAgfCAnZWxlbWVudDpkZWxldGU6c3RhcnQnXG4gIHwgJ2VsZW1lbnQ6ZGVsZXRlOnN1Y2Nlc3MnXG4gIHwgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJ1xuICB8ICdlbGVtZW50OmFjdGl2YXRlJ1xuICB8ICdlbGVtZW50OmRlYWN0aXZhdGUnXG4gIHwgJ2VsZW1lbnQ6Y2FjaGU6cmVmcmVzaCdcbiAgfCAnZWxlbWVudDpjYWNoZTpldmljdCdcbiAgfCAnZWxlbWVudDpleHRlcm5hbC1jaGFuZ2UnXG4gIHwgJ2VsZW1lbnQ6bG9jay10aW1lb3V0JztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RXZlbnRQYXlsb2FkIHtcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIGVsZW1lbnRJZD86IHN0cmluZztcbiAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUGFydGlhbDxJRWxlbWVudE1ldGFkYXRhPjtcbiAgZ2VuZXJhdGlvbj86IG51bWJlcjtcbiAgZXJyb3I/OiB1bmtub3duO1xuICBleHRyYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50RXZlbnRIYW5kbGVyID0gKHBheWxvYWQ6IEVsZW1lbnRFdmVudFBheWxvYWQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IGRpc3BhdGNoZXIgZm9yIGVsZW1lbnQgbGlmZWN5Y2xlIGV2ZW50cy5cbiAqIFByb3ZpZGVzIG1pbmltYWwgRXZlbnRFbWl0dGVyIHdyYXBwZXIgd2l0aCBpbW11dGFibGUgcGF5bG9hZCBzZW1hbnRpY3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbGVtZW50RXZlbnREaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwcml2YXRlIHN0YXRpYyBzaGFyZWQ6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGFuIGV2ZW50LiBSZXR1cm5zIGFuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uLlxuICAgKi9cbiAgb24oZXZlbnQ6IEVsZW1lbnRMaWZlY3ljbGVFdmVudCwgaGFuZGxlcjogRWxlbWVudEV2ZW50SGFuZGxlcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuZW1pdHRlci5vbihldmVudCwgaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuZW1pdHRlci5vZmYoZXZlbnQsIGhhbmRsZXIpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIG9uY2UuXG4gICAqL1xuICBvbmNlKGV2ZW50OiBFbGVtZW50TGlmZWN5Y2xlRXZlbnQsIGhhbmRsZXI6IEVsZW1lbnRFdmVudEhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmVtaXR0ZXIub25jZShldmVudCwgaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuZW1pdHRlci5vZmYoZXZlbnQsIGhhbmRsZXIpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBzeW5jaHJvbm91c2x5ICh1c2VkIGZvciBzdGFydC92ZXRvIGV2ZW50cykuXG4gICAqL1xuICBlbWl0KGV2ZW50OiBFbGVtZW50TGlmZWN5Y2xlRXZlbnQsIHBheWxvYWQ6IEVsZW1lbnRFdmVudFBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXR0ZXIuZW1pdChldmVudCwgeyAuLi5wYXlsb2FkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYXN5bmNocm9ub3VzbHkgdG8gZGVjb3VwbGUgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgZW1pdEFzeW5jKGV2ZW50OiBFbGVtZW50TGlmZWN5Y2xlRXZlbnQsIHBheWxvYWQ6IEVsZW1lbnRFdmVudFBheWxvYWQpOiB2b2lkIHtcbiAgICBjb25zdCBjbG9uZWQgPSB7IC4uLnBheWxvYWQgfTtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoZXZlbnQsIGNsb25lZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXRpbGl0eSBoZWxwZXIgdG8gc25hcHNob3QgbWluaW1hbCBtZXRhZGF0YSBmcm9tIGVsZW1lbnQgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIHNuYXBzaG90TWV0YWRhdGEoZWxlbWVudD86IElFbGVtZW50KTogUGFydGlhbDxJRWxlbWVudE1ldGFkYXRhPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNuYXBzaG90OiBQYXJ0aWFsPElFbGVtZW50TWV0YWRhdGE+ICYgeyBjYXRlZ29yeT86IHN0cmluZyB9ID0ge1xuICAgICAgbmFtZTogZWxlbWVudC5tZXRhZGF0YT8ubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBlbGVtZW50Lm1ldGFkYXRhPy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogZWxlbWVudC5tZXRhZGF0YT8uYXV0aG9yLFxuICAgICAgdmVyc2lvbjogZWxlbWVudC5tZXRhZGF0YT8udmVyc2lvbixcbiAgICB9O1xuICAgIC8vIEFkZCBjYXRlZ29yeSBpZiBpdCBleGlzdHMgKG5vdCBwYXJ0IG9mIGJhc2UgaW50ZXJmYWNlIGJ1dCBzb21lIGVsZW1lbnRzIGhhdmUgaXQpXG4gICAgaWYgKChlbGVtZW50Lm1ldGFkYXRhIGFzIGFueSk/LmNhdGVnb3J5KSB7XG4gICAgICBzbmFwc2hvdC5jYXRlZ29yeSA9IChlbGVtZW50Lm1ldGFkYXRhIGFzIGFueSkuY2F0ZWdvcnk7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZWQgc2luZ2xldG9uIGRpc3BhdGNoZXIgdXNlZCB3aGVuIG1hbmFnZXJzIGRvbid0IGluamVjdCB0aGVpciBvd24uXG4gICAqL1xuICBzdGF0aWMgZ2V0U2hhcmVkRGlzcGF0Y2hlcigpOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVkKSB7XG4gICAgICB0aGlzLnNoYXJlZCA9IG5ldyBFbGVtZW50RXZlbnREaXNwYXRjaGVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYXJlZDtcbiAgfVxufVxuIl19