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 16.6 kB
/** * Enhanced Index tool definitions and handlers * * Provides MCP tools for accessing semantic relationships, similarity search, * and verb-based discovery features of the Enhanced Capability Index. * * FIXES IMPLEMENTED (Issue #1100): * - Uses configuration for default values instead of hardcoded numbers */ export function getEnhancedIndexTools(server, config) { const tools = [ { tool: { name: "find_similar_elements", description: "Find elements that are semantically similar to a given element using NLP scoring (Jaccard similarity and Shannon entropy). Returns elements with similarity scores and relationships.", inputSchema: { type: "object", properties: { element_name: { type: "string", description: "Name of the element to find similar items for", }, element_type: { type: "string", enum: ["personas", "skills", "templates", "agents", "memories", "ensembles"], description: "Type of the element. If not specified, searches all types.", }, limit: { type: "number", description: `Maximum number of similar elements to return. Defaults to ${config.performance.defaultSimilarLimit}.`, }, threshold: { type: "number", description: `Minimum similarity score (0-1) to include. Defaults to ${config.performance.defaultSimilarityThreshold}.`, }, }, required: ["element_name"], }, }, handler: (args) => server.findSimilarElements({ elementName: args.element_name, elementType: args.element_type, limit: args.limit || config.performance.defaultSimilarLimit, threshold: args.threshold || config.performance.defaultSimilarityThreshold }) }, { tool: { name: "get_element_relationships", description: "Get all relationships for a specific element, including semantic similarities, verb-based connections, and cross-element references.", inputSchema: { type: "object", properties: { element_name: { type: "string", description: "Name of the element to get relationships for", }, element_type: { type: "string", enum: ["personas", "skills", "templates", "agents", "memories", "ensembles"], description: "Type of the element. If not specified, searches all types.", }, relationship_types: { type: "array", items: { type: "string", enum: ["similar", "uses", "extends", "requires", "complements", "verb-based"] }, description: "Filter by specific relationship types. If not specified, returns all types.", }, }, required: ["element_name"], }, }, handler: (args) => server.getElementRelationships({ elementName: args.element_name, elementType: args.element_type, relationshipTypes: args.relationship_types }) }, { tool: { name: "search_by_verb", description: "Search for elements that can handle a specific action verb (e.g., 'analyze', 'create', 'debug'). Uses verb trigger patterns to find matching elements.", inputSchema: { type: "object", properties: { verb: { type: "string", description: "Action verb to search for (e.g., 'analyze', 'create', 'debug', 'review')", }, limit: { type: "number", description: `Maximum number of results to return. Defaults to ${config.performance.defaultVerbSearchLimit}.`, }, }, required: ["verb"], }, }, handler: (args) => server.searchByVerb({ verb: args.verb, limit: args.limit || config.performance.defaultVerbSearchLimit }) }, { tool: { name: "get_relationship_stats", description: "Get statistics about the Enhanced Index relationships, including total counts by type, most connected elements, and index health metrics.", inputSchema: { type: "object", properties: {}, }, }, handler: () => server.getRelationshipStats() } ]; return tools; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5oYW5jZWRJbmRleFRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90b29scy9FbmhhbmNlZEluZGV4VG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUE0QkgsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUE0QixFQUM1QixNQUEwQjtJQUUxQixNQUFNLEtBQUssR0FBK0Q7UUFDeEU7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLHVCQUF1QjtnQkFDN0IsV0FBVyxFQUFFLHVMQUF1TDtnQkFDcE0sV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixZQUFZLEVBQUU7NEJBQ1osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLCtDQUErQzt5QkFDN0Q7d0JBQ0QsWUFBWSxFQUFFOzRCQUNaLElBQUksRUFBRSxRQUFROzRCQUNkLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDOzRCQUM1RSxXQUFXLEVBQUUsNERBQTREO3lCQUMxRTt3QkFDRCxLQUFLLEVBQUU7NEJBQ0wsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLDZEQUE2RCxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQixHQUFHO3lCQUNwSDt3QkFDRCxTQUFTLEVBQUU7NEJBQ1QsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLDBEQUEwRCxNQUFNLENBQUMsV0FBVyxDQUFDLDBCQUEwQixHQUFHO3lCQUN4SDtxQkFDRjtvQkFDRCxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUM7aUJBQzNCO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUE2QixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3JFLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDOUIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUM5QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQjtnQkFDM0QsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQywwQkFBMEI7YUFDM0UsQ0FBQztTQUNIO1FBQ0Q7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLDJCQUEyQjtnQkFDakMsV0FBVyxFQUFFLHNJQUFzSTtnQkFDbkosV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixZQUFZLEVBQUU7NEJBQ1osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLDhDQUE4Qzt5QkFDNUQ7d0JBQ0QsWUFBWSxFQUFFOzRCQUNaLElBQUksRUFBRSxRQUFROzRCQUNkLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDOzRCQUM1RSxXQUFXLEVBQUUsNERBQTREO3lCQUMxRTt3QkFDRCxrQkFBa0IsRUFBRTs0QkFDbEIsSUFBSSxFQUFFLE9BQU87NEJBQ2IsS0FBSyxFQUFFO2dDQUNMLElBQUksRUFBRSxRQUFRO2dDQUNkLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDOzZCQUM5RTs0QkFDRCxXQUFXLEVBQUUsNkVBQTZFO3lCQUMzRjtxQkFDRjtvQkFDRCxRQUFRLEVBQUUsQ0FBQyxjQUFjLENBQUM7aUJBQzNCO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFpQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUM7Z0JBQzdFLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDOUIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUM5QixpQkFBaUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2FBQzNDLENBQUM7U0FDSDtRQUNEO1lBQ0UsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLFdBQVcsRUFBRSx3SkFBd0o7Z0JBQ3JLLFdBQVcsRUFBRTtvQkFDWCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUU7d0JBQ1YsSUFBSSxFQUFFOzRCQUNKLElBQUksRUFBRSxRQUFROzRCQUNkLFdBQVcsRUFBRSwwRUFBMEU7eUJBQ3hGO3dCQUNELEtBQUssRUFBRTs0QkFDTCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxXQUFXLEVBQUUsb0RBQW9ELE1BQU0sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEdBQUc7eUJBQzlHO3FCQUNGO29CQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztpQkFDbkI7YUFDRjtZQUNELE9BQU8sRUFBRSxDQUFDLElBQXNCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUFzQjthQUMvRCxDQUFDO1NBQ0g7UUFDRDtZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsd0JBQXdCO2dCQUM5QixXQUFXLEVBQUUsMklBQTJJO2dCQUN4SixXQUFXLEVBQUU7b0JBQ1gsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsVUFBVSxFQUFFLEVBQUU7aUJBQ2Y7YUFDRjtZQUNELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUU7U0FDN0M7S0FDRixDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbmhhbmNlZCBJbmRleCB0b29sIGRlZmluaXRpb25zIGFuZCBoYW5kbGVyc1xuICpcbiAqIFByb3ZpZGVzIE1DUCB0b29scyBmb3IgYWNjZXNzaW5nIHNlbWFudGljIHJlbGF0aW9uc2hpcHMsIHNpbWlsYXJpdHkgc2VhcmNoLFxuICogYW5kIHZlcmItYmFzZWQgZGlzY292ZXJ5IGZlYXR1cmVzIG9mIHRoZSBFbmhhbmNlZCBDYXBhYmlsaXR5IEluZGV4LlxuICpcbiAqIEZJWEVTIElNUExFTUVOVEVEIChJc3N1ZSAjMTEwMCk6XG4gKiAtIFVzZXMgY29uZmlndXJhdGlvbiBmb3IgZGVmYXVsdCB2YWx1ZXMgaW5zdGVhZCBvZiBoYXJkY29kZWQgbnVtYmVyc1xuICovXG5cbmltcG9ydCB7IFRvb2xEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvdHlwZXMvVG9vbFR5cGVzLmpzJztcbmltcG9ydCB7IEluZGV4Q29uZmlndXJhdGlvbiB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9jb25maWcvSW5kZXhDb25maWcuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZEluZGV4SGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL0VuaGFuY2VkSW5kZXhIYW5kbGVyLmpzJztcblxuLy8gVG9vbCBhcmd1bWVudCBpbnRlcmZhY2VzXG5pbnRlcmZhY2UgRmluZFNpbWlsYXJFbGVtZW50c0FyZ3Mge1xuICBlbGVtZW50X25hbWU6IHN0cmluZztcbiAgZWxlbWVudF90eXBlPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgR2V0RWxlbWVudFJlbGF0aW9uc2hpcHNBcmdzIHtcbiAgZWxlbWVudF9uYW1lOiBzdHJpbmc7XG4gIGVsZW1lbnRfdHlwZT86IHN0cmluZztcbiAgcmVsYXRpb25zaGlwX3R5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZWFyY2hCeVZlcmJBcmdzIHtcbiAgdmVyYjogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuLy8gVG9vbCBoYW5kbGVyIGZ1bmN0aW9uIHR5cGVcbnR5cGUgVG9vbEhhbmRsZXI8VD4gPSAoYXJnczogVCkgPT4gUHJvbWlzZTxhbnk+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5oYW5jZWRJbmRleFRvb2xzKFxuICBzZXJ2ZXI6IEVuaGFuY2VkSW5kZXhIYW5kbGVyLFxuICBjb25maWc6IEluZGV4Q29uZmlndXJhdGlvblxuKTogQXJyYXk8eyB0b29sOiBUb29sRGVmaW5pdGlvbjsgaGFuZGxlcjogVG9vbEhhbmRsZXI8YW55PiB9PiB7XG4gIGNvbnN0IHRvb2xzOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlcjxhbnk+IH0+ID0gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJmaW5kX3NpbWlsYXJfZWxlbWVudHNcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRmluZCBlbGVtZW50cyB0aGF0IGFyZSBzZW1hbnRpY2FsbHkgc2ltaWxhciB0byBhIGdpdmVuIGVsZW1lbnQgdXNpbmcgTkxQIHNjb3JpbmcgKEphY2NhcmQgc2ltaWxhcml0eSBhbmQgU2hhbm5vbiBlbnRyb3B5KS4gUmV0dXJucyBlbGVtZW50cyB3aXRoIHNpbWlsYXJpdHkgc2NvcmVzIGFuZCByZWxhdGlvbnNoaXBzLlwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgZWxlbWVudF9uYW1lOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gZmluZCBzaW1pbGFyIGl0ZW1zIGZvclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVsZW1lbnRfdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBlbnVtOiBbXCJwZXJzb25hc1wiLCBcInNraWxsc1wiLCBcInRlbXBsYXRlc1wiLCBcImFnZW50c1wiLCBcIm1lbW9yaWVzXCIsIFwiZW5zZW1ibGVzXCJdLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUeXBlIG9mIHRoZSBlbGVtZW50LiBJZiBub3Qgc3BlY2lmaWVkLCBzZWFyY2hlcyBhbGwgdHlwZXMuXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGltaXQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBNYXhpbXVtIG51bWJlciBvZiBzaW1pbGFyIGVsZW1lbnRzIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gJHtjb25maWcucGVyZm9ybWFuY2UuZGVmYXVsdFNpbWlsYXJMaW1pdH0uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBNaW5pbXVtIHNpbWlsYXJpdHkgc2NvcmUgKDAtMSkgdG8gaW5jbHVkZS4gRGVmYXVsdHMgdG8gJHtjb25maWcucGVyZm9ybWFuY2UuZGVmYXVsdFNpbWlsYXJpdHlUaHJlc2hvbGR9LmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcImVsZW1lbnRfbmFtZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogRmluZFNpbWlsYXJFbGVtZW50c0FyZ3MpID0+IHNlcnZlci5maW5kU2ltaWxhckVsZW1lbnRzKHtcbiAgICAgICAgZWxlbWVudE5hbWU6IGFyZ3MuZWxlbWVudF9uYW1lLFxuICAgICAgICBlbGVtZW50VHlwZTogYXJncy5lbGVtZW50X3R5cGUsXG4gICAgICAgIGxpbWl0OiBhcmdzLmxpbWl0IHx8IGNvbmZpZy5wZXJmb3JtYW5jZS5kZWZhdWx0U2ltaWxhckxpbWl0LFxuICAgICAgICB0aHJlc2hvbGQ6IGFyZ3MudGhyZXNob2xkIHx8IGNvbmZpZy5wZXJmb3JtYW5jZS5kZWZhdWx0U2ltaWxhcml0eVRocmVzaG9sZFxuICAgICAgfSlcbiAgICB9LFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJnZXRfZWxlbWVudF9yZWxhdGlvbnNoaXBzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkdldCBhbGwgcmVsYXRpb25zaGlwcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LCBpbmNsdWRpbmcgc2VtYW50aWMgc2ltaWxhcml0aWVzLCB2ZXJiLWJhc2VkIGNvbm5lY3Rpb25zLCBhbmQgY3Jvc3MtZWxlbWVudCByZWZlcmVuY2VzLlwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgZWxlbWVudF9uYW1lOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHJlbGF0aW9uc2hpcHMgZm9yXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZWxlbWVudF90eXBlOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGVudW06IFtcInBlcnNvbmFzXCIsIFwic2tpbGxzXCIsIFwidGVtcGxhdGVzXCIsIFwiYWdlbnRzXCIsIFwibWVtb3JpZXNcIiwgXCJlbnNlbWJsZXNcIl0sXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlR5cGUgb2YgdGhlIGVsZW1lbnQuIElmIG5vdCBzcGVjaWZpZWQsIHNlYXJjaGVzIGFsbCB0eXBlcy5cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWxhdGlvbnNoaXBfdHlwZXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgZW51bTogW1wic2ltaWxhclwiLCBcInVzZXNcIiwgXCJleHRlbmRzXCIsIFwicmVxdWlyZXNcIiwgXCJjb21wbGVtZW50c1wiLCBcInZlcmItYmFzZWRcIl1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsdGVyIGJ5IHNwZWNpZmljIHJlbGF0aW9uc2hpcCB0eXBlcy4gSWYgbm90IHNwZWNpZmllZCwgcmV0dXJucyBhbGwgdHlwZXMuXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcImVsZW1lbnRfbmFtZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogR2V0RWxlbWVudFJlbGF0aW9uc2hpcHNBcmdzKSA9PiBzZXJ2ZXIuZ2V0RWxlbWVudFJlbGF0aW9uc2hpcHMoe1xuICAgICAgICBlbGVtZW50TmFtZTogYXJncy5lbGVtZW50X25hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBhcmdzLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgcmVsYXRpb25zaGlwVHlwZXM6IGFyZ3MucmVsYXRpb25zaGlwX3R5cGVzXG4gICAgICB9KVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcInNlYXJjaF9ieV92ZXJiXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlNlYXJjaCBmb3IgZWxlbWVudHMgdGhhdCBjYW4gaGFuZGxlIGEgc3BlY2lmaWMgYWN0aW9uIHZlcmIgKGUuZy4sICdhbmFseXplJywgJ2NyZWF0ZScsICdkZWJ1ZycpLiBVc2VzIHZlcmIgdHJpZ2dlciBwYXR0ZXJucyB0byBmaW5kIG1hdGNoaW5nIGVsZW1lbnRzLlwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdmVyYjoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBY3Rpb24gdmVyYiB0byBzZWFyY2ggZm9yIChlLmcuLCAnYW5hbHl6ZScsICdjcmVhdGUnLCAnZGVidWcnLCAncmV2aWV3JylcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaW1pdDoge1xuICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYE1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byAke2NvbmZpZy5wZXJmb3JtYW5jZS5kZWZhdWx0VmVyYlNlYXJjaExpbWl0fS5gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJ2ZXJiXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBTZWFyY2hCeVZlcmJBcmdzKSA9PiBzZXJ2ZXIuc2VhcmNoQnlWZXJiKHtcbiAgICAgICAgdmVyYjogYXJncy52ZXJiLFxuICAgICAgICBsaW1pdDogYXJncy5saW1pdCB8fCBjb25maWcucGVyZm9ybWFuY2UuZGVmYXVsdFZlcmJTZWFyY2hMaW1pdFxuICAgICAgfSlcbiAgICB9LFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJnZXRfcmVsYXRpb25zaGlwX3N0YXRzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkdldCBzdGF0aXN0aWNzIGFib3V0IHRoZSBFbmhhbmNlZCBJbmRleCByZWxhdGlvbnNoaXBzLCBpbmNsdWRpbmcgdG90YWwgY291bnRzIGJ5IHR5cGUsIG1vc3QgY29ubmVjdGVkIGVsZW1lbnRzLCBhbmQgaW5kZXggaGVhbHRoIG1ldHJpY3MuXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoKSA9PiBzZXJ2ZXIuZ2V0UmVsYXRpb25zaGlwU3RhdHMoKVxuICAgIH1cbiAgXTtcblxuICByZXR1cm4gdG9vbHM7XG59XG4iXX0=