@portel/photon 1.0.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.
- package/LICENSE +21 -0
- package/README.md +952 -0
- package/dist/base.d.ts +58 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +92 -0
- package/dist/base.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1441 -0
- package/dist/cli.js.map +1 -0
- package/dist/dependency-manager.d.ts +49 -0
- package/dist/dependency-manager.d.ts.map +1 -0
- package/dist/dependency-manager.js +165 -0
- package/dist/dependency-manager.js.map +1 -0
- package/dist/loader.d.ts +86 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +612 -0
- package/dist/loader.js.map +1 -0
- package/dist/marketplace-manager.d.ts +261 -0
- package/dist/marketplace-manager.d.ts.map +1 -0
- package/dist/marketplace-manager.js +767 -0
- package/dist/marketplace-manager.js.map +1 -0
- package/dist/path-resolver.d.ts +21 -0
- package/dist/path-resolver.d.ts.map +1 -0
- package/dist/path-resolver.js +71 -0
- package/dist/path-resolver.js.map +1 -0
- package/dist/photon-doc-extractor.d.ts +89 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -0
- package/dist/photon-doc-extractor.js +228 -0
- package/dist/photon-doc-extractor.js.map +1 -0
- package/dist/readme-syncer.d.ts +33 -0
- package/dist/readme-syncer.d.ts.map +1 -0
- package/dist/readme-syncer.js +93 -0
- package/dist/readme-syncer.js.map +1 -0
- package/dist/registry-manager.d.ts +76 -0
- package/dist/registry-manager.d.ts.map +1 -0
- package/dist/registry-manager.js +220 -0
- package/dist/registry-manager.js.map +1 -0
- package/dist/schema-extractor.d.ts +83 -0
- package/dist/schema-extractor.d.ts.map +1 -0
- package/dist/schema-extractor.js +396 -0
- package/dist/schema-extractor.js.map +1 -0
- package/dist/security-scanner.d.ts +52 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +172 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/server.d.ts +73 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +474 -0
- package/dist/server.js.map +1 -0
- package/dist/template-manager.d.ts +56 -0
- package/dist/template-manager.d.ts.map +1 -0
- package/dist/template-manager.js +509 -0
- package/dist/template-manager.js.map +1 -0
- package/dist/test-client.d.ts +52 -0
- package/dist/test-client.d.ts.map +1 -0
- package/dist/test-client.js +168 -0
- package/dist/test-client.js.map +1 -0
- package/dist/test-marketplace-sources.d.ts +5 -0
- package/dist/test-marketplace-sources.d.ts.map +1 -0
- package/dist/test-marketplace-sources.js +53 -0
- package/dist/test-marketplace-sources.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/version-checker.d.ts +48 -0
- package/dist/version-checker.d.ts.map +1 -0
- package/dist/version-checker.js +128 -0
- package/dist/version-checker.js.map +1 -0
- package/dist/watcher.d.ts +26 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +72 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +79 -0
- package/templates/photon.template.ts +55 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts JSON schemas from TypeScript method signatures and JSDoc comments
|
|
5
|
+
* Also extracts constructor parameters for config injection
|
|
6
|
+
* Supports Templates (@Template) and Static resources (@Static)
|
|
7
|
+
*
|
|
8
|
+
* Now uses TypeScript's compiler API for robust type parsing
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs/promises';
|
|
11
|
+
import * as ts from 'typescript';
|
|
12
|
+
/**
|
|
13
|
+
* Extract schemas from a Photon MCP class file
|
|
14
|
+
*/
|
|
15
|
+
export class SchemaExtractor {
|
|
16
|
+
/**
|
|
17
|
+
* Extract method schemas from source code file
|
|
18
|
+
*/
|
|
19
|
+
async extractFromFile(filePath) {
|
|
20
|
+
try {
|
|
21
|
+
const source = await fs.readFile(filePath, 'utf-8');
|
|
22
|
+
return this.extractFromSource(source);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error(`Failed to extract schemas from ${filePath}: ${error.message}`);
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract all metadata (tools, templates, statics) from source code
|
|
31
|
+
*/
|
|
32
|
+
extractAllFromSource(source) {
|
|
33
|
+
const tools = [];
|
|
34
|
+
const templates = [];
|
|
35
|
+
const statics = [];
|
|
36
|
+
try {
|
|
37
|
+
// If source doesn't contain a class declaration, wrap it in one
|
|
38
|
+
let sourceToParse = source;
|
|
39
|
+
if (!source.includes('class ')) {
|
|
40
|
+
sourceToParse = `export default class Temp {\n${source}\n}`;
|
|
41
|
+
}
|
|
42
|
+
// Parse source file into AST
|
|
43
|
+
const sourceFile = ts.createSourceFile('temp.ts', sourceToParse, ts.ScriptTarget.Latest, true);
|
|
44
|
+
// Helper to process a method declaration
|
|
45
|
+
const processMethod = (member) => {
|
|
46
|
+
const methodName = member.name.getText(sourceFile);
|
|
47
|
+
const jsdoc = this.getJSDocComment(member, sourceFile);
|
|
48
|
+
// Extract parameter type information
|
|
49
|
+
const paramsType = this.getFirstParameterType(member, sourceFile);
|
|
50
|
+
if (!paramsType) {
|
|
51
|
+
return; // Skip methods without proper params
|
|
52
|
+
}
|
|
53
|
+
// Build schema from TypeScript type
|
|
54
|
+
const { properties, required } = this.buildSchemaFromType(paramsType, sourceFile);
|
|
55
|
+
// Extract descriptions from JSDoc
|
|
56
|
+
const paramDocs = this.extractParamDocs(jsdoc);
|
|
57
|
+
// Merge descriptions into properties
|
|
58
|
+
Object.keys(properties).forEach(key => {
|
|
59
|
+
if (paramDocs.has(key)) {
|
|
60
|
+
properties[key].description = paramDocs.get(key);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const description = this.extractDescription(jsdoc);
|
|
64
|
+
const inputSchema = {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties,
|
|
67
|
+
...(required.length > 0 ? { required } : {}),
|
|
68
|
+
};
|
|
69
|
+
// Check if this is a Template
|
|
70
|
+
if (this.hasTemplateTag(jsdoc)) {
|
|
71
|
+
templates.push({
|
|
72
|
+
name: methodName,
|
|
73
|
+
description,
|
|
74
|
+
inputSchema,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Check if this is a Static resource
|
|
78
|
+
else if (this.hasStaticTag(jsdoc)) {
|
|
79
|
+
const uri = this.extractStaticURI(jsdoc) || `static://${methodName}`;
|
|
80
|
+
const mimeType = this.extractMimeType(jsdoc);
|
|
81
|
+
statics.push({
|
|
82
|
+
name: methodName,
|
|
83
|
+
uri,
|
|
84
|
+
description,
|
|
85
|
+
mimeType,
|
|
86
|
+
inputSchema,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Otherwise, it's a regular tool
|
|
90
|
+
else {
|
|
91
|
+
tools.push({
|
|
92
|
+
name: methodName,
|
|
93
|
+
description,
|
|
94
|
+
inputSchema,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// Visit all nodes in the AST
|
|
99
|
+
const visit = (node) => {
|
|
100
|
+
// Look for class declarations
|
|
101
|
+
if (ts.isClassDeclaration(node)) {
|
|
102
|
+
node.members.forEach((member) => {
|
|
103
|
+
// Look for async methods
|
|
104
|
+
if (ts.isMethodDeclaration(member) &&
|
|
105
|
+
member.modifiers?.some(m => m.kind === ts.SyntaxKind.AsyncKeyword)) {
|
|
106
|
+
processMethod(member);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
ts.forEachChild(node, visit);
|
|
111
|
+
};
|
|
112
|
+
visit(sourceFile);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error('Failed to parse TypeScript source:', error.message);
|
|
116
|
+
}
|
|
117
|
+
return { tools, templates, statics };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Extract schemas from source code string (backward compatibility)
|
|
121
|
+
*/
|
|
122
|
+
extractFromSource(source) {
|
|
123
|
+
return this.extractAllFromSource(source).tools;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get JSDoc comment for a node
|
|
127
|
+
*/
|
|
128
|
+
getJSDocComment(node, sourceFile) {
|
|
129
|
+
// Use TypeScript's JSDoc extraction
|
|
130
|
+
const jsDocs = node.jsDoc;
|
|
131
|
+
if (jsDocs && jsDocs.length > 0) {
|
|
132
|
+
const jsDoc = jsDocs[0];
|
|
133
|
+
const comment = jsDoc.comment;
|
|
134
|
+
// Get full JSDoc text including tags
|
|
135
|
+
const fullText = sourceFile.getFullText();
|
|
136
|
+
const start = jsDoc.pos;
|
|
137
|
+
const end = jsDoc.end;
|
|
138
|
+
const jsDocText = fullText.substring(start, end);
|
|
139
|
+
// Extract content between /** and */
|
|
140
|
+
const match = jsDocText.match(/\/\*\*([\s\S]*?)\*\//);
|
|
141
|
+
return match ? match[1] : '';
|
|
142
|
+
}
|
|
143
|
+
return '';
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the first parameter's type node
|
|
147
|
+
*/
|
|
148
|
+
getFirstParameterType(method, sourceFile) {
|
|
149
|
+
if (method.parameters.length === 0) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const firstParam = method.parameters[0];
|
|
153
|
+
return firstParam.type;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Build JSON schema from TypeScript type node
|
|
157
|
+
*/
|
|
158
|
+
buildSchemaFromType(typeNode, sourceFile) {
|
|
159
|
+
const properties = {};
|
|
160
|
+
const required = [];
|
|
161
|
+
// Handle type literal (object type)
|
|
162
|
+
if (ts.isTypeLiteralNode(typeNode)) {
|
|
163
|
+
typeNode.members.forEach((member) => {
|
|
164
|
+
if (ts.isPropertySignature(member) && member.name) {
|
|
165
|
+
const propName = member.name.getText(sourceFile);
|
|
166
|
+
const isOptional = member.questionToken !== undefined;
|
|
167
|
+
if (!isOptional) {
|
|
168
|
+
required.push(propName);
|
|
169
|
+
}
|
|
170
|
+
if (member.type) {
|
|
171
|
+
properties[propName] = this.typeNodeToSchema(member.type, sourceFile);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
properties[propName] = { type: 'object' };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return { properties, required };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Convert TypeScript type node to JSON schema
|
|
183
|
+
*/
|
|
184
|
+
typeNodeToSchema(typeNode, sourceFile) {
|
|
185
|
+
const schema = {};
|
|
186
|
+
// Handle union types
|
|
187
|
+
if (ts.isUnionTypeNode(typeNode)) {
|
|
188
|
+
schema.anyOf = typeNode.types.map(t => this.typeNodeToSchema(t, sourceFile));
|
|
189
|
+
return schema;
|
|
190
|
+
}
|
|
191
|
+
// Handle intersection types
|
|
192
|
+
if (ts.isIntersectionTypeNode(typeNode)) {
|
|
193
|
+
schema.allOf = typeNode.types.map(t => this.typeNodeToSchema(t, sourceFile));
|
|
194
|
+
return schema;
|
|
195
|
+
}
|
|
196
|
+
// Handle array types
|
|
197
|
+
if (ts.isArrayTypeNode(typeNode)) {
|
|
198
|
+
schema.type = 'array';
|
|
199
|
+
schema.items = this.typeNodeToSchema(typeNode.elementType, sourceFile);
|
|
200
|
+
return schema;
|
|
201
|
+
}
|
|
202
|
+
// Handle type reference (e.g., Array<string>)
|
|
203
|
+
if (ts.isTypeReferenceNode(typeNode)) {
|
|
204
|
+
const typeName = typeNode.typeName.getText(sourceFile);
|
|
205
|
+
if (typeName === 'Array' && typeNode.typeArguments && typeNode.typeArguments.length > 0) {
|
|
206
|
+
schema.type = 'array';
|
|
207
|
+
schema.items = this.typeNodeToSchema(typeNode.typeArguments[0], sourceFile);
|
|
208
|
+
return schema;
|
|
209
|
+
}
|
|
210
|
+
// For other type references, default to object
|
|
211
|
+
schema.type = 'object';
|
|
212
|
+
return schema;
|
|
213
|
+
}
|
|
214
|
+
// Handle literal types
|
|
215
|
+
if (ts.isLiteralTypeNode(typeNode)) {
|
|
216
|
+
const literal = typeNode.literal;
|
|
217
|
+
if (ts.isStringLiteral(literal)) {
|
|
218
|
+
schema.type = 'string';
|
|
219
|
+
schema.enum = [literal.text];
|
|
220
|
+
return schema;
|
|
221
|
+
}
|
|
222
|
+
if (ts.isNumericLiteral(literal)) {
|
|
223
|
+
schema.type = 'number';
|
|
224
|
+
schema.enum = [parseFloat(literal.text)];
|
|
225
|
+
return schema;
|
|
226
|
+
}
|
|
227
|
+
if (literal.kind === ts.SyntaxKind.TrueKeyword || literal.kind === ts.SyntaxKind.FalseKeyword) {
|
|
228
|
+
schema.type = 'boolean';
|
|
229
|
+
return schema;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Handle tuple types
|
|
233
|
+
if (ts.isTupleTypeNode(typeNode)) {
|
|
234
|
+
schema.type = 'array';
|
|
235
|
+
schema.items = typeNode.elements.map(e => this.typeNodeToSchema(e, sourceFile));
|
|
236
|
+
return schema;
|
|
237
|
+
}
|
|
238
|
+
// Handle type literal (nested object)
|
|
239
|
+
if (ts.isTypeLiteralNode(typeNode)) {
|
|
240
|
+
schema.type = 'object';
|
|
241
|
+
const { properties, required } = this.buildSchemaFromType(typeNode, sourceFile);
|
|
242
|
+
schema.properties = properties;
|
|
243
|
+
if (required.length > 0) {
|
|
244
|
+
schema.required = required;
|
|
245
|
+
}
|
|
246
|
+
return schema;
|
|
247
|
+
}
|
|
248
|
+
// Handle keyword types (string, number, boolean, etc.)
|
|
249
|
+
const typeText = typeNode.getText(sourceFile);
|
|
250
|
+
switch (typeText) {
|
|
251
|
+
case 'string':
|
|
252
|
+
schema.type = 'string';
|
|
253
|
+
break;
|
|
254
|
+
case 'number':
|
|
255
|
+
schema.type = 'number';
|
|
256
|
+
break;
|
|
257
|
+
case 'boolean':
|
|
258
|
+
schema.type = 'boolean';
|
|
259
|
+
break;
|
|
260
|
+
case 'any':
|
|
261
|
+
case 'unknown':
|
|
262
|
+
// No type restriction
|
|
263
|
+
break;
|
|
264
|
+
default:
|
|
265
|
+
// Default to object for complex types
|
|
266
|
+
schema.type = 'object';
|
|
267
|
+
}
|
|
268
|
+
return schema;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extract constructor parameters for config injection
|
|
272
|
+
*/
|
|
273
|
+
extractConstructorParams(source) {
|
|
274
|
+
const params = [];
|
|
275
|
+
try {
|
|
276
|
+
const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
|
|
277
|
+
const visit = (node) => {
|
|
278
|
+
if (ts.isClassDeclaration(node)) {
|
|
279
|
+
node.members.forEach((member) => {
|
|
280
|
+
if (ts.isConstructorDeclaration(member)) {
|
|
281
|
+
member.parameters.forEach((param) => {
|
|
282
|
+
if (param.name && ts.isIdentifier(param.name)) {
|
|
283
|
+
const name = param.name.getText(sourceFile);
|
|
284
|
+
const type = param.type ? param.type.getText(sourceFile) : 'any';
|
|
285
|
+
const isOptional = param.questionToken !== undefined || param.initializer !== undefined;
|
|
286
|
+
const hasDefault = param.initializer !== undefined;
|
|
287
|
+
let defaultValue = undefined;
|
|
288
|
+
if (param.initializer) {
|
|
289
|
+
defaultValue = this.extractDefaultValue(param.initializer, sourceFile);
|
|
290
|
+
}
|
|
291
|
+
params.push({
|
|
292
|
+
name,
|
|
293
|
+
type,
|
|
294
|
+
isOptional,
|
|
295
|
+
hasDefault,
|
|
296
|
+
defaultValue,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
ts.forEachChild(node, visit);
|
|
304
|
+
};
|
|
305
|
+
visit(sourceFile);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.error('Failed to extract constructor params:', error.message);
|
|
309
|
+
}
|
|
310
|
+
return params;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Extract default value from initializer
|
|
314
|
+
*/
|
|
315
|
+
extractDefaultValue(initializer, sourceFile) {
|
|
316
|
+
// String literals
|
|
317
|
+
if (ts.isStringLiteral(initializer)) {
|
|
318
|
+
return initializer.text;
|
|
319
|
+
}
|
|
320
|
+
// Numeric literals
|
|
321
|
+
if (ts.isNumericLiteral(initializer)) {
|
|
322
|
+
return parseFloat(initializer.text);
|
|
323
|
+
}
|
|
324
|
+
// Boolean literals
|
|
325
|
+
if (initializer.kind === ts.SyntaxKind.TrueKeyword) {
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
if (initializer.kind === ts.SyntaxKind.FalseKeyword) {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
// For complex expressions (function calls, etc.), return as string
|
|
332
|
+
return initializer.getText(sourceFile);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Extract main description from JSDoc comment
|
|
336
|
+
*/
|
|
337
|
+
extractDescription(jsdocContent) {
|
|
338
|
+
// Split by @param to get only the description part
|
|
339
|
+
const beforeParams = jsdocContent.split(/@param/)[0];
|
|
340
|
+
// Remove leading * from each line and trim
|
|
341
|
+
const lines = beforeParams
|
|
342
|
+
.split('\n')
|
|
343
|
+
.map((line) => line.trim().replace(/^\*\s?/, ''))
|
|
344
|
+
.filter((line) => line && !line.startsWith('@')); // Exclude @tags and empty lines
|
|
345
|
+
// Take only the last meaningful line (the actual method description)
|
|
346
|
+
// This filters out file headers
|
|
347
|
+
const meaningfulLines = lines.filter(line => line.length > 5); // Filter out short lines
|
|
348
|
+
const description = meaningfulLines.length > 0
|
|
349
|
+
? meaningfulLines[meaningfulLines.length - 1]
|
|
350
|
+
: lines.join(' ');
|
|
351
|
+
// Clean up multiple spaces
|
|
352
|
+
return description.replace(/\s+/g, ' ').trim() || 'No description';
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Extract parameter descriptions from JSDoc @param tags
|
|
356
|
+
*/
|
|
357
|
+
extractParamDocs(jsdocContent) {
|
|
358
|
+
const paramDocs = new Map();
|
|
359
|
+
const paramRegex = /@param\s+(\w+)\s+(.+)/g;
|
|
360
|
+
let match;
|
|
361
|
+
while ((match = paramRegex.exec(jsdocContent)) !== null) {
|
|
362
|
+
const [, paramName, description] = match;
|
|
363
|
+
paramDocs.set(paramName, description.trim());
|
|
364
|
+
}
|
|
365
|
+
return paramDocs;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Check if JSDoc contains @Template tag
|
|
369
|
+
*/
|
|
370
|
+
hasTemplateTag(jsdocContent) {
|
|
371
|
+
return /@Template/i.test(jsdocContent);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Check if JSDoc contains @Static tag
|
|
375
|
+
*/
|
|
376
|
+
hasStaticTag(jsdocContent) {
|
|
377
|
+
return /@Static/i.test(jsdocContent);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Extract URI pattern from @Static tag
|
|
381
|
+
* Example: @Static github://repos/{owner}/{repo}/readme
|
|
382
|
+
*/
|
|
383
|
+
extractStaticURI(jsdocContent) {
|
|
384
|
+
const match = jsdocContent.match(/@Static\s+([\w:\/\{\}\-_.]+)/i);
|
|
385
|
+
return match ? match[1].trim() : null;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Extract MIME type from @mimeType tag
|
|
389
|
+
* Example: @mimeType text/markdown
|
|
390
|
+
*/
|
|
391
|
+
extractMimeType(jsdocContent) {
|
|
392
|
+
const match = jsdocContent.match(/@mimeType\s+([\w\/\-+.]+)/i);
|
|
393
|
+
return match ? match[1].trim() : undefined;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=schema-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-extractor.js","sourceRoot":"","sources":["../src/schema-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AASjC;;GAEG;AACH,MAAM,OAAO,eAAe;IAC1B;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,MAAc;QACjC,MAAM,KAAK,GAAsB,EAAE,CAAC;QACpC,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,IAAI,CAAC;YACH,gEAAgE;YAChE,IAAI,aAAa,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,aAAa,GAAG,gCAAgC,MAAM,KAAK,CAAC;YAC9D,CAAC;YAED,6BAA6B;YAC7B,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CACpC,SAAS,EACT,aAAa,EACb,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,CACL,CAAC;YAEF,yCAAyC;YACzC,MAAM,aAAa,GAAG,CAAC,MAA4B,EAAE,EAAE;gBACrD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAEvD,qCAAqC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAClE,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,CAAC,qCAAqC;gBAC/C,CAAC;gBAED,oCAAoC;gBACpC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAElF,kCAAkC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAE/C,qCAAqC;gBACrC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBACpC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACvB,UAAU,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACnD,MAAM,WAAW,GAAG;oBAClB,IAAI,EAAE,QAAiB;oBACvB,UAAU;oBACV,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7C,CAAC;gBAEF,8BAA8B;gBAC9B,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/B,SAAS,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,UAAU;wBAChB,WAAW;wBACX,WAAW;qBACZ,CAAC,CAAC;gBACL,CAAC;gBACD,qCAAqC;qBAChC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,YAAY,UAAU,EAAE,CAAC;oBACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;oBAE7C,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,UAAU;wBAChB,GAAG;wBACH,WAAW;wBACX,QAAQ;wBACR,WAAW;qBACZ,CAAC,CAAC;gBACL,CAAC;gBACD,iCAAiC;qBAC5B,CAAC;oBACJ,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,UAAU;wBAChB,WAAW;wBACX,WAAW;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC;YAEF,6BAA6B;YAC7B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,EAAE;gBAC9B,8BAA8B;gBAC9B,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;wBAC9B,yBAAyB;wBACzB,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;4BAC9B,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;4BACvE,aAAa,CAAC,MAAM,CAAC,CAAC;wBACxB,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC;YAEF,KAAK,CAAC,UAAU,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;IACjD,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAa,EAAE,UAAyB;QAC9D,oCAAoC;QACpC,MAAM,MAAM,GAAI,IAAY,CAAC,KAAK,CAAC;QACnC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAE9B,qCAAqC;YACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACtB,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAEjD,qCAAqC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,MAA4B,EAAE,UAAyB;QACnF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,QAAqB,EAAE,UAAyB;QAC1E,MAAM,UAAU,GAAwB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,oCAAoC;QACpC,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAClC,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACjD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC;oBAEtD,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1B,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;wBAChB,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;oBACxE,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC5C,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,QAAqB,EAAE,UAAyB;QACvE,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,qBAAqB;QACrB,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,4BAA4B;QAC5B,IAAI,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,qBAAqB;QACrB,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,8CAA8C;QAC9C,IAAI,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAEvD,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxF,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;gBACtB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC5E,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,+CAA+C;YAC/C,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACjC,IAAI,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzC,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC9F,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;gBACxB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;YAChF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,sCAAsC;QACtC,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;YACvB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAChF,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,uDAAuD;QACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;gBACxB,MAAM;YACR,KAAK,KAAK,CAAC;YACX,KAAK,SAAS;gBACZ,sBAAsB;gBACtB,MAAM;YACR;gBACE,sCAAsC;gBACtC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,MAAc;QACrC,MAAM,MAAM,GAAuB,EAAE,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CACpC,SAAS,EACT,MAAM,EACN,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,CACL,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,EAAE;gBAC9B,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;wBAC9B,IAAI,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;4BACxC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gCAClC,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oCAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oCAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oCACjE,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;oCACxF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;oCAEnD,IAAI,YAAY,GAAQ,SAAS,CAAC;oCAClC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;wCACtB,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;oCACzE,CAAC;oCAED,MAAM,CAAC,IAAI,CAAC;wCACV,IAAI;wCACJ,IAAI;wCACJ,UAAU;wCACV,UAAU;wCACV,YAAY;qCACb,CAAC,CAAC;gCACL,CAAC;4BACH,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC;YAEF,KAAK,CAAC,UAAU,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,WAA0B,EAAE,UAAyB;QAC/E,kBAAkB;QAClB,IAAI,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,OAAO,WAAW,CAAC,IAAI,CAAC;QAC1B,CAAC;QAED,mBAAmB;QACnB,IAAI,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,mBAAmB;QACnB,IAAI,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mEAAmE;QACnE,OAAO,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,YAAoB;QAC7C,mDAAmD;QACnD,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,2CAA2C;QAC3C,MAAM,KAAK,GAAG,YAAY;aACvB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAgC;QAEpF,qEAAqE;QACrE,gCAAgC;QAChC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB;QACxF,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;YAC5C,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEpB,2BAA2B;QAC3B,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC;IACrE,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,YAAoB;QAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAE5C,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC;YACzC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,YAAoB;QACzC,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,YAAoB;QACvC,OAAO,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,YAAoB;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,YAAoB;QAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner - Check dependencies for known vulnerabilities
|
|
3
|
+
*/
|
|
4
|
+
export interface VulnerabilityInfo {
|
|
5
|
+
severity: 'info' | 'low' | 'moderate' | 'high' | 'critical';
|
|
6
|
+
title: string;
|
|
7
|
+
url?: string;
|
|
8
|
+
via?: string[];
|
|
9
|
+
range?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DependencyAuditResult {
|
|
12
|
+
dependency: string;
|
|
13
|
+
version: string;
|
|
14
|
+
vulnerabilities: VulnerabilityInfo[];
|
|
15
|
+
hasVulnerabilities: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface MCPAuditResult {
|
|
18
|
+
mcpName: string;
|
|
19
|
+
dependencies: DependencyAuditResult[];
|
|
20
|
+
totalVulnerabilities: number;
|
|
21
|
+
criticalCount: number;
|
|
22
|
+
highCount: number;
|
|
23
|
+
moderateCount: number;
|
|
24
|
+
lowCount: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class SecurityScanner {
|
|
27
|
+
/**
|
|
28
|
+
* Audit dependencies for a specific MCP
|
|
29
|
+
*/
|
|
30
|
+
auditMCP(mcpName: string, dependencies: string[]): Promise<MCPAuditResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Audit a single dependency
|
|
33
|
+
*/
|
|
34
|
+
private auditDependency;
|
|
35
|
+
/**
|
|
36
|
+
* Extract relevant vulnerabilities from npm audit output
|
|
37
|
+
*/
|
|
38
|
+
private extractVulnerabilities;
|
|
39
|
+
/**
|
|
40
|
+
* Quick check if dependency has known vulnerabilities
|
|
41
|
+
*/
|
|
42
|
+
hasVulnerabilities(dependency: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Get severity color for terminal output
|
|
45
|
+
*/
|
|
46
|
+
getSeveritySymbol(severity: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Format audit result for display
|
|
49
|
+
*/
|
|
50
|
+
formatAuditResult(result: MCPAuditResult): string;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=security-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../src/security-scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAoChF;;OAEG;YACW,eAAe;IAuC7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB9D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAU3C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAsBlD"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanner - Check dependencies for known vulnerabilities
|
|
3
|
+
*/
|
|
4
|
+
import { exec } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import * as fs from 'fs/promises';
|
|
9
|
+
const execAsync = promisify(exec);
|
|
10
|
+
export class SecurityScanner {
|
|
11
|
+
/**
|
|
12
|
+
* Audit dependencies for a specific MCP
|
|
13
|
+
*/
|
|
14
|
+
async auditMCP(mcpName, dependencies) {
|
|
15
|
+
const results = [];
|
|
16
|
+
let totalVulnerabilities = 0;
|
|
17
|
+
let criticalCount = 0;
|
|
18
|
+
let highCount = 0;
|
|
19
|
+
let moderateCount = 0;
|
|
20
|
+
let lowCount = 0;
|
|
21
|
+
for (const dep of dependencies) {
|
|
22
|
+
const result = await this.auditDependency(mcpName, dep);
|
|
23
|
+
results.push(result);
|
|
24
|
+
if (result.hasVulnerabilities) {
|
|
25
|
+
totalVulnerabilities += result.vulnerabilities.length;
|
|
26
|
+
result.vulnerabilities.forEach(vuln => {
|
|
27
|
+
switch (vuln.severity) {
|
|
28
|
+
case 'critical':
|
|
29
|
+
criticalCount++;
|
|
30
|
+
break;
|
|
31
|
+
case 'high':
|
|
32
|
+
highCount++;
|
|
33
|
+
break;
|
|
34
|
+
case 'moderate':
|
|
35
|
+
moderateCount++;
|
|
36
|
+
break;
|
|
37
|
+
case 'low':
|
|
38
|
+
lowCount++;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
mcpName,
|
|
46
|
+
dependencies: results,
|
|
47
|
+
totalVulnerabilities,
|
|
48
|
+
criticalCount,
|
|
49
|
+
highCount,
|
|
50
|
+
moderateCount,
|
|
51
|
+
lowCount,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Audit a single dependency
|
|
56
|
+
*/
|
|
57
|
+
async auditDependency(mcpName, dependency) {
|
|
58
|
+
// Parse dependency string (name@version)
|
|
59
|
+
const parts = dependency.split('@');
|
|
60
|
+
const version = parts.pop() || 'latest';
|
|
61
|
+
const name = parts.join('@'); // Handle scoped packages like @org/package
|
|
62
|
+
const depPath = path.join(os.homedir(), '.cache', 'photon-mcp', 'dependencies', mcpName);
|
|
63
|
+
try {
|
|
64
|
+
// Check if dependency directory exists
|
|
65
|
+
await fs.access(depPath);
|
|
66
|
+
// Run npm audit in the dependency directory
|
|
67
|
+
const { stdout } = await execAsync('npm audit --json', {
|
|
68
|
+
cwd: depPath,
|
|
69
|
+
timeout: 30000,
|
|
70
|
+
});
|
|
71
|
+
const auditData = JSON.parse(stdout);
|
|
72
|
+
const vulnerabilities = this.extractVulnerabilities(auditData, name);
|
|
73
|
+
return {
|
|
74
|
+
dependency: name,
|
|
75
|
+
version,
|
|
76
|
+
vulnerabilities,
|
|
77
|
+
hasVulnerabilities: vulnerabilities.length > 0,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// If npm audit fails or directory doesn't exist, assume no vulnerabilities
|
|
82
|
+
// (dependency might not be installed yet)
|
|
83
|
+
return {
|
|
84
|
+
dependency: name,
|
|
85
|
+
version,
|
|
86
|
+
vulnerabilities: [],
|
|
87
|
+
hasVulnerabilities: false,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract relevant vulnerabilities from npm audit output
|
|
93
|
+
*/
|
|
94
|
+
extractVulnerabilities(auditData, packageName) {
|
|
95
|
+
const vulnerabilities = [];
|
|
96
|
+
if (!auditData.vulnerabilities) {
|
|
97
|
+
return vulnerabilities;
|
|
98
|
+
}
|
|
99
|
+
// npm audit v7+ format
|
|
100
|
+
for (const [vulnPackage, vulnData] of Object.entries(auditData.vulnerabilities)) {
|
|
101
|
+
const vuln = vulnData;
|
|
102
|
+
// Check if this vulnerability affects our target package
|
|
103
|
+
if (vulnPackage === packageName || vuln.via?.includes(packageName)) {
|
|
104
|
+
vulnerabilities.push({
|
|
105
|
+
severity: vuln.severity || 'moderate',
|
|
106
|
+
title: vuln.name || vulnPackage,
|
|
107
|
+
url: vuln.url,
|
|
108
|
+
via: vuln.via?.filter((v) => typeof v === 'string'),
|
|
109
|
+
range: vuln.range,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return vulnerabilities;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Quick check if dependency has known vulnerabilities
|
|
117
|
+
*/
|
|
118
|
+
async hasVulnerabilities(dependency) {
|
|
119
|
+
try {
|
|
120
|
+
// Use npm view to check if package exists
|
|
121
|
+
const parts = dependency.split('@');
|
|
122
|
+
const version = parts.pop() || 'latest';
|
|
123
|
+
const name = parts.join('@');
|
|
124
|
+
const { stdout } = await execAsync(`npm view ${name}@${version} version`, {
|
|
125
|
+
timeout: 10000,
|
|
126
|
+
});
|
|
127
|
+
// If we get here, package exists. Now check for advisories
|
|
128
|
+
// Note: npm doesn't provide a direct API for this without installing,
|
|
129
|
+
// but we can check the npm registry API
|
|
130
|
+
return false; // Default to false for now
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// Package doesn't exist or other error
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get severity color for terminal output
|
|
139
|
+
*/
|
|
140
|
+
getSeveritySymbol(severity) {
|
|
141
|
+
switch (severity) {
|
|
142
|
+
case 'critical': return 'đ´';
|
|
143
|
+
case 'high': return 'đ ';
|
|
144
|
+
case 'moderate': return 'đĄ';
|
|
145
|
+
case 'low': return 'đĩ';
|
|
146
|
+
default: return 'âšī¸';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Format audit result for display
|
|
151
|
+
*/
|
|
152
|
+
formatAuditResult(result) {
|
|
153
|
+
if (result.totalVulnerabilities === 0) {
|
|
154
|
+
return `â
${result.mcpName}: No vulnerabilities found`;
|
|
155
|
+
}
|
|
156
|
+
let output = `â ī¸ ${result.mcpName}: ${result.totalVulnerabilities} vulnerabilities found\n`;
|
|
157
|
+
if (result.criticalCount > 0) {
|
|
158
|
+
output += ` đ´ Critical: ${result.criticalCount}\n`;
|
|
159
|
+
}
|
|
160
|
+
if (result.highCount > 0) {
|
|
161
|
+
output += ` đ High: ${result.highCount}\n`;
|
|
162
|
+
}
|
|
163
|
+
if (result.moderateCount > 0) {
|
|
164
|
+
output += ` đĄ Moderate: ${result.moderateCount}\n`;
|
|
165
|
+
}
|
|
166
|
+
if (result.lowCount > 0) {
|
|
167
|
+
output += ` đĩ Low: ${result.lowCount}\n`;
|
|
168
|
+
}
|
|
169
|
+
return output;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=security-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scanner.js","sourceRoot":"","sources":["../src/security-scanner.ts"],"names":[],"mappings":"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"}
|