@dxheroes/local-mcp-backend 0.3.1
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.
- package/.swcrc +22 -0
- package/.turbo/turbo-build.log +9 -0
- package/AGENTS.md +360 -0
- package/CHANGELOG.md +60 -0
- package/Dockerfile +71 -0
- package/LICENSE +94 -0
- package/dist/app.module.js +72 -0
- package/dist/app.module.js.map +1 -0
- package/dist/common/decorators/request-id.decorator.js +12 -0
- package/dist/common/decorators/request-id.decorator.js.map +1 -0
- package/dist/common/filters/all-exceptions.filter.js +61 -0
- package/dist/common/filters/all-exceptions.filter.js.map +1 -0
- package/dist/common/interceptors/logging.interceptor.js +46 -0
- package/dist/common/interceptors/logging.interceptor.js.map +1 -0
- package/dist/common/pipes/validation.pipe.js +43 -0
- package/dist/common/pipes/validation.pipe.js.map +1 -0
- package/dist/config/app.config.js +14 -0
- package/dist/config/app.config.js.map +1 -0
- package/dist/config/database.config.js +30 -0
- package/dist/config/database.config.js.map +1 -0
- package/dist/main.js +68 -0
- package/dist/main.js.map +1 -0
- package/dist/modules/database/database.module.js +27 -0
- package/dist/modules/database/database.module.js.map +1 -0
- package/dist/modules/database/prisma.service.js +122 -0
- package/dist/modules/database/prisma.service.js.map +1 -0
- package/dist/modules/debug/debug.controller.js +87 -0
- package/dist/modules/debug/debug.controller.js.map +1 -0
- package/dist/modules/debug/debug.module.js +30 -0
- package/dist/modules/debug/debug.module.js.map +1 -0
- package/dist/modules/debug/debug.service.js +126 -0
- package/dist/modules/debug/debug.service.js.map +1 -0
- package/dist/modules/health/health.controller.js +69 -0
- package/dist/modules/health/health.controller.js.map +1 -0
- package/dist/modules/health/health.module.js +23 -0
- package/dist/modules/health/health.module.js.map +1 -0
- package/dist/modules/mcp/dto/create-mcp-server.dto.js +74 -0
- package/dist/modules/mcp/dto/create-mcp-server.dto.js.map +1 -0
- package/dist/modules/mcp/dto/update-mcp-server.dto.js +74 -0
- package/dist/modules/mcp/dto/update-mcp-server.dto.js.map +1 -0
- package/dist/modules/mcp/mcp-discovery.service.js +176 -0
- package/dist/modules/mcp/mcp-discovery.service.js.map +1 -0
- package/dist/modules/mcp/mcp-registry.js +67 -0
- package/dist/modules/mcp/mcp-registry.js.map +1 -0
- package/dist/modules/mcp/mcp-seed.service.js +122 -0
- package/dist/modules/mcp/mcp-seed.service.js.map +1 -0
- package/dist/modules/mcp/mcp.controller.js +152 -0
- package/dist/modules/mcp/mcp.controller.js.map +1 -0
- package/dist/modules/mcp/mcp.module.js +70 -0
- package/dist/modules/mcp/mcp.module.js.map +1 -0
- package/dist/modules/mcp/mcp.service.js +401 -0
- package/dist/modules/mcp/mcp.service.js.map +1 -0
- package/dist/modules/oauth/oauth.controller.js +116 -0
- package/dist/modules/oauth/oauth.controller.js.map +1 -0
- package/dist/modules/oauth/oauth.module.js +31 -0
- package/dist/modules/oauth/oauth.module.js.map +1 -0
- package/dist/modules/oauth/oauth.service.js +183 -0
- package/dist/modules/oauth/oauth.service.js.map +1 -0
- package/dist/modules/profiles/profiles.controller.js +241 -0
- package/dist/modules/profiles/profiles.controller.js.map +1 -0
- package/dist/modules/profiles/profiles.module.js +34 -0
- package/dist/modules/profiles/profiles.module.js.map +1 -0
- package/dist/modules/profiles/profiles.service.js +390 -0
- package/dist/modules/profiles/profiles.service.js.map +1 -0
- package/dist/modules/proxy/proxy.controller.js +98 -0
- package/dist/modules/proxy/proxy.controller.js.map +1 -0
- package/dist/modules/proxy/proxy.module.js +36 -0
- package/dist/modules/proxy/proxy.module.js.map +1 -0
- package/dist/modules/proxy/proxy.service.js +439 -0
- package/dist/modules/proxy/proxy.service.js.map +1 -0
- package/docker-entrypoint.sh +10 -0
- package/nest-cli.json +10 -0
- package/package.json +51 -0
- package/src/app.module.ts +59 -0
- package/src/common/decorators/request-id.decorator.ts +16 -0
- package/src/common/filters/all-exceptions.filter.ts +77 -0
- package/src/common/interceptors/logging.interceptor.ts +45 -0
- package/src/common/pipes/validation.pipe.ts +31 -0
- package/src/config/app.config.ts +15 -0
- package/src/config/database.config.ts +34 -0
- package/src/main.ts +66 -0
- package/src/modules/database/database.module.ts +15 -0
- package/src/modules/database/prisma.service.ts +110 -0
- package/src/modules/debug/debug.controller.ts +53 -0
- package/src/modules/debug/debug.module.ts +16 -0
- package/src/modules/debug/debug.service.ts +143 -0
- package/src/modules/health/health.controller.ts +48 -0
- package/src/modules/health/health.module.ts +13 -0
- package/src/modules/mcp/dto/create-mcp-server.dto.ts +53 -0
- package/src/modules/mcp/dto/update-mcp-server.dto.ts +53 -0
- package/src/modules/mcp/mcp-discovery.service.ts +205 -0
- package/src/modules/mcp/mcp-registry.ts +73 -0
- package/src/modules/mcp/mcp-seed.service.ts +125 -0
- package/src/modules/mcp/mcp.controller.ts +98 -0
- package/src/modules/mcp/mcp.module.ts +48 -0
- package/src/modules/mcp/mcp.service.ts +427 -0
- package/src/modules/oauth/oauth.controller.ts +89 -0
- package/src/modules/oauth/oauth.module.ts +17 -0
- package/src/modules/oauth/oauth.service.ts +212 -0
- package/src/modules/profiles/profiles.controller.ts +177 -0
- package/src/modules/profiles/profiles.module.ts +18 -0
- package/src/modules/profiles/profiles.service.ts +421 -0
- package/src/modules/proxy/proxy.controller.ts +61 -0
- package/src/modules/proxy/proxy.module.ts +19 -0
- package/src/modules/proxy/proxy.service.ts +595 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Registry
|
|
3
|
+
*
|
|
4
|
+
* In-memory registry of discovered MCP packages.
|
|
5
|
+
*/ function _ts_decorate(decorators, target, key, desc) {
|
|
6
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
7
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
8
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
+
}
|
|
11
|
+
import { Injectable } from "@nestjs/common";
|
|
12
|
+
export class McpRegistry {
|
|
13
|
+
/**
|
|
14
|
+
* Register a discovered MCP package
|
|
15
|
+
*/ register(pkg) {
|
|
16
|
+
this.packages.set(pkg.package.metadata.id, pkg);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get a package by its ID
|
|
20
|
+
*/ get(id) {
|
|
21
|
+
return this.packages.get(id)?.package;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get full discovered package info by ID
|
|
25
|
+
*/ getDiscovered(id) {
|
|
26
|
+
return this.packages.get(id);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get all registered packages
|
|
30
|
+
*/ getAll() {
|
|
31
|
+
return Array.from(this.packages.values()).map((p)=>p.package);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all discovered packages
|
|
35
|
+
*/ getAllDiscovered() {
|
|
36
|
+
return Array.from(this.packages.values());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a package is registered
|
|
40
|
+
*/ has(id) {
|
|
41
|
+
return this.packages.has(id);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get package metadata for UI
|
|
45
|
+
*/ getAllMetadata() {
|
|
46
|
+
return this.getAll().map((pkg)=>({
|
|
47
|
+
id: pkg.metadata.id,
|
|
48
|
+
name: pkg.metadata.name,
|
|
49
|
+
description: pkg.metadata.description,
|
|
50
|
+
version: pkg.metadata.version,
|
|
51
|
+
requiresApiKey: pkg.metadata.requiresApiKey,
|
|
52
|
+
apiKeyHint: pkg.metadata.apiKeyHint,
|
|
53
|
+
requiresOAuth: pkg.metadata.requiresOAuth,
|
|
54
|
+
tags: pkg.metadata.tags,
|
|
55
|
+
icon: pkg.metadata.icon,
|
|
56
|
+
docsUrl: pkg.metadata.docsUrl
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
constructor(){
|
|
60
|
+
this.packages = new Map();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
McpRegistry = _ts_decorate([
|
|
64
|
+
Injectable()
|
|
65
|
+
], McpRegistry);
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=mcp-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/mcp/mcp-registry.ts"],"sourcesContent":["/**\n * MCP Registry\n *\n * In-memory registry of discovered MCP packages.\n */\n\nimport type { DiscoveredMcpPackage, McpPackage } from '@dxheroes/local-mcp-core';\nimport { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class McpRegistry {\n private readonly packages = new Map<string, DiscoveredMcpPackage>();\n\n /**\n * Register a discovered MCP package\n */\n register(pkg: DiscoveredMcpPackage): void {\n this.packages.set(pkg.package.metadata.id, pkg);\n }\n\n /**\n * Get a package by its ID\n */\n get(id: string): McpPackage | undefined {\n return this.packages.get(id)?.package;\n }\n\n /**\n * Get full discovered package info by ID\n */\n getDiscovered(id: string): DiscoveredMcpPackage | undefined {\n return this.packages.get(id);\n }\n\n /**\n * Get all registered packages\n */\n getAll(): McpPackage[] {\n return Array.from(this.packages.values()).map((p) => p.package);\n }\n\n /**\n * Get all discovered packages\n */\n getAllDiscovered(): DiscoveredMcpPackage[] {\n return Array.from(this.packages.values());\n }\n\n /**\n * Check if a package is registered\n */\n has(id: string): boolean {\n return this.packages.has(id);\n }\n\n /**\n * Get package metadata for UI\n */\n getAllMetadata() {\n return this.getAll().map((pkg) => ({\n id: pkg.metadata.id,\n name: pkg.metadata.name,\n description: pkg.metadata.description,\n version: pkg.metadata.version,\n requiresApiKey: pkg.metadata.requiresApiKey,\n apiKeyHint: pkg.metadata.apiKeyHint,\n requiresOAuth: pkg.metadata.requiresOAuth,\n tags: pkg.metadata.tags,\n icon: pkg.metadata.icon,\n docsUrl: pkg.metadata.docsUrl,\n }));\n }\n}\n"],"names":["Injectable","McpRegistry","register","pkg","packages","set","package","metadata","id","get","getDiscovered","getAll","Array","from","values","map","p","getAllDiscovered","has","getAllMetadata","name","description","version","requiresApiKey","apiKeyHint","requiresOAuth","tags","icon","docsUrl","Map"],"mappings":"AAAA;;;;CAIC;;;;;;AAGD,SAASA,UAAU,QAAQ,iBAAiB;AAG5C,OAAO,MAAMC;IAGX;;GAEC,GACDC,SAASC,GAAyB,EAAQ;QACxC,IAAI,CAACC,QAAQ,CAACC,GAAG,CAACF,IAAIG,OAAO,CAACC,QAAQ,CAACC,EAAE,EAAEL;IAC7C;IAEA;;GAEC,GACDM,IAAID,EAAU,EAA0B;QACtC,OAAO,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACD,KAAKF;IAChC;IAEA;;GAEC,GACDI,cAAcF,EAAU,EAAoC;QAC1D,OAAO,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACD;IAC3B;IAEA;;GAEC,GACDG,SAAuB;QACrB,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACT,QAAQ,CAACU,MAAM,IAAIC,GAAG,CAAC,CAACC,IAAMA,EAAEV,OAAO;IAChE;IAEA;;GAEC,GACDW,mBAA2C;QACzC,OAAOL,MAAMC,IAAI,CAAC,IAAI,CAACT,QAAQ,CAACU,MAAM;IACxC;IAEA;;GAEC,GACDI,IAAIV,EAAU,EAAW;QACvB,OAAO,IAAI,CAACJ,QAAQ,CAACc,GAAG,CAACV;IAC3B;IAEA;;GAEC,GACDW,iBAAiB;QACf,OAAO,IAAI,CAACR,MAAM,GAAGI,GAAG,CAAC,CAACZ,MAAS,CAAA;gBACjCK,IAAIL,IAAII,QAAQ,CAACC,EAAE;gBACnBY,MAAMjB,IAAII,QAAQ,CAACa,IAAI;gBACvBC,aAAalB,IAAII,QAAQ,CAACc,WAAW;gBACrCC,SAASnB,IAAII,QAAQ,CAACe,OAAO;gBAC7BC,gBAAgBpB,IAAII,QAAQ,CAACgB,cAAc;gBAC3CC,YAAYrB,IAAII,QAAQ,CAACiB,UAAU;gBACnCC,eAAetB,IAAII,QAAQ,CAACkB,aAAa;gBACzCC,MAAMvB,IAAII,QAAQ,CAACmB,IAAI;gBACvBC,MAAMxB,IAAII,QAAQ,CAACoB,IAAI;gBACvBC,SAASzB,IAAII,QAAQ,CAACqB,OAAO;YAC/B,CAAA;IACF;;aA5DiBxB,WAAW,IAAIyB;;AA6DlC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
function _ts_metadata(k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* MCP Seed Service
|
|
12
|
+
*
|
|
13
|
+
* Seeds MCP server records from discovered packages.
|
|
14
|
+
*/ import { randomUUID } from "node:crypto";
|
|
15
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
16
|
+
import { PrismaService } from "../database/prisma.service.js";
|
|
17
|
+
export class McpSeedService {
|
|
18
|
+
constructor(prisma){
|
|
19
|
+
this.prisma = prisma;
|
|
20
|
+
this.logger = new Logger(McpSeedService.name);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run seed data for all discovered MCP packages
|
|
24
|
+
*
|
|
25
|
+
* Seeding is idempotent - only creates records that don't exist
|
|
26
|
+
*/ async runSeeds(packages) {
|
|
27
|
+
this.logger.log(`Running seeds for ${packages.length} MCP packages`);
|
|
28
|
+
// Ensure default profile exists
|
|
29
|
+
await this.ensureDefaultProfile();
|
|
30
|
+
for (const { package: pkg, packageName } of packages){
|
|
31
|
+
try {
|
|
32
|
+
await this.seedPackage(pkg, packageName);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
this.logger.error(`Failed to seed ${packageName}: ${error}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
this.logger.log('MCP seeding complete');
|
|
38
|
+
}
|
|
39
|
+
async ensureDefaultProfile() {
|
|
40
|
+
const defaultProfile = await this.prisma.profile.findUnique({
|
|
41
|
+
where: {
|
|
42
|
+
name: 'default'
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (!defaultProfile) {
|
|
46
|
+
await this.prisma.profile.create({
|
|
47
|
+
data: {
|
|
48
|
+
id: randomUUID(),
|
|
49
|
+
name: 'default',
|
|
50
|
+
description: 'Default MCP profile'
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
this.logger.log('Created default profile');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async seedPackage(pkg, _packageName) {
|
|
57
|
+
const { metadata, seed } = pkg;
|
|
58
|
+
// Check if MCP server already exists (by builtinId in config)
|
|
59
|
+
const existingServer = await this.findServerByBuiltinId(metadata.id);
|
|
60
|
+
if (existingServer) {
|
|
61
|
+
this.logger.debug(`MCP server ${metadata.id} already exists, skipping seed`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Create the MCP server record
|
|
65
|
+
const serverId = randomUUID();
|
|
66
|
+
await this.prisma.mcpServer.create({
|
|
67
|
+
data: {
|
|
68
|
+
id: serverId,
|
|
69
|
+
name: metadata.name,
|
|
70
|
+
type: 'builtin',
|
|
71
|
+
config: JSON.stringify({
|
|
72
|
+
builtinId: metadata.id
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
this.logger.log(`Created MCP server: ${metadata.name} (${metadata.id})`);
|
|
77
|
+
// Link to profile if seed config specifies
|
|
78
|
+
if (seed?.defaultProfile) {
|
|
79
|
+
const profile = await this.prisma.profile.findUnique({
|
|
80
|
+
where: {
|
|
81
|
+
name: seed.defaultProfile
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
if (profile) {
|
|
85
|
+
await this.prisma.profileMcpServer.create({
|
|
86
|
+
data: {
|
|
87
|
+
id: randomUUID(),
|
|
88
|
+
profileId: profile.id,
|
|
89
|
+
mcpServerId: serverId,
|
|
90
|
+
order: seed.defaultOrder ?? 0,
|
|
91
|
+
isActive: seed.defaultActive ?? true
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
this.logger.log(`Linked ${metadata.name} to profile: ${seed.defaultProfile}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async findServerByBuiltinId(builtinId) {
|
|
99
|
+
const servers = await this.prisma.mcpServer.findMany({
|
|
100
|
+
where: {
|
|
101
|
+
type: 'builtin'
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return servers.some((s)=>{
|
|
105
|
+
try {
|
|
106
|
+
const config = JSON.parse(s.config);
|
|
107
|
+
return config.builtinId === builtinId;
|
|
108
|
+
} catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
McpSeedService = _ts_decorate([
|
|
115
|
+
Injectable(),
|
|
116
|
+
_ts_metadata("design:type", Function),
|
|
117
|
+
_ts_metadata("design:paramtypes", [
|
|
118
|
+
typeof PrismaService === "undefined" ? Object : PrismaService
|
|
119
|
+
])
|
|
120
|
+
], McpSeedService);
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=mcp-seed.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/mcp/mcp-seed.service.ts"],"sourcesContent":["/**\n * MCP Seed Service\n *\n * Seeds MCP server records from discovered packages.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { DiscoveredMcpPackage } from '@dxheroes/local-mcp-core';\nimport { Injectable, Logger } from '@nestjs/common';\nimport { PrismaService } from '../database/prisma.service.js';\n\ninterface McpServerConfig {\n builtinId?: string;\n}\n\n@Injectable()\nexport class McpSeedService {\n private readonly logger = new Logger(McpSeedService.name);\n\n constructor(private readonly prisma: PrismaService) {}\n\n /**\n * Run seed data for all discovered MCP packages\n *\n * Seeding is idempotent - only creates records that don't exist\n */\n async runSeeds(packages: DiscoveredMcpPackage[]): Promise<void> {\n this.logger.log(`Running seeds for ${packages.length} MCP packages`);\n\n // Ensure default profile exists\n await this.ensureDefaultProfile();\n\n for (const { package: pkg, packageName } of packages) {\n try {\n await this.seedPackage(pkg, packageName);\n } catch (error) {\n this.logger.error(`Failed to seed ${packageName}: ${error}`);\n }\n }\n\n this.logger.log('MCP seeding complete');\n }\n\n private async ensureDefaultProfile(): Promise<void> {\n const defaultProfile = await this.prisma.profile.findUnique({\n where: { name: 'default' },\n });\n\n if (!defaultProfile) {\n await this.prisma.profile.create({\n data: {\n id: randomUUID(),\n name: 'default',\n description: 'Default MCP profile',\n },\n });\n this.logger.log('Created default profile');\n }\n }\n\n private async seedPackage(\n pkg: DiscoveredMcpPackage['package'],\n _packageName: string\n ): Promise<void> {\n const { metadata, seed } = pkg;\n\n // Check if MCP server already exists (by builtinId in config)\n const existingServer = await this.findServerByBuiltinId(metadata.id);\n\n if (existingServer) {\n this.logger.debug(`MCP server ${metadata.id} already exists, skipping seed`);\n return;\n }\n\n // Create the MCP server record\n const serverId = randomUUID();\n\n await this.prisma.mcpServer.create({\n data: {\n id: serverId,\n name: metadata.name,\n type: 'builtin',\n config: JSON.stringify({ builtinId: metadata.id }),\n },\n });\n\n this.logger.log(`Created MCP server: ${metadata.name} (${metadata.id})`);\n\n // Link to profile if seed config specifies\n if (seed?.defaultProfile) {\n const profile = await this.prisma.profile.findUnique({\n where: { name: seed.defaultProfile },\n });\n\n if (profile) {\n await this.prisma.profileMcpServer.create({\n data: {\n id: randomUUID(),\n profileId: profile.id,\n mcpServerId: serverId,\n order: seed.defaultOrder ?? 0,\n isActive: seed.defaultActive ?? true,\n },\n });\n\n this.logger.log(`Linked ${metadata.name} to profile: ${seed.defaultProfile}`);\n }\n }\n }\n\n private async findServerByBuiltinId(builtinId: string): Promise<boolean> {\n const servers = await this.prisma.mcpServer.findMany({\n where: { type: 'builtin' },\n });\n\n return servers.some((s) => {\n try {\n const config = JSON.parse(s.config as string) as McpServerConfig;\n return config.builtinId === builtinId;\n } catch {\n return false;\n }\n });\n }\n}\n"],"names":["randomUUID","Injectable","Logger","PrismaService","McpSeedService","prisma","logger","name","runSeeds","packages","log","length","ensureDefaultProfile","package","pkg","packageName","seedPackage","error","defaultProfile","profile","findUnique","where","create","data","id","description","_packageName","metadata","seed","existingServer","findServerByBuiltinId","debug","serverId","mcpServer","type","config","JSON","stringify","builtinId","profileMcpServer","profileId","mcpServerId","order","defaultOrder","isActive","defaultActive","servers","findMany","some","s","parse"],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
function _ts_metadata(k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
}
|
|
10
|
+
function _ts_param(paramIndex, decorator) {
|
|
11
|
+
return function(target, key) {
|
|
12
|
+
decorator(target, key, paramIndex);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* MCP Controller
|
|
17
|
+
*
|
|
18
|
+
* REST API endpoints for MCP server management.
|
|
19
|
+
*/ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put } from "@nestjs/common";
|
|
20
|
+
import { CreateMcpServerDto } from "./dto/create-mcp-server.dto.js";
|
|
21
|
+
import { UpdateMcpServerDto } from "./dto/update-mcp-server.dto.js";
|
|
22
|
+
import { McpService } from "./mcp.service.js";
|
|
23
|
+
import { McpRegistry } from "./mcp-registry.js";
|
|
24
|
+
export class McpController {
|
|
25
|
+
constructor(mcpService, registry){
|
|
26
|
+
this.mcpService = mcpService;
|
|
27
|
+
this.registry = registry;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get all available MCP packages (discovered)
|
|
31
|
+
*/ getAvailablePackages() {
|
|
32
|
+
const metadata = this.registry.getAllMetadata();
|
|
33
|
+
console.log('[McpController] getAllMetadata result:', metadata);
|
|
34
|
+
console.log('[McpController] registry has packages:', this.registry.getAll().length);
|
|
35
|
+
return metadata;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get all configured MCP servers
|
|
39
|
+
*/ async getAll() {
|
|
40
|
+
return this.mcpService.findAll();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get a specific MCP server
|
|
44
|
+
*/ async getOne(id) {
|
|
45
|
+
return this.mcpService.findById(id);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a new MCP server configuration
|
|
49
|
+
*/ async create(dto) {
|
|
50
|
+
return this.mcpService.create(dto);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Update an MCP server configuration
|
|
54
|
+
*/ async update(id, dto) {
|
|
55
|
+
return this.mcpService.update(id, dto);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Delete an MCP server configuration
|
|
59
|
+
*/ async delete(id) {
|
|
60
|
+
await this.mcpService.delete(id);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get tools from an MCP server
|
|
64
|
+
*/ async getTools(id) {
|
|
65
|
+
return this.mcpService.getTools(id);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get MCP server status
|
|
69
|
+
*/ async getStatus(id) {
|
|
70
|
+
return this.mcpService.getStatus(id);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
_ts_decorate([
|
|
74
|
+
Get('available'),
|
|
75
|
+
_ts_metadata("design:type", Function),
|
|
76
|
+
_ts_metadata("design:paramtypes", []),
|
|
77
|
+
_ts_metadata("design:returntype", void 0)
|
|
78
|
+
], McpController.prototype, "getAvailablePackages", null);
|
|
79
|
+
_ts_decorate([
|
|
80
|
+
Get(),
|
|
81
|
+
_ts_metadata("design:type", Function),
|
|
82
|
+
_ts_metadata("design:paramtypes", []),
|
|
83
|
+
_ts_metadata("design:returntype", Promise)
|
|
84
|
+
], McpController.prototype, "getAll", null);
|
|
85
|
+
_ts_decorate([
|
|
86
|
+
Get(':id'),
|
|
87
|
+
_ts_param(0, Param('id')),
|
|
88
|
+
_ts_metadata("design:type", Function),
|
|
89
|
+
_ts_metadata("design:paramtypes", [
|
|
90
|
+
String
|
|
91
|
+
]),
|
|
92
|
+
_ts_metadata("design:returntype", Promise)
|
|
93
|
+
], McpController.prototype, "getOne", null);
|
|
94
|
+
_ts_decorate([
|
|
95
|
+
Post(),
|
|
96
|
+
HttpCode(HttpStatus.CREATED),
|
|
97
|
+
_ts_param(0, Body()),
|
|
98
|
+
_ts_metadata("design:type", Function),
|
|
99
|
+
_ts_metadata("design:paramtypes", [
|
|
100
|
+
typeof CreateMcpServerDto === "undefined" ? Object : CreateMcpServerDto
|
|
101
|
+
]),
|
|
102
|
+
_ts_metadata("design:returntype", Promise)
|
|
103
|
+
], McpController.prototype, "create", null);
|
|
104
|
+
_ts_decorate([
|
|
105
|
+
Put(':id'),
|
|
106
|
+
_ts_param(0, Param('id')),
|
|
107
|
+
_ts_param(1, Body()),
|
|
108
|
+
_ts_metadata("design:type", Function),
|
|
109
|
+
_ts_metadata("design:paramtypes", [
|
|
110
|
+
String,
|
|
111
|
+
typeof UpdateMcpServerDto === "undefined" ? Object : UpdateMcpServerDto
|
|
112
|
+
]),
|
|
113
|
+
_ts_metadata("design:returntype", Promise)
|
|
114
|
+
], McpController.prototype, "update", null);
|
|
115
|
+
_ts_decorate([
|
|
116
|
+
Delete(':id'),
|
|
117
|
+
HttpCode(HttpStatus.NO_CONTENT),
|
|
118
|
+
_ts_param(0, Param('id')),
|
|
119
|
+
_ts_metadata("design:type", Function),
|
|
120
|
+
_ts_metadata("design:paramtypes", [
|
|
121
|
+
String
|
|
122
|
+
]),
|
|
123
|
+
_ts_metadata("design:returntype", Promise)
|
|
124
|
+
], McpController.prototype, "delete", null);
|
|
125
|
+
_ts_decorate([
|
|
126
|
+
Get(':id/tools'),
|
|
127
|
+
_ts_param(0, Param('id')),
|
|
128
|
+
_ts_metadata("design:type", Function),
|
|
129
|
+
_ts_metadata("design:paramtypes", [
|
|
130
|
+
String
|
|
131
|
+
]),
|
|
132
|
+
_ts_metadata("design:returntype", Promise)
|
|
133
|
+
], McpController.prototype, "getTools", null);
|
|
134
|
+
_ts_decorate([
|
|
135
|
+
Get(':id/status'),
|
|
136
|
+
_ts_param(0, Param('id')),
|
|
137
|
+
_ts_metadata("design:type", Function),
|
|
138
|
+
_ts_metadata("design:paramtypes", [
|
|
139
|
+
String
|
|
140
|
+
]),
|
|
141
|
+
_ts_metadata("design:returntype", Promise)
|
|
142
|
+
], McpController.prototype, "getStatus", null);
|
|
143
|
+
McpController = _ts_decorate([
|
|
144
|
+
Controller('mcp-servers'),
|
|
145
|
+
_ts_metadata("design:type", Function),
|
|
146
|
+
_ts_metadata("design:paramtypes", [
|
|
147
|
+
typeof McpService === "undefined" ? Object : McpService,
|
|
148
|
+
typeof McpRegistry === "undefined" ? Object : McpRegistry
|
|
149
|
+
])
|
|
150
|
+
], McpController);
|
|
151
|
+
|
|
152
|
+
//# sourceMappingURL=mcp.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/mcp/mcp.controller.ts"],"sourcesContent":["/**\n * MCP Controller\n *\n * REST API endpoints for MCP server management.\n */\n\nimport {\n Body,\n Controller,\n Delete,\n Get,\n HttpCode,\n HttpStatus,\n Param,\n Post,\n Put,\n} from '@nestjs/common';\nimport { CreateMcpServerDto } from './dto/create-mcp-server.dto.js';\nimport { UpdateMcpServerDto } from './dto/update-mcp-server.dto.js';\nimport { McpService } from './mcp.service.js';\nimport { McpRegistry } from './mcp-registry.js';\n\n@Controller('mcp-servers')\nexport class McpController {\n constructor(\n private readonly mcpService: McpService,\n private readonly registry: McpRegistry\n ) {}\n\n /**\n * Get all available MCP packages (discovered)\n */\n @Get('available')\n getAvailablePackages() {\n const metadata = this.registry.getAllMetadata();\n console.log('[McpController] getAllMetadata result:', metadata);\n console.log('[McpController] registry has packages:', this.registry.getAll().length);\n return metadata;\n }\n\n /**\n * Get all configured MCP servers\n */\n @Get()\n async getAll() {\n return this.mcpService.findAll();\n }\n\n /**\n * Get a specific MCP server\n */\n @Get(':id')\n async getOne(@Param('id') id: string) {\n return this.mcpService.findById(id);\n }\n\n /**\n * Create a new MCP server configuration\n */\n @Post()\n @HttpCode(HttpStatus.CREATED)\n async create(@Body() dto: CreateMcpServerDto) {\n return this.mcpService.create(dto);\n }\n\n /**\n * Update an MCP server configuration\n */\n @Put(':id')\n async update(@Param('id') id: string, @Body() dto: UpdateMcpServerDto) {\n return this.mcpService.update(id, dto);\n }\n\n /**\n * Delete an MCP server configuration\n */\n @Delete(':id')\n @HttpCode(HttpStatus.NO_CONTENT)\n async delete(@Param('id') id: string) {\n await this.mcpService.delete(id);\n }\n\n /**\n * Get tools from an MCP server\n */\n @Get(':id/tools')\n async getTools(@Param('id') id: string) {\n return this.mcpService.getTools(id);\n }\n\n /**\n * Get MCP server status\n */\n @Get(':id/status')\n async getStatus(@Param('id') id: string) {\n return this.mcpService.getStatus(id);\n }\n}\n"],"names":["Body","Controller","Delete","Get","HttpCode","HttpStatus","Param","Post","Put","CreateMcpServerDto","UpdateMcpServerDto","McpService","McpRegistry","McpController","mcpService","registry","getAvailablePackages","metadata","getAllMetadata","console","log","getAll","length","findAll","getOne","id","findById","create","dto","update","delete","getTools","getStatus","CREATED","NO_CONTENT"],"mappings":";;;;;;;;;;;;;;AAAA;;;;CAIC,GAED,SACEA,IAAI,EACJC,UAAU,EACVC,MAAM,EACNC,GAAG,EACHC,QAAQ,EACRC,UAAU,EACVC,KAAK,EACLC,IAAI,EACJC,GAAG,QACE,iBAAiB;AACxB,SAASC,kBAAkB,QAAQ,iCAAiC;AACpE,SAASC,kBAAkB,QAAQ,iCAAiC;AACpE,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,WAAW,QAAQ,oBAAoB;AAGhD,OAAO,MAAMC;IACX,YACE,AAAiBC,UAAsB,EACvC,AAAiBC,QAAqB,CACtC;aAFiBD,aAAAA;aACAC,WAAAA;IAChB;IAEH;;GAEC,GACD,AACAC,uBAAuB;QACrB,MAAMC,WAAW,IAAI,CAACF,QAAQ,CAACG,cAAc;QAC7CC,QAAQC,GAAG,CAAC,0CAA0CH;QACtDE,QAAQC,GAAG,CAAC,0CAA0C,IAAI,CAACL,QAAQ,CAACM,MAAM,GAAGC,MAAM;QACnF,OAAOL;IACT;IAEA;;GAEC,GACD,MACMI,SAAS;QACb,OAAO,IAAI,CAACP,UAAU,CAACS,OAAO;IAChC;IAEA;;GAEC,GACD,MACMC,OAAO,AAAaC,EAAU,EAAE;QACpC,OAAO,IAAI,CAACX,UAAU,CAACY,QAAQ,CAACD;IAClC;IAEA;;GAEC,GACD,MAEME,OAAO,AAAQC,GAAuB,EAAE;QAC5C,OAAO,IAAI,CAACd,UAAU,CAACa,MAAM,CAACC;IAChC;IAEA;;GAEC,GACD,MACMC,OAAO,AAAaJ,EAAU,EAAE,AAAQG,GAAuB,EAAE;QACrE,OAAO,IAAI,CAACd,UAAU,CAACe,MAAM,CAACJ,IAAIG;IACpC;IAEA;;GAEC,GACD,MAEME,OAAO,AAAaL,EAAU,EAAE;QACpC,MAAM,IAAI,CAACX,UAAU,CAACgB,MAAM,CAACL;IAC/B;IAEA;;GAEC,GACD,MACMM,SAAS,AAAaN,EAAU,EAAE;QACtC,OAAO,IAAI,CAACX,UAAU,CAACiB,QAAQ,CAACN;IAClC;IAEA;;GAEC,GACD,MACMO,UAAU,AAAaP,EAAU,EAAE;QACvC,OAAO,IAAI,CAACX,UAAU,CAACkB,SAAS,CAACP;IACnC;AACF;;;;;;;;;;;;;;;;;;;;;;;;wBArCuBQ;;;;;;;;;;;;;;;;;;;;;wBAiBAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
function _ts_metadata(k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* MCP Module
|
|
12
|
+
*
|
|
13
|
+
* Handles MCP server management, discovery, seeding, and registry.
|
|
14
|
+
*/ import { Logger, Module } from "@nestjs/common";
|
|
15
|
+
import { DebugModule } from "../debug/debug.module.js";
|
|
16
|
+
import { McpController } from "./mcp.controller.js";
|
|
17
|
+
import { McpService } from "./mcp.service.js";
|
|
18
|
+
import { McpDiscoveryService } from "./mcp-discovery.service.js";
|
|
19
|
+
import { McpRegistry } from "./mcp-registry.js";
|
|
20
|
+
import { McpSeedService } from "./mcp-seed.service.js";
|
|
21
|
+
export class McpModule {
|
|
22
|
+
constructor(discoveryService, seedService, registry){
|
|
23
|
+
this.discoveryService = discoveryService;
|
|
24
|
+
this.seedService = seedService;
|
|
25
|
+
this.registry = registry;
|
|
26
|
+
this.logger = new Logger(McpModule.name);
|
|
27
|
+
}
|
|
28
|
+
async onModuleInit() {
|
|
29
|
+
this.logger.log('Initializing MCP Module...');
|
|
30
|
+
// 1. Discover all MCP packages
|
|
31
|
+
const packages = await this.discoveryService.discoverPackages();
|
|
32
|
+
this.logger.log(`Discovered ${packages.length} MCP packages`);
|
|
33
|
+
// 2. Register them in the in-memory registry
|
|
34
|
+
for (const pkg of packages){
|
|
35
|
+
this.registry.register(pkg);
|
|
36
|
+
this.logger.log(`Registered: ${pkg.package.metadata.name} (${pkg.package.metadata.id})`);
|
|
37
|
+
}
|
|
38
|
+
// 3. Run seed data for all packages
|
|
39
|
+
await this.seedService.runSeeds(packages);
|
|
40
|
+
this.logger.log('MCP Module initialization complete');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
McpModule = _ts_decorate([
|
|
44
|
+
Module({
|
|
45
|
+
imports: [
|
|
46
|
+
DebugModule
|
|
47
|
+
],
|
|
48
|
+
controllers: [
|
|
49
|
+
McpController
|
|
50
|
+
],
|
|
51
|
+
providers: [
|
|
52
|
+
McpService,
|
|
53
|
+
McpDiscoveryService,
|
|
54
|
+
McpSeedService,
|
|
55
|
+
McpRegistry
|
|
56
|
+
],
|
|
57
|
+
exports: [
|
|
58
|
+
McpService,
|
|
59
|
+
McpRegistry
|
|
60
|
+
]
|
|
61
|
+
}),
|
|
62
|
+
_ts_metadata("design:type", Function),
|
|
63
|
+
_ts_metadata("design:paramtypes", [
|
|
64
|
+
typeof McpDiscoveryService === "undefined" ? Object : McpDiscoveryService,
|
|
65
|
+
typeof McpSeedService === "undefined" ? Object : McpSeedService,
|
|
66
|
+
typeof McpRegistry === "undefined" ? Object : McpRegistry
|
|
67
|
+
])
|
|
68
|
+
], McpModule);
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=mcp.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/mcp/mcp.module.ts"],"sourcesContent":["/**\n * MCP Module\n *\n * Handles MCP server management, discovery, seeding, and registry.\n */\n\nimport { Logger, Module, OnModuleInit } from '@nestjs/common';\nimport { DebugModule } from '../debug/debug.module.js';\nimport { McpController } from './mcp.controller.js';\nimport { McpService } from './mcp.service.js';\nimport { McpDiscoveryService } from './mcp-discovery.service.js';\nimport { McpRegistry } from './mcp-registry.js';\nimport { McpSeedService } from './mcp-seed.service.js';\n\n@Module({\n imports: [DebugModule],\n controllers: [McpController],\n providers: [McpService, McpDiscoveryService, McpSeedService, McpRegistry],\n exports: [McpService, McpRegistry],\n})\nexport class McpModule implements OnModuleInit {\n private readonly logger = new Logger(McpModule.name);\n\n constructor(\n private readonly discoveryService: McpDiscoveryService,\n private readonly seedService: McpSeedService,\n private readonly registry: McpRegistry\n ) {}\n\n async onModuleInit(): Promise<void> {\n this.logger.log('Initializing MCP Module...');\n\n // 1. Discover all MCP packages\n const packages = await this.discoveryService.discoverPackages();\n this.logger.log(`Discovered ${packages.length} MCP packages`);\n\n // 2. Register them in the in-memory registry\n for (const pkg of packages) {\n this.registry.register(pkg);\n this.logger.log(`Registered: ${pkg.package.metadata.name} (${pkg.package.metadata.id})`);\n }\n\n // 3. Run seed data for all packages\n await this.seedService.runSeeds(packages);\n\n this.logger.log('MCP Module initialization complete');\n }\n}\n"],"names":["Logger","Module","DebugModule","McpController","McpService","McpDiscoveryService","McpRegistry","McpSeedService","McpModule","discoveryService","seedService","registry","logger","name","onModuleInit","log","packages","discoverPackages","length","pkg","register","package","metadata","id","runSeeds","imports","controllers","providers","exports"],"mappings":";;;;;;;;;AAAA;;;;CAIC,GAED,SAASA,MAAM,EAAEC,MAAM,QAAsB,iBAAiB;AAC9D,SAASC,WAAW,QAAQ,2BAA2B;AACvD,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,mBAAmB,QAAQ,6BAA6B;AACjE,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,cAAc,QAAQ,wBAAwB;AAQvD,OAAO,MAAMC;IAGX,YACE,AAAiBC,gBAAqC,EACtD,AAAiBC,WAA2B,EAC5C,AAAiBC,QAAqB,CACtC;aAHiBF,mBAAAA;aACAC,cAAAA;aACAC,WAAAA;aALFC,SAAS,IAAIZ,OAAOQ,UAAUK,IAAI;IAMhD;IAEH,MAAMC,eAA8B;QAClC,IAAI,CAACF,MAAM,CAACG,GAAG,CAAC;QAEhB,+BAA+B;QAC/B,MAAMC,WAAW,MAAM,IAAI,CAACP,gBAAgB,CAACQ,gBAAgB;QAC7D,IAAI,CAACL,MAAM,CAACG,GAAG,CAAC,CAAC,WAAW,EAAEC,SAASE,MAAM,CAAC,aAAa,CAAC;QAE5D,6CAA6C;QAC7C,KAAK,MAAMC,OAAOH,SAAU;YAC1B,IAAI,CAACL,QAAQ,CAACS,QAAQ,CAACD;YACvB,IAAI,CAACP,MAAM,CAACG,GAAG,CAAC,CAAC,YAAY,EAAEI,IAAIE,OAAO,CAACC,QAAQ,CAACT,IAAI,CAAC,EAAE,EAAEM,IAAIE,OAAO,CAACC,QAAQ,CAACC,EAAE,CAAC,CAAC,CAAC;QACzF;QAEA,oCAAoC;QACpC,MAAM,IAAI,CAACb,WAAW,CAACc,QAAQ,CAACR;QAEhC,IAAI,CAACJ,MAAM,CAACG,GAAG,CAAC;IAClB;AACF;;;QAhCEU,SAAS;YAACvB;SAAY;QACtBwB,aAAa;YAACvB;SAAc;QAC5BwB,WAAW;YAACvB;YAAYC;YAAqBE;YAAgBD;SAAY;QACzEsB,SAAS;YAACxB;YAAYE;SAAY"}
|