@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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +952 -0
  3. package/dist/base.d.ts +58 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +92 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +1441 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/dependency-manager.d.ts +49 -0
  12. package/dist/dependency-manager.d.ts.map +1 -0
  13. package/dist/dependency-manager.js +165 -0
  14. package/dist/dependency-manager.js.map +1 -0
  15. package/dist/loader.d.ts +86 -0
  16. package/dist/loader.d.ts.map +1 -0
  17. package/dist/loader.js +612 -0
  18. package/dist/loader.js.map +1 -0
  19. package/dist/marketplace-manager.d.ts +261 -0
  20. package/dist/marketplace-manager.d.ts.map +1 -0
  21. package/dist/marketplace-manager.js +767 -0
  22. package/dist/marketplace-manager.js.map +1 -0
  23. package/dist/path-resolver.d.ts +21 -0
  24. package/dist/path-resolver.d.ts.map +1 -0
  25. package/dist/path-resolver.js +71 -0
  26. package/dist/path-resolver.js.map +1 -0
  27. package/dist/photon-doc-extractor.d.ts +89 -0
  28. package/dist/photon-doc-extractor.d.ts.map +1 -0
  29. package/dist/photon-doc-extractor.js +228 -0
  30. package/dist/photon-doc-extractor.js.map +1 -0
  31. package/dist/readme-syncer.d.ts +33 -0
  32. package/dist/readme-syncer.d.ts.map +1 -0
  33. package/dist/readme-syncer.js +93 -0
  34. package/dist/readme-syncer.js.map +1 -0
  35. package/dist/registry-manager.d.ts +76 -0
  36. package/dist/registry-manager.d.ts.map +1 -0
  37. package/dist/registry-manager.js +220 -0
  38. package/dist/registry-manager.js.map +1 -0
  39. package/dist/schema-extractor.d.ts +83 -0
  40. package/dist/schema-extractor.d.ts.map +1 -0
  41. package/dist/schema-extractor.js +396 -0
  42. package/dist/schema-extractor.js.map +1 -0
  43. package/dist/security-scanner.d.ts +52 -0
  44. package/dist/security-scanner.d.ts.map +1 -0
  45. package/dist/security-scanner.js +172 -0
  46. package/dist/security-scanner.js.map +1 -0
  47. package/dist/server.d.ts +73 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +474 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/template-manager.d.ts +56 -0
  52. package/dist/template-manager.d.ts.map +1 -0
  53. package/dist/template-manager.js +509 -0
  54. package/dist/template-manager.js.map +1 -0
  55. package/dist/test-client.d.ts +52 -0
  56. package/dist/test-client.d.ts.map +1 -0
  57. package/dist/test-client.js +168 -0
  58. package/dist/test-client.js.map +1 -0
  59. package/dist/test-marketplace-sources.d.ts +5 -0
  60. package/dist/test-marketplace-sources.d.ts.map +1 -0
  61. package/dist/test-marketplace-sources.js +53 -0
  62. package/dist/test-marketplace-sources.js.map +1 -0
  63. package/dist/types.d.ts +108 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +12 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/version-checker.d.ts +48 -0
  68. package/dist/version-checker.d.ts.map +1 -0
  69. package/dist/version-checker.js +128 -0
  70. package/dist/version-checker.js.map +1 -0
  71. package/dist/watcher.d.ts +26 -0
  72. package/dist/watcher.d.ts.map +1 -0
  73. package/dist/watcher.js +72 -0
  74. package/dist/watcher.js.map +1 -0
  75. package/package.json +79 -0
  76. 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":"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"}
@@ -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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"}