@decaf-ts/mcp-server 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE.md +86 -21
  2. package/README.md +13 -13
  3. package/dist/mcp-server.cjs +893 -187
  4. package/dist/mcp-server.esm.cjs +888 -180
  5. package/lib/McpWrapper.cjs +189 -0
  6. package/lib/McpWrapper.d.ts +101 -0
  7. package/lib/bin/cli.cjs +30 -54
  8. package/lib/bin/cli.d.ts +18 -44
  9. package/lib/constants.cjs +12 -0
  10. package/lib/constants.d.ts +8 -0
  11. package/lib/esm/McpWrapper.d.ts +101 -0
  12. package/lib/esm/McpWrapper.js +182 -0
  13. package/lib/esm/bin/cli.d.ts +18 -44
  14. package/lib/esm/bin/cli.js +28 -55
  15. package/lib/esm/constants.d.ts +8 -0
  16. package/lib/esm/constants.js +9 -0
  17. package/lib/esm/index.d.ts +5 -26
  18. package/lib/esm/index.js +6 -27
  19. package/lib/esm/mcp/index.d.ts +1 -0
  20. package/lib/esm/mcp/index.js +2 -0
  21. package/lib/esm/metadata.d.ts +9 -0
  22. package/lib/esm/metadata.js +22 -0
  23. package/lib/esm/modules/decoration/index.d.ts +0 -0
  24. package/lib/esm/modules/decoration/index.js +2 -0
  25. package/lib/esm/modules/mcp/decoration-assist.d.ts +39 -0
  26. package/lib/esm/modules/mcp/decoration-assist.js +353 -0
  27. package/lib/esm/modules/mcp/decorator-tools.d.ts +118 -0
  28. package/lib/esm/modules/mcp/decorator-tools.js +237 -0
  29. package/lib/esm/modules/mcp/index.d.ts +2 -0
  30. package/lib/esm/modules/mcp/index.js +3 -0
  31. package/lib/esm/modules/mcp/mcp-module.d.ts +230 -0
  32. package/lib/esm/modules/mcp/mcp-module.js +406 -0
  33. package/lib/esm/types.d.ts +15 -0
  34. package/lib/esm/types.js +2 -0
  35. package/lib/esm/utils.d.ts +54 -13
  36. package/lib/esm/utils.js +78 -15
  37. package/lib/index.cjs +6 -28
  38. package/lib/index.d.ts +5 -26
  39. package/lib/mcp/index.cjs +17 -0
  40. package/lib/mcp/index.d.ts +1 -0
  41. package/lib/metadata.cjs +25 -0
  42. package/lib/metadata.d.ts +9 -0
  43. package/lib/modules/decoration/index.cjs +2 -0
  44. package/lib/modules/decoration/index.d.ts +0 -0
  45. package/lib/modules/mcp/decoration-assist.cjs +360 -0
  46. package/lib/modules/mcp/decoration-assist.d.ts +39 -0
  47. package/lib/modules/mcp/decorator-tools.cjs +243 -0
  48. package/lib/modules/mcp/decorator-tools.d.ts +118 -0
  49. package/lib/modules/mcp/index.cjs +24 -0
  50. package/lib/modules/mcp/index.d.ts +2 -0
  51. package/lib/modules/mcp/mcp-module.cjs +452 -0
  52. package/lib/modules/mcp/mcp-module.d.ts +230 -0
  53. package/lib/types.cjs +3 -0
  54. package/lib/types.d.ts +15 -0
  55. package/lib/utils.cjs +116 -16
  56. package/lib/utils.d.ts +54 -13
  57. package/package.json +35 -7
  58. package/lib/esm/namespace/Class.d.ts +0 -74
  59. package/lib/esm/namespace/Class.js +0 -73
  60. package/lib/esm/namespace/Interface.d.ts +0 -17
  61. package/lib/esm/namespace/Interface.js +0 -2
  62. package/lib/esm/namespace/children/ChildClass.d.ts +0 -44
  63. package/lib/esm/namespace/children/ChildClass.js +0 -43
  64. package/lib/esm/namespace/children/ChildInterface.d.ts +0 -22
  65. package/lib/esm/namespace/children/ChildInterface.js +0 -2
  66. package/lib/esm/namespace/children/Enum.d.ts +0 -14
  67. package/lib/esm/namespace/children/Enum.js +0 -16
  68. package/lib/esm/namespace/children/function.d.ts +0 -31
  69. package/lib/esm/namespace/children/function.js +0 -33
  70. package/lib/esm/namespace/children/index.d.ts +0 -25
  71. package/lib/esm/namespace/children/index.js +0 -26
  72. package/lib/esm/namespace/index.d.ts +0 -18
  73. package/lib/esm/namespace/index.js +0 -19
  74. package/lib/esm/namespace/type.d.ts +0 -28
  75. package/lib/esm/namespace/type.js +0 -2
  76. package/lib/namespace/Class.cjs +0 -77
  77. package/lib/namespace/Class.d.ts +0 -74
  78. package/lib/namespace/Interface.cjs +0 -3
  79. package/lib/namespace/Interface.d.ts +0 -17
  80. package/lib/namespace/children/ChildClass.cjs +0 -47
  81. package/lib/namespace/children/ChildClass.d.ts +0 -44
  82. package/lib/namespace/children/ChildInterface.cjs +0 -3
  83. package/lib/namespace/children/ChildInterface.d.ts +0 -22
  84. package/lib/namespace/children/Enum.cjs +0 -19
  85. package/lib/namespace/children/Enum.d.ts +0 -14
  86. package/lib/namespace/children/function.cjs +0 -36
  87. package/lib/namespace/children/function.d.ts +0 -31
  88. package/lib/namespace/children/index.cjs +0 -42
  89. package/lib/namespace/children/index.d.ts +0 -25
  90. package/lib/namespace/index.cjs +0 -35
  91. package/lib/namespace/index.d.ts +0 -18
  92. package/lib/namespace/type.cjs +0 -3
  93. package/lib/namespace/type.d.ts +0 -28
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.decoratorTools = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function escapeRegExp(value) {
10
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
11
+ }
12
+ function formatDecorator(spec) {
13
+ const args = (spec.args || []).map((arg) => JSON.stringify(arg)).join(", ");
14
+ return `@${spec.name}(${args})`;
15
+ }
16
+ function ensureDirectory(filePath) {
17
+ fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
18
+ }
19
+ function collectDecoratorNames(classDecorators, properties) {
20
+ const names = new Set();
21
+ names.add("model");
22
+ for (const decorator of classDecorators || []) {
23
+ names.add(decorator.name);
24
+ }
25
+ for (const property of properties || []) {
26
+ for (const decorator of property.decorators || []) {
27
+ names.add(decorator.name);
28
+ }
29
+ }
30
+ return names;
31
+ }
32
+ function ensureImport(content, importsFrom, decorators) {
33
+ /* istanbul ignore next */
34
+ if (!decorators.size)
35
+ return content;
36
+ const importRegex = new RegExp(`import\\s+\\{([^}]+)\\}\\s+from\\s+["']${escapeRegExp(importsFrom)}["'];`);
37
+ const match = content.match(importRegex);
38
+ const sorted = Array.from(decorators).sort();
39
+ if (match) {
40
+ const existing = match[1]
41
+ .split(",")
42
+ .map((name) => name.trim())
43
+ .filter(Boolean);
44
+ const merged = Array.from(new Set([...existing, ...sorted])).sort();
45
+ return content.replace(importRegex, `import { ${merged.join(", ")} } from "${importsFrom}";`);
46
+ }
47
+ const importLine = `import { ${sorted.join(", ")} } from "${importsFrom}";`;
48
+ return `${importLine}\n\n${content}`;
49
+ }
50
+ function addPropertyBlock(property) {
51
+ const decorators = (property.decorators || [])
52
+ .map(formatDecorator)
53
+ .join("\n ");
54
+ const decoratorBlock = decorators ? ` ${decorators}\n` : "";
55
+ return `${decoratorBlock} ${property.name}: ${property.type};`;
56
+ }
57
+ function removePropertyBlock(content, propertyName) {
58
+ const lines = content.split(/\r?\n/);
59
+ const result = [];
60
+ for (let i = 0; i < lines.length; i++) {
61
+ const line = lines[i];
62
+ if (line.trim().startsWith(`@`) &&
63
+ lines[i + 1]?.includes(`${propertyName}:`)) {
64
+ continue;
65
+ }
66
+ if (line.includes(`${propertyName}:`)) {
67
+ // skip this line and any trailing blank line
68
+ continue;
69
+ }
70
+ result.push(line);
71
+ }
72
+ return result.join("\n");
73
+ }
74
+ function insertDecorator(content, decorator, target) {
75
+ const decoratorLine = formatDecorator(decorator);
76
+ if (target.kind === "class") {
77
+ const classRegex = /(export\s+class\s+[^\s{]+\s*\{)/;
78
+ if (content.includes(decoratorLine))
79
+ return content;
80
+ return content.replace(classRegex, `${decoratorLine}\n$1`);
81
+ }
82
+ if (!target.name)
83
+ return content;
84
+ const propertyRegex = new RegExp(`(^\\s*)(?:@.*\\n\\1)*${escapeRegExp(target.name)}:`, "m");
85
+ const match = propertyRegex.exec(content);
86
+ if (!match)
87
+ return content;
88
+ const indent = match[1] || " ";
89
+ if (content.includes(`${indent}${decoratorLine}`))
90
+ return content;
91
+ return (content.slice(0, match.index) +
92
+ `${indent}${decoratorLine}\n` +
93
+ content.slice(match.index));
94
+ }
95
+ function removeDecorator(content, decoratorName, target) {
96
+ const decoratorRegex = new RegExp(`^\\s*@${escapeRegExp(decoratorName)}\\([^)]*\\)`, "m");
97
+ if (target.kind === "class") {
98
+ return content.replace(decoratorRegex, "");
99
+ }
100
+ if (target.name) {
101
+ const pattern = new RegExp(`(^\\s*@${escapeRegExp(decoratorName)}\\([^)]*\\)\\s*$\\n)(?=\\s*${escapeRegExp(target.name)}:)`, "m");
102
+ return content.replace(pattern, "");
103
+ }
104
+ return content;
105
+ }
106
+ function writeIfChanged(filePath, content) {
107
+ ensureDirectory(filePath);
108
+ fs_1.default.writeFileSync(filePath, content);
109
+ }
110
+ exports.decoratorTools = {
111
+ createOrUpdateModelTool: {
112
+ name: "create-or-update-model",
113
+ description: "Create or update a validation-ready model class",
114
+ execute: async (args) => {
115
+ if (!args.overwrite && fs_1.default.existsSync(args.filePath)) {
116
+ throw new Error(`File already exists at ${args.filePath}`);
117
+ }
118
+ const decorators = collectDecoratorNames(args.classDecorators, args.properties);
119
+ let content = `@model()`;
120
+ for (const decorator of args.classDecorators || []) {
121
+ content += `\n${formatDecorator(decorator)}`;
122
+ }
123
+ const properties = (args.properties || [])
124
+ .map(addPropertyBlock)
125
+ .join("\n\n");
126
+ content += `\nexport class ${args.className} {\n${properties ? `${properties}\n` : ""}}\n`;
127
+ content = ensureImport(content, args.importsFrom, decorators);
128
+ writeIfChanged(args.filePath, content);
129
+ return { filePath: args.filePath };
130
+ },
131
+ },
132
+ addAttributeTool: {
133
+ name: "add-attribute",
134
+ description: "Add a decorated attribute to an existing model",
135
+ execute: async (args) => {
136
+ if (!fs_1.default.existsSync(args.filePath)) {
137
+ throw new Error(`Model file not found at ${args.filePath}`);
138
+ }
139
+ let content = fs_1.default.readFileSync(args.filePath, "utf8");
140
+ if (content.includes(`${args.attribute.name}:`)) {
141
+ return { filePath: args.filePath };
142
+ }
143
+ const decorators = collectDecoratorNames(undefined, [args.attribute]);
144
+ content = ensureImport(content, args.importsFrom, decorators);
145
+ const insertionPoint = content.lastIndexOf("}");
146
+ const block = addPropertyBlock(args.attribute);
147
+ const before = content.slice(0, insertionPoint).replace(/\s*$/, "");
148
+ const after = content.slice(insertionPoint);
149
+ const updated = `${before}\n${block}\n${after}`;
150
+ writeIfChanged(args.filePath, updated);
151
+ return { filePath: args.filePath };
152
+ },
153
+ },
154
+ removeAttributeTool: {
155
+ name: "remove-attribute",
156
+ description: "Remove an attribute from a model class",
157
+ execute: async (args) => {
158
+ if (!fs_1.default.existsSync(args.filePath))
159
+ return { filePath: args.filePath };
160
+ const content = fs_1.default.readFileSync(args.filePath, "utf8");
161
+ const updated = removePropertyBlock(content, args.attributeName);
162
+ writeIfChanged(args.filePath, updated);
163
+ return { filePath: args.filePath };
164
+ },
165
+ },
166
+ applyDecoratorTool: {
167
+ name: "apply-decorator",
168
+ description: "Apply a decorator to a class or property",
169
+ execute: async (args) => {
170
+ if (!fs_1.default.existsSync(args.filePath)) {
171
+ throw new Error(`Model file not found at ${args.filePath}`);
172
+ }
173
+ let content = fs_1.default.readFileSync(args.filePath, "utf8");
174
+ const decorators = new Set([args.decorator.name]);
175
+ content = ensureImport(content, args.importsFrom, decorators);
176
+ content = insertDecorator(content, args.decorator, args.target);
177
+ writeIfChanged(args.filePath, content);
178
+ return { filePath: args.filePath };
179
+ },
180
+ },
181
+ removeDecoratorTool: {
182
+ name: "remove-decorator",
183
+ description: "Remove a decorator from a class or property",
184
+ execute: async (args) => {
185
+ if (!fs_1.default.existsSync(args.filePath))
186
+ return { filePath: args.filePath };
187
+ let content = fs_1.default.readFileSync(args.filePath, "utf8");
188
+ content = removeDecorator(content, args.decoratorName, args.target);
189
+ writeIfChanged(args.filePath, content);
190
+ return { filePath: args.filePath };
191
+ },
192
+ },
193
+ scaffoldValidatorTool: {
194
+ name: "scaffold-validator",
195
+ description: "Scaffold a validator class and optional decorator",
196
+ execute: async (args) => {
197
+ const classFile = path_1.default.join(args.validatorsDir, `${args.name}.ts`);
198
+ ensureDirectory(classFile);
199
+ const classContent = `export class ${args.name} {\n validate(value: unknown): boolean {\n return value !== undefined;\n }\n}\n`;
200
+ fs_1.default.writeFileSync(classFile, classContent);
201
+ let decoratorFile;
202
+ if (args.decoratorDir) {
203
+ decoratorFile = path_1.default.join(args.decoratorDir, `${args.name}Decorator.ts`);
204
+ ensureDirectory(decoratorFile);
205
+ fs_1.default.writeFileSync(decoratorFile, `export function ${args.name}Decorator() {\n return () => void 0;\n}\n`);
206
+ }
207
+ return { classFile, decoratorFile };
208
+ },
209
+ },
210
+ scaffoldSerializerTool: {
211
+ name: "scaffold-serializer",
212
+ description: "Scaffold a serializer class and optional registry",
213
+ execute: async (args) => {
214
+ const classFile = path_1.default.join(args.dir, `${args.name}.ts`);
215
+ ensureDirectory(classFile);
216
+ fs_1.default.writeFileSync(classFile, `export class ${args.name} {\n serialize(value: unknown): string {\n return JSON.stringify(value);\n }\n}\n`);
217
+ let registerFile;
218
+ if (args.registerDir) {
219
+ registerFile = path_1.default.join(args.registerDir, `${args.name}Register.ts`);
220
+ ensureDirectory(registerFile);
221
+ fs_1.default.writeFileSync(registerFile, `export function register${args.name}() {\n return ${args.setDefault ? "'default'" : "'optional'"};\n}\n`);
222
+ }
223
+ return { classFile, registerFile };
224
+ },
225
+ },
226
+ scaffoldHashingTool: {
227
+ name: "scaffold-hashing",
228
+ description: "Scaffold a hashing function and optional registry",
229
+ execute: async (args) => {
230
+ const functionFile = path_1.default.join(args.dir, `${args.name}.ts`);
231
+ ensureDirectory(functionFile);
232
+ fs_1.default.writeFileSync(functionFile, `export function ${args.name}(value: string): string {\n return value.split('').reverse().join('');\n}\n`);
233
+ let registerFile;
234
+ if (args.registerDir) {
235
+ registerFile = path_1.default.join(args.registerDir, `${args.name}Register.ts`);
236
+ ensureDirectory(registerFile);
237
+ fs_1.default.writeFileSync(registerFile, `export function register${args.name}() {\n return ${args.setDefault ? "'default'" : "'optional'"};\n}\n`);
238
+ }
239
+ return { functionFile, registerFile };
240
+ },
241
+ },
242
+ };
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZHVsZXMvbWNwL2RlY29yYXRvci10b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBYXhCLFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFtQjtJQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVFLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxRQUFnQjtJQUN2QyxZQUFFLENBQUMsU0FBUyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsZUFBNEMsRUFDNUMsVUFBdUM7SUFFdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLEtBQUssTUFBTSxTQUFTLElBQUksZUFBZSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxLQUFLLE1BQU0sUUFB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SSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLFFBQVEsQ0FDM0csQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ3hDLENBQUM7S0FDRjtDQUNPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFyZ3M/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBBdHRyaWJ1dGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZGVjb3JhdG9ycz86IERlY29yYXRvclNwZWNbXTtcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERlY29yYXRvcihzcGVjOiBEZWNvcmF0b3JTcGVjKTogc3RyaW5nIHtcbiAgY29uc3QgYXJncyA9IChzcGVjLmFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PiBKU09OLnN0cmluZ2lmeShhcmcpKS5qb2luKFwiLCBcIik7XG4gIHJldHVybiBgQCR7c3BlYy5uYW1lfSgke2FyZ3N9KWA7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdERlY29yYXRvck5hbWVzKFxuICBjbGFzc0RlY29yYXRvcnM6IERlY29yYXRvclNwZWNbXSB8IHVuZGVmaW5lZCxcbiAgcHJvcGVydGllczogQXR0cmlidXRlU3BlY1tdIHwgdW5kZWZpbmVkXG4pIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbmFtZXMuYWRkKFwibW9kZWxcIik7XG4gIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGNsYXNzRGVjb3JhdG9ycyB8fCBbXSkge1xuICAgIG5hbWVzLmFkZChkZWNvcmF0b3IubmFtZSk7XG4gIH1cbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzIHx8IFtdKSB7XG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgcHJvcGVydHkuZGVjb3JhdG9ycyB8fCBbXSkge1xuICAgICAgbmFtZXMuYWRkKGRlY29yYXRvci5uYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVJbXBvcnQoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgaW1wb3J0c0Zyb206IHN0cmluZyxcbiAgZGVjb3JhdG9yczogU2V0PHN0cmluZz5cbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWRlY29yYXRvcnMuc2l6ZSkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGltcG9ydFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgaW1wb3J0XFxcXHMrXFxcXHsoW159XSspXFxcXH1cXFxccytmcm9tXFxcXHMrW1wiJ10ke2VzY2FwZVJlZ0V4cChpbXBvcnRzRnJvbSl9W1wiJ107YFxuICApO1xuICBjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goaW1wb3J0UmVnZXgpO1xuICBjb25zdCBzb3J0ZWQgPSBBcnJheS5mcm9tKGRlY29yYXRvcnMpLnNvcnQoKTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IG1hdGNoWzFdXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChuYW1lKSA9PiBuYW1lLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5leGlzdGluZywgLi4uc29ydGVkXSkpLnNvcnQoKTtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKFxuICAgICAgaW1wb3J0UmVnZXgsXG4gICAgICBgaW1wb3J0IHsgJHttZXJnZWQuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke2ltcG9ydHNGcm9tfVwiO2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW1wb3J0TGluZSA9IGBpbXBvcnQgeyAke3NvcnRlZC5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7aW1wb3J0c0Zyb219XCI7YDtcbiAgcmV0dXJuIGAke2ltcG9ydExpbmV9XFxuXFxuJHtjb250ZW50fWA7XG59XG5cbmZ1bmN0aW9uIGFkZFByb3BlcnR5QmxvY2socHJvcGVydHk6IEF0dHJpYnV0ZVNwZWMpIHtcbiAgY29uc3QgZGVjb3JhdG9ycyA9IChwcm9wZXJ0eS5kZWNvcmF0b3JzIHx8IFtdKVxuICAgIC5tYXAoZm9ybWF0RGVjb3JhdG9yKVxuICAgIC5qb2luKFwiXFxuICBcIik7XG4gIGNvbnN0IGRlY29yYXRvckJsb2NrID0gZGVjb3JhdG9ycyA/IGAgICR7ZGVjb3JhdG9yc31cXG5gIDogXCJcIjtcbiAgcmV0dXJuIGAke2RlY29yYXRvckJsb2NrfSAgJHtwcm9wZXJ0eS5uYW1lfTogJHtwcm9wZXJ0eS50eXBlfTtgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcm9wZXJ0eUJsb2NrKGNvbnRlbnQ6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICBpZiAoXG4gICAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKGBAYCkgJiZcbiAgICAgIGxpbmVzW2kgKyAxXT8uaW5jbHVkZXMoYCR7cHJvcGVydHlOYW1lfTpgKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChsaW5lLmluY2x1ZGVzKGAke3Byb3BlcnR5TmFtZX06YCkpIHtcbiAgICAgIC8vIHNraXAgdGhpcyBsaW5lIGFuZCBhbnkgdHJhaWxpbmcgYmxhbmsgbGluZVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0RGVjb3JhdG9yKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yU3BlYyxcbiAgdGFyZ2V0OiB7XG4gICAga2luZDogXCJjbGFzc1wiIHwgXCJwcm9wZXJ0eVwiO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gIH1cbikge1xuICBjb25zdCBkZWNvcmF0b3JMaW5lID0gZm9ybWF0RGVjb3JhdG9yKGRlY29yYXRvcik7XG4gIGlmICh0YXJnZXQua2luZCA9PT0gXCJjbGFzc1wiKSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC8oZXhwb3J0XFxzK2NsYXNzXFxzK1teXFxze10rXFxzKlxceykvO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKGRlY29yYXRvckxpbmUpKSByZXR1cm4gY29udGVudDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKGNsYXNzUmVnZXgsIGAke2RlY29yYXRvckxpbmV9XFxuJDFgKTtcbiAgfVxuICBpZiAoIXRhcmdldC5uYW1lKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgcHJvcGVydHlSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgYCheXFxcXHMqKSg/OkAuKlxcXFxuXFxcXDEpKiR7ZXNjYXBlUmVnRXhwKHRhcmdldC5uYW1lKX06YCxcbiAgICBcIm1cIlxuICApO1xuICBjb25zdCBtYXRjaCA9IHByb3BlcnR5UmVnZXguZXhlYyhjb250ZW50KTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGluZGVudCA9IG1hdGNoWzFdIHx8IFwiICBcIjtcbiAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoYCR7aW5kZW50fSR7ZGVjb3JhdG9yTGluZX1gKSkgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCBtYXRjaC5pbmRleCkgK1xuICAgIGAke2luZGVudH0ke2RlY29yYXRvckxpbmV9XFxuYCArXG4gICAgY29udGVudC5zbGljZShtYXRjaC5pbmRleClcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRGVjb3JhdG9yKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbiAgdGFyZ2V0OiB7XG4gICAga2luZDogXCJjbGFzc1wiIHwgXCJwcm9wZXJ0eVwiO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gIH1cbikge1xuICBjb25zdCBkZWNvcmF0b3JSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgYF5cXFxccypAJHtlc2NhcGVSZWdFeHAoZGVjb3JhdG9yTmFtZSl9XFxcXChbXildKlxcXFwpYCxcbiAgICBcIm1cIlxuICApO1xuICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiY2xhc3NcIikge1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoZGVjb3JhdG9yUmVnZXgsIFwiXCIpO1xuICB9XG4gIGlmICh0YXJnZXQubmFtZSkge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgYCheXFxcXHMqQCR7ZXNjYXBlUmVnRXhwKGRlY29yYXRvck5hbWUpfVxcXFwoW14pXSpcXFxcKVxcXFxzKiRcXFxcbikoPz1cXFxccyoke2VzY2FwZVJlZ0V4cCh0YXJnZXQubmFtZSl9OilgLFxuICAgICAgXCJtXCJcbiAgICApO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgXCJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSWZDaGFuZ2VkKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlY29yYXRvclRvb2xzID0ge1xuICBjcmVhdGVPclVwZGF0ZU1vZGVsVG9vbDoge1xuICAgIG5hbWU6IFwiY3JlYXRlLW9yLXVwZGF0ZS1tb2RlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNyZWF0ZSBvciB1cGRhdGUgYSB2YWxpZGF0aW9uLXJlYWR5IG1vZGVsIGNsYXNzXCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIGNsYXNzRGVjb3JhdG9ycz86IERlY29yYXRvclNwZWNbXTtcbiAgICAgIHByb3BlcnRpZXM6IEF0dHJpYnV0ZVNwZWNbXTtcbiAgICAgIGltcG9ydHNGcm9tOiBzdHJpbmc7XG4gICAgICBvdmVyd3JpdGU/OiBib29sZWFuO1xuICAgIH0pID0+IHtcbiAgICAgIGlmICghYXJncy5vdmVyd3JpdGUgJiYgZnMuZXhpc3RzU3luYyhhcmdzLmZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHMgYXQgJHthcmdzLmZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGNvbGxlY3REZWNvcmF0b3JOYW1lcyhcbiAgICAgICAgYXJncy5jbGFzc0RlY29yYXRvcnMsXG4gICAgICAgIGFyZ3MucHJvcGVydGllc1xuICAgICAgKTtcbiAgICAgIGxldCBjb250ZW50ID0gYEBtb2RlbCgpYDtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGFyZ3MuY2xhc3NEZWNvcmF0b3JzIHx8IFtdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gYFxcbiR7Zm9ybWF0RGVjb3JhdG9yKGRlY29yYXRvcil9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSAoYXJncy5wcm9wZXJ0aWVzIHx8IFtdKVxuICAgICAgICAubWFwKGFkZFByb3BlcnR5QmxvY2spXG4gICAgICAgIC5qb2luKFwiXFxuXFxuXCIpO1xuICAgICAgY29udGVudCArPSBgXFxuZXhwb3J0IGNsYXNzICR7YXJncy5jbGFzc05hbWV9IHtcXG4ke3Byb3BlcnRpZXMgPyBgJHtwcm9wZXJ0aWVzfVxcbmAgOiBcIlwifX1cXG5gO1xuICAgICAgY29udGVudCA9IGVuc3VyZUltcG9ydChjb250ZW50LCBhcmdzLmltcG9ydHNGcm9tLCBkZWNvcmF0b3JzKTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICBhZGRBdHRyaWJ1dGVUb29sOiB7XG4gICAgbmFtZTogXCJhZGQtYXR0cmlidXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRkIGEgZGVjb3JhdGVkIGF0dHJpYnV0ZSB0byBhbiBleGlzdGluZyBtb2RlbFwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyaWJ1dGU6IEF0dHJpYnV0ZVNwZWM7XG4gICAgICBpbXBvcnRzRnJvbTogc3RyaW5nO1xuICAgIH0pID0+IHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhhcmdzLmZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIGZpbGUgbm90IGZvdW5kIGF0ICR7YXJncy5maWxlUGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFyZ3MuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKGAke2FyZ3MuYXR0cmlidXRlLm5hbWV9OmApKSB7XG4gICAgICAgIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gY29sbGVjdERlY29yYXRvck5hbWVzKHVuZGVmaW5lZCwgW2FyZ3MuYXR0cmlidXRlXSk7XG4gICAgICBjb250ZW50ID0gZW5zdXJlSW1wb3J0KGNvbnRlbnQsIGFyZ3MuaW1wb3J0c0Zyb20sIGRlY29yYXRvcnMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKFwifVwiKTtcbiAgICAgIGNvbnN0IGJsb2NrID0gYWRkUHJvcGVydHlCbG9jayhhcmdzLmF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBiZWZvcmUgPSBjb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KS5yZXBsYWNlKC9cXHMqJC8sIFwiXCIpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBjb250ZW50LnNsaWNlKGluc2VydGlvblBvaW50KTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBgJHtiZWZvcmV9XFxuJHtibG9ja31cXG4ke2FmdGVyfWA7XG4gICAgICB3cml0ZUlmQ2hhbmdlZChhcmdzLmZpbGVQYXRoLCB1cGRhdGVkKTtcbiAgICAgIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgfSxcbiAgfSxcbiAgcmVtb3ZlQXR0cmlidXRlVG9vbDoge1xuICAgIG5hbWU6IFwicmVtb3ZlLWF0dHJpYnV0ZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSBhIG1vZGVsIGNsYXNzXCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIGF0dHJpYnV0ZU5hbWU6IHN0cmluZztcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYXJncy5maWxlUGF0aCkpIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFyZ3MuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSByZW1vdmVQcm9wZXJ0eUJsb2NrKGNvbnRlbnQsIGFyZ3MuYXR0cmlidXRlTmFtZSk7XG4gICAgICB3cml0ZUlmQ2hhbmdlZChhcmdzLmZpbGVQYXRoLCB1cGRhdGVkKTtcbiAgICAgIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgfSxcbiAgfSxcbiAgYXBwbHlEZWNvcmF0b3JUb29sOiB7XG4gICAgbmFtZTogXCJhcHBseS1kZWNvcmF0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBcHBseSBhIGRlY29yYXRvciB0byBhIGNsYXNzIG9yIHByb3BlcnR5XCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIHRhcmdldDogeyBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICAgIGRlY29yYXRvcjogRGVjb3JhdG9yU3BlYztcbiAgICAgIGltcG9ydHNGcm9tOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgZmlsZSBub3QgZm91bmQgYXQgJHthcmdzLmZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IG5ldyBTZXQ8c3RyaW5nPihbYXJncy5kZWNvcmF0b3IubmFtZV0pO1xuICAgICAgY29udGVudCA9IGVuc3VyZUltcG9ydChjb250ZW50LCBhcmdzLmltcG9ydHNGcm9tLCBkZWNvcmF0b3JzKTtcbiAgICAgIGNvbnRlbnQgPSBpbnNlcnREZWNvcmF0b3IoY29udGVudCwgYXJncy5kZWNvcmF0b3IsIGFyZ3MudGFyZ2V0KTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICByZW1vdmVEZWNvcmF0b3JUb29sOiB7XG4gICAgbmFtZTogXCJyZW1vdmUtZGVjb3JhdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVtb3ZlIGEgZGVjb3JhdG9yIGZyb20gYSBjbGFzcyBvciBwcm9wZXJ0eVwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgICB0YXJnZXQ6IHsga2luZDogXCJjbGFzc1wiIHwgXCJwcm9wZXJ0eVwiOyBuYW1lPzogc3RyaW5nIH07XG4gICAgICBkZWNvcmF0b3JOYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29udGVudCA9IHJlbW92ZURlY29yYXRvcihjb250ZW50LCBhcmdzLmRlY29yYXRvck5hbWUsIGFyZ3MudGFyZ2V0KTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICBzY2FmZm9sZFZhbGlkYXRvclRvb2w6IHtcbiAgICBuYW1lOiBcInNjYWZmb2xkLXZhbGlkYXRvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNjYWZmb2xkIGEgdmFsaWRhdG9yIGNsYXNzIGFuZCBvcHRpb25hbCBkZWNvcmF0b3JcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgdmFsaWRhdG9yc0Rpcjogc3RyaW5nO1xuICAgICAgZGVjb3JhdG9yRGlyPzogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzRmlsZSA9IHBhdGguam9pbihhcmdzLnZhbGlkYXRvcnNEaXIsIGAke2FyZ3MubmFtZX0udHNgKTtcbiAgICAgIGVuc3VyZURpcmVjdG9yeShjbGFzc0ZpbGUpO1xuICAgICAgY29uc3QgY2xhc3NDb250ZW50ID0gYGV4cG9ydCBjbGFzcyAke2FyZ3MubmFtZX0ge1xcbiAgdmFsaWRhdGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XFxuICB9XFxufVxcbmA7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNsYXNzRmlsZSwgY2xhc3NDb250ZW50KTtcbiAgICAgIGxldCBkZWNvcmF0b3JGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJncy5kZWNvcmF0b3JEaXIpIHtcbiAgICAgICAgZGVjb3JhdG9yRmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICBhcmdzLmRlY29yYXRvckRpcixcbiAgICAgICAgICBgJHthcmdzLm5hbWV9RGVjb3JhdG9yLnRzYFxuICAgICAgICApO1xuICAgICAgICBlbnN1cmVEaXJlY3RvcnkoZGVjb3JhdG9yRmlsZSk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgZGVjb3JhdG9yRmlsZSxcbiAgICAgICAgICBgZXhwb3J0IGZ1bmN0aW9uICR7YXJncy5uYW1lfURlY29yYXRvcigpIHtcXG4gIHJldHVybiAoKSA9PiB2b2lkIDA7XFxufVxcbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzRmlsZSwgZGVjb3JhdG9yRmlsZSB9O1xuICAgIH0sXG4gIH0sXG4gIHNjYWZmb2xkU2VyaWFsaXplclRvb2w6IHtcbiAgICBuYW1lOiBcInNjYWZmb2xkLXNlcmlhbGl6ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTY2FmZm9sZCBhIHNlcmlhbGl6ZXIgY2xhc3MgYW5kIG9wdGlvbmFsIHJlZ2lzdHJ5XCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGRpcjogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgcmVnaXN0ZXJEaXI/OiBzdHJpbmc7XG4gICAgICBzZXREZWZhdWx0PzogYm9vbGVhbjtcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBjbGFzc0ZpbGUgPSBwYXRoLmpvaW4oYXJncy5kaXIsIGAke2FyZ3MubmFtZX0udHNgKTtcbiAgICAgIGVuc3VyZURpcmVjdG9yeShjbGFzc0ZpbGUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgY2xhc3NGaWxlLFxuICAgICAgICBgZXhwb3J0IGNsYXNzICR7YXJncy5uYW1lfSB7XFxuICBzZXJpYWxpemUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xcbiAgfVxcbn1cXG5gXG4gICAgICApO1xuICAgICAgbGV0IHJlZ2lzdGVyRmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyZ3MucmVnaXN0ZXJEaXIpIHtcbiAgICAgICAgcmVnaXN0ZXJGaWxlID0gcGF0aC5qb2luKGFyZ3MucmVnaXN0ZXJEaXIsIGAke2FyZ3MubmFtZX1SZWdpc3Rlci50c2ApO1xuICAgICAgICBlbnN1cmVEaXJlY3RvcnkocmVnaXN0ZXJGaWxlKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZWdpc3RlckZpbGUsXG4gICAgICAgICAgYGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlciR7YXJncy5uYW1lfSgpIHtcXG4gIHJldHVybiAke2FyZ3Muc2V0RGVmYXVsdCA/IFwiJ2RlZmF1bHQnXCIgOiBcIidvcHRpb25hbCdcIn07XFxufVxcbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzRmlsZSwgcmVnaXN0ZXJGaWxlIH07XG4gICAgfSxcbiAgfSxcbiAgc2NhZmZvbGRIYXNoaW5nVG9vbDoge1xuICAgIG5hbWU6IFwic2NhZmZvbGQtaGFzaGluZ1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNjYWZmb2xkIGEgaGFzaGluZyBmdW5jdGlvbiBhbmQgb3B0aW9uYWwgcmVnaXN0cnlcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZGlyOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICByZWdpc3RlckRpcj86IHN0cmluZztcbiAgICAgIHNldERlZmF1bHQ/OiBib29sZWFuO1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uRmlsZSA9IHBhdGguam9pbihhcmdzLmRpciwgYCR7YXJncy5uYW1lfS50c2ApO1xuICAgICAgZW5zdXJlRGlyZWN0b3J5KGZ1bmN0aW9uRmlsZSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBmdW5jdGlvbkZpbGUsXG4gICAgICAgIGBleHBvcnQgZnVuY3Rpb24gJHthcmdzLm5hbWV9KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xcbiAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7XFxufVxcbmBcbiAgICAgICk7XG4gICAgICBsZXQgcmVnaXN0ZXJGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJncy5yZWdpc3RlckRpcikge1xuICAgICAgICByZWdpc3RlckZpbGUgPSBwYXRoLmpvaW4oYXJncy5yZWdpc3RlckRpciwgYCR7YXJncy5uYW1lfVJlZ2lzdGVyLnRzYCk7XG4gICAgICAgIGVuc3VyZURpcmVjdG9yeShyZWdpc3RlckZpbGUpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlZ2lzdGVyRmlsZSxcbiAgICAgICAgICBgZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyJHthcmdzLm5hbWV9KCkge1xcbiAgcmV0dXJuICR7YXJncy5zZXREZWZhdWx0ID8gXCInZGVmYXVsdCdcIiA6IFwiJ29wdGlvbmFsJ1wifTtcXG59XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZnVuY3Rpb25GaWxlLCByZWdpc3RlckZpbGUgfTtcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVG9vbHMgPSB0eXBlb2YgZGVjb3JhdG9yVG9vbHM7XG4iXX0=
@@ -0,0 +1,118 @@
1
+ export type DecoratorSpec = {
2
+ name: string;
3
+ args?: unknown[];
4
+ };
5
+ export type AttributeSpec = {
6
+ name: string;
7
+ type: string;
8
+ decorators?: DecoratorSpec[];
9
+ };
10
+ export declare const decoratorTools: {
11
+ readonly createOrUpdateModelTool: {
12
+ readonly name: "create-or-update-model";
13
+ readonly description: "Create or update a validation-ready model class";
14
+ readonly execute: (args: {
15
+ filePath: string;
16
+ className: string;
17
+ classDecorators?: DecoratorSpec[];
18
+ properties: AttributeSpec[];
19
+ importsFrom: string;
20
+ overwrite?: boolean;
21
+ }) => Promise<{
22
+ filePath: string;
23
+ }>;
24
+ };
25
+ readonly addAttributeTool: {
26
+ readonly name: "add-attribute";
27
+ readonly description: "Add a decorated attribute to an existing model";
28
+ readonly execute: (args: {
29
+ filePath: string;
30
+ className: string;
31
+ attribute: AttributeSpec;
32
+ importsFrom: string;
33
+ }) => Promise<{
34
+ filePath: string;
35
+ }>;
36
+ };
37
+ readonly removeAttributeTool: {
38
+ readonly name: "remove-attribute";
39
+ readonly description: "Remove an attribute from a model class";
40
+ readonly execute: (args: {
41
+ filePath: string;
42
+ className: string;
43
+ attributeName: string;
44
+ }) => Promise<{
45
+ filePath: string;
46
+ }>;
47
+ };
48
+ readonly applyDecoratorTool: {
49
+ readonly name: "apply-decorator";
50
+ readonly description: "Apply a decorator to a class or property";
51
+ readonly execute: (args: {
52
+ filePath: string;
53
+ className: string;
54
+ target: {
55
+ kind: "class" | "property";
56
+ name?: string;
57
+ };
58
+ decorator: DecoratorSpec;
59
+ importsFrom: string;
60
+ }) => Promise<{
61
+ filePath: string;
62
+ }>;
63
+ };
64
+ readonly removeDecoratorTool: {
65
+ readonly name: "remove-decorator";
66
+ readonly description: "Remove a decorator from a class or property";
67
+ readonly execute: (args: {
68
+ filePath: string;
69
+ className: string;
70
+ target: {
71
+ kind: "class" | "property";
72
+ name?: string;
73
+ };
74
+ decoratorName: string;
75
+ }) => Promise<{
76
+ filePath: string;
77
+ }>;
78
+ };
79
+ readonly scaffoldValidatorTool: {
80
+ readonly name: "scaffold-validator";
81
+ readonly description: "Scaffold a validator class and optional decorator";
82
+ readonly execute: (args: {
83
+ validatorsDir: string;
84
+ decoratorDir?: string;
85
+ name: string;
86
+ }) => Promise<{
87
+ classFile: string;
88
+ decoratorFile: string | undefined;
89
+ }>;
90
+ };
91
+ readonly scaffoldSerializerTool: {
92
+ readonly name: "scaffold-serializer";
93
+ readonly description: "Scaffold a serializer class and optional registry";
94
+ readonly execute: (args: {
95
+ dir: string;
96
+ name: string;
97
+ registerDir?: string;
98
+ setDefault?: boolean;
99
+ }) => Promise<{
100
+ classFile: string;
101
+ registerFile: string | undefined;
102
+ }>;
103
+ };
104
+ readonly scaffoldHashingTool: {
105
+ readonly name: "scaffold-hashing";
106
+ readonly description: "Scaffold a hashing function and optional registry";
107
+ readonly execute: (args: {
108
+ dir: string;
109
+ name: string;
110
+ registerDir?: string;
111
+ setDefault?: boolean;
112
+ }) => Promise<{
113
+ functionFile: string;
114
+ registerFile: string | undefined;
115
+ }>;
116
+ };
117
+ };
118
+ export type DecoratorTools = typeof decoratorTools;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.default = void 0;
21
+ var mcp_module_1 = require("./mcp-module.cjs");
22
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(mcp_module_1).default; } });
23
+ __exportStar(require("./mcp-module.cjs"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUM7QUFBOUIsc0hBQUEsT0FBTyxPQUFBO0FBQ2hCLG1EQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tIFwiLi9tY3AtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tY3AtbW9kdWxlXCI7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { default } from "./mcp-module";
2
+ export * from "./mcp-module";