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.

42 lines 5.18 kB
/** * A bounded FIFO queue that evicts the oldest item when at capacity. * * Wraps a plain array with push/shift semantics — the standard pattern * for bounded event logs where reads (.filter, .slice, .map, for...of) * dominate. V8 already optimizes Array.shift() for this pattern. */ export class EvictingQueue { maxSize; items = []; constructor(maxSize) { this.maxSize = maxSize; if (maxSize < 1) throw new Error('EvictingQueue capacity must be >= 1'); } /** Add an item. If at capacity, the oldest item is evicted. */ push(item) { this.items.push(item); if (this.items.length > this.maxSize) { this.items.shift(); } } /** Number of items currently in the queue. */ get size() { return this.items.length; } /** Maximum capacity. */ get capacity() { return this.maxSize; } /** Get the underlying array (read-only view). Oldest first. */ toArray() { return this.items; } /** Remove all items. */ clear() { this.items = []; } /** Replace contents with a new array (for time-based pruning). */ reset(items) { this.items = items.length > this.maxSize ? items.slice(-this.maxSize) : [...items]; } /** Support for...of iteration. */ [Symbol.iterator]() { return this.items[Symbol.iterator](); } /** JSON serialization — produces plain array. */ toJSON() { return [...this.items]; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZpY3RpbmdRdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9FdmljdGluZ1F1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBR0s7SUFGckIsS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUV4QixZQUE2QixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUMxQyxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsSUFBSSxDQUFDLElBQU87UUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWhELHdCQUF3QjtJQUN4QixJQUFJLFFBQVEsS0FBYSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRS9DLCtEQUErRDtJQUMvRCxPQUFPLEtBQW1CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFOUMsd0JBQXdCO0lBQ3hCLEtBQUssS0FBVyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbEMsa0VBQWtFO0lBQ2xFLEtBQUssQ0FBQyxLQUFVO1FBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPO1lBQ3RDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWtCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFMUUsaURBQWlEO0lBQ2pELE1BQU0sS0FBVSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIGJvdW5kZWQgRklGTyBxdWV1ZSB0aGF0IGV2aWN0cyB0aGUgb2xkZXN0IGl0ZW0gd2hlbiBhdCBjYXBhY2l0eS5cbiAqXG4gKiBXcmFwcyBhIHBsYWluIGFycmF5IHdpdGggcHVzaC9zaGlmdCBzZW1hbnRpY3Mg4oCUIHRoZSBzdGFuZGFyZCBwYXR0ZXJuXG4gKiBmb3IgYm91bmRlZCBldmVudCBsb2dzIHdoZXJlIHJlYWRzICguZmlsdGVyLCAuc2xpY2UsIC5tYXAsIGZvci4uLm9mKVxuICogZG9taW5hdGUuIFY4IGFscmVhZHkgb3B0aW1pemVzIEFycmF5LnNoaWZ0KCkgZm9yIHRoaXMgcGF0dGVybi5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2aWN0aW5nUXVldWU8VD4ge1xuICBwcml2YXRlIGl0ZW1zOiBUW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heFNpemU6IG51bWJlcikge1xuICAgIGlmIChtYXhTaXplIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdFdmljdGluZ1F1ZXVlIGNhcGFjaXR5IG11c3QgYmUgPj0gMScpO1xuICB9XG5cbiAgLyoqIEFkZCBhbiBpdGVtLiBJZiBhdCBjYXBhY2l0eSwgdGhlIG9sZGVzdCBpdGVtIGlzIGV2aWN0ZWQuICovXG4gIHB1c2goaXRlbTogVCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPiB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRoaXMuaXRlbXMuc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBpbiB0aGUgcXVldWUuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7IHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aDsgfVxuXG4gIC8qKiBNYXhpbXVtIGNhcGFjaXR5LiAqL1xuICBnZXQgY2FwYWNpdHkoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMubWF4U2l6ZTsgfVxuXG4gIC8qKiBHZXQgdGhlIHVuZGVybHlpbmcgYXJyYXkgKHJlYWQtb25seSB2aWV3KS4gT2xkZXN0IGZpcnN0LiAqL1xuICB0b0FycmF5KCk6IHJlYWRvbmx5IFRbXSB7IHJldHVybiB0aGlzLml0ZW1zOyB9XG5cbiAgLyoqIFJlbW92ZSBhbGwgaXRlbXMuICovXG4gIGNsZWFyKCk6IHZvaWQgeyB0aGlzLml0ZW1zID0gW107IH1cblxuICAvKiogUmVwbGFjZSBjb250ZW50cyB3aXRoIGEgbmV3IGFycmF5IChmb3IgdGltZS1iYXNlZCBwcnVuaW5nKS4gKi9cbiAgcmVzZXQoaXRlbXM6IFRbXSk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMgPSBpdGVtcy5sZW5ndGggPiB0aGlzLm1heFNpemVcbiAgICAgID8gaXRlbXMuc2xpY2UoLXRoaXMubWF4U2l6ZSlcbiAgICAgIDogWy4uLml0ZW1zXTtcbiAgfVxuXG4gIC8qKiBTdXBwb3J0IGZvci4uLm9mIGl0ZXJhdGlvbi4gKi9cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4geyByZXR1cm4gdGhpcy5pdGVtc1tTeW1ib2wuaXRlcmF0b3JdKCk7IH1cblxuICAvKiogSlNPTiBzZXJpYWxpemF0aW9uIOKAlCBwcm9kdWNlcyBwbGFpbiBhcnJheS4gKi9cbiAgdG9KU09OKCk6IFRbXSB7IHJldHVybiBbLi4udGhpcy5pdGVtc107IH1cbn1cbiJdfQ==