@stacksfinder/mcp-server 1.0.2 → 1.1.0

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.
@@ -0,0 +1,559 @@
1
+ import { z } from 'zod';
2
+ import { apiRequest } from '../utils/api-client.js';
3
+ import { McpError, ErrorCode } from '../utils/errors.js';
4
+ import { debug } from '../utils/logger.js';
5
+ import { hasApiKey } from '../utils/config.js';
6
+ // ============================================================================
7
+ // SCHEMAS
8
+ // ============================================================================
9
+ /**
10
+ * Input schema for create_audit tool.
11
+ */
12
+ export const CreateAuditInputSchema = z.object({
13
+ name: z.string().min(1).max(200).describe('Name for the audit report'),
14
+ technologies: z
15
+ .array(z.object({
16
+ name: z.string().min(1).describe('Technology name (e.g., "react", "express", "lodash")'),
17
+ version: z.string().optional().describe('Version string (e.g., "18.2.0", "4.17.21")'),
18
+ category: z.string().optional().describe('Optional category (e.g., "frontend", "backend")')
19
+ }))
20
+ .min(1)
21
+ .max(50)
22
+ .describe('List of technologies to audit')
23
+ });
24
+ /**
25
+ * Input schema for get_audit tool.
26
+ */
27
+ export const GetAuditInputSchema = z.object({
28
+ auditId: z.string().uuid().describe('Audit report UUID')
29
+ });
30
+ /**
31
+ * Input schema for list_audits tool.
32
+ */
33
+ export const ListAuditsInputSchema = z.object({
34
+ limit: z.number().min(1).max(50).optional().default(10).describe('Max results to return'),
35
+ offset: z.number().min(0).optional().default(0).describe('Pagination offset')
36
+ });
37
+ /**
38
+ * Input schema for compare_audits tool.
39
+ */
40
+ export const CompareAuditsInputSchema = z.object({
41
+ baseAuditId: z.string().uuid().describe('Base audit ID (older)'),
42
+ compareAuditId: z.string().uuid().describe('Compare audit ID (newer)')
43
+ });
44
+ /**
45
+ * Input schema for get_audit_quota tool.
46
+ */
47
+ export const GetAuditQuotaInputSchema = z.object({});
48
+ /**
49
+ * Input schema for get_migration_recommendation tool.
50
+ */
51
+ export const GetMigrationRecommendationInputSchema = z.object({
52
+ auditId: z.string().uuid().describe('Audit report UUID to analyze for migration')
53
+ });
54
+ // ============================================================================
55
+ // TOOL DEFINITIONS
56
+ // ============================================================================
57
+ export const createAuditToolDefinition = {
58
+ name: 'create_audit',
59
+ description: `Create a technical debt audit for a list of technologies.
60
+ Analyzes your stack for deprecated packages, security vulnerabilities, EOL versions, and upgrade recommendations.
61
+ Returns findings with severity (critical/high/medium/low/info) and actionable suggestions.
62
+ Requires API key with audit:write scope.`,
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ name: {
67
+ type: 'string',
68
+ description: 'Name for the audit report (e.g., "Q1 2026 Stack Review")'
69
+ },
70
+ technologies: {
71
+ type: 'array',
72
+ items: {
73
+ type: 'object',
74
+ properties: {
75
+ name: { type: 'string', description: 'Technology name' },
76
+ version: { type: 'string', description: 'Version (optional)' },
77
+ category: { type: 'string', description: 'Category (optional)' }
78
+ },
79
+ required: ['name']
80
+ },
81
+ description: 'Technologies to audit'
82
+ }
83
+ },
84
+ required: ['name', 'technologies']
85
+ }
86
+ };
87
+ export const getAuditToolDefinition = {
88
+ name: 'get_audit',
89
+ description: 'Fetch a completed audit report by ID. Returns all findings and health score.',
90
+ inputSchema: {
91
+ type: 'object',
92
+ properties: {
93
+ auditId: {
94
+ type: 'string',
95
+ format: 'uuid',
96
+ description: 'Audit report UUID'
97
+ }
98
+ },
99
+ required: ['auditId']
100
+ }
101
+ };
102
+ export const listAuditsToolDefinition = {
103
+ name: 'list_audits',
104
+ description: 'List your audit reports with pagination. Shows name, status, health score, and creation date.',
105
+ inputSchema: {
106
+ type: 'object',
107
+ properties: {
108
+ limit: {
109
+ type: 'number',
110
+ description: 'Max results (1-50, default 10)'
111
+ },
112
+ offset: {
113
+ type: 'number',
114
+ description: 'Pagination offset (default 0)'
115
+ }
116
+ },
117
+ required: []
118
+ }
119
+ };
120
+ export const compareAuditsToolDefinition = {
121
+ name: 'compare_audits',
122
+ description: `Compare two audit reports to track technical debt trends over time.
123
+ Shows new issues introduced, issues resolved, and health score change.
124
+ Useful for measuring progress on debt reduction.`,
125
+ inputSchema: {
126
+ type: 'object',
127
+ properties: {
128
+ baseAuditId: {
129
+ type: 'string',
130
+ format: 'uuid',
131
+ description: 'Base (older) audit ID'
132
+ },
133
+ compareAuditId: {
134
+ type: 'string',
135
+ format: 'uuid',
136
+ description: 'Compare (newer) audit ID'
137
+ }
138
+ },
139
+ required: ['baseAuditId', 'compareAuditId']
140
+ }
141
+ };
142
+ export const getAuditQuotaToolDefinition = {
143
+ name: 'get_audit_quota',
144
+ description: 'Check your remaining audit quota for this month.',
145
+ inputSchema: {
146
+ type: 'object',
147
+ properties: {},
148
+ required: []
149
+ }
150
+ };
151
+ export const getMigrationRecommendationToolDefinition = {
152
+ name: 'get_migration_recommendation',
153
+ description: `Analyze an audit report for migration opportunities.
154
+ Returns a detailed migration recommendation including:
155
+ - Technologies that should be replaced
156
+ - Recommended modern alternatives
157
+ - Migration roadmap with phases
158
+ - Risk assessment
159
+ - Builder constraints to pre-fill for generating a migration blueprint
160
+
161
+ Use this after create_audit to get actionable migration guidance.`,
162
+ inputSchema: {
163
+ type: 'object',
164
+ properties: {
165
+ auditId: {
166
+ type: 'string',
167
+ format: 'uuid',
168
+ description: 'Audit report UUID to analyze'
169
+ }
170
+ },
171
+ required: ['auditId']
172
+ }
173
+ };
174
+ // ============================================================================
175
+ // FORMATTERS
176
+ // ============================================================================
177
+ function formatSeverityEmoji(severity) {
178
+ switch (severity) {
179
+ case 'critical':
180
+ return '🔴';
181
+ case 'high':
182
+ return '🟠';
183
+ case 'medium':
184
+ return '🟡';
185
+ case 'low':
186
+ return '🟢';
187
+ case 'info':
188
+ return 'ℹ️';
189
+ default:
190
+ return '•';
191
+ }
192
+ }
193
+ function formatHealthScore(score) {
194
+ if (score >= 90)
195
+ return `✅ ${score}/100 (Excellent)`;
196
+ if (score >= 70)
197
+ return `🟡 ${score}/100 (Good)`;
198
+ if (score >= 50)
199
+ return `🟠 ${score}/100 (Fair)`;
200
+ return `🔴 ${score}/100 (Needs Attention)`;
201
+ }
202
+ function formatAuditReport(audit) {
203
+ let text = `## Audit Report: ${audit.name}\n\n`;
204
+ text += `**ID**: ${audit.id}\n`;
205
+ text += `**Status**: ${audit.status}\n`;
206
+ text += `**Created**: ${new Date(audit.createdAt).toLocaleDateString()}\n`;
207
+ if (audit.summary) {
208
+ text += `\n### Health Score\n`;
209
+ text += `${formatHealthScore(audit.summary.healthScore)}\n\n`;
210
+ text += `### Summary\n`;
211
+ text += `| Severity | Count |\n`;
212
+ text += `|----------|-------|\n`;
213
+ text += `| 🔴 Critical | ${audit.summary.criticalCount} |\n`;
214
+ text += `| 🟠 High | ${audit.summary.highCount} |\n`;
215
+ text += `| 🟡 Medium | ${audit.summary.mediumCount} |\n`;
216
+ text += `| 🟢 Low | ${audit.summary.lowCount} |\n`;
217
+ text += `| ℹ️ Info | ${audit.summary.infoCount} |\n`;
218
+ text += `\n**Total Findings**: ${audit.summary.totalFindings}\n`;
219
+ }
220
+ if (audit.findings && audit.findings.length > 0) {
221
+ text += `\n### Findings\n\n`;
222
+ for (const finding of audit.findings) {
223
+ text += `#### ${formatSeverityEmoji(finding.severity)} ${finding.title}\n`;
224
+ text += `**Technology**: ${finding.technology}`;
225
+ if (finding.currentVersion) {
226
+ text += ` (v${finding.currentVersion})`;
227
+ }
228
+ text += `\n`;
229
+ text += `**Category**: ${finding.category}\n`;
230
+ text += `**Severity**: ${finding.severity.toUpperCase()}\n\n`;
231
+ text += `${finding.description}\n\n`;
232
+ if (finding.recommendedVersion) {
233
+ text += `**Recommended**: Upgrade to v${finding.recommendedVersion}\n`;
234
+ }
235
+ if (finding.migrationEffort) {
236
+ text += `**Migration Effort**: ${finding.migrationEffort}\n`;
237
+ }
238
+ if (finding.cveIds && finding.cveIds.length > 0) {
239
+ text += `**CVEs**: ${finding.cveIds.join(', ')}\n`;
240
+ }
241
+ text += `\n**Action**: ${finding.suggestedAction}\n\n`;
242
+ if (finding.references && finding.references.length > 0) {
243
+ text += `**References**:\n`;
244
+ for (const ref of finding.references) {
245
+ text += `- ${ref}\n`;
246
+ }
247
+ }
248
+ text += `---\n\n`;
249
+ }
250
+ }
251
+ else if (audit.status === 'completed') {
252
+ text += `\n### 🎉 No Issues Found\n`;
253
+ text += `Your stack passed all checks. Great job maintaining your technical health!\n`;
254
+ }
255
+ return text;
256
+ }
257
+ function formatComparison(comparison) {
258
+ let text = `## Audit Comparison\n\n`;
259
+ text += `### Overview\n`;
260
+ text += `| Audit | Health Score |\n`;
261
+ text += `|-------|-------------|\n`;
262
+ text += `| ${comparison.baseAudit.name} (base) | ${comparison.baseAudit.healthScore}/100 |\n`;
263
+ text += `| ${comparison.compareAudit.name} (compare) | ${comparison.compareAudit.healthScore}/100 |\n`;
264
+ text += `\n`;
265
+ const trendEmoji = comparison.trend === 'improving'
266
+ ? '📈'
267
+ : comparison.trend === 'degrading'
268
+ ? '📉'
269
+ : '➡️';
270
+ text += `### Trend: ${trendEmoji} ${comparison.trend.toUpperCase()}\n`;
271
+ text += `**Health Score Change**: ${comparison.healthScoreDelta > 0 ? '+' : ''}${comparison.healthScoreDelta} points\n\n`;
272
+ if (comparison.resolvedCount > 0) {
273
+ text += `### ✅ Resolved Issues (${comparison.resolvedCount})\n`;
274
+ for (const finding of comparison.resolvedFindings) {
275
+ text += `- ${formatSeverityEmoji(finding.severity)} ${finding.title} (${finding.technology})\n`;
276
+ }
277
+ text += `\n`;
278
+ }
279
+ if (comparison.newCount > 0) {
280
+ text += `### ⚠️ New Issues (${comparison.newCount})\n`;
281
+ for (const finding of comparison.newFindings) {
282
+ text += `- ${formatSeverityEmoji(finding.severity)} ${finding.title} (${finding.technology})\n`;
283
+ }
284
+ text += `\n`;
285
+ }
286
+ if (comparison.resolvedCount === 0 && comparison.newCount === 0) {
287
+ text += `### No Changes\n`;
288
+ text += `The findings are identical between these two audits.\n`;
289
+ }
290
+ return text;
291
+ }
292
+ function formatMigrationRecommendation(response) {
293
+ if (!response.needsMigration) {
294
+ return `## Migration Analysis\n\n✅ **No migration recommended.**\n\nYour stack is healthy with no critical issues requiring migration.\n\n**Migration Score**: ${response.migrationScore}/100 (below threshold)`;
295
+ }
296
+ const rec = response.recommendation;
297
+ if (!rec) {
298
+ return `## Migration Analysis\n\nUnable to generate recommendation.`;
299
+ }
300
+ const urgencyEmoji = {
301
+ critical: '🚨',
302
+ high: '⚠️',
303
+ medium: '📋',
304
+ low: 'ℹ️'
305
+ }[rec.urgency];
306
+ let text = `## ${urgencyEmoji} Migration Recommendation\n\n`;
307
+ text += `### ${rec.title}\n\n`;
308
+ text += `**Migration Score**: ${response.migrationScore}/100\n`;
309
+ text += `**Urgency**: ${rec.urgency.toUpperCase()}\n`;
310
+ text += `**Scope**: ${rec.scope}\n`;
311
+ text += `**Estimated Effort**: ${rec.estimatedEffort}\n`;
312
+ text += `**Affected Technologies**: ${response.affectedTechCount}\n`;
313
+ text += `**Critical Issues**: ${response.criticalIssues}\n\n`;
314
+ text += `${rec.summary}\n\n`;
315
+ // Technologies to Replace
316
+ if (rec.techsToReplace.length > 0) {
317
+ text += `### 🔄 Technologies to Replace\n\n`;
318
+ text += `| Technology | Version | Reason |\n`;
319
+ text += `|------------|---------|--------|\n`;
320
+ for (const tech of rec.techsToReplace) {
321
+ text += `| ${tech.name} | ${tech.currentVersion || '-'} | ${tech.reason} |\n`;
322
+ }
323
+ text += `\n`;
324
+ }
325
+ // Suggested Alternatives
326
+ if (rec.suggestedAlternatives.length > 0) {
327
+ text += `### ✨ Recommended Alternatives\n\n`;
328
+ for (const alt of rec.suggestedAlternatives) {
329
+ text += `**${alt.forTech}** → `;
330
+ const alts = alt.alternatives.map(a => a === alt.preferredChoice ? `**${a}** (recommended)` : a);
331
+ text += alts.join(', ');
332
+ text += `\n`;
333
+ text += ` _${alt.reason}_\n\n`;
334
+ }
335
+ }
336
+ // Migration Roadmap
337
+ if (rec.migrationSteps.length > 0) {
338
+ text += `### 📋 Migration Roadmap\n\n`;
339
+ for (const step of rec.migrationSteps) {
340
+ text += `**Phase ${step.order}: ${step.phase}** (${step.effort} effort)\n`;
341
+ text += `${step.description}\n`;
342
+ if (step.techsAffected.length > 0) {
343
+ text += `Affects: ${step.techsAffected.join(', ')}\n`;
344
+ }
345
+ text += `\n`;
346
+ }
347
+ }
348
+ // Risks
349
+ if (rec.risks.length > 0) {
350
+ text += `### ⚠️ Risk Assessment\n\n`;
351
+ for (const risk of rec.risks) {
352
+ const riskEmoji = risk.level === 'high' ? '🔴' : risk.level === 'medium' ? '🟡' : '🟢';
353
+ text += `${riskEmoji} **${risk.level.toUpperCase()} RISK**: ${risk.description}\n`;
354
+ text += ` _Mitigation_: ${risk.mitigation}\n\n`;
355
+ }
356
+ }
357
+ // Inferred Constraints
358
+ if (rec.inferredConstraints.length > 0) {
359
+ text += `### 🎯 Inferred Builder Constraints\n\n`;
360
+ text += `These constraints will be pre-filled when generating a migration blueprint:\n`;
361
+ text += rec.inferredConstraints.map(c => `\`${c}\``).join(', ');
362
+ text += `\n\n`;
363
+ }
364
+ // Builder Pre-fill info
365
+ if (response.builderPreFill) {
366
+ text += `### 🚀 Generate Migration Blueprint\n\n`;
367
+ text += `Use the StacksFinder Builder with these pre-filled settings:\n`;
368
+ if (response.builderPreFill.context.projectType) {
369
+ text += `- **Project Type**: ${response.builderPreFill.context.projectType}\n`;
370
+ }
371
+ if (response.builderPreFill.context.scale) {
372
+ text += `- **Scale**: ${response.builderPreFill.context.scale}\n`;
373
+ }
374
+ if (response.builderPreFill.context.priorities.length > 0) {
375
+ text += `- **Priorities**: ${response.builderPreFill.context.priorities.join(', ')}\n`;
376
+ }
377
+ if (response.builderPreFill.hints.techsToAvoid.length > 0) {
378
+ text += `- **Avoid**: ${response.builderPreFill.hints.techsToAvoid.join(', ')}\n`;
379
+ }
380
+ text += `\nVisit https://stacksfinder.com/builder to generate your migration blueprint.\n`;
381
+ }
382
+ return text;
383
+ }
384
+ // ============================================================================
385
+ // EXECUTE FUNCTIONS
386
+ // ============================================================================
387
+ function requireApiKey() {
388
+ if (!hasApiKey()) {
389
+ throw new McpError(ErrorCode.CONFIG_ERROR, 'API key required for audit operations. Set STACKSFINDER_API_KEY environment variable.', ['Get your API key from https://stacksfinder.com/settings/api']);
390
+ }
391
+ }
392
+ /**
393
+ * Execute create_audit tool.
394
+ */
395
+ export async function executeCreateAudit(input) {
396
+ requireApiKey();
397
+ debug('Creating audit', { name: input.name, techCount: input.technologies.length });
398
+ try {
399
+ const response = await apiRequest('/api/v1/audits', {
400
+ method: 'POST',
401
+ body: {
402
+ name: input.name,
403
+ stackInput: {
404
+ technologies: input.technologies
405
+ },
406
+ source: 'mcp'
407
+ },
408
+ timeoutMs: 30000
409
+ });
410
+ const text = formatAuditReport(response);
411
+ return { text };
412
+ }
413
+ catch (err) {
414
+ if (err instanceof McpError) {
415
+ return { text: err.toResponseText(), isError: true };
416
+ }
417
+ const error = new McpError(ErrorCode.API_ERROR, err instanceof Error ? err.message : 'Failed to create audit');
418
+ return { text: error.toResponseText(), isError: true };
419
+ }
420
+ }
421
+ /**
422
+ * Execute get_audit tool.
423
+ */
424
+ export async function executeGetAudit(input) {
425
+ requireApiKey();
426
+ debug('Fetching audit', { auditId: input.auditId });
427
+ try {
428
+ const response = await apiRequest(`/api/v1/audits/${input.auditId}`);
429
+ const text = formatAuditReport(response);
430
+ return { text };
431
+ }
432
+ catch (err) {
433
+ if (err instanceof McpError) {
434
+ if (err.code === ErrorCode.NOT_FOUND) {
435
+ err.suggestions = [
436
+ 'Use list_audits to see your available audit reports.',
437
+ 'Create a new audit with create_audit.'
438
+ ];
439
+ }
440
+ return { text: err.toResponseText(), isError: true };
441
+ }
442
+ const error = new McpError(ErrorCode.API_ERROR, err instanceof Error ? err.message : 'Failed to fetch audit');
443
+ return { text: error.toResponseText(), isError: true };
444
+ }
445
+ }
446
+ /**
447
+ * Execute list_audits tool.
448
+ */
449
+ export async function executeListAudits(input) {
450
+ requireApiKey();
451
+ debug('Listing audits', { limit: input.limit, offset: input.offset });
452
+ try {
453
+ const response = await apiRequest(`/api/v1/audits?limit=${input.limit}&offset=${input.offset}`);
454
+ if (response.audits.length === 0) {
455
+ return {
456
+ text: `## Your Audits\n\nNo audit reports found. Create one with the \`create_audit\` tool.`
457
+ };
458
+ }
459
+ let text = `## Your Audits (${response.audits.length} of ${response.total})\n\n`;
460
+ text += `| Name | Health Score | Status | Created |\n`;
461
+ text += `|------|-------------|--------|--------|\n`;
462
+ for (const audit of response.audits) {
463
+ const score = audit.summary?.healthScore ?? '-';
464
+ const date = new Date(audit.createdAt).toLocaleDateString();
465
+ text += `| ${audit.name} | ${score}/100 | ${audit.status} | ${date} |\n`;
466
+ }
467
+ if (response.total > response.audits.length) {
468
+ text += `\n_Showing ${response.audits.length} of ${response.total} audits. Use offset parameter for more._`;
469
+ }
470
+ return { text };
471
+ }
472
+ catch (err) {
473
+ if (err instanceof McpError) {
474
+ return { text: err.toResponseText(), isError: true };
475
+ }
476
+ const error = new McpError(ErrorCode.API_ERROR, err instanceof Error ? err.message : 'Failed to list audits');
477
+ return { text: error.toResponseText(), isError: true };
478
+ }
479
+ }
480
+ /**
481
+ * Execute compare_audits tool.
482
+ */
483
+ export async function executeCompareAudits(input) {
484
+ requireApiKey();
485
+ debug('Comparing audits', { base: input.baseAuditId, compare: input.compareAuditId });
486
+ try {
487
+ const response = await apiRequest('/api/v1/audits/compare', {
488
+ method: 'POST',
489
+ body: {
490
+ baseAuditId: input.baseAuditId,
491
+ compareAuditId: input.compareAuditId
492
+ }
493
+ });
494
+ const text = formatComparison(response.comparison);
495
+ return { text };
496
+ }
497
+ catch (err) {
498
+ if (err instanceof McpError) {
499
+ return { text: err.toResponseText(), isError: true };
500
+ }
501
+ const error = new McpError(ErrorCode.API_ERROR, err instanceof Error ? err.message : 'Failed to compare audits');
502
+ return { text: error.toResponseText(), isError: true };
503
+ }
504
+ }
505
+ /**
506
+ * Execute get_audit_quota tool.
507
+ */
508
+ export async function executeGetAuditQuota() {
509
+ requireApiKey();
510
+ debug('Getting audit quota');
511
+ try {
512
+ const response = await apiRequest('/api/v1/audits/quota');
513
+ const { quota } = response;
514
+ let text = `## Audit Quota\n\n`;
515
+ text += `| Metric | Value |\n`;
516
+ text += `|--------|-------|\n`;
517
+ text += `| Used | ${quota.used} |\n`;
518
+ text += `| Limit | ${quota.limit} |\n`;
519
+ text += `| Remaining | ${quota.remaining} |\n`;
520
+ if (quota.resetsAt) {
521
+ text += `| Resets At | ${new Date(quota.resetsAt).toLocaleDateString()} |\n`;
522
+ }
523
+ return { text };
524
+ }
525
+ catch (err) {
526
+ if (err instanceof McpError) {
527
+ return { text: err.toResponseText(), isError: true };
528
+ }
529
+ const error = new McpError(ErrorCode.API_ERROR, err instanceof Error ? err.message : 'Failed to get audit quota');
530
+ return { text: error.toResponseText(), isError: true };
531
+ }
532
+ }
533
+ /**
534
+ * Execute get_migration_recommendation tool.
535
+ */
536
+ export async function executeGetMigrationRecommendation(input) {
537
+ requireApiKey();
538
+ debug('Getting migration recommendation', { auditId: input.auditId });
539
+ try {
540
+ const response = await apiRequest(`/api/v1/audits/${input.auditId}/migration`);
541
+ const text = formatMigrationRecommendation(response);
542
+ return { text };
543
+ }
544
+ catch (err) {
545
+ if (err instanceof McpError) {
546
+ if (err.code === ErrorCode.NOT_FOUND) {
547
+ err.suggestions = [
548
+ 'Use list_audits to see your available audit reports.',
549
+ 'Make sure the audit is completed before requesting migration analysis.',
550
+ 'Create a new audit with create_audit.'
551
+ ];
552
+ }
553
+ return { text: err.toResponseText(), isError: true };
554
+ }
555
+ const error = new McpError(ErrorCode.API_ERROR, err instanceof Error ? err.message : 'Failed to get migration recommendation');
556
+ return { text: error.toResponseText(), isError: true };
557
+ }
558
+ }
559
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/tools/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtE,YAAY,EAAE,CAAC;SACb,KAAK,CACL,CAAC,CAAC,MAAM,CAAC;QACR,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QACxF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACrF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;KAC3F,CAAC,CACF;SACA,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,+BAA+B,CAAC;CAC3C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACxD,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACzF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CAC7E,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAChE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACtE,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAIrD;;GAEG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;CACjF,CAAC,CAAC;AAIH,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE;;;yCAG2B;IACxC,WAAW,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACX,IAAI,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;aACvE;YACD,YAAY,EAAE;gBACb,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACX,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;wBACxD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;wBAC9D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;qBAChE;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBAClB;gBACD,WAAW,EAAE,uBAAuB;aACpC;SACD;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC;KAClC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,8EAA8E;IAC3F,WAAW,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACX,OAAO,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,mBAAmB;aAChC;SACD;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACrB;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,+FAA+F;IAC5G,WAAW,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACX,KAAK,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAC7C;YACD,MAAM,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+BAA+B;aAC5C;SACD;QACD,QAAQ,EAAE,EAAE;KACZ;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IAC1C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE;;iDAEmC;IAChD,WAAW,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACX,WAAW,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,uBAAuB;aACpC;YACD,cAAc,EAAE;gBACf,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,0BAA0B;aACvC;SACD;QACD,QAAQ,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;KAC3C;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IAC1C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,kDAAkD;IAC/D,WAAW,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACZ;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,wCAAwC,GAAG;IACvD,IAAI,EAAE,8BAA8B;IACpC,WAAW,EAAE;;;;;;;;kEAQoD;IACjE,WAAW,EAAE;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACX,OAAO,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,8BAA8B;aAC3C;SACD;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACrB;CACD,CAAC;AAwIF,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,SAAS,mBAAmB,CAAC,QAAgB;IAC5C,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,UAAU;YACd,OAAO,IAAI,CAAC;QACb,KAAK,MAAM;YACV,OAAO,IAAI,CAAC;QACb,KAAK,QAAQ;YACZ,OAAO,IAAI,CAAC;QACb,KAAK,KAAK;YACT,OAAO,IAAI,CAAC;QACb,KAAK,MAAM;YACV,OAAO,IAAI,CAAC;QACb;YACC,OAAO,GAAG,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACvC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,KAAK,KAAK,kBAAkB,CAAC;IACrD,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,KAAK,aAAa,CAAC;IACjD,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,KAAK,aAAa,CAAC;IACjD,OAAO,MAAM,KAAK,wBAAwB,CAAC;AAC5C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB;IAC9C,IAAI,IAAI,GAAG,oBAAoB,KAAK,CAAC,IAAI,MAAM,CAAC;IAChD,IAAI,IAAI,WAAW,KAAK,CAAC,EAAE,IAAI,CAAC;IAChC,IAAI,IAAI,eAAe,KAAK,CAAC,MAAM,IAAI,CAAC;IACxC,IAAI,IAAI,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC;IAE3E,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,IAAI,sBAAsB,CAAC;QAC/B,IAAI,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;QAE9D,IAAI,IAAI,eAAe,CAAC;QACxB,IAAI,IAAI,wBAAwB,CAAC;QACjC,IAAI,IAAI,wBAAwB,CAAC;QACjC,IAAI,IAAI,mBAAmB,KAAK,CAAC,OAAO,CAAC,aAAa,MAAM,CAAC;QAC7D,IAAI,IAAI,eAAe,KAAK,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC;QACrD,IAAI,IAAI,iBAAiB,KAAK,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC;QACzD,IAAI,IAAI,cAAc,KAAK,CAAC,OAAO,CAAC,QAAQ,MAAM,CAAC;QACnD,IAAI,IAAI,eAAe,KAAK,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC;QACrD,IAAI,IAAI,yBAAyB,KAAK,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC;IAClE,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,IAAI,oBAAoB,CAAC;QAE7B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,IAAI,QAAQ,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC;YAC3E,IAAI,IAAI,mBAAmB,OAAO,CAAC,UAAU,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,IAAI,IAAI,MAAM,OAAO,CAAC,cAAc,GAAG,CAAC;YACzC,CAAC;YACD,IAAI,IAAI,IAAI,CAAC;YACb,IAAI,IAAI,iBAAiB,OAAO,CAAC,QAAQ,IAAI,CAAC;YAC9C,IAAI,IAAI,iBAAiB,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;YAC9D,IAAI,IAAI,GAAG,OAAO,CAAC,WAAW,MAAM,CAAC;YAErC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAChC,IAAI,IAAI,gCAAgC,OAAO,CAAC,kBAAkB,IAAI,CAAC;YACxE,CAAC;YACD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC7B,IAAI,IAAI,yBAAyB,OAAO,CAAC,eAAe,IAAI,CAAC;YAC9D,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,IAAI,IAAI,aAAa,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACpD,CAAC;YAED,IAAI,IAAI,iBAAiB,OAAO,CAAC,eAAe,MAAM,CAAC;YAEvD,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,IAAI,IAAI,mBAAmB,CAAC;gBAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBACtC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC;gBACtB,CAAC;YACF,CAAC;YACD,IAAI,IAAI,SAAS,CAAC;QACnB,CAAC;IACF,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACzC,IAAI,IAAI,4BAA4B,CAAC;QACrC,IAAI,IAAI,8EAA8E,CAAC;IACxF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAyC;IAClE,IAAI,IAAI,GAAG,yBAAyB,CAAC;IAErC,IAAI,IAAI,gBAAgB,CAAC;IACzB,IAAI,IAAI,4BAA4B,CAAC;IACrC,IAAI,IAAI,2BAA2B,CAAC;IACpC,IAAI,IAAI,KAAK,UAAU,CAAC,SAAS,CAAC,IAAI,aAAa,UAAU,CAAC,SAAS,CAAC,WAAW,UAAU,CAAC;IAC9F,IAAI,IAAI,KAAK,UAAU,CAAC,YAAY,CAAC,IAAI,gBAAgB,UAAU,CAAC,YAAY,CAAC,WAAW,UAAU,CAAC;IACvG,IAAI,IAAI,IAAI,CAAC;IAEb,MAAM,UAAU,GACf,UAAU,CAAC,KAAK,KAAK,WAAW;QAC/B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,WAAW;YACjC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC;IAEV,IAAI,IAAI,cAAc,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC;IACvE,IAAI,IAAI,4BAA4B,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,gBAAgB,aAAa,CAAC;IAE1H,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,0BAA0B,UAAU,CAAC,aAAa,KAAK,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACnD,IAAI,IAAI,KAAK,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,UAAU,KAAK,CAAC;QACjG,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,IAAI,sBAAsB,UAAU,CAAC,QAAQ,KAAK,CAAC;QACvD,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,IAAI,KAAK,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,UAAU,KAAK,CAAC;QACjG,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,aAAa,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACjE,IAAI,IAAI,kBAAkB,CAAC;QAC3B,IAAI,IAAI,wDAAwD,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,6BAA6B,CAAC,QAAyC;IAC/E,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC9B,OAAO,0JAA0J,QAAQ,CAAC,cAAc,wBAAwB,CAAC;IAClN,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO,6DAA6D,CAAC;IACtE,CAAC;IAED,MAAM,YAAY,GAAG;QACpB,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;KACT,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEf,IAAI,IAAI,GAAG,MAAM,YAAY,+BAA+B,CAAC;IAC7D,IAAI,IAAI,OAAO,GAAG,CAAC,KAAK,MAAM,CAAC;IAC/B,IAAI,IAAI,wBAAwB,QAAQ,CAAC,cAAc,QAAQ,CAAC;IAChE,IAAI,IAAI,gBAAgB,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;IACtD,IAAI,IAAI,cAAc,GAAG,CAAC,KAAK,IAAI,CAAC;IACpC,IAAI,IAAI,yBAAyB,GAAG,CAAC,eAAe,IAAI,CAAC;IACzD,IAAI,IAAI,8BAA8B,QAAQ,CAAC,iBAAiB,IAAI,CAAC;IACrE,IAAI,IAAI,wBAAwB,QAAQ,CAAC,cAAc,MAAM,CAAC;IAE9D,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,MAAM,CAAC;IAE7B,0BAA0B;IAC1B,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,oCAAoC,CAAC;QAC7C,IAAI,IAAI,qCAAqC,CAAC;QAC9C,IAAI,IAAI,qCAAqC,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,cAAc,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;IACd,CAAC;IAED,yBAAyB;IACzB,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,oCAAoC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;YAC7C,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,OAAO,CAAC;YAChC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,KAAK,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;YACF,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,IAAI,IAAI,CAAC;YACb,IAAI,IAAI,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC;QACjC,CAAC;IACF,CAAC;IAED,oBAAoB;IACpB,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,8BAA8B,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,IAAI,WAAW,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,YAAY,CAAC;YAC3E,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC;YAChC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,IAAI,YAAY,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACvD,CAAC;YACD,IAAI,IAAI,IAAI,CAAC;QACd,CAAC;IACF,CAAC;IAED,QAAQ;IACR,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,IAAI,4BAA4B,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvF,IAAI,IAAI,GAAG,SAAS,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,IAAI,CAAC,WAAW,IAAI,CAAC;YACnF,IAAI,IAAI,oBAAoB,IAAI,CAAC,UAAU,MAAM,CAAC;QACnD,CAAC;IACF,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,yCAAyC,CAAC;QAClD,IAAI,IAAI,+EAA+E,CAAC;QACxF,IAAI,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,IAAI,MAAM,CAAC;IAChB,CAAC;IAED,wBAAwB;IACxB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC7B,IAAI,IAAI,yCAAyC,CAAC;QAClD,IAAI,IAAI,gEAAgE,CAAC;QACzE,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,IAAI,uBAAuB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC;QAChF,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,IAAI,gBAAgB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;QACnE,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,IAAI,IAAI,qBAAqB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACxF,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,IAAI,IAAI,gBAAgB,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACnF,CAAC;QACD,IAAI,IAAI,kFAAkF,CAAC;IAC5F,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,aAAa;IACrB,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,QAAQ,CACjB,SAAS,CAAC,YAAY,EACtB,uFAAuF,EACvF,CAAC,6DAA6D,CAAC,CAC/D,CAAC;IACH,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,KAAuB;IAEvB,aAAa,EAAE,CAAC;IAEhB,KAAK,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpF,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAgB,gBAAgB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE;oBACX,YAAY,EAAE,KAAK,CAAC,YAAY;iBAChC;gBACD,MAAM,EAAE,KAAK;aACb;YACD,SAAS,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,SAAS,CAAC,SAAS,EACnB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAC7D,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,KAAoB;IAEpB,aAAa,EAAE,CAAC;IAEhB,KAAK,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAgB,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;gBACtC,GAAG,CAAC,WAAW,GAAG;oBACjB,sDAAsD;oBACtD,uCAAuC;iBACvC,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,SAAS,CAAC,SAAS,EACnB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAC5D,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,KAAsB;IAEtB,aAAa,EAAE,CAAC;IAEhB,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,UAAU,CAChC,wBAAwB,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,CAC5D,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;gBACN,IAAI,EAAE,sFAAsF;aAC5F,CAAC;QACH,CAAC;QAED,IAAI,IAAI,GAAG,mBAAmB,QAAQ,CAAC,MAAM,CAAC,MAAM,OAAO,QAAQ,CAAC,KAAK,OAAO,CAAC;QACjF,IAAI,IAAI,8CAA8C,CAAC;QACvD,IAAI,IAAI,4CAA4C,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,IAAI,GAAG,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAC5D,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,UAAU,KAAK,CAAC,MAAM,MAAM,IAAI,MAAM,CAAC;QAC1E,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,IAAI,cAAc,QAAQ,CAAC,MAAM,CAAC,MAAM,OAAO,QAAQ,CAAC,KAAK,0CAA0C,CAAC;QAC7G,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,SAAS,CAAC,SAAS,EACnB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAC5D,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,KAAyB;IAEzB,aAAa,EAAE,CAAC;IAEhB,KAAK,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAEtF,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAkB,wBAAwB,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACL,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;aACpC;SACD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,SAAS,CAAC,SAAS,EACnB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAC/D,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACzC,aAAa,EAAE,CAAC;IAEhB,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAE7B,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAgB,sBAAsB,CAAC,CAAC;QACzE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;QAE3B,IAAI,IAAI,GAAG,oBAAoB,CAAC;QAChC,IAAI,IAAI,sBAAsB,CAAC;QAC/B,IAAI,IAAI,sBAAsB,CAAC;QAC/B,IAAI,IAAI,YAAY,KAAK,CAAC,IAAI,MAAM,CAAC;QACrC,IAAI,IAAI,aAAa,KAAK,CAAC,KAAK,MAAM,CAAC;QACvC,IAAI,IAAI,iBAAiB,KAAK,CAAC,SAAS,MAAM,CAAC;QAE/C,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,IAAI,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAC9E,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,SAAS,CAAC,SAAS,EACnB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAChE,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACtD,KAAsC;IAEtC,aAAa,EAAE,CAAC;IAEhB,KAAK,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,UAAU,CAChC,kBAAkB,KAAK,CAAC,OAAO,YAAY,CAC3C,CAAC;QAEF,MAAM,IAAI,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;gBACtC,GAAG,CAAC,WAAW,GAAG;oBACjB,sDAAsD;oBACtD,wEAAwE;oBACxE,uCAAuC;iBACvC,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,QAAQ,CACzB,SAAS,CAAC,SAAS,EACnB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC,CAC7E,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stacksfinder/mcp-server",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "MCP server for StacksFinder - tech stack recommendations for LLM clients",
5
5
  "type": "module",
6
6
  "bin": {