@decaf-ts/mcp-server 0.0.3 → 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.
@@ -6,7 +6,7 @@ import { Metadata } from "@decaf-ts/decoration";
6
6
  * @summary The actual version number is replaced during the build process.
7
7
  * @type {string}
8
8
  */
9
- export const VERSION = "0.0.2";
9
+ export const VERSION = "0.0.3";
10
10
  export const PACKAGE_NAME = "##PACKAGE_NAME##";
11
11
  try {
12
12
  Metadata.registerLibrary(PACKAGE_NAME, VERSION);
@@ -34,6 +34,6 @@ export type AnalyzeRepoArgs = z.infer<typeof analyzeRepoSchema>;
34
34
  export type EnumerateCapabilitiesArgs = z.infer<typeof enumerateCapabilitiesSchema>;
35
35
  export type PlanFeatureArgs = z.infer<typeof planFeatureSchema>;
36
36
  export default function enrich(mcp: FastMCP): FastMCP<Record<string, unknown> | undefined>;
37
- export declare const VERSION = "0.0.2";
37
+ export declare const VERSION = "0.0.3";
38
38
  export declare const PACKAGE_NAME = "##PACKAGE_NAME##/decoration-assist";
39
39
  export {};
@@ -0,0 +1,353 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { z } from "zod";
4
+ import { VERSION as V, PACKAGE_NAME as PKG } from "../../metadata";
5
+ // Utility: safe read file
6
+ function readFileSafe(filePath, encoding = "utf8") {
7
+ try {
8
+ return fs.readFileSync(filePath, { encoding });
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ function listFilesRecursive(root, matcher) {
15
+ const out = [];
16
+ const stack = [root];
17
+ while (stack.length) {
18
+ const cur = stack.pop();
19
+ const stat = fs.statSync(cur);
20
+ if (stat.isDirectory()) {
21
+ for (const f of fs.readdirSync(cur))
22
+ stack.push(path.join(cur, f));
23
+ }
24
+ else if (!matcher || matcher(cur)) {
25
+ out.push(cur);
26
+ }
27
+ }
28
+ return out.sort();
29
+ }
30
+ // Zod Schemas (with explicit descriptions)
31
+ const analyzeRepoSchema = z
32
+ .object({
33
+ repoPath: z
34
+ .string({
35
+ description: "Relative or absolute path to the target repository inside this monorepo, e.g. './decoration'.",
36
+ })
37
+ .min(1, "repoPath is required"),
38
+ includeTests: z
39
+ .boolean({
40
+ description: "If true, analyze the tests directory (if present) to derive expected behaviors.",
41
+ })
42
+ .default(true),
43
+ includeDocs: z
44
+ .boolean({
45
+ description: "If true, analyze README.md and docs directories to extract documented features.",
46
+ })
47
+ .default(true),
48
+ })
49
+ .strict()
50
+ .describe("Analyze a local repository (e.g. ./decoration) to extract APIs, features, tests, and documentation cues.");
51
+ const enumerateCapabilitiesSchema = z
52
+ .object({
53
+ repoPath: z
54
+ .string({
55
+ description: "Relative or absolute path to the target repository to enumerate developer-facing capabilities.",
56
+ })
57
+ .min(1, "repoPath is required"),
58
+ })
59
+ .strict()
60
+ .describe("Enumerate the complete set of capabilities a developer is expected to use from the given repository.");
61
+ const planFeatureSchema = z
62
+ .object({
63
+ feature: z
64
+ .string({
65
+ description: "Natural-language description of a developer's requested feature or task to implement using the repository and available MCP tools.",
66
+ })
67
+ .min(5, "feature must describe the goal clearly"),
68
+ repoPath: z
69
+ .string({
70
+ description: "Target repository path providing the library to use, e.g. './decoration'.",
71
+ })
72
+ .default("./decoration"),
73
+ })
74
+ .strict()
75
+ .describe("Plan which MCP tools to use and in what sequence to implement a requested feature using the repository.");
76
+ // Analysis helpers (minimal yet effective, text-based to avoid heavy AST deps)
77
+ function isSourceFile(p) {
78
+ return /\.(ts|tsx|js|jsx)$/.test(p) && !p.endsWith(".d.ts");
79
+ }
80
+ function isTestFile(p) {
81
+ return /(\.test\.|\.spec\.)/.test(p);
82
+ }
83
+ function extractExports(fileContent) {
84
+ const names = new Set();
85
+ const exportRe = /(export\s+(?:default\s+)?(?:class|function|const|let|var|interface|type|enum)\s+)([A-Za-z0-9_]+)/g;
86
+ const namedRe = /export\s*\{([^}]+)\}/g;
87
+ let m;
88
+ while ((m = exportRe.exec(fileContent)))
89
+ names.add(m[2]);
90
+ while ((m = namedRe.exec(fileContent))) {
91
+ m[1]
92
+ .split(",")
93
+ .map((s) => s.trim().split(" as ")[0].trim())
94
+ .forEach((n) => {
95
+ if (n)
96
+ names.add(n);
97
+ });
98
+ }
99
+ return [...names].sort();
100
+ }
101
+ function extractDecorators(fileContent) {
102
+ const decs = new Set();
103
+ const decRe = /@([A-Za-z_][A-Za-z0-9_]*)/g;
104
+ let m;
105
+ while ((m = decRe.exec(fileContent)))
106
+ decs.add(m[1]);
107
+ return [...decs].sort();
108
+ }
109
+ function summarizeReadme(readme) {
110
+ if (!readme)
111
+ return undefined;
112
+ const lines = readme.split(/\r?\n/).filter(Boolean);
113
+ const title = lines.find((l) => /^#\s+/.test(l))?.replace(/^#\s+/, "") || "README";
114
+ const bullets = lines.filter((l) => /^[-*]\s+/.test(l)).slice(0, 20);
115
+ return { title, bullets };
116
+ }
117
+ function analyzeRepo(root) {
118
+ const src = path.join(root, "src");
119
+ const testDir = path.join(root, "tests");
120
+ const readmePath = path.join(root, "README.md");
121
+ const readme = readFileSafe(readmePath);
122
+ const files = fs.existsSync(src) ? listFilesRecursive(src, isSourceFile) : [];
123
+ const testFiles = fs.existsSync(testDir)
124
+ ? listFilesRecursive(testDir, (f) => isSourceFile(f) && isTestFile(f))
125
+ : [];
126
+ const api = {};
127
+ for (const f of files) {
128
+ const content = readFileSafe(f) || "";
129
+ api[path.relative(root, f)] = {
130
+ exports: extractExports(content),
131
+ decorators: extractDecorators(content),
132
+ };
133
+ }
134
+ const tests = {};
135
+ for (const f of testFiles) {
136
+ const content = readFileSafe(f) || "";
137
+ const mentions = Array.from(new Set([...extractExports(content), ...extractDecorators(content)])).sort();
138
+ tests[path.relative(root, f)] = { mentions };
139
+ }
140
+ return { files, testFiles, api, tests, readme: summarizeReadme(readme) };
141
+ }
142
+ // Tools
143
+ function buildAnalyzeRepositoryTool() {
144
+ return {
145
+ name: "analyze-repository",
146
+ description: "Analyze a local repository's source, tests, and docs to extract exported APIs, decorators, and test mentions.",
147
+ parameters: analyzeRepoSchema,
148
+ execute: async (input) => {
149
+ let repoRoot = path.resolve(process.cwd(), input.repoPath);
150
+ if (!fs.existsSync(repoRoot)) {
151
+ // try resolving from monorepo root (parent of current cwd)
152
+ const alt = path.resolve(process.cwd(), "..", input.repoPath);
153
+ if (fs.existsSync(alt))
154
+ repoRoot = alt;
155
+ }
156
+ if (!fs.existsSync(repoRoot)) {
157
+ // if input was absolute and still not found, try ../<basename>
158
+ const alt2 = path.resolve(process.cwd(), "..", path.basename(input.repoPath));
159
+ if (fs.existsSync(alt2))
160
+ repoRoot = alt2;
161
+ }
162
+ if (!fs.existsSync(repoRoot))
163
+ throw new Error(`Repository not found at ${repoRoot}`);
164
+ const result = analyzeRepo(repoRoot);
165
+ return {
166
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
167
+ };
168
+ },
169
+ };
170
+ }
171
+ function deriveCapabilities(analysis) {
172
+ const cap = new Set();
173
+ // heuristics: if decorators like Decoration, flavouredAs, extend, override appear, add capabilities
174
+ const allDecs = new Set();
175
+ for (const k of Object.keys(analysis.api)) {
176
+ for (const d of analysis.api[k].decorators)
177
+ allDecs.add(d);
178
+ for (const e of analysis.api[k].exports)
179
+ if (/Decoration|decorate|Builder|Flavour/i.test(e))
180
+ cap.add("use-decoration-api");
181
+ }
182
+ if ([...allDecs].some((d) => /override|extend/i.test(d)))
183
+ cap.add("override-and-extend-decorations");
184
+ if (Object.keys(analysis.tests).length > 0)
185
+ cap.add("validate-with-tests");
186
+ if (analysis.readme)
187
+ cap.add("follow-readme-guides");
188
+ return [...cap].sort();
189
+ }
190
+ function buildEnumerateCapabilitiesTool() {
191
+ return {
192
+ name: "enumerate-capabilities",
193
+ description: "Enumerate developer-facing capabilities of the given repository, inferred from code, tests, and docs.",
194
+ parameters: enumerateCapabilitiesSchema,
195
+ execute: async (input) => {
196
+ let repoRoot = path.resolve(process.cwd(), input.repoPath);
197
+ if (!fs.existsSync(repoRoot)) {
198
+ const alt = path.resolve(process.cwd(), "..", input.repoPath);
199
+ if (fs.existsSync(alt))
200
+ repoRoot = alt;
201
+ }
202
+ if (!fs.existsSync(repoRoot)) {
203
+ const alt2 = path.resolve(process.cwd(), "..", path.basename(input.repoPath));
204
+ if (fs.existsSync(alt2))
205
+ repoRoot = alt2;
206
+ }
207
+ if (!fs.existsSync(repoRoot))
208
+ throw new Error(`Repository not found at ${repoRoot}`);
209
+ const analysis = analyzeRepo(repoRoot);
210
+ const capabilities = deriveCapabilities(analysis);
211
+ return {
212
+ content: [
213
+ {
214
+ type: "text",
215
+ text: JSON.stringify({
216
+ capabilities,
217
+ analysisSummary: {
218
+ files: analysis.files.length,
219
+ testFiles: analysis.testFiles.length,
220
+ readme: analysis.readme?.title,
221
+ },
222
+ }, null, 2),
223
+ },
224
+ ],
225
+ };
226
+ },
227
+ };
228
+ }
229
+ function buildPlanFeatureTool() {
230
+ return {
231
+ name: "plan-feature-implementation",
232
+ description: "Given a feature request, select appropriate MCP tools (including existing and new ones) and produce an execution plan.",
233
+ parameters: planFeatureSchema,
234
+ execute: async (input) => {
235
+ const steps = [];
236
+ let i = 1;
237
+ steps.push({
238
+ step: i++,
239
+ action: "Analyze repository to enumerate APIs and decorators",
240
+ tool: "analyze-repository",
241
+ arguments: { repoPath: input.repoPath },
242
+ rationale: "Understand available building blocks.",
243
+ });
244
+ steps.push({
245
+ step: i++,
246
+ action: "List capabilities expected for developers",
247
+ tool: "enumerate-capabilities",
248
+ arguments: { repoPath: input.repoPath },
249
+ rationale: "Align the plan with supported capabilities.",
250
+ });
251
+ // Suggest existing generic tools from mcp-module
252
+ steps.push({
253
+ step: i++,
254
+ action: "Select documentation prompt and gather relevant source file(s)",
255
+ tool: "document-code",
256
+ arguments: { filePath: "<target-file>" },
257
+ rationale: "Provide context and instructions for changes.",
258
+ });
259
+ steps.push({
260
+ step: i++,
261
+ action: "Apply code changes using unified diff patch",
262
+ tool: "apply-code-change",
263
+ arguments: {
264
+ filePath: "<target-file>",
265
+ patch: "<unified-diff>",
266
+ dryRun: true,
267
+ },
268
+ rationale: "Validate changes safely before committing.",
269
+ });
270
+ steps.push({
271
+ step: i++,
272
+ action: "Commit code changes",
273
+ tool: "apply-code-change",
274
+ arguments: {
275
+ filePath: "<target-file>",
276
+ patch: "<unified-diff>",
277
+ dryRun: false,
278
+ },
279
+ rationale: "Persist the update.",
280
+ });
281
+ // If decoration-related terms present, suggest decorator tools
282
+ if (/decorat|flavour|override|extend|builder/i.test(input.feature)) {
283
+ steps.unshift({
284
+ step: 0,
285
+ action: "Use decorator tooling to insert/remove/modify decorators",
286
+ tool: "decorator-tools",
287
+ arguments: { action: "help" },
288
+ rationale: "Leverage specialized utilities for decoration patterns.",
289
+ });
290
+ steps.forEach((s, idx) => (s.step = idx + 1));
291
+ }
292
+ return {
293
+ content: [
294
+ {
295
+ type: "text",
296
+ text: JSON.stringify({
297
+ plan: steps,
298
+ notes: "Replace placeholder arguments like <target-file> and <unified-diff> based on the analysis output.",
299
+ }, null, 2),
300
+ },
301
+ ],
302
+ };
303
+ },
304
+ };
305
+ }
306
+ function buildPrompts(repoPath) {
307
+ return [
308
+ {
309
+ name: "decoration-overview",
310
+ description: "High-level guidance on using the decoration library: key exports, decorators, and common workflows.",
311
+ load: async () => `You are assisting with the Decaf.ts decoration module located at ${repoPath}. Prefer using exported builders and decorators over ad-hoc patterns.\n\nProvide a concise, actionable overview of how to use the decoration APIs for extending and overriding behaviors.`,
312
+ },
313
+ ];
314
+ }
315
+ function buildResourceTemplates(repoPath) {
316
+ const root = path.resolve(process.cwd(), repoPath);
317
+ return [
318
+ {
319
+ name: "decoration-src",
320
+ description: "Read a file from the decoration/src tree by relative path.",
321
+ mimeType: "text/plain",
322
+ uriTemplate: "decoration://src/{path}",
323
+ arguments: [
324
+ {
325
+ name: "path",
326
+ description: "Path under decoration/src to load, e.g. 'decoration/types.ts'",
327
+ required: true,
328
+ },
329
+ ],
330
+ load: async ({ path: rel }) => {
331
+ const abs = path.join(root, "src", rel);
332
+ const text = readFileSafe(abs) ?? "";
333
+ return { text };
334
+ },
335
+ },
336
+ ];
337
+ }
338
+ export default function enrich(mcp) {
339
+ // Register tools
340
+ mcp.addTool(buildAnalyzeRepositoryTool());
341
+ mcp.addTool(buildEnumerateCapabilitiesTool());
342
+ mcp.addTool(buildPlanFeatureTool());
343
+ // Prompts/resources
344
+ const repoPath = "./decoration";
345
+ for (const p of buildPrompts(repoPath))
346
+ mcp.addPrompt(p);
347
+ for (const r of buildResourceTemplates(repoPath))
348
+ mcp.addResourceTemplate(r);
349
+ return mcp;
350
+ }
351
+ export const VERSION = V;
352
+ export const PACKAGE_NAME = `${PKG}/decoration-assist`;
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi1hc3Npc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvZGVjb3JhdGlvbi1hc3Npc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLFlBQVksSUFBSSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSwwQkFBMEI7QUFDMUIsU0FBUyxZQUFZLENBQ25CLFFBQWdCLEVBQ2hCLFdBQTJCLE1BQU07SUFFakMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsSUFBWSxFQUNaLE9BQWdDO0lBRWhDLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUN6QixNQUFNLEtBQUssR0FBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUcsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElB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Q3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsQixDQUFDO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLFVBQVUsTUFBTSxDQUFDLEdBQVk7SUFDekMsaUJBQWlCO0lBQ2pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQVMsQ0FBQyxDQUFDO0lBQ2pELEdBQUcsQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQVMsQ0FBQyxDQUFDO0lBQ3JELEdBQUcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQVMsQ0FBQyxDQUFDO0lBQzNDLG9CQUFvQjtJQUNwQixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUM7SUFDaEMsS0FBSyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFRLENBQUMsQ0FBQztJQUNoRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztRQUM5QyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBUSxDQUFDLENBQUM7SUFDcEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RNQ1AsIFRvb2wsIElucHV0UHJvbXB0IH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IFZFUlNJT04gYXMgViwgUEFDS0FHRV9OQU1FIGFzIFBLRyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YVwiO1xuXG4vLyBVdGlsaXR5OiBzYWZlIHJlYWQgZmlsZVxuZnVuY3Rpb24gcmVhZEZpbGVTYWZlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcgPSBcInV0ZjhcIlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RGaWxlc1JlY3Vyc2l2ZShcbiAgcm9vdDogc3RyaW5nLFxuICBtYXRjaGVyPzogKHA6IHN0cmluZykgPT4gYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0YWNrOiBzdHJpbmdbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IHN0YWNrLnBvcCgpITtcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoY3VyKTtcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZnMucmVhZGRpclN5bmMoY3VyKSkgc3RhY2sucHVzaChwYXRoLmpvaW4oY3VyLCBmKSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2hlciB8fCBtYXRjaGVyKGN1cikpIHtcbiAgICAgIG91dC5wdXNoKGN1cik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQuc29ydCgpO1xufVxuXG4vLyBab2QgU2NoZW1hcyAod2l0aCBleHBsaWNpdCBkZXNjcmlwdGlvbnMpXG5jb25zdCBhbmFseXplUmVwb1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcmVwb1BhdGg6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IGluc2lkZSB0aGlzIG1vbm9yZXBvLCBlLmcuICcuL2RlY29yYXRpb24nLlwiLFxuICAgICAgfSlcbiAgICAgIC5taW4oMSwgXCJyZXBvUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgICBpbmNsdWRlVGVzdHM6IHpcbiAgICAgIC5ib29sZWFuKHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJJZiB0cnVlLCBhbmFseXplIHRoZSB0ZXN0cyBkaXJlY3RvcnkgKGlmIHByZXNlbnQpIHRvIGRlcml2ZSBleHBlY3RlZCBiZWhhdmlvcnMuXCIsXG4gICAgICB9KVxuICAgICAgLmRlZmF1bHQodHJ1ZSksXG4gICAgaW5jbHVkZURvY3M6IHpcbiAgICAgIC5ib29sZWFuKHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJJZiB0cnVlLCBhbmFseXplIFJFQURNRS5tZCBhbmQgZG9jcyBkaXJlY3RvcmllcyB0byBleHRyYWN0IGRvY3VtZW50ZWQgZmVhdHVyZXMuXCIsXG4gICAgICB9KVxuICAgICAgLmRlZmF1bHQodHJ1ZSksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXG4gICAgXCJBbmFseXplIGEgbG9jYWwgcmVwb3NpdG9yeSAoZS5nLiAuL2RlY29yYXRpb24pIHRvIGV4dHJhY3QgQVBJcywgZmVhdHVyZXMsIHRlc3RzLCBhbmQgZG9jdW1lbnRhdGlvbiBjdWVzLlwiXG4gICk7XG5cbmNvbnN0IGVudW1lcmF0ZUNhcGFiaWxpdGllc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcmVwb1BhdGg6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IHRvIGVudW1lcmF0ZSBkZXZlbG9wZXItZmFjaW5nIGNhcGFiaWxpdGllcy5cIixcbiAgICAgIH0pXG4gICAgICAubWluKDEsIFwicmVwb1BhdGggaXMgcmVxdWlyZWRcIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXG4gICAgXCJFbnVtZXJhdGUgdGhlIGNvbXBsZXRlIHNldCBvZiBjYXBhYmlsaXRpZXMgYSBkZXZlbG9wZXIgaXMgZXhwZWN0ZWQgdG8gdXNlIGZyb20gdGhlIGdpdmVuIHJlcG9zaXRvcnkuXCJcbiAgKTtcblxuY29uc3QgcGxhbkZlYXR1cmVTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGZlYXR1cmU6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIk5hdHVyYWwtbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgYSBkZXZlbG9wZXIncyByZXF1ZXN0ZWQgZmVhdHVyZSBvciB0YXNrIHRvIGltcGxlbWVudCB1c2luZyB0aGUgcmVwb3NpdG9yeSBhbmQgYXZhaWxhYmxlIE1DUCB0b29scy5cIixcbiAgICAgIH0pXG4gICAgICAubWluKDUsIFwiZmVhdHVyZSBtdXN0IGRlc2NyaWJlIHRoZSBnb2FsIGNsZWFybHlcIiksXG4gICAgcmVwb1BhdGg6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIlRhcmdldCByZXBvc2l0b3J5IHBhdGggcHJvdmlkaW5nIHRoZSBsaWJyYXJ5IHRvIHVzZSwgZS5nLiAnLi9kZWNvcmF0aW9uJy5cIixcbiAgICAgIH0pXG4gICAgICAuZGVmYXVsdChcIi4vZGVjb3JhdGlvblwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcbiAgICBcIlBsYW4gd2hpY2ggTUNQIHRvb2xzIHRvIHVzZSBhbmQgaW4gd2hhdCBzZXF1ZW5jZSB0byBpbXBsZW1lbnQgYSByZXF1ZXN0ZWQgZmVhdHVyZSB1c2luZyB0aGUgcmVwb3NpdG9yeS5cIlxuICApO1xuXG4vLyBUeXBlc1xuZXhwb3J0IHR5cGUgQW5hbHl6ZVJlcG9BcmdzID0gei5pbmZlcjx0eXBlb2YgYW5hbHl6ZVJlcG9TY2hlbWE+O1xuZXhwb3J0IHR5cGUgRW51bWVyYXRlQ2FwYWJpbGl0aWVzQXJncyA9IHouaW5mZXI8XG4gIHR5cGVvZiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWFcbj47XG5leHBvcnQgdHlwZSBQbGFuRmVhdHVyZUFyZ3MgPSB6LmluZmVyPHR5cGVvZiBwbGFuRmVhdHVyZVNjaGVtYT47XG5cbi8vIEFuYWx5c2lzIGhlbHBlcnMgKG1pbmltYWwgeWV0IGVmZmVjdGl2ZSwgdGV4dC1iYXNlZCB0byBhdm9pZCBoZWF2eSBBU1QgZGVwcylcbmZ1bmN0aW9uIGlzU291cmNlRmlsZShwOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9cXC4odHN8dHN4fGpzfGpzeCkkLy50ZXN0KHApICYmICFwLmVuZHNXaXRoKFwiLmQudHNcIik7XG59XG5mdW5jdGlvbiBpc1Rlc3RGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gLyhcXC50ZXN0XFwufFxcLnNwZWNcXC4pLy50ZXN0KHApO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXhwb3J0cyhmaWxlQ29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBleHBvcnRSZSA9XG4gICAgLyhleHBvcnRcXHMrKD86ZGVmYXVsdFxccyspPyg/OmNsYXNzfGZ1bmN0aW9ufGNvbnN0fGxldHx2YXJ8aW50ZXJmYWNlfHR5cGV8ZW51bSlcXHMrKShbQS1aYS16MC05X10rKS9nO1xuICBjb25zdCBuYW1lZFJlID0gL2V4cG9ydFxccypcXHsoW159XSspXFx9L2c7XG4gIGxldCBtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICB3aGlsZSAoKG0gPSBleHBvcnRSZS5leGVjKGZpbGVDb250ZW50KSkpIG5hbWVzLmFkZChtWzJdKTtcbiAgd2hpbGUgKChtID0gbmFtZWRSZS5leGVjKGZpbGVDb250ZW50KSkpIHtcbiAgICBtWzFdXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzKSA9PiBzLnRyaW0oKS5zcGxpdChcIiBhcyBcIilbMF0udHJpbSgpKVxuICAgICAgLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgaWYgKG4pIG5hbWVzLmFkZChuKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4ubmFtZXNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY29yYXRvcnMoZmlsZUNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZWNSZSA9IC9AKFtBLVphLXpfXVtBLVphLXowLTlfXSopL2c7XG4gIGxldCBtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICB3aGlsZSAoKG0gPSBkZWNSZS5leGVjKGZpbGVDb250ZW50KSkpIGRlY3MuYWRkKG1bMV0pO1xuICByZXR1cm4gWy4uLmRlY3NdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gc3VtbWFyaXplUmVhZG1lKHJlYWRtZT86IHN0cmluZykge1xuICBpZiAoIXJlYWRtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGluZXMgPSByZWFkbWUuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHRpdGxlID1cbiAgICBsaW5lcy5maW5kKChsKSA9PiAvXiNcXHMrLy50ZXN0KGwpKT8ucmVwbGFjZSgvXiNcXHMrLywgXCJcIikgfHwgXCJSRUFETUVcIjtcbiAgY29uc3QgYnVsbGV0cyA9IGxpbmVzLmZpbHRlcigobCkgPT4gL15bLSpdXFxzKy8udGVzdChsKSkuc2xpY2UoMCwgMjApO1xuICByZXR1cm4geyB0aXRsZSwgYnVsbGV0cyB9O1xufVxuXG5mdW5jdGlvbiBhbmFseXplUmVwbyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHJvb3QsIFwic3JjXCIpO1xuICBjb25zdCB0ZXN0RGlyID0gcGF0aC5qb2luKHJvb3QsIFwidGVzdHNcIik7XG4gIGNvbnN0IHJlYWRtZVBhdGggPSBwYXRoLmpvaW4ocm9vdCwgXCJSRUFETUUubWRcIik7XG4gIGNvbnN0IHJlYWRtZSA9IHJlYWRGaWxlU2FmZShyZWFkbWVQYXRoKTtcblxuICBjb25zdCBmaWxlcyA9IGZzLmV4aXN0c1N5bmMoc3JjKSA/IGxpc3RGaWxlc1JlY3Vyc2l2ZShzcmMsIGlzU291cmNlRmlsZSkgOiBbXTtcbiAgY29uc3QgdGVzdEZpbGVzID0gZnMuZXhpc3RzU3luYyh0ZXN0RGlyKVxuICAgID8gbGlzdEZpbGVzUmVjdXJzaXZlKHRlc3REaXIsIChmKSA9PiBpc1NvdXJjZUZpbGUoZikgJiYgaXNUZXN0RmlsZShmKSlcbiAgICA6IFtdO1xuXG4gIGNvbnN0IGFwaTogUmVjb3JkPHN0cmluZywgeyBleHBvcnRzOiBzdHJpbmdbXTsgZGVjb3JhdG9yczogc3RyaW5nW10gfT4gPSB7fTtcbiAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU2FmZShmKSB8fCBcIlwiO1xuICAgIGFwaVtwYXRoLnJlbGF0aXZlKHJvb3QsIGYpXSA9IHtcbiAgICAgIGV4cG9ydHM6IGV4dHJhY3RFeHBvcnRzKGNvbnRlbnQpLFxuICAgICAgZGVjb3JhdG9yczogZXh0cmFjdERlY29yYXRvcnMoY29udGVudCksXG4gICAgfTtcbiAgfVxuICBjb25zdCB0ZXN0czogUmVjb3JkPHN0cmluZywgeyBtZW50aW9uczogc3RyaW5nW10gfT4gPSB7fTtcbiAgZm9yIChjb25zdCBmIG9mIHRlc3RGaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVNhZmUoZikgfHwgXCJcIjtcbiAgICBjb25zdCBtZW50aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5leHRyYWN0RXhwb3J0cyhjb250ZW50KSwgLi4uZXh0cmFjdERlY29yYXRvcnMoY29udGVudCldKVxuICAgICkuc29ydCgpO1xuICAgIHRlc3RzW3BhdGgucmVsYXRpdmUocm9vdCwgZildID0geyBtZW50aW9ucyB9O1xuICB9XG4gIHJldHVybiB7IGZpbGVzLCB0ZXN0RmlsZXMsIGFwaSwgdGVzdHMsIHJlYWRtZTogc3VtbWFyaXplUmVhZG1lKHJlYWRtZSkgfTtcbn1cblxuLy8gVG9vbHNcbmZ1bmN0aW9uIGJ1aWxkQW5hbHl6ZVJlcG9zaXRvcnlUb29sKCk6IFRvb2w8XG4gIHVuZGVmaW5lZCxcbiAgdHlwZW9mIGFuYWx5emVSZXBvU2NoZW1hXG4+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImFuYWx5emUtcmVwb3NpdG9yeVwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJBbmFseXplIGEgbG9jYWwgcmVwb3NpdG9yeSdzIHNvdXJjZSwgdGVzdHMsIGFuZCBkb2NzIHRvIGV4dHJhY3QgZXhwb3J0ZWQgQVBJcywgZGVjb3JhdG9ycywgYW5kIHRlc3QgbWVudGlvbnMuXCIsXG4gICAgcGFyYW1ldGVyczogYW5hbHl6ZVJlcG9TY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBsZXQgcmVwb1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgaW5wdXQucmVwb1BhdGgpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICAvLyB0cnkgcmVzb2x2aW5nIGZyb20gbW9ub3JlcG8gcm9vdCAocGFyZW50IG9mIGN1cnJlbnQgY3dkKVxuICAgICAgICBjb25zdCBhbHQgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCIuLlwiLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdCkpIHJlcG9Sb290ID0gYWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICAvLyBpZiBpbnB1dCB3YXMgYWJzb2x1dGUgYW5kIHN0aWxsIG5vdCBmb3VuZCwgdHJ5IC4uLzxiYXNlbmFtZT5cbiAgICAgICAgY29uc3QgYWx0MiA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIFwiLi5cIixcbiAgICAgICAgICBwYXRoLmJhc2VuYW1lKGlucHV0LnJlcG9QYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhhbHQyKSkgcmVwb1Jvb3QgPSBhbHQyO1xuICAgICAgfVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXBvc2l0b3J5IG5vdCBmb3VuZCBhdCAke3JlcG9Sb290fWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYW5hbHl6ZVJlcG8ocmVwb1Jvb3QpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgfV0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlcml2ZUNhcGFiaWxpdGllcyhcbiAgYW5hbHlzaXM6IFJldHVyblR5cGU8dHlwZW9mIGFuYWx5emVSZXBvPlxuKTogc3RyaW5nW10ge1xuICBjb25zdCBjYXAgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gaGV1cmlzdGljczogaWYgZGVjb3JhdG9ycyBsaWtlIERlY29yYXRpb24sIGZsYXZvdXJlZEFzLCBleHRlbmQsIG92ZXJyaWRlIGFwcGVhciwgYWRkIGNhcGFiaWxpdGllc1xuICBjb25zdCBhbGxEZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhbmFseXNpcy5hcGkpKSB7XG4gICAgZm9yIChjb25zdCBkIG9mIGFuYWx5c2lzLmFwaVtrXS5kZWNvcmF0b3JzKSBhbGxEZWNzLmFkZChkKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgYW5hbHlzaXMuYXBpW2tdLmV4cG9ydHMpXG4gICAgICBpZiAoL0RlY29yYXRpb258ZGVjb3JhdGV8QnVpbGRlcnxGbGF2b3VyL2kudGVzdChlKSlcbiAgICAgICAgY2FwLmFkZChcInVzZS1kZWNvcmF0aW9uLWFwaVwiKTtcbiAgfVxuICBpZiAoWy4uLmFsbERlY3NdLnNvbWUoKGQpID0+IC9vdmVycmlkZXxleHRlbmQvaS50ZXN0KGQpKSlcbiAgICBjYXAuYWRkKFwib3ZlcnJpZGUtYW5kLWV4dGVuZC1kZWNvcmF0aW9uc1wiKTtcbiAgaWYgKE9iamVjdC5rZXlzKGFuYWx5c2lzLnRlc3RzKS5sZW5ndGggPiAwKSBjYXAuYWRkKFwidmFsaWRhdGUtd2l0aC10ZXN0c1wiKTtcbiAgaWYgKGFuYWx5c2lzLnJlYWRtZSkgY2FwLmFkZChcImZvbGxvdy1yZWFkbWUtZ3VpZGVzXCIpO1xuICByZXR1cm4gWy4uLmNhcF0uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBidWlsZEVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2woKTogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hXG4+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImVudW1lcmF0ZS1jYXBhYmlsaXRpZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRW51bWVyYXRlIGRldmVsb3Blci1mYWNpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSBnaXZlbiByZXBvc2l0b3J5LCBpbmZlcnJlZCBmcm9tIGNvZGUsIHRlc3RzLCBhbmQgZG9jcy5cIixcbiAgICBwYXJhbWV0ZXJzOiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBsZXQgcmVwb1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgaW5wdXQucmVwb1BhdGgpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICBjb25zdCBhbHQgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCIuLlwiLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdCkpIHJlcG9Sb290ID0gYWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICBjb25zdCBhbHQyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgIHBhdGguYmFzZW5hbWUoaW5wdXQucmVwb1BhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdDIpKSByZXBvUm9vdCA9IGFsdDI7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9zaXRvcnkgbm90IGZvdW5kIGF0ICR7cmVwb1Jvb3R9YCk7XG4gICAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVSZXBvKHJlcG9Sb290KTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGRlcml2ZUNhcGFiaWxpdGllcyhhbmFseXNpcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICBhbmFseXNpc1N1bW1hcnk6IHtcbiAgICAgICAgICAgICAgICAgIGZpbGVzOiBhbmFseXNpcy5maWxlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICB0ZXN0RmlsZXM6IGFuYWx5c2lzLnRlc3RGaWxlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICByZWFkbWU6IGFuYWx5c2lzLnJlYWRtZT8udGl0bGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBsYW5GZWF0dXJlVG9vbCgpOiBUb29sPHVuZGVmaW5lZCwgdHlwZW9mIHBsYW5GZWF0dXJlU2NoZW1hPiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJwbGFuLWZlYXR1cmUtaW1wbGVtZW50YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiR2l2ZW4gYSBmZWF0dXJlIHJlcXVlc3QsIHNlbGVjdCBhcHByb3ByaWF0ZSBNQ1AgdG9vbHMgKGluY2x1ZGluZyBleGlzdGluZyBhbmQgbmV3IG9uZXMpIGFuZCBwcm9kdWNlIGFuIGV4ZWN1dGlvbiBwbGFuLlwiLFxuICAgIHBhcmFtZXRlcnM6IHBsYW5GZWF0dXJlU2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcHM6IEFycmF5PHtcbiAgICAgICAgc3RlcDogbnVtYmVyO1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdG9vbD86IHN0cmluZztcbiAgICAgICAgYXJndW1lbnRzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgcmF0aW9uYWxlOiBzdHJpbmc7XG4gICAgICB9PiA9IFtdO1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkFuYWx5emUgcmVwb3NpdG9yeSB0byBlbnVtZXJhdGUgQVBJcyBhbmQgZGVjb3JhdG9yc1wiLFxuICAgICAgICB0b29sOiBcImFuYWx5emUtcmVwb3NpdG9yeVwiLFxuICAgICAgICBhcmd1bWVudHM6IHsgcmVwb1BhdGg6IGlucHV0LnJlcG9QYXRoIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJVbmRlcnN0YW5kIGF2YWlsYWJsZSBidWlsZGluZyBibG9ja3MuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJMaXN0IGNhcGFiaWxpdGllcyBleHBlY3RlZCBmb3IgZGV2ZWxvcGVyc1wiLFxuICAgICAgICB0b29sOiBcImVudW1lcmF0ZS1jYXBhYmlsaXRpZXNcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IHJlcG9QYXRoOiBpbnB1dC5yZXBvUGF0aCB9LFxuICAgICAgICByYXRpb25hbGU6IFwiQWxpZ24gdGhlIHBsYW4gd2l0aCBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLlwiLFxuICAgICAgfSk7XG4gICAgICAvLyBTdWdnZXN0IGV4aXN0aW5nIGdlbmVyaWMgdG9vbHMgZnJvbSBtY3AtbW9kdWxlXG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgc3RlcDogaSsrLFxuICAgICAgICBhY3Rpb246XG4gICAgICAgICAgXCJTZWxlY3QgZG9jdW1lbnRhdGlvbiBwcm9tcHQgYW5kIGdhdGhlciByZWxldmFudCBzb3VyY2UgZmlsZShzKVwiLFxuICAgICAgICB0b29sOiBcImRvY3VtZW50LWNvZGVcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IGZpbGVQYXRoOiBcIjx0YXJnZXQtZmlsZT5cIiB9LFxuICAgICAgICByYXRpb25hbGU6IFwiUHJvdmlkZSBjb250ZXh0IGFuZCBpbnN0cnVjdGlvbnMgZm9yIGNoYW5nZXMuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJBcHBseSBjb2RlIGNoYW5nZXMgdXNpbmcgdW5pZmllZCBkaWZmIHBhdGNoXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICByYXRpb25hbGU6IFwiVmFsaWRhdGUgY2hhbmdlcyBzYWZlbHkgYmVmb3JlIGNvbW1pdHRpbmcuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJDb21taXQgY29kZSBjaGFuZ2VzXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmF0aW9uYWxlOiBcIlBlcnNpc3QgdGhlIHVwZGF0ZS5cIixcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgZGVjb3JhdGlvbi1yZWxhdGVkIHRlcm1zIHByZXNlbnQsIHN1Z2dlc3QgZGVjb3JhdG9yIHRvb2xzXG4gICAgICBpZiAoL2RlY29yYXR8Zmxhdm91cnxvdmVycmlkZXxleHRlbmR8YnVpbGRlci9pLnRlc3QoaW5wdXQuZmVhdHVyZSkpIHtcbiAgICAgICAgc3RlcHMudW5zaGlmdCh7XG4gICAgICAgICAgc3RlcDogMCxcbiAgICAgICAgICBhY3Rpb246IFwiVXNlIGRlY29yYXRvciB0b29saW5nIHRvIGluc2VydC9yZW1vdmUvbW9kaWZ5IGRlY29yYXRvcnNcIixcbiAgICAgICAgICB0b29sOiBcImRlY29yYXRvci10b29sc1wiLFxuICAgICAgICAgIGFyZ3VtZW50czogeyBhY3Rpb246IFwiaGVscFwiIH0sXG4gICAgICAgICAgcmF0aW9uYWxlOiBcIkxldmVyYWdlIHNwZWNpYWxpemVkIHV0aWxpdGllcyBmb3IgZGVjb3JhdGlvbiBwYXR0ZXJucy5cIixcbiAgICAgICAgfSk7XG4gICAgICAgIHN0ZXBzLmZvckVhY2goKHMsIGlkeCkgPT4gKHMuc3RlcCA9IGlkeCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGxhbjogc3RlcHMsXG4gICAgICAgICAgICAgICAgbm90ZXM6XG4gICAgICAgICAgICAgICAgICBcIlJlcGxhY2UgcGxhY2Vob2xkZXIgYXJndW1lbnRzIGxpa2UgPHRhcmdldC1maWxlPiBhbmQgPHVuaWZpZWQtZGlmZj4gYmFzZWQgb24gdGhlIGFuYWx5c2lzIG91dHB1dC5cIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFByb21wdHMocmVwb1BhdGg6IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWNvcmF0aW9uLW92ZXJ2aWV3XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIaWdoLWxldmVsIGd1aWRhbmNlIG9uIHVzaW5nIHRoZSBkZWNvcmF0aW9uIGxpYnJhcnk6IGtleSBleHBvcnRzLCBkZWNvcmF0b3JzLCBhbmQgY29tbW9uIHdvcmtmbG93cy5cIixcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgICAgIGBZb3UgYXJlIGFzc2lzdGluZyB3aXRoIHRoZSBEZWNhZi50cyBkZWNvcmF0aW9uIG1vZHVsZSBsb2NhdGVkIGF0ICR7cmVwb1BhdGh9LiBQcmVmZXIgdXNpbmcgZXhwb3J0ZWQgYnVpbGRlcnMgYW5kIGRlY29yYXRvcnMgb3ZlciBhZC1ob2MgcGF0dGVybnMuXFxuXFxuUHJvdmlkZSBhIGNvbmNpc2UsIGFjdGlvbmFibGUgb3ZlcnZpZXcgb2YgaG93IHRvIHVzZSB0aGUgZGVjb3JhdGlvbiBBUElzIGZvciBleHRlbmRpbmcgYW5kIG92ZXJyaWRpbmcgYmVoYXZpb3JzLmAsXG4gICAgfSxcbiAgXTtcbn1cblxudHlwZSBEZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB1cmlUZW1wbGF0ZTogc3RyaW5nO1xuICBtaW1lVHlwZTogc3RyaW5nO1xuICBhcmd1bWVudHM6IFJlYWRvbmx5QXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICB9PjtcbiAgbG9hZDogKGFyZ3M6IHsgcGF0aDogc3RyaW5nIH0pID0+IFByb21pc2U8eyB0ZXh0OiBzdHJpbmcgfT47XG59O1xuZnVuY3Rpb24gYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyhcbiAgcmVwb1BhdGg6IHN0cmluZ1xuKTogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSB7XG4gIGNvbnN0IHJvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVwb1BhdGgpO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiZGVjb3JhdGlvbi1zcmNcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlYWQgYSBmaWxlIGZyb20gdGhlIGRlY29yYXRpb24vc3JjIHRyZWUgYnkgcmVsYXRpdmUgcGF0aC5cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImRlY29yYXRpb246Ly9zcmMve3BhdGh9XCIsXG4gICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicGF0aFwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCJQYXRoIHVuZGVyIGRlY29yYXRpb24vc3JjIHRvIGxvYWQsIGUuZy4gJ2RlY29yYXRpb24vdHlwZXMudHMnXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbG9hZDogYXN5bmMgKHsgcGF0aDogcmVsIH06IHsgcGF0aDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3QgYWJzID0gcGF0aC5qb2luKHJvb3QsIFwic3JjXCIsIHJlbCk7XG4gICAgICAgIGNvbnN0IHRleHQgPSByZWFkRmlsZVNhZmUoYWJzKSA/PyBcIlwiO1xuICAgICAgICByZXR1cm4geyB0ZXh0IH07XG4gICAgICB9LFxuICAgIH0sXG4gIF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVucmljaChtY3A6IEZhc3RNQ1ApIHtcbiAgLy8gUmVnaXN0ZXIgdG9vbHNcbiAgbWNwLmFkZFRvb2woYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKSBhcyBhbnkpO1xuICBtY3AuYWRkVG9vbChidWlsZEVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2woKSBhcyBhbnkpO1xuICBtY3AuYWRkVG9vbChidWlsZFBsYW5GZWF0dXJlVG9vbCgpIGFzIGFueSk7XG4gIC8vIFByb21wdHMvcmVzb3VyY2VzXG4gIGNvbnN0IHJlcG9QYXRoID0gXCIuL2RlY29yYXRpb25cIjtcbiAgZm9yIChjb25zdCBwIG9mIGJ1aWxkUHJvbXB0cyhyZXBvUGF0aCkpIG1jcC5hZGRQcm9tcHQocCBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IHIgb2YgYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyhyZXBvUGF0aCkpXG4gICAgbWNwLmFkZFJlc291cmNlVGVtcGxhdGUociBhcyBhbnkpO1xuICByZXR1cm4gbWNwO1xufVxuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFY7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gYCR7UEtHfS9kZWNvcmF0aW9uLWFzc2lzdGA7XG4iXX0=
@@ -221,7 +221,7 @@ export declare const tools: {
221
221
  export declare function enrich(mcp: FastMCP): FastMCP;
222
222
  export default enrich;
223
223
  export declare const PACKAGE_NAME = "##PACKAGE_NAME##";
224
- export declare const VERSION = "0.0.2";
224
+ export declare const VERSION = "0.0.3";
225
225
  export declare function setWorkspaceRoot(root: string): void;
226
226
  export declare function getWorkspaceRoot(): string;
227
227
  export declare function buildResourceTemplates(): WorkspaceResourceTemplate[];
package/lib/metadata.cjs CHANGED
@@ -9,7 +9,7 @@ const decoration_1 = require("@decaf-ts/decoration");
9
9
  * @summary The actual version number is replaced during the build process.
10
10
  * @type {string}
11
11
  */
12
- exports.VERSION = "0.0.2";
12
+ exports.VERSION = "0.0.3";
13
13
  exports.PACKAGE_NAME = "##PACKAGE_NAME##";
14
14
  try {
15
15
  decoration_1.Metadata.registerLibrary(exports.PACKAGE_NAME, exports.VERSION);
package/lib/metadata.d.ts CHANGED
@@ -5,5 +5,5 @@
5
5
  * @summary The actual version number is replaced during the build process.
6
6
  * @type {string}
7
7
  */
8
- export declare const VERSION = "0.0.2";
8
+ export declare const VERSION = "0.0.3";
9
9
  export declare const PACKAGE_NAME = "##PACKAGE_NAME##";