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.

303 lines 34.5 kB
/** * Element-related tool definitions and handlers * Provides generic tools that work with all element types */ import { ElementType } from '../../portfolio/types.js'; export function getElementTools(server) { return [ { tool: { name: "list_elements", description: "List all available elements of a specific type", inputSchema: { type: "object", properties: { type: { type: "string", description: "The element type to list", enum: Object.values(ElementType), }, }, required: ["type"], }, }, handler: (args) => server.listElements(args.type) }, { tool: { name: "activate_element", description: "Activate a specific element by name", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to activate", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, }, required: ["name", "type"], }, }, handler: (args) => server.activateElement(args.name, args.type) }, { tool: { name: "get_active_elements", description: "Get information about currently active elements of a specific type", inputSchema: { type: "object", properties: { type: { type: "string", description: "The element type to check", enum: Object.values(ElementType), }, }, required: ["type"], }, }, handler: (args) => server.getActiveElements(args.type) }, { tool: { name: "deactivate_element", description: "Deactivate a specific element", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to deactivate", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, }, required: ["name", "type"], }, }, handler: (args) => server.deactivateElement(args.name, args.type) }, { tool: { name: "get_element_details", description: "Get detailed information about a specific element", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to get details for", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, }, required: ["name", "type"], }, }, handler: (args) => server.getElementDetails(args.name, args.type) }, { tool: { name: "reload_elements", description: "Reload elements of a specific type from the filesystem", inputSchema: { type: "object", properties: { type: { type: "string", description: "The element type to reload", enum: Object.values(ElementType), }, }, required: ["type"], }, }, handler: (args) => server.reloadElements(args.type) }, // Element-specific tools { tool: { name: "render_template", description: "Render a template element with provided variables", inputSchema: { type: "object", properties: { name: { type: "string", description: "The template name to render", }, variables: { type: "object", description: "Variables to use in the template", additionalProperties: true, }, }, required: ["name", "variables"], }, }, handler: (args) => server.renderTemplate(args.name, args.variables) }, { tool: { name: "execute_agent", description: "Execute an agent element with a specific goal", inputSchema: { type: "object", properties: { name: { type: "string", description: "The agent name to execute", }, goal: { type: "string", description: "The goal for the agent to achieve", }, }, required: ["name", "goal"], }, }, handler: (args) => server.executeAgent(args.name, args.goal) }, // Generic element creation tool { tool: { name: "create_element", description: "Create a new element of any type", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, description: { type: "string", description: "Element description", }, content: { type: "string", description: "Element content (required for some types)", }, metadata: { type: "object", description: "Additional metadata specific to element type", additionalProperties: true, }, }, required: ["name", "type", "description"], }, }, handler: (args) => server.createElement(args) }, // Generic element editing tool { tool: { name: "edit_element", description: "Edit an existing element of any type", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to edit", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, field: { type: "string", description: "The field to edit (e.g., 'description', 'metadata.author', 'content')", }, value: { description: "The new value for the field", oneOf: [ { type: "string" }, { type: "number" }, { type: "boolean" }, { type: "object" }, { type: "array" }, ], }, }, required: ["name", "type", "field", "value"], }, }, handler: (args) => server.editElement(args) }, // Generic element validation tool { tool: { name: "validate_element", description: "Validate an element for correctness and best practices", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to validate", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, strict: { type: "boolean", description: "Whether to apply strict validation rules", default: false, }, }, required: ["name", "type"], }, }, handler: (args) => server.validateElement(args) }, // Generic element deletion tool { tool: { name: "delete_element", description: "Delete an element and optionally its associated data files", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to delete", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, deleteData: { type: "boolean", description: "Whether to delete associated data files (if not specified, will prompt)", default: undefined, }, }, required: ["name", "type"], }, }, handler: (args) => server.deleteElement(args) }, ]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90b29scy9FbGVtZW50VG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBSUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBbUV2RCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQW9CO0lBQ2xELE9BQU87UUFDTDtZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsZUFBZTtnQkFDckIsV0FBVyxFQUFFLGdEQUFnRDtnQkFDN0QsV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixJQUFJLEVBQUU7NEJBQ0osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLDBCQUEwQjs0QkFDdkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO3lCQUNqQztxQkFDRjtvQkFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7aUJBQ25CO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFzQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDcEU7UUFDRDtZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixXQUFXLEVBQUUscUNBQXFDO2dCQUNsRCxXQUFXLEVBQUU7b0JBQ1gsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsVUFBVSxFQUFFO3dCQUNWLElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUUsUUFBUTs0QkFDZCxXQUFXLEVBQUUsOEJBQThCO3lCQUM1Qzt3QkFDRCxJQUFJLEVBQUU7NEJBQ0osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLGtCQUFrQjs0QkFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO3lCQUNq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TUFBTSxFQUFFOzRCQUNOLElBQUksRUFBRSxTQUFTOzRCQUNmLFdBQVcsRUFBRSwwQ0FBMEM7NEJBQ3ZELE9BQU8sRUFBRSxLQUFLO3lCQUNmO3FCQUNGO29CQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7aUJBQzNCO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUF5QixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztTQUNyRTtRQUNELGdDQUFnQztRQUNoQztZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixXQUFXLEVBQUUsNERBQTREO2dCQUN6RSxXQUFXLEVBQUU7b0JBQ1gsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsVUFBVSxFQUFFO3dCQUNWLElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUUsUUFBUTs0QkFDZCxXQUFXLEVBQUUsNEJBQTRCO3lCQUMxQzt3QkFDRCxJQUFJLEVBQUU7NEJBQ0osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLGtCQUFrQjs0QkFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO3lCQUNqQzt3QkFDRCxVQUFVLEVBQUU7NEJBQ1YsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsV0FBVyxFQUFFLHlFQUF5RTs0QkFDdEYsT0FBTyxFQUFFLFNBQVM7eUJBQ25CO3FCQUNGO29CQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7aUJBQzNCO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUF1QixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztTQUNqRTtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGVtZW50LXJlbGF0ZWQgdG9vbCBkZWZpbml0aW9ucyBhbmQgaGFuZGxlcnNcbiAqIFByb3ZpZGVzIGdlbmVyaWMgdG9vbHMgdGhhdCB3b3JrIHdpdGggYWxsIGVsZW1lbnQgdHlwZXNcbiAqL1xuXG5pbXBvcnQgeyBUb29sRGVmaW5pdGlvbiB9IGZyb20gJy4vVG9vbFJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IElUb29sSGFuZGxlciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcblxuLy8gVHlwZS1zYWZlIGludGVyZmFjZXMgZm9yIGFsbCBlbGVtZW50IHRvb2wgYXJndW1lbnRzXG5pbnRlcmZhY2UgTGlzdEVsZW1lbnRzQXJncyB7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFjdGl2YXRlRWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERlYWN0aXZhdGVFbGVtZW50QXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0RWxlbWVudERldGFpbHNBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRBY3RpdmVFbGVtZW50c0FyZ3Mge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDcmVhdGVFbGVtZW50QXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmludGVyZmFjZSBFZGl0RWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbn1cblxuaW50ZXJmYWNlIFZhbGlkYXRlRWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgc3RyaWN0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIERlbGV0ZUVsZW1lbnRBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGRlbGV0ZURhdGE/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmVuZGVyVGVtcGxhdGVBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmludGVyZmFjZSBSZWxvYWRFbGVtZW50c0FyZ3Mge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBFeGVjdXRlQWdlbnRBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnb2FsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50VG9vbHMoc2VydmVyOiBJVG9vbEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBhbnkgfT4ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJsaXN0X2VsZW1lbnRzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkxpc3QgYWxsIGF2YWlsYWJsZSBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGVcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZSB0byBsaXN0XCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0eXBlXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBMaXN0RWxlbWVudHNBcmdzKSA9PiBzZXJ2ZXIubGlzdEVsZW1lbnRzKGFyZ3MudHlwZSlcbiAgICB9LFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJhY3RpdmF0ZV9lbGVtZW50XCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkFjdGl2YXRlIGEgc3BlY2lmaWMgZWxlbWVudCBieSBuYW1lXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IG5hbWUgdG8gYWN0aXZhdGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IHR5cGVcIixcbiAgICAgICAgICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ0eXBlXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBBY3RpdmF0ZUVsZW1lbnRBcmdzKSA9PiBzZXJ2ZXIuYWN0aXZhdGVFbGVtZW50KGFyZ3MubmFtZSwgYXJncy50eXBlKVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImdldF9hY3RpdmVfZWxlbWVudHNcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiR2V0IGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IHR5cGUgdG8gY2hlY2tcIixcbiAgICAgICAgICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcInR5cGVcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IEdldEFjdGl2ZUVsZW1lbnRzQXJncykgPT4gc2VydmVyLmdldEFjdGl2ZUVsZW1lbnRzKGFyZ3MudHlwZSlcbiAgICB9LFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJkZWFjdGl2YXRlX2VsZW1lbnRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRGVhY3RpdmF0ZSBhIHNwZWNpZmljIGVsZW1lbnRcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgbmFtZSB0byBkZWFjdGl2YXRlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCB0eXBlXCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidHlwZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogRGVhY3RpdmF0ZUVsZW1lbnRBcmdzKSA9PiBzZXJ2ZXIuZGVhY3RpdmF0ZUVsZW1lbnQoYXJncy5uYW1lLCBhcmdzLnR5cGUpXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiZ2V0X2VsZW1lbnRfZGV0YWlsc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBlbGVtZW50XCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IG5hbWUgdG8gZ2V0IGRldGFpbHMgZm9yXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCB0eXBlXCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidHlwZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogR2V0RWxlbWVudERldGFpbHNBcmdzKSA9PiBzZXJ2ZXIuZ2V0RWxlbWVudERldGFpbHMoYXJncy5uYW1lLCBhcmdzLnR5cGUpXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwicmVsb2FkX2VsZW1lbnRzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlbG9hZCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUgZnJvbSB0aGUgZmlsZXN5c3RlbVwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCB0eXBlIHRvIHJlbG9hZFwiLFxuICAgICAgICAgICAgICBlbnVtOiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1widHlwZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogUmVsb2FkRWxlbWVudHNBcmdzKSA9PiBzZXJ2ZXIucmVsb2FkRWxlbWVudHMoYXJncy50eXBlKVxuICAgIH0sXG4gICAgLy8gRWxlbWVudC1zcGVjaWZpYyB0b29sc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJyZW5kZXJfdGVtcGxhdGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVuZGVyIGEgdGVtcGxhdGUgZWxlbWVudCB3aXRoIHByb3ZpZGVkIHZhcmlhYmxlc1wiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgdGVtcGxhdGUgbmFtZSB0byByZW5kZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVmFyaWFibGVzIHRvIHVzZSBpbiB0aGUgdGVtcGxhdGVcIixcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ2YXJpYWJsZXNcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IFJlbmRlclRlbXBsYXRlQXJncykgPT4gc2VydmVyLnJlbmRlclRlbXBsYXRlKGFyZ3MubmFtZSwgYXJncy52YXJpYWJsZXMpXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiZXhlY3V0ZV9hZ2VudFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJFeGVjdXRlIGFuIGFnZW50IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGdvYWxcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGFnZW50IG5hbWUgdG8gZXhlY3V0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdvYWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGdvYWwgZm9yIHRoZSBhZ2VudCB0byBhY2hpZXZlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJnb2FsXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBFeGVjdXRlQWdlbnRBcmdzKSA9PiBzZXJ2ZXIuZXhlY3V0ZUFnZW50KGFyZ3MubmFtZSwgYXJncy5nb2FsKVxuICAgIH0sXG4gICAgLy8gR2VuZXJpYyBlbGVtZW50IGNyZWF0aW9uIHRvb2xcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiY3JlYXRlX2VsZW1lbnRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQ3JlYXRlIGEgbmV3IGVsZW1lbnQgb2YgYW55IHR5cGVcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgbmFtZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZVwiLFxuICAgICAgICAgICAgICBlbnVtOiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJFbGVtZW50IGRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJFbGVtZW50IGNvbnRlbnQgKHJlcXVpcmVkIGZvciBzb21lIHR5cGVzKVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkFkZGl0aW9uYWwgbWV0YWRhdGEgc3BlY2lmaWMgdG8gZWxlbWVudCB0eXBlXCIsXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidHlwZVwiLCBcImRlc2NyaXB0aW9uXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBDcmVhdGVFbGVtZW50QXJncykgPT4gc2VydmVyLmNyZWF0ZUVsZW1lbnQoYXJncylcbiAgICB9LFxuICAgIC8vIEdlbmVyaWMgZWxlbWVudCBlZGl0aW5nIHRvb2xcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiZWRpdF9lbGVtZW50XCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkVkaXQgYW4gZXhpc3RpbmcgZWxlbWVudCBvZiBhbnkgdHlwZVwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCBuYW1lIHRvIGVkaXRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IHR5cGVcIixcbiAgICAgICAgICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmllbGQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGZpZWxkIHRvIGVkaXQgKGUuZy4sICdkZXNjcmlwdGlvbicsICdtZXRhZGF0YS5hdXRob3InLCAnY29udGVudCcpXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGZpZWxkXCIsXG4gICAgICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcIm51bWJlclwiIH0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICAgICAgICAgIHsgdHlwZTogXCJvYmplY3RcIiB9LFxuICAgICAgICAgICAgICAgIHsgdHlwZTogXCJhcnJheVwiIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ0eXBlXCIsIFwiZmllbGRcIiwgXCJ2YWx1ZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogRWRpdEVsZW1lbnRBcmdzKSA9PiBzZXJ2ZXIuZWRpdEVsZW1lbnQoYXJncylcbiAgICB9LFxuICAgIC8vIEdlbmVyaWMgZWxlbWVudCB2YWxpZGF0aW9uIHRvb2xcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwidmFsaWRhdGVfZWxlbWVudFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJWYWxpZGF0ZSBhbiBlbGVtZW50IGZvciBjb3JyZWN0bmVzcyBhbmQgYmVzdCBwcmFjdGljZXNcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgbmFtZSB0byB2YWxpZGF0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZVwiLFxuICAgICAgICAgICAgICBlbnVtOiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJpY3Q6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldoZXRoZXIgdG8gYXBwbHkgc3RyaWN0IHZhbGlkYXRpb24gcnVsZXNcIixcbiAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJ0eXBlXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBWYWxpZGF0ZUVsZW1lbnRBcmdzKSA9PiBzZXJ2ZXIudmFsaWRhdGVFbGVtZW50KGFyZ3MpXG4gICAgfSxcbiAgICAvLyBHZW5lcmljIGVsZW1lbnQgZGVsZXRpb24gdG9vbFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJkZWxldGVfZWxlbWVudFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJEZWxldGUgYW4gZWxlbWVudCBhbmQgb3B0aW9uYWxseSBpdHMgYXNzb2NpYXRlZCBkYXRhIGZpbGVzXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IG5hbWUgdG8gZGVsZXRlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCB0eXBlXCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbGV0ZURhdGE6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldoZXRoZXIgdG8gZGVsZXRlIGFzc29jaWF0ZWQgZGF0YSBmaWxlcyAoaWYgbm90IHNwZWNpZmllZCwgd2lsbCBwcm9tcHQpXCIsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiLCBcInR5cGVcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IERlbGV0ZUVsZW1lbnRBcmdzKSA9PiBzZXJ2ZXIuZGVsZXRlRWxlbWVudChhcmdzKVxuICAgIH0sXG4gIF07XG59Il19