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.

496 lines 63.1 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 with optional pagination, filtering, and sorting", inputSchema: { type: "object", properties: { type: { type: "string", description: "The element type to list", enum: Object.values(ElementType), }, // Pagination parameters (Issue #38) page: { type: "number", description: "Page number (1-indexed). Default: 1", minimum: 1, }, pageSize: { type: "number", description: "Number of items per page. Default: 25, max: 100", minimum: 1, maximum: 100, }, // Sorting parameters (Issue #38) sortBy: { type: "string", description: "Field to sort by. Default: 'name'", enum: ["name", "created", "modified", "version", "retention"], }, sortOrder: { type: "string", description: "Sort direction. Default: 'asc'", enum: ["asc", "desc"], }, // Filter parameters (Issue #38) nameContains: { type: "string", description: "Filter by partial name match (case-insensitive)", }, tags: { type: "array", items: { type: "string" }, description: "Filter by tags (AND logic - must have ALL tags)", }, tagsAny: { type: "array", items: { type: "string" }, description: "Filter by tags (OR logic - must have ANY tag)", }, author: { type: "string", description: "Filter by author (exact match, case-insensitive)", }, createdAfter: { type: "string", description: "Filter for elements created after this date (ISO 8601 format)", }, createdBefore: { type: "string", description: "Filter for elements created before this date (ISO 8601 format)", }, status: { type: "string", description: "Filter by element status", enum: ["active", "inactive", "all"], }, }, required: ["type"], }, }, handler: (args) => server.listElements(args.type, { pagination: { page: args.page, pageSize: args.pageSize, }, sort: { sortBy: args.sortBy, sortOrder: args.sortOrder, }, filters: { nameContains: args.nameContains, tags: args.tags, tagsAny: args.tagsAny, author: args.author, createdAfter: args.createdAfter, createdBefore: args.createdBefore, status: args.status, }, }) }, { 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 with a goal. Activates configured elements and returns context for LLM-driven agentic loop. The agent configuration defines a goal template that is filled with provided parameters.", inputSchema: { type: "object", properties: { name: { type: "string", description: "Name of the agent to execute", }, parameters: { type: "object", description: "Parameters for the agent goal template (e.g., {directory: \"src\"})", additionalProperties: true, }, }, required: ["name", "parameters"], }, }, handler: (args) => server.executeAgent(args.name, args.parameters) }, // 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 - GraphQL-aligned nested input { tool: { name: "edit_element", description: "Edit an existing element using nested input objects (deep-merged with existing)", inputSchema: { type: "object", properties: { name: { type: "string", description: "The element name to edit", }, type: { type: "string", description: "The element type", enum: Object.values(ElementType), }, input: { type: "object", description: "Nested object with fields to update. Fields are deep-merged with existing element. Example: { description: 'New desc', metadata: { triggers: ['code'] } }", additionalProperties: true, }, }, required: ["name", "type", "input"], }, }, 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) }, // Agent execution loop tools { tool: { name: "record_agent_step", description: "Record a step in the agent's execution, including progress, findings, and outcome. Use this to document what the agent has done, what it learned, and whether the step succeeded. This creates an audit trail, enables resumption, and returns an autonomy directive indicating whether to continue or pause.", inputSchema: { type: "object", properties: { agentName: { type: "string", description: "Name of the agent executing this step", }, stepDescription: { type: "string", description: "Brief description of what this step accomplished (e.g., 'Analyzed codebase for security issues', 'Generated test cases')", }, outcome: { type: "string", enum: ["success", "failure", "partial"], description: "Outcome of this step: 'success' (completed as intended), 'failure' (could not complete), 'partial' (made progress but not finished)", }, findings: { type: "string", description: "Detailed findings, results, or observations from this step. Include relevant data, insights, or context for future steps.", }, confidence: { type: "number", description: "Confidence level in this step's outcome (0.0 to 1.0). Optional, defaults to 0.8", minimum: 0, maximum: 1, }, nextActionHint: { type: "string", description: "Hint about the next planned action. Used for autonomy evaluation to determine if approval is needed before proceeding.", }, riskScore: { type: "number", description: "Risk score for the next action (0-100). Used for autonomy evaluation against risk tolerance thresholds.", minimum: 0, maximum: 100, }, }, required: ["agentName", "stepDescription", "outcome"], }, }, handler: (args) => server.recordAgentStep(args) }, { tool: { name: "complete_agent_goal", description: "Signal that the agent has completed its goal. This marks the goal as complete, updates decision outcomes, and calculates performance metrics. Use this when all success criteria have been met.", inputSchema: { type: "object", properties: { agentName: { type: "string", description: "Name of the agent completing its goal", }, goalId: { type: "string", description: "Optional specific goal ID to complete. If omitted, completes the most recent in-progress goal.", }, outcome: { type: "string", enum: ["success", "failure", "partial"], description: "Final outcome: 'success' (all criteria met), 'failure' (could not achieve goal), 'partial' (made progress but incomplete)", }, summary: { type: "string", description: "Summary of what was accomplished, challenges faced, and any relevant context for future reference", }, }, required: ["agentName", "outcome", "summary"], }, }, handler: (args) => server.completeAgentGoal(args) }, { tool: { name: "get_agent_state", description: "Query the current state of an agent, including active goals, decision history, progress, and execution context. Use this to understand what the agent has done and what remains to be completed.", inputSchema: { type: "object", properties: { agentName: { type: "string", description: "Name of the agent to query", }, includeDecisionHistory: { type: "boolean", description: "Include full decision history in response. Default: false (only includes recent decisions)", }, includeContext: { type: "boolean", description: "Include full execution context. Default: false (only includes summary)", }, }, required: ["agentName"], }, }, handler: (args) => server.getAgentState(args) }, { tool: { name: "continue_agent_execution", description: "Continue executing an agent from its current state. Use this to resume after interruption or start the next step in a multi-step workflow. Returns the agent's context including previous state, allowing the LLM to pick up where it left off.", inputSchema: { type: "object", properties: { agentName: { type: "string", description: "Name of the agent to continue", }, parameters: { type: "object", description: "Optional parameters to update the execution context (e.g., new data, changed requirements)", additionalProperties: true, }, previousStepResult: { type: "string", description: "Optional summary of the previous step's result to inform the next step", }, }, required: ["agentName"], }, }, handler: (args) => server.continueAgentExecution(args) }, ]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90b29scy9FbGVtZW50VG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBOEd2RCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQTBCO0lBQ3hELE9BQU87UUFDTDtZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsZUFBZTtnQkFDckIsV0FBVyxFQUFFLGlHQUFpRztnQkFDOUcsV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixJQUFJLEVBQUU7NEJBQ0osSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLDBCQUEwQjs0QkFDdkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO3lCQUNqQzt3QkFDRCxvQ0FBb0M7d0JBQ3BDLElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUUsUUFBUTs0QkFDZCxXQUFXLEVBQUUscUNBQXFDOzRCQUNsRCxPQUFPLEVBQUUsQ0FBQzt5QkFDWDt3QkFDRCxRQUFRLEVBQUU7NEJBQ1IsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLGlEQUFpRDs0QkFDOUQsT0FBTyxFQUFFLENBQUM7NEJBQ1YsT0FBTyxFQUFFLEdBQUc7eUJBQ2I7d0JBQ0QsaUNBQWlDO3dCQUNqQyxNQUFNLEVBQUU7NEJBQ04sSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLG1DQUFtQzs0QkFDaEQsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQzt5QkFDOUQ7d0JBQ0QsU0FBUyxFQUFFOzRCQUNULElBQUksRUFBRSxRQUFROzRCQUNkLFdBQVcsRUFBRSxnQ0FBZ0M7NEJBQzdDLElBQUks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QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGVtZW50LXJlbGF0ZWQgdG9vbCBkZWZpbml0aW9ucyBhbmQgaGFuZGxlcnNcbiAqIFByb3ZpZGVzIGdlbmVyaWMgdG9vbHMgdGhhdCB3b3JrIHdpdGggYWxsIGVsZW1lbnQgdHlwZXNcbiAqL1xuXG5pbXBvcnQgeyBUb29sRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL3R5cGVzL1Rvb2xUeXBlcy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRDUlVESGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL0VsZW1lbnRDUlVESGFuZGxlci5qcyc7XG5cbi8vIFR5cGUtc2FmZSBpbnRlcmZhY2VzIGZvciBhbGwgZWxlbWVudCB0b29sIGFyZ3VtZW50c1xuaW50ZXJmYWNlIExpc3RFbGVtZW50c0FyZ3Mge1xuICB0eXBlOiBzdHJpbmc7XG4gIC8vIFBhZ2luYXRpb24gb3B0aW9ucyAoSXNzdWUgIzM4KVxuICBwYWdlPzogbnVtYmVyO1xuICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgLy8gU29ydGluZyBvcHRpb25zIChJc3N1ZSAjMzgpXG4gIHNvcnRCeT86ICduYW1lJyB8ICdjcmVhdGVkJyB8ICdtb2RpZmllZCcgfCAndmVyc2lvbicgfCAncmV0ZW50aW9uJztcbiAgc29ydE9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8vIEZpbHRlciBvcHRpb25zIChJc3N1ZSAjMzgpXG4gIG5hbWVDb250YWlucz86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xuICB0YWdzQW55Pzogc3RyaW5nW107XG4gIGF1dGhvcj86IHN0cmluZztcbiAgY3JlYXRlZEFmdGVyPzogc3RyaW5nO1xuICBjcmVhdGVkQmVmb3JlPzogc3RyaW5nO1xuICBzdGF0dXM/OiAnYWN0aXZlJyB8ICdpbmFjdGl2ZScgfCAnYWxsJztcbn1cblxuaW50ZXJmYWNlIEFjdGl2YXRlRWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERlYWN0aXZhdGVFbGVtZW50QXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0RWxlbWVudERldGFpbHNBcmdzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRBY3RpdmVFbGVtZW50c0FyZ3Mge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDcmVhdGVFbGVtZW50QXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmludGVyZmFjZSBFZGl0RWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgVmFsaWRhdGVFbGVtZW50QXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBzdHJpY3Q/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlRWxlbWVudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZGVsZXRlRGF0YT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSZW5kZXJUZW1wbGF0ZUFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuaW50ZXJmYWNlIFJlbG9hZEVsZW1lbnRzQXJncyB7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEV4ZWN1dGVBZ2VudEFyZ3Mge1xuICBuYW1lOiBzdHJpbmc7XG4gIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmludGVyZmFjZSBSZWNvcmRBZ2VudFN0ZXBBcmdzIHtcbiAgYWdlbnROYW1lOiBzdHJpbmc7XG4gIHN0ZXBEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBvdXRjb21lOiBcInN1Y2Nlc3NcIiB8IFwiZmFpbHVyZVwiIHwgXCJwYXJ0aWFsXCI7XG4gIGZpbmRpbmdzPzogc3RyaW5nO1xuICBjb25maWRlbmNlPzogbnVtYmVyO1xuICBuZXh0QWN0aW9uSGludD86IHN0cmluZztcbiAgcmlza1Njb3JlPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ29tcGxldGVBZ2VudEdvYWxBcmdzIHtcbiAgYWdlbnROYW1lOiBzdHJpbmc7XG4gIGdvYWxJZD86IHN0cmluZztcbiAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRBZ2VudFN0YXRlQXJncyB7XG4gIGFnZW50TmFtZTogc3RyaW5nO1xuICBpbmNsdWRlRGVjaXNpb25IaXN0b3J5PzogYm9vbGVhbjtcbiAgaW5jbHVkZUNvbnRleHQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ29udGludWVBZ2VudEV4ZWN1dGlvbkFyZ3Mge1xuICBhZ2VudE5hbWU6IHN0cmluZztcbiAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHByZXZpb3VzU3RlcFJlc3VsdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRUb29scyhzZXJ2ZXI6IEVsZW1lbnRDUlVESGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IGFueSB9PiB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImxpc3RfZWxlbWVudHNcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTGlzdCBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZSB3aXRoIG9wdGlvbmFsIHBhZ2luYXRpb24sIGZpbHRlcmluZywgYW5kIHNvcnRpbmdcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZSB0byBsaXN0XCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFBhZ2luYXRpb24gcGFyYW1ldGVycyAoSXNzdWUgIzM4KVxuICAgICAgICAgICAgcGFnZToge1xuICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQYWdlIG51bWJlciAoMS1pbmRleGVkKS4gRGVmYXVsdDogMVwiLFxuICAgICAgICAgICAgICBtaW5pbXVtOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhZ2VTaXplOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk51bWJlciBvZiBpdGVtcyBwZXIgcGFnZS4gRGVmYXVsdDogMjUsIG1heDogMTAwXCIsXG4gICAgICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgICAgIG1heGltdW06IDEwMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTb3J0aW5nIHBhcmFtZXRlcnMgKElzc3VlICMzOClcbiAgICAgICAgICAgIHNvcnRCeToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJGaWVsZCB0byBzb3J0IGJ5LiBEZWZhdWx0OiAnbmFtZSdcIixcbiAgICAgICAgICAgICAgZW51bTogW1wibmFtZVwiLCBcImNyZWF0ZWRcIiwgXCJtb2RpZmllZFwiLCBcInZlcnNpb25cIiwgXCJyZXRlbnRpb25cIl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydE9yZGVyOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlNvcnQgZGlyZWN0aW9uLiBEZWZhdWx0OiAnYXNjJ1wiLFxuICAgICAgICAgICAgICBlbnVtOiBbXCJhc2NcIiwgXCJkZXNjXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEZpbHRlciBwYXJhbWV0ZXJzIChJc3N1ZSAjMzgpXG4gICAgICAgICAgICBuYW1lQ29udGFpbnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsdGVyIGJ5IHBhcnRpYWwgbmFtZSBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSlcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJGaWx0ZXIgYnkgdGFncyAoQU5EIGxvZ2ljIC0gbXVzdCBoYXZlIEFMTCB0YWdzKVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhZ3NBbnk6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICBpdGVtczogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkZpbHRlciBieSB0YWdzIChPUiBsb2dpYyAtIG11c3QgaGF2ZSBBTlkgdGFnKVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dGhvcjoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJGaWx0ZXIgYnkgYXV0aG9yIChleGFjdCBtYXRjaCwgY2FzZS1pbnNlbnNpdGl2ZSlcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGVkQWZ0ZXI6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsdGVyIGZvciBlbGVtZW50cyBjcmVhdGVkIGFmdGVyIHRoaXMgZGF0ZSAoSVNPIDg2MDEgZm9ybWF0KVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZWRCZWZvcmU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsdGVyIGZvciBlbGVtZW50cyBjcmVhdGVkIGJlZm9yZSB0aGlzIGRhdGUgKElTTyA4NjAxIGZvcm1hdClcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRmlsdGVyIGJ5IGVsZW1lbnQgc3RhdHVzXCIsXG4gICAgICAgICAgICAgIGVudW06IFtcImFjdGl2ZVwiLCBcImluYWN0aXZlXCIsIFwiYWxsXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0eXBlXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBMaXN0RWxlbWVudHNBcmdzKSA9PiBzZXJ2ZXIubGlzdEVsZW1lbnRzKGFyZ3MudHlwZSwge1xuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgcGFnZTogYXJncy5wYWdlLFxuICAgICAgICAgIHBhZ2VTaXplOiBhcmdzLnBhZ2VTaXplLFxuICAgICAgICB9LFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgc29ydEJ5OiBhcmdzLnNvcnRCeSxcbiAgICAgICAgICBzb3J0T3JkZXI6IGFyZ3Muc29ydE9yZGVyLFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgbmFtZUNvbnRhaW5zOiBhcmdzLm5hbWVDb250YWlucyxcbiAgICAgICAgICB0YWdzOiBhcmdzLnRhZ3MsXG4gICAgICAgICAgdGFnc0FueTogYXJncy50YWdzQW55LFxuICAgICAgICAgIGF1dGhvcjogYXJncy5hdXRob3IsXG4gICAgICAgICAgY3JlYXRlZEFmdGVyOiBhcmdzLmNyZWF0ZWRBZnRlcixcbiAgICAgICAgICBjcmVhdGVkQmVmb3JlOiBhcmdzLmNyZWF0ZWRCZWZvcmUsXG4gICAgICAgICAgc3RhdHVzOiBhcmdzLnN0YXR1cyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiYWN0aXZhdGVfZWxlbWVudFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJBY3RpdmF0ZSBhIHNwZWNpZmljIGVsZW1lbnQgYnkgbmFtZVwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCBuYW1lIHRvIGFjdGl2YXRlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCB0eXBlXCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidHlwZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogQWN0aXZhdGVFbGVtZW50QXJncykgPT4gc2VydmVyLmFjdGl2YXRlRWxlbWVudChhcmdzLm5hbWUsIGFyZ3MudHlwZSlcbiAgICB9LFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJnZXRfYWN0aXZlX2VsZW1lbnRzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkdldCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZVwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCB0eXBlIHRvIGNoZWNrXCIsXG4gICAgICAgICAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0eXBlXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBHZXRBY3RpdmVFbGVtZW50c0FyZ3MpID0+IHNlcnZlci5nZXRBY3RpdmVFbGVtZW50cyhhcmdzLnR5cGUpXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiZGVhY3RpdmF0ZV9lbGVtZW50XCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkRlYWN0aXZhdGUgYSBzcGVjaWZpYyBlbGVtZW50XCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlbGVtZW50IG5hbWUgdG8gZGVhY3RpdmF0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZVwiLFxuICAgICAgICAgICAgICBlbnVtOiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiLCBcInR5cGVcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IERlYWN0aXZhdGVFbGVtZW50QXJncykgPT4gc2VydmVyLmRlYWN0aXZhdGVFbGVtZW50KGFyZ3MubmFtZSwgYXJncy50eXBlKVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImdldF9lbGVtZW50X2RldGFpbHNcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgZWxlbWVudFwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWxlbWVudCBuYW1lIHRvIGdldCBkZXRhaWxzIGZvclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZVwiLFxuICAgICAgICAgICAgICBlbnVtOiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wibmFtZVwiLCBcInR5cGVcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IEdldEVsZW1lbnREZXRhaWxzQXJncykgPT4gc2VydmVyLmdldEVsZW1lbnREZXRhaWxzKGFyZ3MubmFtZSwgYXJncy50eXBlKVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcInJlbG9hZF9lbGVtZW50c1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZWxvYWQgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlIGZyb20gdGhlIGZpbGVzeXN0ZW1cIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGVsZW1lbnQgdHlwZSB0byByZWxvYWRcIixcbiAgICAgICAgICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcInR5cGVcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IFJlbG9hZEVsZW1lbnRzQXJncykgPT4gc2VydmVyLnJlbG9hZEVsZW1lbnRzKGFyZ3MudHlwZSlcbiAgICB9LFxuICAgIC8vIEVsZW1lbnQtc3BlY2lmaWMgdG9vbHNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwicmVuZGVyX3RlbXBsYXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlbmRlciBhIHRlbXBsYXRlIGVsZW1lbnQgd2l0aCBwcm92aWRlZCB2YXJpYWJsZXNcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRlbXBsYXRlIG5hbWUgdG8gcmVuZGVyXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlZhcmlhYmxlcyB0byB1c2UgaW4gdGhlIHRlbXBsYXRlXCIsXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJuYW1lXCIsIFwidmFyaWFibGVzXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBSZW5kZXJUZW1wbGF0ZUFyZ3MpID0+IHNlcnZlci5yZW5kZXJUZW1wbGF0ZShhcmdzLm5hbWUsIGFyZ3MudmFyaWFibGVzKVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRXhlY3V0ZSBhbiBhZ2VudCB3aXRoIGEgZ29hbC4gQWN0aXZhdGVzIGNvbmZpZ3VyZWQgZWxlbWVudHMgYW5kIHJldHVybnMgY29udGV4dCBmb3IgTExNLWRyaXZlbiBhZ2VudGljIGxvb3AuIFRoZSBhZ2VudCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSBnb2FsIHRlbXBsYXRlIHRoYXQgaXMgZmlsbGVkIHdpdGggcHJvdmlkZWQgcGFyYW1ldGVycy5cIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTmFtZSBvZiB0aGUgYWdlbnQgdG8gZXhlY3V0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUGFyYW1ldGVycyBmb3IgdGhlIGFnZW50IGdvYWwgdGVtcGxhdGUgKGUuZy4sIHtkaXJlY3Rvcnk6IFxcXCJzcmNcXFwifSlcIixcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcIm5hbWVcIiwgXCJwYXJhbWV0ZXJzXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBFeGVjdXRlQWdlbnRBcmdzKSA9PiBzZXJ2ZXIuZXhlY3V0ZUFnZW50KGFyZ3MubmFtZSwgYXJncy5wYXJhbWV0ZXJzKVxuICAgIH0sXG4gICAgLy8gR2VuZXJpYyBlbGVtZW50IGNyZWF0aW9uIHRvb2xcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiY3JlYXRlX2VsZW1lbnRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQ3JlYXRlIGEgbmV3IGVsZW1lbnQgb2YgYW55IHR5cGVcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9i