@bryan-thompson/inspector-assessment-client 1.25.1 → 1.25.5
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/dist/assets/{OAuthCallback-CkzX_H4T.js → OAuthCallback-Dl4GYls3.js} +1 -1
- package/dist/assets/{OAuthDebugCallback-jZEkm74B.js → OAuthDebugCallback-BdJ38Z-r.js} +1 -1
- package/dist/assets/{index-Df9Sx1jt.css → index-cHhcEXbr.css} +4 -0
- package/dist/assets/{index-BVx1dGJT.js → index-pfUiTdQb.js} +4 -4
- package/dist/index.html +2 -2
- package/lib/lib/assessment/configTypes.d.ts +3 -0
- package/lib/lib/assessment/configTypes.d.ts.map +1 -1
- package/lib/lib/assessment/configTypes.js +11 -6
- package/lib/lib/assessment/coreTypes.d.ts +65 -0
- package/lib/lib/assessment/coreTypes.d.ts.map +1 -1
- package/lib/lib/assessment/extendedTypes.d.ts +127 -0
- package/lib/lib/assessment/extendedTypes.d.ts.map +1 -1
- package/lib/lib/assessment/resultTypes.d.ts +45 -0
- package/lib/lib/assessment/resultTypes.d.ts.map +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.d.ts +4 -12
- package/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.js +49 -238
- package/lib/services/assessment/TestDataGenerator.d.ts +9 -1
- package/lib/services/assessment/TestDataGenerator.d.ts.map +1 -1
- package/lib/services/assessment/TestDataGenerator.js +32 -6
- package/lib/services/assessment/TestScenarioEngine.d.ts +9 -1
- package/lib/services/assessment/TestScenarioEngine.d.ts.map +1 -1
- package/lib/services/assessment/TestScenarioEngine.js +17 -14
- package/lib/services/assessment/ToolClassifier.d.ts +154 -27
- package/lib/services/assessment/ToolClassifier.d.ts.map +1 -1
- package/lib/services/assessment/ToolClassifier.js +171 -318
- package/lib/services/assessment/config/annotationPatterns.d.ts +3 -1
- package/lib/services/assessment/config/annotationPatterns.d.ts.map +1 -1
- package/lib/services/assessment/config/annotationPatterns.js +5 -2
- package/lib/services/assessment/config/architecturePatterns.d.ts +101 -0
- package/lib/services/assessment/config/architecturePatterns.d.ts.map +1 -0
- package/lib/services/assessment/config/architecturePatterns.js +248 -0
- package/lib/services/assessment/config/performanceConfig.d.ts +122 -0
- package/lib/services/assessment/config/performanceConfig.d.ts.map +1 -0
- package/lib/services/assessment/config/performanceConfig.js +154 -0
- package/lib/services/assessment/config/sanitizationPatterns.d.ts +63 -0
- package/lib/services/assessment/config/sanitizationPatterns.d.ts.map +1 -0
- package/lib/services/assessment/config/sanitizationPatterns.js +223 -0
- package/lib/services/assessment/lib/claudeCodeBridge.d.ts +3 -1
- package/lib/services/assessment/lib/claudeCodeBridge.d.ts.map +1 -1
- package/lib/services/assessment/lib/claudeCodeBridge.js +5 -3
- package/lib/services/assessment/lib/concurrencyLimit.d.ts +6 -2
- package/lib/services/assessment/lib/concurrencyLimit.d.ts.map +1 -1
- package/lib/services/assessment/lib/concurrencyLimit.js +13 -6
- package/lib/services/assessment/lib/errors.d.ts +90 -0
- package/lib/services/assessment/lib/errors.d.ts.map +1 -0
- package/lib/services/assessment/lib/errors.js +136 -0
- package/lib/services/assessment/lib/timeoutUtils.d.ts +69 -0
- package/lib/services/assessment/lib/timeoutUtils.d.ts.map +1 -0
- package/lib/services/assessment/lib/timeoutUtils.js +103 -0
- package/lib/services/assessment/modules/BaseAssessor.d.ts +43 -8
- package/lib/services/assessment/modules/BaseAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/BaseAssessor.js +103 -34
- package/lib/services/assessment/modules/DeveloperExperienceAssessor.d.ts +38 -1
- package/lib/services/assessment/modules/DeveloperExperienceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/DeveloperExperienceAssessor.js +185 -19
- package/lib/services/assessment/modules/DocumentationAssessor.d.ts +5 -0
- package/lib/services/assessment/modules/DocumentationAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/DocumentationAssessor.js +11 -0
- package/lib/services/assessment/modules/ErrorHandlingAssessor.js +1 -1
- package/lib/services/assessment/modules/FunctionalityAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/FunctionalityAssessor.js +6 -3
- package/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts +3 -0
- package/lib/services/assessment/modules/MCPSpecComplianceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/MCPSpecComplianceAssessor.js +14 -2
- package/lib/services/assessment/modules/ManifestValidationAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ManifestValidationAssessor.js +7 -2
- package/lib/services/assessment/modules/PromptAssessor.d.ts +1 -0
- package/lib/services/assessment/modules/PromptAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/PromptAssessor.js +26 -16
- package/lib/services/assessment/modules/ProtocolComplianceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ProtocolComplianceAssessor.js +6 -2
- package/lib/services/assessment/modules/ProtocolConformanceAssessor.d.ts +5 -0
- package/lib/services/assessment/modules/ProtocolConformanceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ProtocolConformanceAssessor.js +15 -0
- package/lib/services/assessment/modules/ResourceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ResourceAssessor.js +8 -2
- package/lib/services/assessment/modules/SecurityAssessor.d.ts +3 -171
- package/lib/services/assessment/modules/SecurityAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/SecurityAssessor.js +25 -1480
- package/lib/services/assessment/modules/ToolAnnotationAssessor.d.ts +27 -28
- package/lib/services/assessment/modules/ToolAnnotationAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ToolAnnotationAssessor.js +340 -863
- package/lib/services/assessment/modules/UsabilityAssessor.d.ts +5 -0
- package/lib/services/assessment/modules/UsabilityAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/UsabilityAssessor.js +11 -0
- package/lib/services/assessment/modules/annotations/AnnotationDeceptionDetector.d.ts +57 -0
- package/lib/services/assessment/modules/annotations/AnnotationDeceptionDetector.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/AnnotationDeceptionDetector.js +176 -0
- package/lib/services/assessment/modules/annotations/ArchitectureDetector.d.ts +67 -0
- package/lib/services/assessment/modules/annotations/ArchitectureDetector.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/ArchitectureDetector.js +239 -0
- package/lib/services/assessment/modules/annotations/BehaviorInference.d.ts +46 -0
- package/lib/services/assessment/modules/annotations/BehaviorInference.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/BehaviorInference.js +394 -0
- package/lib/services/assessment/modules/annotations/DescriptionAnalyzer.d.ts +64 -0
- package/lib/services/assessment/modules/annotations/DescriptionAnalyzer.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/DescriptionAnalyzer.js +304 -0
- package/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.d.ts +43 -0
- package/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/DescriptionPoisoningDetector.js +276 -0
- package/lib/services/assessment/modules/annotations/SchemaAnalyzer.d.ts +122 -0
- package/lib/services/assessment/modules/annotations/SchemaAnalyzer.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/SchemaAnalyzer.js +388 -0
- package/lib/services/assessment/modules/annotations/index.d.ts +13 -0
- package/lib/services/assessment/modules/annotations/index.d.ts.map +1 -0
- package/lib/services/assessment/modules/annotations/index.js +15 -0
- package/lib/services/assessment/modules/index.d.ts +10 -0
- package/lib/services/assessment/modules/index.d.ts.map +1 -1
- package/lib/services/assessment/modules/index.js +13 -0
- package/lib/services/assessment/modules/securityTests/SanitizationDetector.d.ts +125 -0
- package/lib/services/assessment/modules/securityTests/SanitizationDetector.d.ts.map +1 -0
- package/lib/services/assessment/modules/securityTests/SanitizationDetector.js +345 -0
- package/lib/services/assessment/modules/securityTests/SecurityPayloadGenerator.d.ts +33 -0
- package/lib/services/assessment/modules/securityTests/SecurityPayloadGenerator.d.ts.map +1 -0
- package/lib/services/assessment/modules/securityTests/SecurityPayloadGenerator.js +128 -0
- package/lib/services/assessment/modules/securityTests/SecurityPayloadTester.d.ts +67 -0
- package/lib/services/assessment/modules/securityTests/SecurityPayloadTester.d.ts.map +1 -0
- package/lib/services/assessment/modules/securityTests/SecurityPayloadTester.js +372 -0
- package/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts +178 -0
- package/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.d.ts.map +1 -0
- package/lib/services/assessment/modules/securityTests/SecurityResponseAnalyzer.js +1207 -0
- package/lib/services/assessment/modules/securityTests/index.d.ts +8 -0
- package/lib/services/assessment/modules/securityTests/index.d.ts.map +1 -0
- package/lib/services/assessment/modules/securityTests/index.js +7 -0
- package/lib/services/assessment/orchestratorHelpers.d.ts +83 -0
- package/lib/services/assessment/orchestratorHelpers.d.ts.map +1 -0
- package/lib/services/assessment/orchestratorHelpers.js +212 -0
- package/lib/services/assessment/tool-classifier-patterns.d.ts +85 -0
- package/lib/services/assessment/tool-classifier-patterns.d.ts.map +1 -0
- package/lib/services/assessment/tool-classifier-patterns.js +365 -0
- package/package.json +1 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitization Library Pattern Configuration
|
|
3
|
+
*
|
|
4
|
+
* Detects security libraries and sanitization practices in tool metadata/descriptions.
|
|
5
|
+
* Used by SanitizationDetector to reduce false positives when tools have proper
|
|
6
|
+
* input sanitization in place.
|
|
7
|
+
*
|
|
8
|
+
* @see Issue #56: Improve security analysis granularity
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Categories of sanitization approaches
|
|
12
|
+
*/
|
|
13
|
+
export type SanitizationCategory = "xss" | "html" | "sql" | "input" | "encoding" | "framework";
|
|
14
|
+
/**
|
|
15
|
+
* Pattern definition for detecting a specific sanitization library
|
|
16
|
+
*/
|
|
17
|
+
export interface SanitizationLibraryPattern {
|
|
18
|
+
/** Library name for reporting */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Regex patterns to detect this library */
|
|
21
|
+
patterns: RegExp[];
|
|
22
|
+
/** Type of sanitization this library provides */
|
|
23
|
+
category: SanitizationCategory;
|
|
24
|
+
/** Confidence boost when detected (15-25 points) */
|
|
25
|
+
confidenceBoost: number;
|
|
26
|
+
/** Languages this library is typically used with */
|
|
27
|
+
languageHint?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Known sanitization libraries with detection patterns
|
|
31
|
+
*
|
|
32
|
+
* Detection is conservative - patterns match explicit mentions of libraries
|
|
33
|
+
* rather than generic terms that could have other meanings.
|
|
34
|
+
*/
|
|
35
|
+
export declare const SANITIZATION_LIBRARY_PATTERNS: SanitizationLibraryPattern[];
|
|
36
|
+
/**
|
|
37
|
+
* Generic sanitization keyword patterns
|
|
38
|
+
*
|
|
39
|
+
* These are less specific than library patterns and provide lower confidence boost.
|
|
40
|
+
* Used when no specific library is detected but sanitization is mentioned.
|
|
41
|
+
*/
|
|
42
|
+
export declare const GENERIC_SANITIZATION_KEYWORDS: RegExp[];
|
|
43
|
+
/**
|
|
44
|
+
* Response-time sanitization indicators
|
|
45
|
+
*
|
|
46
|
+
* Patterns that indicate sanitization was applied to the response.
|
|
47
|
+
* These provide evidence that input was processed safely.
|
|
48
|
+
*/
|
|
49
|
+
export declare const RESPONSE_SANITIZATION_INDICATORS: RegExp[];
|
|
50
|
+
/**
|
|
51
|
+
* Confidence boost values for different detection types
|
|
52
|
+
*/
|
|
53
|
+
export declare const CONFIDENCE_BOOSTS: {
|
|
54
|
+
/** Specific library detected (e.g., DOMPurify) */
|
|
55
|
+
readonly SPECIFIC_LIBRARY: 25;
|
|
56
|
+
/** Generic sanitization keyword detected */
|
|
57
|
+
readonly GENERIC_KEYWORD: 8;
|
|
58
|
+
/** Response-time sanitization evidence */
|
|
59
|
+
readonly RESPONSE_EVIDENCE: 10;
|
|
60
|
+
/** Maximum total adjustment (cap) */
|
|
61
|
+
readonly MAX_ADJUSTMENT: 50;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=sanitizationPatterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizationPatterns.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/sanitizationPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,UAAU,GACV,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,0BAA0B,EAkKrE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,EAWjD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,EAAE,MAAM,EAWpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B,kDAAkD;;IAElD,4CAA4C;;IAE5C,0CAA0C;;IAE1C,qCAAqC;;CAE7B,CAAC"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitization Library Pattern Configuration
|
|
3
|
+
*
|
|
4
|
+
* Detects security libraries and sanitization practices in tool metadata/descriptions.
|
|
5
|
+
* Used by SanitizationDetector to reduce false positives when tools have proper
|
|
6
|
+
* input sanitization in place.
|
|
7
|
+
*
|
|
8
|
+
* @see Issue #56: Improve security analysis granularity
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Known sanitization libraries with detection patterns
|
|
12
|
+
*
|
|
13
|
+
* Detection is conservative - patterns match explicit mentions of libraries
|
|
14
|
+
* rather than generic terms that could have other meanings.
|
|
15
|
+
*/
|
|
16
|
+
export const SANITIZATION_LIBRARY_PATTERNS = [
|
|
17
|
+
// XSS Prevention Libraries
|
|
18
|
+
{
|
|
19
|
+
name: "DOMPurify",
|
|
20
|
+
patterns: [/\bDOMPurify\b/i, /\bdom[\-_]?purify\b/i],
|
|
21
|
+
category: "xss",
|
|
22
|
+
confidenceBoost: 25,
|
|
23
|
+
languageHint: ["javascript", "typescript"],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "xss",
|
|
27
|
+
patterns: [
|
|
28
|
+
/\bxss\s*\(/i,
|
|
29
|
+
/require\s*\(\s*['"]xss['"]\s*\)/i,
|
|
30
|
+
/import.*from\s+['"]xss['"]/i,
|
|
31
|
+
/xss\s+library/i,
|
|
32
|
+
],
|
|
33
|
+
category: "xss",
|
|
34
|
+
confidenceBoost: 25,
|
|
35
|
+
languageHint: ["javascript", "typescript"],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "bleach",
|
|
39
|
+
patterns: [/\bbleach\b/i, /bleach\.clean/i, /import\s+bleach/i],
|
|
40
|
+
category: "xss",
|
|
41
|
+
confidenceBoost: 25,
|
|
42
|
+
languageHint: ["python"],
|
|
43
|
+
},
|
|
44
|
+
// HTML Sanitization
|
|
45
|
+
{
|
|
46
|
+
name: "sanitize-html",
|
|
47
|
+
patterns: [
|
|
48
|
+
/\bsanitize[\-_]?html\b/i,
|
|
49
|
+
/sanitizeHtml\s*\(/i,
|
|
50
|
+
/require\s*\(\s*['"]sanitize-html['"]\s*\)/i,
|
|
51
|
+
],
|
|
52
|
+
category: "html",
|
|
53
|
+
confidenceBoost: 20,
|
|
54
|
+
languageHint: ["javascript", "typescript"],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "escape-html",
|
|
58
|
+
patterns: [
|
|
59
|
+
/\bescape[\-_]?html\b/i,
|
|
60
|
+
/escapeHtml\s*\(/i,
|
|
61
|
+
/require\s*\(\s*['"]escape-html['"]\s*\)/i,
|
|
62
|
+
],
|
|
63
|
+
category: "encoding",
|
|
64
|
+
confidenceBoost: 15,
|
|
65
|
+
languageHint: ["javascript", "typescript"],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "he",
|
|
69
|
+
patterns: [
|
|
70
|
+
/\bhe\.encode/i,
|
|
71
|
+
/\bhe\.escape/i,
|
|
72
|
+
/require\s*\(\s*['"]he['"]\s*\)/i,
|
|
73
|
+
],
|
|
74
|
+
category: "encoding",
|
|
75
|
+
confidenceBoost: 15,
|
|
76
|
+
languageHint: ["javascript", "typescript"],
|
|
77
|
+
},
|
|
78
|
+
// Input Validation Libraries
|
|
79
|
+
{
|
|
80
|
+
name: "validator",
|
|
81
|
+
patterns: [
|
|
82
|
+
/validator\.js/i,
|
|
83
|
+
/\bvalidatorjs\b/i,
|
|
84
|
+
/validator\.(isEmail|escape|sanitize|isURL|isAlphanumeric)/i,
|
|
85
|
+
/require\s*\(\s*['"]validator['"]\s*\)/i,
|
|
86
|
+
],
|
|
87
|
+
category: "input",
|
|
88
|
+
confidenceBoost: 20,
|
|
89
|
+
languageHint: ["javascript", "typescript"],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "Zod",
|
|
93
|
+
patterns: [
|
|
94
|
+
/\bz\.string\s*\(\)/i,
|
|
95
|
+
/\bz\.object\s*\(/i,
|
|
96
|
+
/\bzod\b/i,
|
|
97
|
+
/\.safeParse\s*\(/i,
|
|
98
|
+
/import.*from\s+['"]zod['"]/i,
|
|
99
|
+
],
|
|
100
|
+
category: "input",
|
|
101
|
+
confidenceBoost: 15,
|
|
102
|
+
languageHint: ["typescript"],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "Joi",
|
|
106
|
+
patterns: [
|
|
107
|
+
/\bJoi\b/i,
|
|
108
|
+
/Joi\.string\s*\(\)/i,
|
|
109
|
+
/Joi\.object\s*\(/i,
|
|
110
|
+
/\.validate\s*\(/i,
|
|
111
|
+
/require\s*\(\s*['"]joi['"]\s*\)/i,
|
|
112
|
+
],
|
|
113
|
+
category: "input",
|
|
114
|
+
confidenceBoost: 15,
|
|
115
|
+
languageHint: ["javascript", "typescript"],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "yup",
|
|
119
|
+
patterns: [
|
|
120
|
+
/\byup\b/i,
|
|
121
|
+
/yup\.string\s*\(\)/i,
|
|
122
|
+
/yup\.object\s*\(/i,
|
|
123
|
+
/import.*from\s+['"]yup['"]/i,
|
|
124
|
+
],
|
|
125
|
+
category: "input",
|
|
126
|
+
confidenceBoost: 15,
|
|
127
|
+
languageHint: ["javascript", "typescript"],
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: "pydantic",
|
|
131
|
+
patterns: [
|
|
132
|
+
/\bpydantic\b/i,
|
|
133
|
+
/from\s+pydantic\s+import/i,
|
|
134
|
+
/BaseModel/i,
|
|
135
|
+
/Field\s*\(/i,
|
|
136
|
+
],
|
|
137
|
+
category: "input",
|
|
138
|
+
confidenceBoost: 15,
|
|
139
|
+
languageHint: ["python"],
|
|
140
|
+
},
|
|
141
|
+
// SQL Injection Prevention
|
|
142
|
+
{
|
|
143
|
+
name: "parameterized-queries",
|
|
144
|
+
patterns: [
|
|
145
|
+
/prepared[\s_]?statement/i,
|
|
146
|
+
/parameterized[\s_]?quer/i,
|
|
147
|
+
/\$\d+\s/i, // PostgreSQL style $1, $2
|
|
148
|
+
/:\w+\s/i, // Named parameters :name
|
|
149
|
+
/\?\s/i, // Positional parameters ?
|
|
150
|
+
],
|
|
151
|
+
category: "sql",
|
|
152
|
+
confidenceBoost: 20,
|
|
153
|
+
languageHint: ["sql"],
|
|
154
|
+
},
|
|
155
|
+
// Framework-level Protection
|
|
156
|
+
{
|
|
157
|
+
name: "helmet",
|
|
158
|
+
patterns: [
|
|
159
|
+
/\bhelmet\b/i,
|
|
160
|
+
/helmet\s*\(\)/i,
|
|
161
|
+
/require\s*\(\s*['"]helmet['"]\s*\)/i,
|
|
162
|
+
],
|
|
163
|
+
category: "framework",
|
|
164
|
+
confidenceBoost: 10,
|
|
165
|
+
languageHint: ["javascript", "typescript"],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: "django-csrf",
|
|
169
|
+
patterns: [/csrf_token/i, /CsrfViewMiddleware/i, /@csrf_protect/i],
|
|
170
|
+
category: "framework",
|
|
171
|
+
confidenceBoost: 10,
|
|
172
|
+
languageHint: ["python"],
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
/**
|
|
176
|
+
* Generic sanitization keyword patterns
|
|
177
|
+
*
|
|
178
|
+
* These are less specific than library patterns and provide lower confidence boost.
|
|
179
|
+
* Used when no specific library is detected but sanitization is mentioned.
|
|
180
|
+
*/
|
|
181
|
+
export const GENERIC_SANITIZATION_KEYWORDS = [
|
|
182
|
+
/\bsanitiz(e|ed|es|ing|ation)\b/i,
|
|
183
|
+
/\bescap(e|ed|es|ing)\b/i,
|
|
184
|
+
/\bencod(e|ed|es|ing)\b/i,
|
|
185
|
+
/\bvalidat(e|ed|es|ing|ion)\b/i,
|
|
186
|
+
/\bfilter(ed|s|ing)?\b/i,
|
|
187
|
+
/\bclean(ed|s|ing)?\b/i,
|
|
188
|
+
/\bpurif(y|ied|ies|ying)\b/i,
|
|
189
|
+
/\bnormaliz(e|ed|es|ing)\b/i,
|
|
190
|
+
/\bstrip(ped|s|ping)?\b/i,
|
|
191
|
+
/\btrim(med|s|ming)?\b/i,
|
|
192
|
+
];
|
|
193
|
+
/**
|
|
194
|
+
* Response-time sanitization indicators
|
|
195
|
+
*
|
|
196
|
+
* Patterns that indicate sanitization was applied to the response.
|
|
197
|
+
* These provide evidence that input was processed safely.
|
|
198
|
+
*/
|
|
199
|
+
export const RESPONSE_SANITIZATION_INDICATORS = [
|
|
200
|
+
/\[sanitized\]/i,
|
|
201
|
+
/\[filtered\]/i,
|
|
202
|
+
/\[redacted\]/i,
|
|
203
|
+
/\[removed\]/i,
|
|
204
|
+
/\[cleaned\]/i,
|
|
205
|
+
/\[escaped\]/i,
|
|
206
|
+
/input.*sanitized/i,
|
|
207
|
+
/content.*filtered/i,
|
|
208
|
+
/value.*cleaned/i,
|
|
209
|
+
/data.*validated/i,
|
|
210
|
+
];
|
|
211
|
+
/**
|
|
212
|
+
* Confidence boost values for different detection types
|
|
213
|
+
*/
|
|
214
|
+
export const CONFIDENCE_BOOSTS = {
|
|
215
|
+
/** Specific library detected (e.g., DOMPurify) */
|
|
216
|
+
SPECIFIC_LIBRARY: 25,
|
|
217
|
+
/** Generic sanitization keyword detected */
|
|
218
|
+
GENERIC_KEYWORD: 8,
|
|
219
|
+
/** Response-time sanitization evidence */
|
|
220
|
+
RESPONSE_EVIDENCE: 10,
|
|
221
|
+
/** Maximum total adjustment (cap) */
|
|
222
|
+
MAX_ADJUSTMENT: 50,
|
|
223
|
+
};
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
14
14
|
import type { AUPCategory } from "../../../lib/assessmentTypes.js";
|
|
15
|
+
import { Logger } from "./logger.js";
|
|
15
16
|
/**
|
|
16
17
|
* Response from Claude Code execution
|
|
17
18
|
*/
|
|
@@ -103,7 +104,8 @@ export declare const FULL_CLAUDE_CODE_CONFIG: ClaudeCodeBridgeConfig;
|
|
|
103
104
|
export declare class ClaudeCodeBridge {
|
|
104
105
|
private config;
|
|
105
106
|
private isAvailable;
|
|
106
|
-
|
|
107
|
+
private logger?;
|
|
108
|
+
constructor(config: ClaudeCodeBridgeConfig, logger?: Logger);
|
|
107
109
|
/**
|
|
108
110
|
* Check if a specific feature is enabled
|
|
109
111
|
* Note: annotationInference is an alias for behaviorInference
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeCodeBridge.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/lib/claudeCodeBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"claudeCodeBridge.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/lib/claudeCodeBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,11 +50,13 @@ export const FULL_CLAUDE_CODE_CONFIG = {
|
|
|
50
50
|
export class ClaudeCodeBridge {
|
|
51
51
|
config;
|
|
52
52
|
isAvailable = false;
|
|
53
|
-
|
|
53
|
+
logger;
|
|
54
|
+
constructor(config, logger) {
|
|
54
55
|
this.config = config;
|
|
56
|
+
this.logger = logger;
|
|
55
57
|
this.isAvailable = this.checkClaudeAvailability();
|
|
56
58
|
if (!this.isAvailable) {
|
|
57
|
-
|
|
59
|
+
this.logger?.warn("Claude CLI not available - features will be disabled");
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
62
|
/**
|
|
@@ -151,7 +153,7 @@ export class ClaudeCodeBridge {
|
|
|
151
153
|
return JSON.parse(jsonStr);
|
|
152
154
|
}
|
|
153
155
|
catch {
|
|
154
|
-
|
|
156
|
+
this.logger?.warn("Failed to parse JSON response");
|
|
155
157
|
return null;
|
|
156
158
|
}
|
|
157
159
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Simple concurrency limiter for parallel async operations
|
|
3
3
|
* Provides the same interface as p-limit but is CJS-compatible
|
|
4
4
|
*/
|
|
5
|
+
import { Logger } from "./logger.js";
|
|
5
6
|
/**
|
|
6
7
|
* Warning threshold for queue depth monitoring.
|
|
7
8
|
* If queue exceeds this size, a warning is emitted to help diagnose
|
|
@@ -12,14 +13,17 @@
|
|
|
12
13
|
*
|
|
13
14
|
* Threshold of 10,000 provides ~146% headroom to accommodate larger
|
|
14
15
|
* tool sets while catching true runaway scenarios.
|
|
16
|
+
*
|
|
17
|
+
* @see PerformanceConfig.queueWarningThreshold (Issue #37)
|
|
15
18
|
*/
|
|
16
|
-
export declare const QUEUE_WARNING_THRESHOLD
|
|
19
|
+
export declare const QUEUE_WARNING_THRESHOLD: number;
|
|
17
20
|
export type LimitFunction = <T>(fn: () => Promise<T>) => Promise<T>;
|
|
18
21
|
/**
|
|
19
22
|
* Creates a concurrency limiter that allows only a specified number
|
|
20
23
|
* of async operations to run simultaneously
|
|
21
24
|
*
|
|
22
25
|
* @param concurrency - Maximum number of concurrent operations
|
|
26
|
+
* @param logger - Optional logger instance for queue depth warnings
|
|
23
27
|
* @returns A function that wraps async operations with the concurrency limit
|
|
24
28
|
*
|
|
25
29
|
* @example
|
|
@@ -28,5 +32,5 @@ export type LimitFunction = <T>(fn: () => Promise<T>) => Promise<T>;
|
|
|
28
32
|
* items.map(item => limit(() => processItem(item)))
|
|
29
33
|
* );
|
|
30
34
|
*/
|
|
31
|
-
export declare function createConcurrencyLimit(concurrency: number): LimitFunction;
|
|
35
|
+
export declare function createConcurrencyLimit(concurrency: number, logger?: Logger): LimitFunction;
|
|
32
36
|
//# sourceMappingURL=concurrencyLimit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concurrencyLimit.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/lib/concurrencyLimit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"concurrencyLimit.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/lib/concurrencyLimit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,QACc,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAwDf"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Simple concurrency limiter for parallel async operations
|
|
3
3
|
* Provides the same interface as p-limit but is CJS-compatible
|
|
4
4
|
*/
|
|
5
|
+
import { DEFAULT_PERFORMANCE_CONFIG } from "../config/performanceConfig.js";
|
|
5
6
|
/**
|
|
6
7
|
* Warning threshold for queue depth monitoring.
|
|
7
8
|
* If queue exceeds this size, a warning is emitted to help diagnose
|
|
@@ -12,13 +13,16 @@
|
|
|
12
13
|
*
|
|
13
14
|
* Threshold of 10,000 provides ~146% headroom to accommodate larger
|
|
14
15
|
* tool sets while catching true runaway scenarios.
|
|
16
|
+
*
|
|
17
|
+
* @see PerformanceConfig.queueWarningThreshold (Issue #37)
|
|
15
18
|
*/
|
|
16
|
-
export const QUEUE_WARNING_THRESHOLD =
|
|
19
|
+
export const QUEUE_WARNING_THRESHOLD = DEFAULT_PERFORMANCE_CONFIG.queueWarningThreshold;
|
|
17
20
|
/**
|
|
18
21
|
* Creates a concurrency limiter that allows only a specified number
|
|
19
22
|
* of async operations to run simultaneously
|
|
20
23
|
*
|
|
21
24
|
* @param concurrency - Maximum number of concurrent operations
|
|
25
|
+
* @param logger - Optional logger instance for queue depth warnings
|
|
22
26
|
* @returns A function that wraps async operations with the concurrency limit
|
|
23
27
|
*
|
|
24
28
|
* @example
|
|
@@ -27,7 +31,7 @@ export const QUEUE_WARNING_THRESHOLD = 10000;
|
|
|
27
31
|
* items.map(item => limit(() => processItem(item)))
|
|
28
32
|
* );
|
|
29
33
|
*/
|
|
30
|
-
export function createConcurrencyLimit(concurrency) {
|
|
34
|
+
export function createConcurrencyLimit(concurrency, logger) {
|
|
31
35
|
if (concurrency < 1) {
|
|
32
36
|
throw new Error("Concurrency must be at least 1");
|
|
33
37
|
}
|
|
@@ -62,10 +66,13 @@ export function createConcurrencyLimit(concurrency) {
|
|
|
62
66
|
// Only warn once per limiter instance to avoid log spam
|
|
63
67
|
if (queue.length > QUEUE_WARNING_THRESHOLD && !hasWarned) {
|
|
64
68
|
hasWarned = true;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
logger?.warn("Queue depth exceeded threshold", {
|
|
70
|
+
queueDepth: queue.length,
|
|
71
|
+
threshold: QUEUE_WARNING_THRESHOLD,
|
|
72
|
+
activeCount,
|
|
73
|
+
concurrency,
|
|
74
|
+
message: "This may indicate a slow/stalled server",
|
|
75
|
+
});
|
|
69
76
|
}
|
|
70
77
|
next();
|
|
71
78
|
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessment Error Types
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized error handling across all assessment modules.
|
|
5
|
+
* See docs/ERROR_HANDLING_CONVENTIONS.md for usage guidelines.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error categories for classification and debugging
|
|
9
|
+
*/
|
|
10
|
+
export declare enum ErrorCategory {
|
|
11
|
+
/** Network connectivity issues (ECONNREFUSED, DNS failures, etc.) */
|
|
12
|
+
CONNECTION = "CONNECTION",
|
|
13
|
+
/** MCP protocol violations or unexpected responses */
|
|
14
|
+
PROTOCOL = "PROTOCOL",
|
|
15
|
+
/** Input validation failures (invalid parameters, missing fields) */
|
|
16
|
+
VALIDATION = "VALIDATION",
|
|
17
|
+
/** Operation exceeded time limit */
|
|
18
|
+
TIMEOUT = "TIMEOUT",
|
|
19
|
+
/** JSON or data parsing failures */
|
|
20
|
+
PARSE = "PARSE",
|
|
21
|
+
/** Unclassified errors */
|
|
22
|
+
UNKNOWN = "UNKNOWN"
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Custom error class for assessment operations
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* throw new AssessmentError(
|
|
29
|
+
* 'Failed to connect to MCP server',
|
|
30
|
+
* ErrorCategory.CONNECTION,
|
|
31
|
+
* false, // not recoverable
|
|
32
|
+
* { url: 'http://localhost:3000', attempt: 3 }
|
|
33
|
+
* );
|
|
34
|
+
*/
|
|
35
|
+
export declare class AssessmentError extends Error {
|
|
36
|
+
readonly code: ErrorCategory;
|
|
37
|
+
readonly recoverable: boolean;
|
|
38
|
+
readonly context?: Record<string, unknown>;
|
|
39
|
+
constructor(message: string, code: ErrorCategory, recoverable?: boolean, context?: Record<string, unknown>);
|
|
40
|
+
/**
|
|
41
|
+
* Create a structured object for serialization
|
|
42
|
+
*/
|
|
43
|
+
toJSON(): ErrorInfo;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Structured error information for result objects
|
|
47
|
+
*/
|
|
48
|
+
export interface ErrorInfo {
|
|
49
|
+
/** Human-readable error message */
|
|
50
|
+
message: string;
|
|
51
|
+
/** Error category for classification */
|
|
52
|
+
code: ErrorCategory;
|
|
53
|
+
/** Whether the operation can be retried */
|
|
54
|
+
recoverable: boolean;
|
|
55
|
+
/** Stack trace (optional, for debugging) */
|
|
56
|
+
stack?: string;
|
|
57
|
+
/** Additional context about the error */
|
|
58
|
+
context?: Record<string, unknown>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Interface for result objects that may contain errors
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* interface ToolTestResult extends ErrorResult {
|
|
65
|
+
* toolName: string;
|
|
66
|
+
* passed: boolean;
|
|
67
|
+
* }
|
|
68
|
+
*/
|
|
69
|
+
export interface ErrorResult {
|
|
70
|
+
error?: ErrorInfo;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Type guard to check if a value is an AssessmentError
|
|
74
|
+
*/
|
|
75
|
+
export declare function isAssessmentError(error: unknown): error is AssessmentError;
|
|
76
|
+
/**
|
|
77
|
+
* Categorize an error based on its message content
|
|
78
|
+
*
|
|
79
|
+
* @param error - The error to categorize
|
|
80
|
+
* @returns The appropriate ErrorCategory
|
|
81
|
+
*/
|
|
82
|
+
export declare function categorizeError(error: unknown): ErrorCategory;
|
|
83
|
+
/**
|
|
84
|
+
* Extract error message from various error types
|
|
85
|
+
*
|
|
86
|
+
* @param error - The error to extract message from
|
|
87
|
+
* @returns A string error message
|
|
88
|
+
*/
|
|
89
|
+
export declare function extractErrorMessage(error: unknown): string;
|
|
90
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,oBAAY,aAAa;IACvB,qEAAqE;IACrE,UAAU,eAAe;IACzB,sDAAsD;IACtD,QAAQ,aAAa;IACrB,qEAAqE;IACrE,UAAU,eAAe;IACzB,oCAAoC;IACpC,OAAO,YAAY;IACnB,oCAAoC;IACpC,KAAK,UAAU;IACf,0BAA0B;IAC1B,OAAO,YAAY;CACpB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,IAAI,EAAE,aAAa;aACnB,WAAW,EAAE,OAAO;aACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAHjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,aAAa,EACnB,WAAW,GAAE,OAAc,EAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAUnD;;OAEG;IACH,MAAM,IAAI,SAAS;CASpB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,EAAE,aAAa,CAAC;IACpB,2CAA2C;IAC3C,WAAW,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAsC7D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAwB1D"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessment Error Types
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized error handling across all assessment modules.
|
|
5
|
+
* See docs/ERROR_HANDLING_CONVENTIONS.md for usage guidelines.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error categories for classification and debugging
|
|
9
|
+
*/
|
|
10
|
+
export var ErrorCategory;
|
|
11
|
+
(function (ErrorCategory) {
|
|
12
|
+
/** Network connectivity issues (ECONNREFUSED, DNS failures, etc.) */
|
|
13
|
+
ErrorCategory["CONNECTION"] = "CONNECTION";
|
|
14
|
+
/** MCP protocol violations or unexpected responses */
|
|
15
|
+
ErrorCategory["PROTOCOL"] = "PROTOCOL";
|
|
16
|
+
/** Input validation failures (invalid parameters, missing fields) */
|
|
17
|
+
ErrorCategory["VALIDATION"] = "VALIDATION";
|
|
18
|
+
/** Operation exceeded time limit */
|
|
19
|
+
ErrorCategory["TIMEOUT"] = "TIMEOUT";
|
|
20
|
+
/** JSON or data parsing failures */
|
|
21
|
+
ErrorCategory["PARSE"] = "PARSE";
|
|
22
|
+
/** Unclassified errors */
|
|
23
|
+
ErrorCategory["UNKNOWN"] = "UNKNOWN";
|
|
24
|
+
})(ErrorCategory || (ErrorCategory = {}));
|
|
25
|
+
/**
|
|
26
|
+
* Custom error class for assessment operations
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* throw new AssessmentError(
|
|
30
|
+
* 'Failed to connect to MCP server',
|
|
31
|
+
* ErrorCategory.CONNECTION,
|
|
32
|
+
* false, // not recoverable
|
|
33
|
+
* { url: 'http://localhost:3000', attempt: 3 }
|
|
34
|
+
* );
|
|
35
|
+
*/
|
|
36
|
+
export class AssessmentError extends Error {
|
|
37
|
+
code;
|
|
38
|
+
recoverable;
|
|
39
|
+
context;
|
|
40
|
+
constructor(message, code, recoverable = true, context) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.code = code;
|
|
43
|
+
this.recoverable = recoverable;
|
|
44
|
+
this.context = context;
|
|
45
|
+
this.name = "AssessmentError";
|
|
46
|
+
// Maintains proper stack trace in V8 environments
|
|
47
|
+
if (Error.captureStackTrace) {
|
|
48
|
+
Error.captureStackTrace(this, AssessmentError);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a structured object for serialization
|
|
53
|
+
*/
|
|
54
|
+
toJSON() {
|
|
55
|
+
return {
|
|
56
|
+
message: this.message,
|
|
57
|
+
code: this.code,
|
|
58
|
+
recoverable: this.recoverable,
|
|
59
|
+
stack: this.stack,
|
|
60
|
+
context: this.context,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Type guard to check if a value is an AssessmentError
|
|
66
|
+
*/
|
|
67
|
+
export function isAssessmentError(error) {
|
|
68
|
+
return error instanceof AssessmentError;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Categorize an error based on its message content
|
|
72
|
+
*
|
|
73
|
+
* @param error - The error to categorize
|
|
74
|
+
* @returns The appropriate ErrorCategory
|
|
75
|
+
*/
|
|
76
|
+
export function categorizeError(error) {
|
|
77
|
+
const message = extractErrorMessage(error).toLowerCase();
|
|
78
|
+
if (message.includes("timeout") || message.includes("timed out")) {
|
|
79
|
+
return ErrorCategory.TIMEOUT;
|
|
80
|
+
}
|
|
81
|
+
if (message.includes("connection") ||
|
|
82
|
+
message.includes("econnrefused") ||
|
|
83
|
+
message.includes("enotfound") ||
|
|
84
|
+
message.includes("network")) {
|
|
85
|
+
return ErrorCategory.CONNECTION;
|
|
86
|
+
}
|
|
87
|
+
if (message.includes("parse") ||
|
|
88
|
+
message.includes("json") ||
|
|
89
|
+
message.includes("syntax")) {
|
|
90
|
+
return ErrorCategory.PARSE;
|
|
91
|
+
}
|
|
92
|
+
if (message.includes("protocol") ||
|
|
93
|
+
message.includes("mcp") ||
|
|
94
|
+
message.includes("invalid response")) {
|
|
95
|
+
return ErrorCategory.PROTOCOL;
|
|
96
|
+
}
|
|
97
|
+
if (message.includes("invalid") ||
|
|
98
|
+
message.includes("required") ||
|
|
99
|
+
message.includes("missing") ||
|
|
100
|
+
message.includes("validation")) {
|
|
101
|
+
return ErrorCategory.VALIDATION;
|
|
102
|
+
}
|
|
103
|
+
return ErrorCategory.UNKNOWN;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Extract error message from various error types
|
|
107
|
+
*
|
|
108
|
+
* @param error - The error to extract message from
|
|
109
|
+
* @returns A string error message
|
|
110
|
+
*/
|
|
111
|
+
export function extractErrorMessage(error) {
|
|
112
|
+
if (typeof error === "string") {
|
|
113
|
+
return error;
|
|
114
|
+
}
|
|
115
|
+
if (error instanceof Error) {
|
|
116
|
+
return error.message;
|
|
117
|
+
}
|
|
118
|
+
if (error && typeof error === "object") {
|
|
119
|
+
const err = error;
|
|
120
|
+
if (typeof err.message === "string") {
|
|
121
|
+
return err.message;
|
|
122
|
+
}
|
|
123
|
+
if (typeof err.error === "string") {
|
|
124
|
+
return err.error;
|
|
125
|
+
}
|
|
126
|
+
if (err.error && typeof err.error === "object") {
|
|
127
|
+
return extractErrorMessage(err.error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
return JSON.stringify(error);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return String(error);
|
|
135
|
+
}
|
|
136
|
+
}
|