@bryan-thompson/inspector-assessment-client 1.26.6 → 1.26.7

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 (57) hide show
  1. package/lib/lib/assessment/configTypes.d.ts +2 -0
  2. package/lib/lib/assessment/configTypes.d.ts.map +1 -1
  3. package/lib/lib/securityPatterns.d.ts +4 -2
  4. package/lib/lib/securityPatterns.d.ts.map +1 -1
  5. package/lib/lib/securityPatterns.js +146 -2
  6. package/lib/services/assessment/modules/AUPComplianceAssessor.js +9 -9
  7. package/lib/services/assessment/modules/AuthenticationAssessor.js +4 -4
  8. package/lib/services/assessment/modules/BaseAssessor.d.ts +0 -14
  9. package/lib/services/assessment/modules/BaseAssessor.d.ts.map +1 -1
  10. package/lib/services/assessment/modules/BaseAssessor.js +1 -33
  11. package/lib/services/assessment/modules/CrossCapabilitySecurityAssessor.js +1 -1
  12. package/lib/services/assessment/modules/DeveloperExperienceAssessor.js +1 -1
  13. package/lib/services/assessment/modules/DocumentationAssessor.js +2 -2
  14. package/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts.map +1 -1
  15. package/lib/services/assessment/modules/ErrorHandlingAssessor.js +8 -8
  16. package/lib/services/assessment/modules/ExternalAPIScannerAssessor.d.ts.map +1 -1
  17. package/lib/services/assessment/modules/ExternalAPIScannerAssessor.js +3 -3
  18. package/lib/services/assessment/modules/FunctionalityAssessor.js +9 -9
  19. package/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts.map +1 -1
  20. package/lib/services/assessment/modules/MCPSpecComplianceAssessor.js +12 -12
  21. package/lib/services/assessment/modules/ManifestValidationAssessor.d.ts.map +1 -1
  22. package/lib/services/assessment/modules/ManifestValidationAssessor.js +9 -5
  23. package/lib/services/assessment/modules/PortabilityAssessor.d.ts.map +1 -1
  24. package/lib/services/assessment/modules/PortabilityAssessor.js +3 -3
  25. package/lib/services/assessment/modules/ProhibitedLibrariesAssessor.js +4 -4
  26. package/lib/services/assessment/modules/PromptAssessor.js +2 -2
  27. package/lib/services/assessment/modules/ProtocolComplianceAssessor.d.ts.map +1 -1
  28. package/lib/services/assessment/modules/ProtocolComplianceAssessor.js +7 -7
  29. package/lib/services/assessment/modules/ProtocolConformanceAssessor.js +1 -1
  30. package/lib/services/assessment/modules/ResourceAssessor.js +1 -1
  31. package/lib/services/assessment/modules/SecurityAssessor.d.ts +25 -2
  32. package/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -1
  33. package/lib/services/assessment/modules/SecurityAssessor.js +149 -17
  34. package/lib/services/assessment/modules/TemporalAssessor.d.ts.map +1 -1
  35. package/lib/services/assessment/modules/TemporalAssessor.js +10 -10
  36. package/lib/services/assessment/modules/ToolAnnotationAssessor.js +9 -9
  37. package/lib/services/assessment/modules/UsabilityAssessor.js +1 -1
  38. package/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.d.ts.map +1 -1
  39. package/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.js +37 -0
  40. package/lib/services/assessment/modules/index.d.ts +3 -0
  41. package/lib/services/assessment/modules/index.d.ts.map +1 -1
  42. package/lib/services/assessment/modules/securityTests/ChainExecutionTester.d.ts +104 -0
  43. package/lib/services/assessment/modules/securityTests/ChainExecutionTester.d.ts.map +1 -0
  44. package/lib/services/assessment/modules/securityTests/ChainExecutionTester.js +257 -0
  45. package/lib/services/assessment/modules/securityTests/CrossToolStateTester.d.ts +91 -0
  46. package/lib/services/assessment/modules/securityTests/CrossToolStateTester.d.ts.map +1 -0
  47. package/lib/services/assessment/modules/securityTests/CrossToolStateTester.js +225 -0
  48. package/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts +120 -0
  49. package/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts.map +1 -1
  50. package/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.js +338 -0
  51. package/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts +59 -0
  52. package/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts.map +1 -1
  53. package/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.js +168 -0
  54. package/lib/services/assessment/modules/securityTests/index.d.ts +3 -1
  55. package/lib/services/assessment/modules/securityTests/index.d.ts.map +1 -1
  56. package/lib/services/assessment/modules/securityTests/index.js +2 -0
  57. package/package.json +1 -1
@@ -50,6 +50,8 @@ export interface AssessmentConfiguration {
50
50
  selectedToolsForTesting?: string[];
51
51
  securityPatternsToTest?: number;
52
52
  enableDomainTesting?: boolean;
53
+ /** Enable cross-tool sequence testing for privilege escalation (Issue #92, default true) */
54
+ enableSequenceTesting?: boolean;
53
55
  mcpProtocolVersion?: string;
54
56
  enableSourceCodeAnalysis?: boolean;
55
57
  patternConfigPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"configTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/assessment/configTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/assessment/configTypes.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Backend API Security Patterns
3
- * Tests MCP server API security with 24 focused patterns
3
+ * Tests MCP server API security with 26 focused patterns
4
4
  *
5
5
  * Architecture: Attack-Type with Specific Payloads
6
6
  * - Critical Injection (6 patterns): Command, Calculator, SQL, Path Traversal, XXE, NoSQL
@@ -12,6 +12,8 @@
12
12
  * - Token Theft (1 pattern): Authentication token leakage
13
13
  * - Permission Scope (1 pattern): Privilege escalation and scope bypass
14
14
  * - Auth Bypass (1 pattern): Fail-open authentication vulnerabilities (Issue #75)
15
+ * - Cross-Tool State Bypass (1 pattern): Cross-tool privilege escalation via shared state (Issue #92)
16
+ * - Chained Exploitation (1 pattern): Multi-tool chain execution attacks (Issue #93)
15
17
  *
16
18
  * Scope: Backend API Security ONLY
17
19
  * - Tests structured data inputs to API endpoints
@@ -43,7 +45,7 @@ export interface AttackPattern {
43
45
  * BACKEND API SECURITY PATTERNS
44
46
  * ========================================
45
47
  *
46
- * 23 focused patterns for MCP server API security
48
+ * 26 focused patterns for MCP server API security
47
49
  */
48
50
  export declare const SECURITY_ATTACK_PATTERNS: AttackPattern[];
49
51
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"securityPatterns.d.ts","sourceRoot":"","sources":["../../src/lib/securityPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,EA64CnD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,eAAe,EAAE,CAQnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB;;;;;;;;EA8BnC"}
1
+ {"version":3,"file":"securityPatterns.d.ts","sourceRoot":"","sources":["../../src/lib/securityPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,EAwjDnD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,eAAe,EAAE,CAQnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB;;;;;;;;EA8BnC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Backend API Security Patterns
3
- * Tests MCP server API security with 24 focused patterns
3
+ * Tests MCP server API security with 26 focused patterns
4
4
  *
5
5
  * Architecture: Attack-Type with Specific Payloads
6
6
  * - Critical Injection (6 patterns): Command, Calculator, SQL, Path Traversal, XXE, NoSQL
@@ -12,6 +12,8 @@
12
12
  * - Token Theft (1 pattern): Authentication token leakage
13
13
  * - Permission Scope (1 pattern): Privilege escalation and scope bypass
14
14
  * - Auth Bypass (1 pattern): Fail-open authentication vulnerabilities (Issue #75)
15
+ * - Cross-Tool State Bypass (1 pattern): Cross-tool privilege escalation via shared state (Issue #92)
16
+ * - Chained Exploitation (1 pattern): Multi-tool chain execution attacks (Issue #93)
15
17
  *
16
18
  * Scope: Backend API Security ONLY
17
19
  * - Tests structured data inputs to API endpoints
@@ -29,7 +31,7 @@
29
31
  * BACKEND API SECURITY PATTERNS
30
32
  * ========================================
31
33
  *
32
- * 23 focused patterns for MCP server API security
34
+ * 26 focused patterns for MCP server API security
33
35
  */
34
36
  export const SECURITY_ATTACK_PATTERNS = [
35
37
  // ==========================================
@@ -1315,6 +1317,148 @@ export const SECURITY_ATTACK_PATTERNS = [
1315
1317
  },
1316
1318
  ],
1317
1319
  },
1320
+ // ==========================================
1321
+ // CROSS-TOOL STATE BYPASS TESTS (Issue #92, Challenge #7)
1322
+ // ==========================================
1323
+ // 25. CROSS-TOOL STATE BYPASS
1324
+ {
1325
+ attackName: "Cross-Tool State Bypass",
1326
+ description: "Tests for privilege escalation via shared mutable state between tools (Challenge #7)",
1327
+ payloads: [
1328
+ // Admin action payloads - tests tools that check shared state
1329
+ {
1330
+ payload: "read secrets",
1331
+ evidence: /(admin_mode.*true.*cross-tool|enabled\s+by.*another\s+tool|"evidence".*privilege.*escalation)/i,
1332
+ riskLevel: "HIGH",
1333
+ description: "Admin action checking shared state for authorization",
1334
+ payloadType: "state_bypass",
1335
+ parameterTypes: ["action", "command", "request", "operation"],
1336
+ },
1337
+ {
1338
+ payload: "delete user admin",
1339
+ evidence: /(admin_mode.*true.*privilege|destructive.*enabled.*cross-tool|"evidence".*state.*dependency)/i,
1340
+ riskLevel: "HIGH",
1341
+ description: "Destructive action via cross-tool state dependency",
1342
+ payloadType: "state_bypass",
1343
+ parameterTypes: ["action", "command", "request"],
1344
+ },
1345
+ {
1346
+ payload: "modify config security=disabled",
1347
+ evidence: /(admin_mode.*enabled.*config|config\s+modification.*admin|privilege.*escalation.*config)/i,
1348
+ riskLevel: "HIGH",
1349
+ description: "Config modification via cross-tool privilege escalation",
1350
+ payloadType: "state_bypass",
1351
+ parameterTypes: ["action", "setting", "config"],
1352
+ },
1353
+ // State modifier payloads - tests tools that modify shared state
1354
+ {
1355
+ payload: "admin_mode=true",
1356
+ evidence: /(admin\s+mode\s+activated|elevated\s+privileges?\s+granted|admin_mode.*enabled)/i,
1357
+ riskLevel: "HIGH",
1358
+ description: "Tool modifies shared state affecting other tools' authorization",
1359
+ payloadType: "state_modifier",
1360
+ parameterTypes: ["setting", "config", "option"],
1361
+ },
1362
+ {
1363
+ payload: "set admin_mode=true",
1364
+ evidence: /(admin\s+mode\s+activated|elevated\s+privileges?\s+granted|configuration.*updated.*admin)/i,
1365
+ riskLevel: "HIGH",
1366
+ description: "Explicit shared state modification request",
1367
+ payloadType: "state_modifier",
1368
+ parameterTypes: ["setting", "config", "option", "input"],
1369
+ },
1370
+ {
1371
+ payload: "enable elevated privileges",
1372
+ evidence: /(elevated.*granted|privilege.*enabled|admin.*activated)/i,
1373
+ riskLevel: "HIGH",
1374
+ description: "Privilege elevation via shared state",
1375
+ payloadType: "state_modifier",
1376
+ parameterTypes: ["setting", "config", "option", "command"],
1377
+ },
1378
+ ],
1379
+ },
1380
+ // ==========================================
1381
+ // CHAINED EXPLOITATION TESTS (Issue #93, Challenge #6)
1382
+ // ==========================================
1383
+ // 26. CHAINED EXPLOITATION
1384
+ {
1385
+ attackName: "Chained Exploitation",
1386
+ description: "Tests for multi-tool chain execution allowing arbitrary tool invocation, output injection, and recursive attacks",
1387
+ payloads: [
1388
+ // Single-step chain execution without allowlist
1389
+ {
1390
+ payload: '[{"tool": "vulnerable_calculator", "args": {"query": "2+2"}}]',
1391
+ evidence: /(chain_results|steps_executed|vulnerabilities_triggered|chain.*executed)/i,
1392
+ riskLevel: "HIGH",
1393
+ description: "Single-step chain execution without tool allowlist validation",
1394
+ payloadType: "chain_execution",
1395
+ parameterTypes: ["chain", "steps", "sequence", "pipeline"],
1396
+ },
1397
+ // Output injection via {{output}} template
1398
+ {
1399
+ payload: '[{"tool": "calc", "args": {"q": "2+2"}}, {"tool": "exec", "args": {"cmd": "{{output}}"}}]',
1400
+ evidence: /(output_injection|{{output}}.*substituted|\{\{output\}\}.*replaced|output.*injection.*step)/i,
1401
+ riskLevel: "HIGH",
1402
+ description: "Output injection - raw output flows between chain steps",
1403
+ payloadType: "chain_output_injection",
1404
+ parameterTypes: ["chain", "steps", "sequence"],
1405
+ },
1406
+ // Recursive chain (DoS via self-reference)
1407
+ {
1408
+ payload: '[{"tool": "vulnerable_chain_executor", "args": {"chain": "[]"}}]',
1409
+ evidence: /(recursive_chain|chain_executor.*within.*chain|circular.*chain|self.*referential)/i,
1410
+ riskLevel: "HIGH",
1411
+ description: "Recursive chain execution - DoS via self-referential chains",
1412
+ payloadType: "chain_recursion",
1413
+ parameterTypes: ["chain", "steps", "sequence"],
1414
+ },
1415
+ // Arbitrary tool name acceptance
1416
+ {
1417
+ payload: '[{"tool": "MALICIOUS_TOOL_12345", "args": {}}]',
1418
+ evidence: /(arbitrary.*tool|unknown.*tool.*executed|attempted.*execute.*unknown|accepted.*arbitrary)/i,
1419
+ riskLevel: "HIGH",
1420
+ description: "Chain accepts arbitrary tool names without allowlist",
1421
+ payloadType: "chain_arbitrary_tool",
1422
+ parameterTypes: ["chain", "steps", "sequence"],
1423
+ },
1424
+ // State poisoning via multi-step chain
1425
+ {
1426
+ payload: '[{"tool": "config_modifier", "args": {"setting": "admin=true"}}, {"tool": "admin_action", "args": {"action": "read secrets"}}]',
1427
+ evidence: /(state.*poison|admin_mode.*true.*chain|privilege.*escalation.*chain|config.*modified.*chain)/i,
1428
+ riskLevel: "HIGH",
1429
+ description: "State poisoning - earlier step modifies state affecting later steps",
1430
+ payloadType: "chain_state_poisoning",
1431
+ parameterTypes: ["chain", "steps", "sequence"],
1432
+ },
1433
+ // Depth limit bypass
1434
+ {
1435
+ payload: '[{"tool":"a"},{"tool":"b"},{"tool":"c"},{"tool":"d"},{"tool":"e"},{"tool":"f"},{"tool":"g"},{"tool":"h"},{"tool":"i"},{"tool":"j"},{"tool":"k"},{"tool":"l"}]',
1436
+ evidence: /(steps_executed.*1[0-9]|executed.*beyond.*limit|depth.*limit.*bypassed|no.*depth.*limit)/i,
1437
+ riskLevel: "MEDIUM",
1438
+ description: "Missing or bypassable chain depth limits",
1439
+ payloadType: "chain_depth_bypass",
1440
+ parameterTypes: ["chain", "steps", "sequence"],
1441
+ },
1442
+ // Tool shadowing via chain
1443
+ {
1444
+ payload: '[{"tool": "shadowed_tool_name", "args": {}}]',
1445
+ evidence: /(shadowed.*tool|tool.*poison|shadowed_definition|executed.*shadowed)/i,
1446
+ riskLevel: "HIGH",
1447
+ description: "Chain executes shadowed/poisoned tool definitions",
1448
+ payloadType: "chain_shadowing",
1449
+ parameterTypes: ["chain", "steps", "sequence"],
1450
+ },
1451
+ // Large chain input (unbounded input)
1452
+ {
1453
+ payload: '[{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}},{"tool":"t","args":{}}]',
1454
+ evidence: /(steps_executed.*[1-2][0-9]|no.*size.*limit|unbounded.*input|executed.*all.*steps)/i,
1455
+ riskLevel: "MEDIUM",
1456
+ description: "No input size validation on chain definitions",
1457
+ payloadType: "chain_unbounded",
1458
+ parameterTypes: ["chain", "steps", "sequence"],
1459
+ },
1460
+ ],
1461
+ },
1318
1462
  ];
1319
1463
  /**
1320
1464
  * Get all payloads for an attack type
@@ -35,7 +35,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
35
35
  * If Claude semantic analysis is enabled, violations are verified to reduce false positives.
36
36
  */
37
37
  async assess(context) {
38
- this.log("Starting AUP compliance assessment");
38
+ this.logger.info("Starting AUP compliance assessment");
39
39
  this.testCount = 0;
40
40
  const violations = [];
41
41
  const highRiskDomains = [];
@@ -51,7 +51,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
51
51
  toolDescriptionMap.set(tool.name, tool.description || "");
52
52
  }
53
53
  // Scan tool names
54
- this.log("Scanning tool names...");
54
+ this.logger.info("Scanning tool names...");
55
55
  scannedLocations.toolNames = true;
56
56
  for (const tool of context.tools) {
57
57
  this.testCount++;
@@ -66,7 +66,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
66
66
  }
67
67
  }
68
68
  // Scan tool descriptions
69
- this.log("Scanning tool descriptions...");
69
+ this.logger.info("Scanning tool descriptions...");
70
70
  scannedLocations.toolDescriptions = true;
71
71
  for (const tool of context.tools) {
72
72
  if (tool.description) {
@@ -83,7 +83,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
83
83
  }
84
84
  // Scan README content
85
85
  if (context.readmeContent) {
86
- this.log("Scanning README content...");
86
+ this.logger.info("Scanning README content...");
87
87
  scannedLocations.readme = true;
88
88
  this.testCount++;
89
89
  const readmeViolations = this.scanReadme(context.readmeContent);
@@ -97,7 +97,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
97
97
  }
98
98
  // Scan source code if available
99
99
  if (context.sourceCodeFiles && context.config.enableSourceCodeAnalysis) {
100
- this.log("Scanning source code files...");
100
+ this.logger.info("Scanning source code files...");
101
101
  scannedLocations.sourceCode = true;
102
102
  for (const [filePath, content] of context.sourceCodeFiles) {
103
103
  // Skip non-relevant files
@@ -110,14 +110,14 @@ export class AUPComplianceAssessor extends BaseAssessor {
110
110
  }
111
111
  // If Claude semantic analysis is enabled, verify violations to reduce false positives
112
112
  if (this.isSemanticAnalysisEnabled() && violations.length > 0) {
113
- this.log(`Running semantic analysis on ${violations.length} potential violations...`);
113
+ this.logger.info(`Running semantic analysis on ${violations.length} potential violations...`);
114
114
  return await this.runSemanticAnalysis(violations, highRiskDomains, scannedLocations, toolDescriptionMap);
115
115
  }
116
116
  // Standard assessment without semantic analysis
117
117
  const status = this.determineAUPStatus(violations);
118
118
  const explanation = this.generateExplanation(violations, highRiskDomains, scannedLocations);
119
119
  const recommendations = this.generateRecommendations(violations, highRiskDomains);
120
- this.log(`Assessment complete: ${violations.length} violations found, ${highRiskDomains.length} high-risk domains`);
120
+ this.logger.info(`Assessment complete: ${violations.length} violations found, ${highRiskDomains.length} high-risk domains`);
121
121
  return {
122
122
  violations,
123
123
  highRiskDomains,
@@ -185,7 +185,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
185
185
  // Low confidence - likely false positive
186
186
  else {
187
187
  falsePositivesFiltered++;
188
- this.log(`Filtered likely false positive: "${violation.matchedText}" - ${analysis.reasoning}`);
188
+ this.logger.info(`Filtered likely false positive: "${violation.matchedText}" - ${analysis.reasoning}`);
189
189
  }
190
190
  }
191
191
  catch (error) {
@@ -205,7 +205,7 @@ export class AUPComplianceAssessor extends BaseAssessor {
205
205
  const status = this.determineAUPStatus(confirmedViolations);
206
206
  const explanation = this.generateSemanticExplanation(confirmedViolations, flaggedForReview, falsePositivesFiltered, highRiskDomains, scannedLocations);
207
207
  const recommendations = this.generateSemanticRecommendations(confirmedViolations, flaggedForReview, highRiskDomains);
208
- this.log(`Semantic analysis complete: ${confirmedViolations.length} confirmed, ${flaggedForReview.length} flagged, ${falsePositivesFiltered} filtered`);
208
+ this.logger.info(`Semantic analysis complete: ${confirmedViolations.length} confirmed, ${flaggedForReview.length} flagged, ${falsePositivesFiltered} filtered`);
209
209
  return {
210
210
  violations: [...confirmedViolations, ...flaggedForReview],
211
211
  confirmedViolations,
@@ -246,7 +246,7 @@ export class AuthenticationAssessor extends BaseAssessor {
246
246
  * Run authentication assessment
247
247
  */
248
248
  async assess(context) {
249
- this.log("Starting authentication assessment");
249
+ this.logger.info("Starting authentication assessment");
250
250
  this.testCount = 0;
251
251
  const oauthIndicators = [];
252
252
  const localResourceIndicators = [];
@@ -323,7 +323,7 @@ export class AuthenticationAssessor extends BaseAssessor {
323
323
  // Generate additional recommendations from auth config findings
324
324
  const authConfigRecommendations = authConfigAnalysis.findings.map((f) => f.recommendation ||
325
325
  `Review ${f.type}: ${f.message} (${f.file || "unknown file"})`);
326
- this.log(`Assessment complete: auth=${authMethod}, localDeps=${hasLocalDependencies}, tlsEnforced=${transportSecurity.tlsEnforced}, authConfigFindings=${authConfigAnalysis.totalFindings}`);
326
+ this.logger.info(`Assessment complete: auth=${authMethod}, localDeps=${hasLocalDependencies}, tlsEnforced=${transportSecurity.tlsEnforced}, authConfigFindings=${authConfigAnalysis.totalFindings}`);
327
327
  return {
328
328
  authMethod,
329
329
  hasLocalDependencies,
@@ -594,7 +594,7 @@ export class AuthenticationAssessor extends BaseAssessor {
594
594
  // Issue #65: Apply file limit to prevent performance issues on large codebases
595
595
  let sourceFiles = Array.from(context.sourceCodeFiles);
596
596
  if (sourceFiles.length > MAX_FILES) {
597
- this.log(`Rate limiting: Analyzing ${MAX_FILES} of ${sourceFiles.length} files`);
597
+ this.logger.info(`Rate limiting: Analyzing ${MAX_FILES} of ${sourceFiles.length} files`);
598
598
  sourceFiles = sourceFiles.slice(0, MAX_FILES);
599
599
  }
600
600
  for (const [filePath, content] of sourceFiles) {
@@ -776,7 +776,7 @@ export class AuthenticationAssessor extends BaseAssessor {
776
776
  }
777
777
  catch (error) {
778
778
  // Warning 4 fix: Handle malformed files gracefully
779
- this.log(`Error analyzing ${filePath}: ${error}`);
779
+ this.logger.info(`Error analyzing ${filePath}: ${error}`);
780
780
  continue;
781
781
  }
782
782
  }
@@ -10,7 +10,6 @@ export declare abstract class BaseAssessor<T = unknown> {
10
10
  protected config: AssessmentConfiguration;
11
11
  protected logger: Logger;
12
12
  protected testCount: number;
13
- private deprecationWarningsEmitted;
14
13
  constructor(config: AssessmentConfiguration);
15
14
  /**
16
15
  * Abstract method that each assessor must implement
@@ -20,19 +19,6 @@ export declare abstract class BaseAssessor<T = unknown> {
20
19
  * Common method to determine status based on pass rate
21
20
  */
22
21
  protected determineStatus(passed: number, total: number, threshold?: number): AssessmentStatus;
23
- /**
24
- * Log assessment progress
25
- * @deprecated Use this.logger.info() directly for structured logging with context. Will be removed in v2.0.0.
26
- */
27
- protected log(message: string): void;
28
- /**
29
- * Log error with optional context
30
- * @deprecated Use this.logger.error() directly for structured logging with context. Will be removed in v2.0.0.
31
- *
32
- * @param message - Description of what operation failed
33
- * @param error - The error that occurred (optional)
34
- */
35
- protected logError(message: string, error?: unknown): void;
36
22
  /**
37
23
  * Handle an error with logging and structured result
38
24
  *
@@ -1 +1 @@
1
- {"version":3,"file":"BaseAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/BaseAssessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAwC,MAAM,eAAe,CAAC;AAC7E,OAAO,EAGL,WAAW,EAEZ,MAAM,eAAe,CAAC;AAGvB,8BAAsB,YAAY,CAAC,CAAC,GAAG,OAAO;IAC5C,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;IAGhC,OAAO,CAAC,0BAA0B,CAGhC;gBAEU,MAAM,EAAE,uBAAuB;IAS3C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAY,GACtB,gBAAgB;IAUnB;;;OAGG;IACH,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWpC;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAW1D;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,WAAW,EACzC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,OAAO,CAAC,CAAC,CAAM,GACxB,CAAC;IAsBJ;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,SAAS,CAAC,gBAAgB,CACxB,OAAO,EAAE,MAAM,uBAAuB,CAAC,sBAAsB,CAAC,GAC7D,OAAO;IAIV;;OAEG;cACa,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;;;;;;;OAUG;cACa,kBAAkB,CAAC,CAAC,EAClC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,GAAE,MAAgC,GAC1C,OAAO,CAAC,CAAC,CAAC;IAOb;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS9C;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAgBrD;;;;;;OAMG;IACH,SAAS,CAAC,eAAe,CACvB,QAAQ,EAAE,OAAO,EACjB,UAAU,GAAE,OAAe,GAC1B,OAAO;IA+CV;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG;QAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;CA2BF"}
1
+ {"version":3,"file":"BaseAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/BaseAssessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAwC,MAAM,eAAe,CAAC;AAC7E,OAAO,EAGL,WAAW,EAEZ,MAAM,eAAe,CAAC;AAGvB,8BAAsB,YAAY,CAAC,CAAC,GAAG,OAAO;IAC5C,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,SAAS,EAAE,MAAM,CAAK;gBAEpB,MAAM,EAAE,uBAAuB;IAS3C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAY,GACtB,gBAAgB;IAUnB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,WAAW,EACzC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,OAAO,CAAC,CAAC,CAAM,GACxB,CAAC;IAsBJ;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,SAAS,CAAC,gBAAgB,CACxB,OAAO,EAAE,MAAM,uBAAuB,CAAC,sBAAsB,CAAC,GAC7D,OAAO;IAIV;;OAEG;cACa,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;;;;;;;OAUG;cACa,kBAAkB,CAAC,CAAC,EAClC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,GAAE,MAAgC,GAC1C,OAAO,CAAC,CAAC,CAAC;IAOb;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS9C;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAgBrD;;;;;;OAMG;IACH,SAAS,CAAC,eAAe,CACvB,QAAQ,EAAE,OAAO,EACjB,UAAU,GAAE,OAAe,GAC1B,OAAO;IA+CV;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG;QAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;CA2BF"}
@@ -9,11 +9,6 @@ export class BaseAssessor {
9
9
  config;
10
10
  logger;
11
11
  testCount = 0;
12
- // Track deprecation warnings to emit only once per instance
13
- deprecationWarningsEmitted = {
14
- log: false,
15
- logError: false,
16
- };
17
12
  constructor(config) {
18
13
  this.config = config;
19
14
  // Create logger from config, using class name as prefix
@@ -32,33 +27,6 @@ export class BaseAssessor {
32
27
  return "NEED_MORE_INFO";
33
28
  return "FAIL";
34
29
  }
35
- /**
36
- * Log assessment progress
37
- * @deprecated Use this.logger.info() directly for structured logging with context. Will be removed in v2.0.0.
38
- */
39
- log(message) {
40
- if (!this.deprecationWarningsEmitted.log) {
41
- this.logger.warn("BaseAssessor.log() is deprecated. Use this.logger.info() instead. " +
42
- "This method will be removed in v2.0.0.");
43
- this.deprecationWarningsEmitted.log = true;
44
- }
45
- this.logger.info(message);
46
- }
47
- /**
48
- * Log error with optional context
49
- * @deprecated Use this.logger.error() directly for structured logging with context. Will be removed in v2.0.0.
50
- *
51
- * @param message - Description of what operation failed
52
- * @param error - The error that occurred (optional)
53
- */
54
- logError(message, error) {
55
- if (!this.deprecationWarningsEmitted.logError) {
56
- this.logger.warn("BaseAssessor.logError() is deprecated. Use this.logger.error() instead. " +
57
- "This method will be removed in v2.0.0.");
58
- this.deprecationWarningsEmitted.logError = true;
59
- }
60
- this.logger.error(message, error ? { error: String(error) } : undefined);
61
- }
62
30
  /**
63
31
  * Handle an error with logging and structured result
64
32
  *
@@ -147,7 +115,7 @@ export class BaseAssessor {
147
115
  return JSON.parse(text);
148
116
  }
149
117
  catch (error) {
150
- this.logError(`Failed to parse JSON: ${text}`, error);
118
+ this.logger.error(`Failed to parse JSON: ${text}`, { error });
151
119
  return null;
152
120
  }
153
121
  }
@@ -65,7 +65,7 @@ export class CrossCapabilitySecurityAssessor extends BaseAssessor {
65
65
  const tools = context.tools || [];
66
66
  const resources = context.resources || [];
67
67
  const prompts = context.prompts || [];
68
- this.log(`Testing cross-capability security: ${tools.length} tools, ${resources.length} resources, ${prompts.length} prompts`);
68
+ this.logger.info(`Testing cross-capability security: ${tools.length} tools, ${resources.length} resources, ${prompts.length} prompts`);
69
69
  // Test 1: Tool->Resource access patterns
70
70
  const toolResourceResults = this.testToolResourceAccess(tools, resources);
71
71
  results.push(...toolResourceResults);
@@ -15,7 +15,7 @@
15
15
  import { BaseAssessor } from "./BaseAssessor.js";
16
16
  export class DeveloperExperienceAssessor extends BaseAssessor {
17
17
  async assess(context) {
18
- this.log("Starting developer experience assessment");
18
+ this.logger.info("Starting developer experience assessment");
19
19
  const readmeContent = context.readmeContent || "";
20
20
  // Assess documentation
21
21
  const documentationMetrics = this.analyzeDocumentation(readmeContent, context.tools, "verbose");
@@ -16,7 +16,7 @@ export class DocumentationAssessor extends BaseAssessor {
16
16
  });
17
17
  }
18
18
  async assess(context) {
19
- this.log("Starting documentation assessment");
19
+ this.logger.info("Starting documentation assessment");
20
20
  const readmeContent = context.readmeContent || "";
21
21
  const validVerbosityLevels = ["minimal", "standard", "verbose"];
22
22
  const configVerbosity = this.config.documentationVerbosity;
@@ -27,7 +27,7 @@ export class DocumentationAssessor extends BaseAssessor {
27
27
  verbosity = configVerbosity;
28
28
  }
29
29
  else {
30
- this.log(`Warning: Invalid documentationVerbosity "${configVerbosity}". ` +
30
+ this.logger.info(`Warning: Invalid documentationVerbosity "${configVerbosity}". ` +
31
31
  `Valid options: ${validVerbosityLevels.join(", ")}. Using "verbose".`);
32
32
  }
33
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandlingAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ErrorHandlingAssessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EAIxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,qBAAa,qBAAsB,SAAQ,YAAY;IAC/C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiE1E,OAAO,CAAC,qBAAqB;YAqDf,qBAAqB;YAuBrB,qBAAqB;YAmGrB,cAAc;YAmFd,iBAAiB;YA8DjB,kBAAkB;IA6DhC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,uBAAuB;IA4B/B,OAAO,CAAC,gBAAgB;IAoGxB,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,mBAAmB;IAuE3B,OAAO,CAAC,uBAAuB;CA4ChC"}
1
+ {"version":3,"file":"ErrorHandlingAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ErrorHandlingAssessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,uBAAuB,EAIxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,qBAAa,qBAAsB,SAAQ,YAAY;IAC/C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiE1E,OAAO,CAAC,qBAAqB;YAuDf,qBAAqB;YAuBrB,qBAAqB;YAmGrB,cAAc;YAmFd,iBAAiB;YA8DjB,kBAAkB;IA6DhC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,uBAAuB;IA4B/B,OAAO,CAAC,gBAAgB;IAoGxB,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,mBAAmB;IAuE3B,OAAO,CAAC,uBAAuB;CA4ChC"}
@@ -6,7 +6,7 @@ import { BaseAssessor } from "./BaseAssessor.js";
6
6
  import { createConcurrencyLimit } from "../lib/concurrencyLimit.js";
7
7
  export class ErrorHandlingAssessor extends BaseAssessor {
8
8
  async assess(context) {
9
- this.log("Starting error handling assessment");
9
+ this.logger.info("Starting error handling assessment");
10
10
  const testDetails = [];
11
11
  let passedTests = 0;
12
12
  // Test a sample of tools for error handling
@@ -14,7 +14,7 @@ export class ErrorHandlingAssessor extends BaseAssessor {
14
14
  // Parallel tool testing with concurrency limit
15
15
  const concurrency = this.config.maxParallelTests ?? 5;
16
16
  const limit = createConcurrencyLimit(concurrency, this.logger);
17
- this.log(`Testing ${toolsToTest.length} tools for error handling with concurrency limit of ${concurrency}`);
17
+ this.logger.info(`Testing ${toolsToTest.length} tools for error handling with concurrency limit of ${concurrency}`);
18
18
  const allToolTests = await Promise.all(toolsToTest.map((tool) => limit(async () => {
19
19
  const toolTests = await this.testToolErrorHandling(tool, context.callTool);
20
20
  // Add delay between tests to avoid rate limiting
@@ -50,34 +50,34 @@ export class ErrorHandlingAssessor extends BaseAssessor {
50
50
  if (this.config.selectedToolsForTesting !== undefined) {
51
51
  // Warn if deprecated maxToolsToTestForErrors is also set
52
52
  if (this.config.maxToolsToTestForErrors !== undefined) {
53
- this.log(`Warning: Both selectedToolsForTesting and maxToolsToTestForErrors are set. ` +
53
+ this.logger.info(`Warning: Both selectedToolsForTesting and maxToolsToTestForErrors are set. ` +
54
54
  `Using selectedToolsForTesting (maxToolsToTestForErrors is deprecated).`);
55
55
  }
56
56
  const selectedNames = new Set(this.config.selectedToolsForTesting);
57
57
  const selectedTools = tools.filter((tool) => selectedNames.has(tool.name));
58
58
  // Empty array means user explicitly selected 0 tools
59
59
  if (this.config.selectedToolsForTesting.length === 0) {
60
- this.log(`User selected 0 tools for error handling - skipping tests`);
60
+ this.logger.info(`User selected 0 tools for error handling - skipping tests`);
61
61
  return [];
62
62
  }
63
63
  // If no tools matched the names (config out of sync), log warning but respect selection
64
64
  if (selectedTools.length === 0) {
65
- this.log(`Warning: No tools matched selection (${this.config.selectedToolsForTesting.join(", ")})`);
65
+ this.logger.info(`Warning: No tools matched selection (${this.config.selectedToolsForTesting.join(", ")})`);
66
66
  return [];
67
67
  }
68
- this.log(`Testing ${selectedTools.length} selected tools out of ${tools.length} for error handling`);
68
+ this.logger.info(`Testing ${selectedTools.length} selected tools out of ${tools.length} for error handling`);
69
69
  return selectedTools;
70
70
  }
71
71
  // Backward compatibility: use old maxToolsToTestForErrors configuration
72
72
  const configLimit = this.config.maxToolsToTestForErrors;
73
73
  // If -1, test all tools
74
74
  if (configLimit === -1) {
75
- this.log(`Testing all ${tools.length} tools for error handling`);
75
+ this.logger.info(`Testing all ${tools.length} tools for error handling`);
76
76
  return tools;
77
77
  }
78
78
  // Otherwise use the configured limit (default to 5 if not set)
79
79
  const maxTools = Math.min(configLimit ?? 5, tools.length);
80
- this.log(`Testing ${maxTools} out of ${tools.length} tools for error handling`);
80
+ this.logger.info(`Testing ${maxTools} out of ${tools.length} tools for error handling`);
81
81
  return tools.slice(0, maxTools);
82
82
  }
83
83
  async testToolErrorHandling(tool, callTool) {
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalAPIScannerAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ExternalAPIScannerAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAEV,4BAA4B,EAE7B,MAAM,uBAAuB,CAAC;AAmE/B,qBAAa,0BAA2B,SAAQ,YAAY;IACpD,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IA6DxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B"}
1
+ {"version":3,"file":"ExternalAPIScannerAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ExternalAPIScannerAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAEV,4BAA4B,EAE7B,MAAM,uBAAuB,CAAC;AAmE/B,qBAAa,0BAA2B,SAAQ,YAAY;IACpD,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IA+DxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B"}
@@ -74,13 +74,13 @@ const SKIP_FILE_PATTERNS = [
74
74
  ];
75
75
  export class ExternalAPIScannerAssessor extends BaseAssessor {
76
76
  async assess(context) {
77
- this.log("Starting external API scanner assessment");
77
+ this.logger.info("Starting external API scanner assessment");
78
78
  this.resetTestCount();
79
79
  const detectedAPIs = [];
80
80
  let scannedFiles = 0;
81
81
  // Check if source code analysis is enabled
82
82
  if (!context.sourceCodeFiles || !context.config.enableSourceCodeAnalysis) {
83
- this.log("Source code analysis not enabled, skipping external API scan");
83
+ this.logger.info("Source code analysis not enabled, skipping external API scan");
84
84
  return this.createNoSourceResult();
85
85
  }
86
86
  // Scan each source file
@@ -100,7 +100,7 @@ export class ExternalAPIScannerAssessor extends BaseAssessor {
100
100
  const status = this.computeStatus(detectedAPIs, affiliationWarning);
101
101
  const explanation = this.generateExplanation(detectedAPIs, uniqueServices, affiliationWarning, scannedFiles);
102
102
  const recommendations = this.generateRecommendations(uniqueServices, affiliationWarning);
103
- this.log(`External API scan complete: ${detectedAPIs.length} APIs found in ${scannedFiles} files`);
103
+ this.logger.info(`External API scan complete: ${detectedAPIs.length} APIs found in ${scannedFiles} files`);
104
104
  return {
105
105
  detectedAPIs,
106
106
  uniqueServices,