@bryan-thompson/inspector-assessment 1.26.5 → 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.
- package/cli/build/__tests__/assessment-runner/assessment-executor.test.js +248 -0
- package/cli/build/__tests__/assessment-runner/config-builder.test.js +289 -0
- package/cli/build/__tests__/assessment-runner/index.test.js +41 -0
- package/cli/build/__tests__/assessment-runner/server-config.test.js +249 -0
- package/cli/build/__tests__/assessment-runner/server-connection.test.js +221 -0
- package/cli/build/__tests__/assessment-runner/source-loader.test.js +341 -0
- package/cli/build/__tests__/assessment-runner/tool-wrapper.test.js +114 -0
- package/cli/build/__tests__/assessment-runner-facade.test.js +118 -0
- package/cli/build/assess-full.js +26 -1254
- package/cli/build/lib/assessment-runner/assessment-executor.js +323 -0
- package/cli/build/lib/assessment-runner/config-builder.js +127 -0
- package/cli/build/lib/assessment-runner/index.js +20 -0
- package/cli/build/lib/assessment-runner/server-config.js +78 -0
- package/cli/build/lib/assessment-runner/server-connection.js +80 -0
- package/cli/build/lib/assessment-runner/source-loader.js +139 -0
- package/cli/build/lib/assessment-runner/tool-wrapper.js +40 -0
- package/cli/build/lib/assessment-runner/types.js +8 -0
- package/cli/build/lib/assessment-runner.js +12 -0
- package/cli/build/lib/cli-parser.js +419 -0
- package/cli/build/lib/comparison-handler.js +84 -0
- package/cli/build/lib/result-output.js +154 -0
- package/cli/package.json +1 -1
- package/client/dist/assets/{OAuthCallback-DpdInvWI.js → OAuthCallback-kF1MLuwg.js} +1 -1
- package/client/dist/assets/{OAuthDebugCallback-D1ImpKK5.js → OAuthDebugCallback-Nv-8u0GR.js} +1 -1
- package/client/dist/assets/{index-umcoGmYw.js → index-CCiX5wkF.js} +4 -4
- package/client/dist/index.html +1 -1
- package/client/lib/lib/assessment/configTypes.d.ts +2 -0
- package/client/lib/lib/assessment/configTypes.d.ts.map +1 -1
- package/client/lib/lib/securityPatterns.d.ts +4 -2
- package/client/lib/lib/securityPatterns.d.ts.map +1 -1
- package/client/lib/lib/securityPatterns.js +146 -2
- package/client/lib/services/assessment/modules/AUPComplianceAssessor.js +9 -9
- package/client/lib/services/assessment/modules/AuthenticationAssessor.js +4 -4
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts +0 -14
- package/client/lib/services/assessment/modules/BaseAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/BaseAssessor.js +1 -33
- package/client/lib/services/assessment/modules/CrossCapabilitySecurityAssessor.js +1 -1
- package/client/lib/services/assessment/modules/DeveloperExperienceAssessor.js +1 -1
- package/client/lib/services/assessment/modules/DocumentationAssessor.js +2 -2
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ErrorHandlingAssessor.js +8 -8
- package/client/lib/services/assessment/modules/ExternalAPIScannerAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ExternalAPIScannerAssessor.js +3 -3
- package/client/lib/services/assessment/modules/FunctionalityAssessor.js +9 -9
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/MCPSpecComplianceAssessor.js +12 -12
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ManifestValidationAssessor.js +9 -5
- package/client/lib/services/assessment/modules/PortabilityAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/PortabilityAssessor.js +3 -3
- package/client/lib/services/assessment/modules/ProhibitedLibrariesAssessor.js +4 -4
- package/client/lib/services/assessment/modules/PromptAssessor.js +2 -2
- package/client/lib/services/assessment/modules/ProtocolComplianceAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/ProtocolComplianceAssessor.js +7 -7
- package/client/lib/services/assessment/modules/ProtocolConformanceAssessor.js +1 -1
- package/client/lib/services/assessment/modules/ResourceAssessor.js +1 -1
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts +25 -2
- package/client/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/SecurityAssessor.js +149 -17
- package/client/lib/services/assessment/modules/TemporalAssessor.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/TemporalAssessor.js +10 -10
- package/client/lib/services/assessment/modules/ToolAnnotationAssessor.js +9 -9
- package/client/lib/services/assessment/modules/UsabilityAssessor.js +1 -1
- package/client/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.js +37 -0
- package/client/lib/services/assessment/modules/index.d.ts +3 -0
- package/client/lib/services/assessment/modules/index.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/ChainExecutionTester.d.ts +104 -0
- package/client/lib/services/assessment/modules/securityTests/ChainExecutionTester.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/ChainExecutionTester.js +257 -0
- package/client/lib/services/assessment/modules/securityTests/ConfidenceScorer.d.ts +57 -0
- package/client/lib/services/assessment/modules/securityTests/ConfidenceScorer.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/ConfidenceScorer.js +199 -0
- package/client/lib/services/assessment/modules/securityTests/CrossToolStateTester.d.ts +91 -0
- package/client/lib/services/assessment/modules/securityTests/CrossToolStateTester.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/CrossToolStateTester.js +225 -0
- package/client/lib/services/assessment/modules/securityTests/ErrorClassifier.d.ts +57 -0
- package/client/lib/services/assessment/modules/securityTests/ErrorClassifier.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/ErrorClassifier.js +113 -0
- package/client/lib/services/assessment/modules/securityTests/ExecutionArtifactDetector.d.ts +49 -0
- package/client/lib/services/assessment/modules/securityTests/ExecutionArtifactDetector.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/ExecutionArtifactDetector.js +74 -0
- package/client/lib/services/assessment/modules/securityTests/MathAnalyzer.d.ts +58 -0
- package/client/lib/services/assessment/modules/securityTests/MathAnalyzer.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/MathAnalyzer.js +251 -0
- package/client/lib/services/assessment/modules/securityTests/SafeResponseDetector.d.ts +59 -0
- package/client/lib/services/assessment/modules/securityTests/SafeResponseDetector.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/SafeResponseDetector.js +151 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts +349 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.d.ts.map +1 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityPatternLibrary.js +904 -0
- package/client/lib/services/assessment/modules/securityTests/SecurityPayloadGenerator.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityPayloadGenerator.js +49 -24
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts +122 -85
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.js +443 -1176
- package/client/lib/services/assessment/modules/securityTests/index.d.ts +3 -1
- package/client/lib/services/assessment/modules/securityTests/index.d.ts.map +1 -1
- package/client/lib/services/assessment/modules/securityTests/index.js +2 -0
- package/client/package.json +1 -1
- package/package.json +9 -1
- package/server/package.json +1 -1
|
@@ -246,7 +246,7 @@ export class AuthenticationAssessor extends BaseAssessor {
|
|
|
246
246
|
* Run authentication assessment
|
|
247
247
|
*/
|
|
248
248
|
async assess(context) {
|
|
249
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
65
|
+
this.logger.info(`Warning: No tools matched selection (${this.config.selectedToolsForTesting.join(", ")})`);
|
|
66
66
|
return [];
|
|
67
67
|
}
|
|
68
|
-
this.
|
|
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.
|
|
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.
|
|
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;
|
|
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.
|
|
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.
|
|
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.
|
|
103
|
+
this.logger.info(`External API scan complete: ${detectedAPIs.length} APIs found in ${scannedFiles} files`);
|
|
104
104
|
return {
|
|
105
105
|
detectedAPIs,
|
|
106
106
|
uniqueServices,
|
|
@@ -23,23 +23,23 @@ export class FunctionalityAssessor extends BaseAssessor {
|
|
|
23
23
|
const selectedTools = tools.filter((tool) => selectedNames.has(tool.name));
|
|
24
24
|
// Empty array means user explicitly selected 0 tools
|
|
25
25
|
if (this.config.selectedToolsForTesting.length === 0) {
|
|
26
|
-
this.
|
|
26
|
+
this.logger.info(`User selected 0 tools for functionality testing - skipping tests`);
|
|
27
27
|
return [];
|
|
28
28
|
}
|
|
29
29
|
// If no tools matched the names (config out of sync), log warning but respect selection
|
|
30
30
|
if (selectedTools.length === 0) {
|
|
31
|
-
this.
|
|
31
|
+
this.logger.info(`Warning: No tools matched selection (${this.config.selectedToolsForTesting.join(", ")})`);
|
|
32
32
|
return [];
|
|
33
33
|
}
|
|
34
|
-
this.
|
|
34
|
+
this.logger.info(`Testing ${selectedTools.length} selected tools out of ${tools.length} for functionality`);
|
|
35
35
|
return selectedTools;
|
|
36
36
|
}
|
|
37
37
|
// Default: test all tools
|
|
38
|
-
this.
|
|
38
|
+
this.logger.info(`Testing all ${tools.length} tools for functionality`);
|
|
39
39
|
return tools;
|
|
40
40
|
}
|
|
41
41
|
async assess(context) {
|
|
42
|
-
this.
|
|
42
|
+
this.logger.info(`Starting functionality assessment${this.config.reviewerMode ? " (reviewer mode - quick verification)" : ""}`);
|
|
43
43
|
const toolResults = [];
|
|
44
44
|
const brokenTools = [];
|
|
45
45
|
let workingTools = 0;
|
|
@@ -71,7 +71,7 @@ export class FunctionalityAssessor extends BaseAssessor {
|
|
|
71
71
|
batchCount = 0;
|
|
72
72
|
lastBatchTime = Date.now();
|
|
73
73
|
};
|
|
74
|
-
this.
|
|
74
|
+
this.logger.info(`Testing ${toolsToTest.length} tools with concurrency limit of ${concurrency}`);
|
|
75
75
|
const results = await Promise.all(toolsToTest.map((tool) => limit(async () => {
|
|
76
76
|
this.testCount++;
|
|
77
77
|
completedTests++;
|
|
@@ -103,7 +103,7 @@ export class FunctionalityAssessor extends BaseAssessor {
|
|
|
103
103
|
else if (result.status === "broken") {
|
|
104
104
|
brokenTools.push(result.toolName);
|
|
105
105
|
if (this.config.skipBrokenTools) {
|
|
106
|
-
this.
|
|
106
|
+
this.logger.info(`Skipping further tests for broken tool: ${result.toolName}`);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -141,7 +141,7 @@ export class FunctionalityAssessor extends BaseAssessor {
|
|
|
141
141
|
const cleanedParams = schema
|
|
142
142
|
? cleanParams(testParams, schema)
|
|
143
143
|
: testParams;
|
|
144
|
-
this.
|
|
144
|
+
this.logger.info(`Testing tool: ${tool.name} with params: ${JSON.stringify(cleanedParams)}`);
|
|
145
145
|
// Execute tool with timeout
|
|
146
146
|
const response = await this.executeWithTimeout(callTool(tool.name, cleanedParams), this.config.testTimeout);
|
|
147
147
|
const executionTime = Date.now() - startTime;
|
|
@@ -197,7 +197,7 @@ export class FunctionalityAssessor extends BaseAssessor {
|
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
199
|
catch (error) {
|
|
200
|
-
this.
|
|
200
|
+
this.logger.error(`Tool execution failed: ${tool.name}`, { error });
|
|
201
201
|
return {
|
|
202
202
|
toolName: tool.name,
|
|
203
203
|
tested: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MCPSpecComplianceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/MCPSpecComplianceAssessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,2BAA2B,EAM3B,uBAAuB,EAKxB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,OAAO,CAAC,GAAG,CAAc;gBAEb,MAAM,EAAE,uBAAuB;IAa3C;;;OAGG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,2BAA2B,CAAC;IAyHvC;;OAEG;IACH,OAAO,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"MCPSpecComplianceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/MCPSpecComplianceAssessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,2BAA2B,EAM3B,uBAAuB,EAKxB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,OAAO,CAAC,GAAG,CAAc;gBAEb,MAAM,EAAE,uBAAuB;IAa3C;;;OAGG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,2BAA2B,CAAC;IAyHvC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;;OAGG;YACW,sBAAsB;IA6BpC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;;OAGG;YACW,mBAAmB;IAsCjC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAoDnC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IA8FnC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAyFjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2C7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAoF5B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAyBjC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA0DtC"}
|
|
@@ -90,7 +90,7 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
90
90
|
const totalChecks = checksArray.length;
|
|
91
91
|
const complianceScore = (passedCount / totalChecks) * 100;
|
|
92
92
|
// Log score/check consistency for debugging
|
|
93
|
-
this.
|
|
93
|
+
this.logger.info(`MCP Compliance: ${passedCount}/${totalChecks} checks passed (${complianceScore.toFixed(1)}%)`);
|
|
94
94
|
// Determine status based on protocol checks only
|
|
95
95
|
let status;
|
|
96
96
|
if (!protocolChecks.serverInfoValidity.passed) {
|
|
@@ -135,16 +135,16 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
135
135
|
const metadata = context.serverInfo?.metadata;
|
|
136
136
|
const protocolVersion = metadata?.protocolVersion;
|
|
137
137
|
if (protocolVersion) {
|
|
138
|
-
this.
|
|
138
|
+
this.logger.info(`Using protocol version from metadata: ${protocolVersion}`);
|
|
139
139
|
return protocolVersion;
|
|
140
140
|
}
|
|
141
141
|
// Fall back to server version
|
|
142
142
|
if (context.serverInfo?.version) {
|
|
143
|
-
this.
|
|
143
|
+
this.logger.info(`Using server version as protocol version: ${context.serverInfo.version}`);
|
|
144
144
|
return context.serverInfo.version;
|
|
145
145
|
}
|
|
146
146
|
// Default if no version information available
|
|
147
|
-
this.
|
|
147
|
+
this.logger.info("No protocol version information available, using default");
|
|
148
148
|
return "2025-06-18"; // Current MCP spec version as fallback
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
@@ -183,14 +183,14 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
183
183
|
// Check if name is properly set (should be a string, not null/undefined)
|
|
184
184
|
if (serverInfo.name !== undefined && serverInfo.name !== null) {
|
|
185
185
|
if (typeof serverInfo.name !== "string") {
|
|
186
|
-
this.
|
|
186
|
+
this.logger.info("Server info name is not a string");
|
|
187
187
|
return false;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
190
|
// Check if metadata is properly formatted (should be an object if present)
|
|
191
191
|
if (serverInfo.metadata !== undefined && serverInfo.metadata !== null) {
|
|
192
192
|
if (typeof serverInfo.metadata !== "object") {
|
|
193
|
-
this.
|
|
193
|
+
this.logger.info("Server info metadata is not an object");
|
|
194
194
|
return false;
|
|
195
195
|
}
|
|
196
196
|
}
|
|
@@ -297,7 +297,7 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
297
297
|
const totalTools = tools.length;
|
|
298
298
|
const coveragePercent = totalTools > 0 ? Math.round((withOutputSchema / totalTools) * 100) : 0;
|
|
299
299
|
// Log for debugging
|
|
300
|
-
this.
|
|
300
|
+
this.logger.info(`Structured output support: ${withOutputSchema}/${totalTools} tools (${coveragePercent}%)`);
|
|
301
301
|
const coverage = {
|
|
302
302
|
totalTools,
|
|
303
303
|
withOutputSchema,
|
|
@@ -344,11 +344,11 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
344
344
|
}
|
|
345
345
|
// Check listChanged notification support
|
|
346
346
|
if (capabilities.resources.listChanged) {
|
|
347
|
-
this.
|
|
347
|
+
this.logger.info("Server declares resources.listChanged notification support");
|
|
348
348
|
}
|
|
349
349
|
// Check subscribe support
|
|
350
350
|
if (capabilities.resources.subscribe) {
|
|
351
|
-
this.
|
|
351
|
+
this.logger.info("Server declares resource subscription support");
|
|
352
352
|
}
|
|
353
353
|
this.testCount++;
|
|
354
354
|
}
|
|
@@ -362,13 +362,13 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
362
362
|
}
|
|
363
363
|
// Check listChanged notification support
|
|
364
364
|
if (capabilities.prompts.listChanged) {
|
|
365
|
-
this.
|
|
365
|
+
this.logger.info("Server declares prompts.listChanged notification support");
|
|
366
366
|
}
|
|
367
367
|
this.testCount++;
|
|
368
368
|
}
|
|
369
369
|
// Check logging capability
|
|
370
370
|
if (capabilities.logging) {
|
|
371
|
-
this.
|
|
371
|
+
this.logger.info("Server declares logging capability");
|
|
372
372
|
this.testCount++;
|
|
373
373
|
}
|
|
374
374
|
// Determine pass/fail
|
|
@@ -433,7 +433,7 @@ export class MCPSpecComplianceAssessor extends BaseAssessor {
|
|
|
433
433
|
(transport === "http" || transport === "streamable-http")) {
|
|
434
434
|
// For HTTP transport on 2025-06-18+, headers are required
|
|
435
435
|
// We assume compliance if using the new protocol version
|
|
436
|
-
this.
|
|
436
|
+
this.logger.info(`HTTP transport detected with protocol ${protocolVersion} - header compliance assumed`);
|
|
437
437
|
}
|
|
438
438
|
// Determine confidence based on detection method
|
|
439
439
|
const confidence = hasTransportMetadata ? "medium" : "low";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManifestValidationAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ManifestValidationAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,4BAA4B,EAK7B,MAAM,uBAAuB,CAAC;AAM/B,qBAAa,0BAA2B,SAAQ,YAAY;IAC1D;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IA6JxC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAiChC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8B7B;;OAEG;YACW,yBAAyB;
|
|
1
|
+
{"version":3,"file":"ManifestValidationAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ManifestValidationAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,4BAA4B,EAK7B,MAAM,uBAAuB,CAAC;AAM/B,qBAAa,0BAA2B,SAAQ,YAAY;IAC1D;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IA6JxC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAiChC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8B7B;;OAEG;YACW,yBAAyB;IAqFvC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0C3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;CA+ChC"}
|
|
@@ -19,7 +19,7 @@ export class ManifestValidationAssessor extends BaseAssessor {
|
|
|
19
19
|
* Run manifest validation assessment
|
|
20
20
|
*/
|
|
21
21
|
async assess(context) {
|
|
22
|
-
this.
|
|
22
|
+
this.logger.info("Starting manifest validation assessment");
|
|
23
23
|
this.testCount = 0;
|
|
24
24
|
// Check if manifest is available
|
|
25
25
|
if (!context.manifestJson && !context.manifestRaw) {
|
|
@@ -91,7 +91,7 @@ export class ManifestValidationAssessor extends BaseAssessor {
|
|
|
91
91
|
if (manifest.privacy_policies &&
|
|
92
92
|
Array.isArray(manifest.privacy_policies) &&
|
|
93
93
|
manifest.privacy_policies.length > 0) {
|
|
94
|
-
this.
|
|
94
|
+
this.logger.info(`Validating ${manifest.privacy_policies.length} privacy policy URL(s)`);
|
|
95
95
|
const policyResults = await this.validatePrivacyPolicyUrls(manifest.privacy_policies);
|
|
96
96
|
privacyPolicies = {
|
|
97
97
|
declared: manifest.privacy_policies,
|
|
@@ -121,7 +121,7 @@ export class ManifestValidationAssessor extends BaseAssessor {
|
|
|
121
121
|
const status = this.determineManifestStatus(validationResults, hasRequiredFields);
|
|
122
122
|
const explanation = this.generateExplanation(validationResults, hasRequiredFields, hasIcon, privacyPolicies);
|
|
123
123
|
const recommendations = this.generateRecommendations(validationResults, privacyPolicies);
|
|
124
|
-
this.
|
|
124
|
+
this.logger.info(`Assessment complete: ${validationResults.filter((r) => r.valid).length}/${validationResults.length} checks passed`);
|
|
125
125
|
return {
|
|
126
126
|
hasManifest: true,
|
|
127
127
|
manifestVersion: manifest.manifest_version,
|
|
@@ -413,7 +413,9 @@ export class ManifestValidationAssessor extends BaseAssessor {
|
|
|
413
413
|
new URL(url);
|
|
414
414
|
}
|
|
415
415
|
catch (error) {
|
|
416
|
-
this.
|
|
416
|
+
this.logger.error(`Invalid privacy policy URL format: ${url}`, {
|
|
417
|
+
error,
|
|
418
|
+
});
|
|
417
419
|
results.push({
|
|
418
420
|
url,
|
|
419
421
|
accessible: false,
|
|
@@ -460,7 +462,9 @@ export class ManifestValidationAssessor extends BaseAssessor {
|
|
|
460
462
|
});
|
|
461
463
|
}
|
|
462
464
|
catch (fetchError) {
|
|
463
|
-
this.
|
|
465
|
+
this.logger.error(`Failed to fetch privacy policy URL: ${url}`, {
|
|
466
|
+
error: fetchError,
|
|
467
|
+
});
|
|
464
468
|
results.push({
|
|
465
469
|
url,
|
|
466
470
|
accessible: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PortabilityAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/PortabilityAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,uBAAuB,CAAC;AA8H/B,qBAAa,mBAAoB,SAAQ,YAAY;IACnD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"PortabilityAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/PortabilityAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,uBAAuB,CAAC;AA8H/B,qBAAa,mBAAoB,SAAQ,YAAY;IACnD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAyHxE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiD5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuE/B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiIhB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAmClC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqC3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAmDhC"}
|
|
@@ -124,7 +124,7 @@ export class PortabilityAssessor extends BaseAssessor {
|
|
|
124
124
|
* Run portability assessment
|
|
125
125
|
*/
|
|
126
126
|
async assess(context) {
|
|
127
|
-
this.
|
|
127
|
+
this.logger.info("Starting portability assessment");
|
|
128
128
|
this.testCount = 0;
|
|
129
129
|
const issues = [];
|
|
130
130
|
let scannedFiles = 0;
|
|
@@ -159,7 +159,7 @@ export class PortabilityAssessor extends BaseAssessor {
|
|
|
159
159
|
}
|
|
160
160
|
// Check source code files if available
|
|
161
161
|
if (context.sourceCodeFiles && context.config.enableSourceCodeAnalysis) {
|
|
162
|
-
this.
|
|
162
|
+
this.logger.info("Scanning source code files for portability issues...");
|
|
163
163
|
for (const [filePath, content] of context.sourceCodeFiles) {
|
|
164
164
|
// Skip irrelevant files
|
|
165
165
|
if (this.shouldSkipFile(filePath))
|
|
@@ -185,7 +185,7 @@ export class PortabilityAssessor extends BaseAssessor {
|
|
|
185
185
|
const status = this.determinePortabilityStatus(issues, usesDirname, usesBundleRoot);
|
|
186
186
|
const explanation = this.generateExplanation(issues, usesDirname, usesBundleRoot, scannedFiles);
|
|
187
187
|
const recommendations = this.generateRecommendations(issues, usesDirname, usesBundleRoot);
|
|
188
|
-
this.
|
|
188
|
+
this.logger.info(`Assessment complete: ${issues.length} portability issues found`);
|
|
189
189
|
// NEW: Analyze shell commands and platform coverage (Issue #9)
|
|
190
190
|
const shellCommands = this.analyzeShellCommands(context);
|
|
191
191
|
const platformCoverage = this.analyzePlatformCoverage(issues);
|
|
@@ -16,7 +16,7 @@ export class ProhibitedLibrariesAssessor extends BaseAssessor {
|
|
|
16
16
|
* Run prohibited libraries assessment
|
|
17
17
|
*/
|
|
18
18
|
async assess(context) {
|
|
19
|
-
this.
|
|
19
|
+
this.logger.info("Starting prohibited libraries assessment");
|
|
20
20
|
this.testCount = 0;
|
|
21
21
|
const matches = [];
|
|
22
22
|
const scannedFiles = [];
|
|
@@ -24,7 +24,7 @@ export class ProhibitedLibrariesAssessor extends BaseAssessor {
|
|
|
24
24
|
let hasMediaLibraries = false;
|
|
25
25
|
// Check package.json dependencies
|
|
26
26
|
if (context.packageJson) {
|
|
27
|
-
this.
|
|
27
|
+
this.logger.info("Scanning package.json dependencies...");
|
|
28
28
|
this.testCount++;
|
|
29
29
|
scannedFiles.push("package.json");
|
|
30
30
|
const packageJson = context.packageJson;
|
|
@@ -64,7 +64,7 @@ export class ProhibitedLibrariesAssessor extends BaseAssessor {
|
|
|
64
64
|
}
|
|
65
65
|
// Check source code files if available
|
|
66
66
|
if (context.sourceCodeFiles && context.config.enableSourceCodeAnalysis) {
|
|
67
|
-
this.
|
|
67
|
+
this.logger.info("Scanning source code files...");
|
|
68
68
|
for (const [filePath, content] of context.sourceCodeFiles) {
|
|
69
69
|
// Check Python requirements files
|
|
70
70
|
if (filePath.endsWith("requirements.txt") ||
|
|
@@ -126,7 +126,7 @@ export class ProhibitedLibrariesAssessor extends BaseAssessor {
|
|
|
126
126
|
const status = this.calculateStatusFromMatches(uniqueMatches);
|
|
127
127
|
const explanation = this.generateExplanation(uniqueMatches, hasFinancialLibraries, hasMediaLibraries, scannedFiles);
|
|
128
128
|
const recommendations = this.generateRecommendations(uniqueMatches);
|
|
129
|
-
this.
|
|
129
|
+
this.logger.info(`Assessment complete: ${uniqueMatches.length} prohibited libraries found`);
|
|
130
130
|
return {
|
|
131
131
|
matches: uniqueMatches,
|
|
132
132
|
scannedFiles,
|
|
@@ -67,7 +67,7 @@ export class PromptAssessor extends BaseAssessor {
|
|
|
67
67
|
if (!context.prompts || context.prompts.length === 0) {
|
|
68
68
|
return this.createNoPromptsResponse();
|
|
69
69
|
}
|
|
70
|
-
this.
|
|
70
|
+
this.logger.info(`Testing ${context.prompts.length} prompts`);
|
|
71
71
|
// Test each prompt
|
|
72
72
|
for (const prompt of context.prompts) {
|
|
73
73
|
this.testCount++;
|
|
@@ -216,7 +216,7 @@ export class PromptAssessor extends BaseAssessor {
|
|
|
216
216
|
return { success: true, unsafeContent, executionTime };
|
|
217
217
|
}
|
|
218
218
|
catch (error) {
|
|
219
|
-
this.
|
|
219
|
+
this.logger.error(`Prompt execution failed: ${prompt.name}`, { error });
|
|
220
220
|
return {
|
|
221
221
|
success: false,
|
|
222
222
|
unsafeContent: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtocolComplianceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ProtocolComplianceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,2BAA2B,EAM3B,uBAAuB,EAKxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAOpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAmB9D;;;GAGG;AACH,MAAM,WAAW,4BAA6B,SAAQ,2BAA2B;IAC/E,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE;QAClB,mBAAmB,EAAE,aAAa,CAAC;QACnC,kBAAkB,EAAE,aAAa,CAAC;QAClC,uBAAuB,EAAE,aAAa,CAAC;KACxC,CAAC;CACH;AAED,qBAAa,0BAA2B,SAAQ,YAAY,CAAC,4BAA4B,CAAC;IACxF,OAAO,CAAC,GAAG,CAAc;gBAEb,MAAM,EAAE,uBAAuB;IAK3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IAyIxC;;OAEG;IACH,OAAO,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"ProtocolComplianceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ProtocolComplianceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,2BAA2B,EAM3B,uBAAuB,EAKxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAOpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAmB9D;;;GAGG;AACH,MAAM,WAAW,4BAA6B,SAAQ,2BAA2B;IAC/E,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE;QAClB,mBAAmB,EAAE,aAAa,CAAC;QACnC,kBAAkB,EAAE,aAAa,CAAC;QAClC,uBAAuB,EAAE,aAAa,CAAC;KACxC,CAAC;CACH;AAED,qBAAa,0BAA2B,SAAQ,YAAY,CAAC,4BAA4B,CAAC;IACxF,OAAO,CAAC,GAAG,CAAc;gBAEb,MAAM,EAAE,uBAAuB;IAK3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IAyIxC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;YACW,sBAAsB;IAuBpC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwC7B;;OAEG;YACW,mBAAmB;IAiCjC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAiDnC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAkEnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;YACW,wBAAwB;IA4GtC;;OAEG;YACW,uBAAuB;IA2FrC;;OAEG;YACW,4BAA4B;IAoD1C,OAAO,CAAC,yBAAyB;IAkEjC,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,oBAAoB;IA8E5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoC3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAqEhC"}
|