@bryan-thompson/inspector-assessment-client 1.25.4 → 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-DE62cdTZ.js → OAuthCallback-Dl4GYls3.js} +1 -1
- package/dist/assets/{OAuthDebugCallback-CWjFdCIE.js → OAuthDebugCallback-BdJ38Z-r.js} +1 -1
- package/dist/assets/{index-Df9Sx1jt.css → index-cHhcEXbr.css} +4 -0
- package/dist/assets/{index-PCQVSwHa.js → index-pfUiTdQb.js} +4 -4
- package/dist/index.html +2 -2
- 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 +3 -7
- package/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.js +13 -2
- 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/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/tool-classifier-patterns.d.ts +1 -0
- package/lib/services/assessment/tool-classifier-patterns.d.ts.map +1 -1
- package/lib/services/assessment/tool-classifier-patterns.js +17 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestDataGenerator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/TestDataGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"TestDataGenerator.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/TestDataGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,MAAM,CAAC,EAAE,cAAc,GAAG,kBAAkB,CAAC;CAC9C;AAED,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAiC;IAE5D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAuB;IAE5C;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI;IAI7D;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI7C;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,OAAO;IAOjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CA2FpC;IAEF;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,EAAE;IAoBxD;;;OAGG;WACU,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmD5E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAWpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAaxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAYxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAwCxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IA2FxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAgDpC;;OAEG;WACW,uBAAuB,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GACnD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAoB1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAkTrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAgB9B;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO;IAI3E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAsDtC;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAwBxE;IAEJ;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAe7C;IAEF;;;;;;;;;;OAUG;IACH,MAAM,CAAC,wBAAwB,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,GACf,OAAO;CAoBX"}
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
export class TestDataGenerator {
|
|
9
9
|
// Optional Claude Code bridge for intelligent test generation
|
|
10
10
|
static claudeBridge = null;
|
|
11
|
+
// Optional logger for diagnostic output
|
|
12
|
+
static logger = null;
|
|
11
13
|
/**
|
|
12
14
|
* Set the Claude Code bridge for intelligent test generation
|
|
13
15
|
* Call this once during initialization if Claude integration is enabled
|
|
@@ -15,6 +17,13 @@ export class TestDataGenerator {
|
|
|
15
17
|
static setClaudeBridge(bridge) {
|
|
16
18
|
this.claudeBridge = bridge;
|
|
17
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Set the logger for diagnostic output
|
|
22
|
+
* Call this once during initialization
|
|
23
|
+
*/
|
|
24
|
+
static setLogger(logger) {
|
|
25
|
+
this.logger = logger;
|
|
26
|
+
}
|
|
18
27
|
/**
|
|
19
28
|
* Check if Claude Code integration is available and enabled
|
|
20
29
|
*/
|
|
@@ -144,7 +153,9 @@ export class TestDataGenerator {
|
|
|
144
153
|
try {
|
|
145
154
|
const claudeParams = await this.claudeBridge.generateTestParameters(tool);
|
|
146
155
|
if (claudeParams && claudeParams.length > 0) {
|
|
147
|
-
|
|
156
|
+
this.logger?.info("Using Claude-generated params", {
|
|
157
|
+
toolName: tool.name,
|
|
158
|
+
});
|
|
148
159
|
// Convert Claude params to TestScenario format
|
|
149
160
|
const claudeScenarios = claudeParams.map((params, index) => ({
|
|
150
161
|
name: this.getClaudeScenarioName(index),
|
|
@@ -163,7 +174,10 @@ export class TestDataGenerator {
|
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
176
|
catch (error) {
|
|
166
|
-
|
|
177
|
+
this.logger?.warn("Claude generation failed, falling back to schema-based", {
|
|
178
|
+
toolName: tool.name,
|
|
179
|
+
error: String(error),
|
|
180
|
+
});
|
|
167
181
|
}
|
|
168
182
|
}
|
|
169
183
|
// Fall back to schema-based generation
|
|
@@ -539,7 +553,10 @@ export class TestDataGenerator {
|
|
|
539
553
|
lowerFieldName.includes("documents");
|
|
540
554
|
if (isMutationField && schema.items) {
|
|
541
555
|
// Generate one minimal item even for "empty" variant
|
|
542
|
-
const
|
|
556
|
+
const itemSchema = Array.isArray(schema.items)
|
|
557
|
+
? schema.items[0]
|
|
558
|
+
: schema.items;
|
|
559
|
+
const item = this.generateValueFromSchema(itemSchema, "empty");
|
|
543
560
|
return [item];
|
|
544
561
|
}
|
|
545
562
|
return [];
|
|
@@ -548,9 +565,12 @@ export class TestDataGenerator {
|
|
|
548
565
|
// Generate multiple items
|
|
549
566
|
const count = 10;
|
|
550
567
|
if (schema.items) {
|
|
568
|
+
const itemSchema = Array.isArray(schema.items)
|
|
569
|
+
? schema.items[0]
|
|
570
|
+
: schema.items;
|
|
551
571
|
return Array(count)
|
|
552
572
|
.fill(0)
|
|
553
|
-
.map(() => this.generateValueFromSchema(
|
|
573
|
+
.map(() => this.generateValueFromSchema(itemSchema, variant));
|
|
554
574
|
}
|
|
555
575
|
return Array(count)
|
|
556
576
|
.fill(0)
|
|
@@ -559,7 +579,10 @@ export class TestDataGenerator {
|
|
|
559
579
|
// Typical variant - generate realistic array
|
|
560
580
|
if (schema.items) {
|
|
561
581
|
// Generate 1-2 items based on schema.items
|
|
562
|
-
const
|
|
582
|
+
const itemSchema = Array.isArray(schema.items)
|
|
583
|
+
? schema.items[0]
|
|
584
|
+
: schema.items;
|
|
585
|
+
const item = this.generateValueFromSchema(itemSchema, variant);
|
|
563
586
|
return [item];
|
|
564
587
|
}
|
|
565
588
|
// Context-aware array generation (fallback for simple arrays without schema.items)
|
|
@@ -650,7 +673,10 @@ export class TestDataGenerator {
|
|
|
650
673
|
}
|
|
651
674
|
case "array":
|
|
652
675
|
if (schema.items) {
|
|
653
|
-
const
|
|
676
|
+
const itemSchema = Array.isArray(schema.items)
|
|
677
|
+
? schema.items[0]
|
|
678
|
+
: schema.items;
|
|
679
|
+
const item = this.generateValueFromSchema(itemSchema, variant);
|
|
654
680
|
return [item];
|
|
655
681
|
}
|
|
656
682
|
return [];
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { Tool, CompatibilityCallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
6
6
|
import { TestScenario } from "./TestDataGenerator.js";
|
|
7
7
|
import { ValidationResult } from "./ResponseValidator.js";
|
|
8
|
+
import { PerformanceConfig } from "./config/performanceConfig.js";
|
|
8
9
|
export interface ScenarioTestResult {
|
|
9
10
|
scenario: TestScenario;
|
|
10
11
|
executed: boolean;
|
|
@@ -42,7 +43,14 @@ export interface ComprehensiveToolTestResult {
|
|
|
42
43
|
export declare class TestScenarioEngine {
|
|
43
44
|
private testTimeout;
|
|
44
45
|
private delayBetweenTests;
|
|
45
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Create a new TestScenarioEngine.
|
|
48
|
+
*
|
|
49
|
+
* @param testTimeout - Timeout for each test in milliseconds (default from PerformanceConfig)
|
|
50
|
+
* @param delayBetweenTests - Delay between tests for rate limiting (default: 0)
|
|
51
|
+
* @param performanceConfig - Optional performance configuration for centralized tuning
|
|
52
|
+
*/
|
|
53
|
+
constructor(testTimeout?: number, delayBetweenTests?: number, performanceConfig?: Partial<PerformanceConfig>);
|
|
46
54
|
/**
|
|
47
55
|
* Sleep for specified milliseconds (for rate limiting)
|
|
48
56
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestScenarioEngine.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/TestScenarioEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,IAAI,EACJ,2BAA2B,EAC5B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAqB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAEL,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"TestScenarioEngine.d.ts","sourceRoot":"","sources":["../../../src/services/assessment/TestScenarioEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,IAAI,EACJ,2BAA2B,EAC5B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAqB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAEL,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iBAAiB,EAElB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EACT,eAAe,GACf,mBAAmB,GACnB,mBAAmB,GACnB,QAAQ,GACR,UAAU,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,OAAO,EAAE;QACP,gBAAgB,EAAE,OAAO,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IAGF,qBAAqB,CAAC,EAAE;QACtB,YAAY,EAAE,OAAO,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;KAC9C,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAElC;;;;;;OAMG;gBAED,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,GAAE,MAAU,EAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAShD;;OAEG;YACW,KAAK;IAInB;;OAEG;IACG,yBAAyB,CAC7B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,2BAA2B,CAAC,GACxC,OAAO,CAAC,2BAA2B,CAAC,uBAAuB,CAAC,CAAC;IAoEhE;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACG,uBAAuB,CAC3B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,2BAA2B,CAAC,GACxC,OAAO,CAAC,2BAA2B,CAAC;IAiGvC;;OAEG;YACW,eAAe;IAwE7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoD9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoK/B;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM;CAsD3E"}
|
|
@@ -4,11 +4,23 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { TestDataGenerator } from "./TestDataGenerator.js";
|
|
6
6
|
import { ResponseValidator, } from "./ResponseValidator.js";
|
|
7
|
+
import { DEFAULT_PERFORMANCE_CONFIG, } from "./config/performanceConfig.js";
|
|
8
|
+
import { executeWithTimeout } from "./lib/timeoutUtils.js";
|
|
7
9
|
export class TestScenarioEngine {
|
|
8
10
|
testTimeout;
|
|
9
11
|
delayBetweenTests;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Create a new TestScenarioEngine.
|
|
14
|
+
*
|
|
15
|
+
* @param testTimeout - Timeout for each test in milliseconds (default from PerformanceConfig)
|
|
16
|
+
* @param delayBetweenTests - Delay between tests for rate limiting (default: 0)
|
|
17
|
+
* @param performanceConfig - Optional performance configuration for centralized tuning
|
|
18
|
+
*/
|
|
19
|
+
constructor(testTimeout, delayBetweenTests = 0, performanceConfig) {
|
|
20
|
+
this.testTimeout =
|
|
21
|
+
testTimeout ??
|
|
22
|
+
performanceConfig?.testTimeoutMs ??
|
|
23
|
+
DEFAULT_PERFORMANCE_CONFIG.testTimeoutMs;
|
|
12
24
|
this.delayBetweenTests = delayBetweenTests;
|
|
13
25
|
}
|
|
14
26
|
/**
|
|
@@ -29,10 +41,7 @@ export class TestScenarioEngine {
|
|
|
29
41
|
// Test 1: Minimal complexity - absolute minimum params
|
|
30
42
|
const minimalParams = this.generateMinimalParams(tool);
|
|
31
43
|
try {
|
|
32
|
-
const minimalResult = await
|
|
33
|
-
callTool(tool.name, minimalParams),
|
|
34
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), this.testTimeout)),
|
|
35
|
-
]);
|
|
44
|
+
const minimalResult = await executeWithTimeout(callTool(tool.name, minimalParams), { timeoutMs: this.testTimeout, errorMessage: "Timeout" });
|
|
36
45
|
// Tool works if it returns successfully OR if it returns a business logic error
|
|
37
46
|
// (business logic errors indicate the tool is validating correctly)
|
|
38
47
|
const isBusinessError = minimalResult.isError
|
|
@@ -53,10 +62,7 @@ export class TestScenarioEngine {
|
|
|
53
62
|
// Test 2: Simple complexity - one required param with simple value
|
|
54
63
|
const simpleParams = this.generateSimpleParams(tool);
|
|
55
64
|
try {
|
|
56
|
-
const simpleResult = await
|
|
57
|
-
callTool(tool.name, simpleParams),
|
|
58
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), this.testTimeout)),
|
|
59
|
-
]);
|
|
65
|
+
const simpleResult = await executeWithTimeout(callTool(tool.name, simpleParams), { timeoutMs: this.testTimeout, errorMessage: "Timeout" });
|
|
60
66
|
// Tool works if it returns successfully OR if it returns a business logic error
|
|
61
67
|
const isBusinessError = simpleResult.isError
|
|
62
68
|
? ResponseValidator.isBusinessLogicError({
|
|
@@ -228,10 +234,7 @@ export class TestScenarioEngine {
|
|
|
228
234
|
const startTime = Date.now();
|
|
229
235
|
try {
|
|
230
236
|
// Call tool with timeout
|
|
231
|
-
const response = await
|
|
232
|
-
callTool(tool.name, scenario.params),
|
|
233
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), this.testTimeout)),
|
|
234
|
-
]);
|
|
237
|
+
const response = await executeWithTimeout(callTool(tool.name, scenario.params), { timeoutMs: this.testTimeout, errorMessage: "Timeout" });
|
|
235
238
|
// Validate response
|
|
236
239
|
const validationContext = {
|
|
237
240
|
tool,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Configurable pattern system for inferring expected tool behavior from names.
|
|
5
5
|
* Supports JSON configuration files for customization.
|
|
6
6
|
*/
|
|
7
|
+
import type { Logger } from "../lib/logger.js";
|
|
7
8
|
/**
|
|
8
9
|
* Pattern configuration for tool behavior inference.
|
|
9
10
|
* Each category contains string patterns that are converted to RegExp at runtime.
|
|
@@ -52,9 +53,10 @@ export declare function compilePatterns(config: AnnotationPatternConfig): Compil
|
|
|
52
53
|
* Partial configs are merged with defaults.
|
|
53
54
|
*
|
|
54
55
|
* @param configPath - Path to JSON configuration file
|
|
56
|
+
* @param logger - Optional logger for diagnostic output
|
|
55
57
|
* @returns Merged configuration with defaults
|
|
56
58
|
*/
|
|
57
|
-
export declare function loadPatternConfig(configPath?: string): AnnotationPatternConfig;
|
|
59
|
+
export declare function loadPatternConfig(configPath?: string, logger?: Logger): AnnotationPatternConfig;
|
|
58
60
|
/**
|
|
59
61
|
* Match a tool name against compiled patterns and return the result.
|
|
60
62
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotationPatterns.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/annotationPatterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"annotationPatterns.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/annotationPatterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,iFAAiF;IACjF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0FAA0F;IAC1F,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,8FAA8F;IAC9F,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mFAAmF;IACnF,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,UAAU,GAAG,aAAa,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACzE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,uBAqMzC,CAAC;AAoBF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,uBAAuB,GAC9B,gBAAgB,CAOlB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,uBAAuB,CAyBzB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,gBAAgB,GACzB,kBAAkB,CA0DpB;AAOD;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAK7D;AAMD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,gBAAgB,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAW3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,EAU5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gCAAgC,EAAE,MAAM,EAgCpD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAM,EAWnD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EAAE,GAClB,wBAAwB,CAuD1B;AAED;;;;;GAKG;AACH,wBAAgB,uCAAuC,CAAC,WAAW,EAAE,MAAM,GAAG;IAC5E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CA0BA"}
|
|
@@ -239,9 +239,10 @@ export function compilePatterns(config) {
|
|
|
239
239
|
* Partial configs are merged with defaults.
|
|
240
240
|
*
|
|
241
241
|
* @param configPath - Path to JSON configuration file
|
|
242
|
+
* @param logger - Optional logger for diagnostic output
|
|
242
243
|
* @returns Merged configuration with defaults
|
|
243
244
|
*/
|
|
244
|
-
export function loadPatternConfig(configPath) {
|
|
245
|
+
export function loadPatternConfig(configPath, logger) {
|
|
245
246
|
if (!configPath) {
|
|
246
247
|
return DEFAULT_ANNOTATION_PATTERNS;
|
|
247
248
|
}
|
|
@@ -257,7 +258,9 @@ export function loadPatternConfig(configPath) {
|
|
|
257
258
|
};
|
|
258
259
|
}
|
|
259
260
|
catch {
|
|
260
|
-
|
|
261
|
+
logger?.warn("Could not load pattern config, using defaults", {
|
|
262
|
+
configPath,
|
|
263
|
+
});
|
|
261
264
|
return DEFAULT_ANNOTATION_PATTERNS;
|
|
262
265
|
}
|
|
263
266
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architecture Pattern Configuration
|
|
3
|
+
*
|
|
4
|
+
* Pattern database for detecting server architecture characteristics including:
|
|
5
|
+
* - Database backends (Neo4j, MongoDB, PostgreSQL, etc.)
|
|
6
|
+
* - Transport modes (stdio, HTTP, SSE)
|
|
7
|
+
* - Network access requirements
|
|
8
|
+
*
|
|
9
|
+
* Created as part of Issue #57: Architecture detection and behavior inference modules
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Database backend types detected from patterns
|
|
13
|
+
*/
|
|
14
|
+
export type DatabaseBackend = "neo4j" | "mongodb" | "sqlite" | "postgresql" | "mysql" | "redis" | "dynamodb" | "firestore" | "supabase" | "cassandra" | "elasticsearch" | "unknown";
|
|
15
|
+
/**
|
|
16
|
+
* Transport mode capabilities
|
|
17
|
+
*/
|
|
18
|
+
export type TransportMode = "stdio" | "http" | "sse";
|
|
19
|
+
/**
|
|
20
|
+
* Server architecture classification
|
|
21
|
+
*/
|
|
22
|
+
export type ServerArchitectureType = "local" | "hybrid" | "remote";
|
|
23
|
+
/**
|
|
24
|
+
* Database detection patterns.
|
|
25
|
+
* Each database has multiple patterns to catch various naming conventions.
|
|
26
|
+
*/
|
|
27
|
+
export declare const DATABASE_PATTERNS: Record<Exclude<DatabaseBackend, "unknown">, RegExp[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Transport detection patterns.
|
|
30
|
+
* Used to identify which transport modes a server supports.
|
|
31
|
+
*/
|
|
32
|
+
export declare const TRANSPORT_PATTERNS: Record<TransportMode, RegExp[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Network access indicators.
|
|
35
|
+
* Patterns that suggest the server requires network/internet access.
|
|
36
|
+
*/
|
|
37
|
+
export declare const NETWORK_INDICATORS: RegExp[];
|
|
38
|
+
/**
|
|
39
|
+
* Local-only indicators.
|
|
40
|
+
* Patterns that suggest the server operates locally without network.
|
|
41
|
+
*/
|
|
42
|
+
export declare const LOCAL_ONLY_INDICATORS: RegExp[];
|
|
43
|
+
/**
|
|
44
|
+
* External service detection patterns.
|
|
45
|
+
* Maps service names to URL/import patterns.
|
|
46
|
+
*/
|
|
47
|
+
export declare const EXTERNAL_SERVICE_PATTERNS: Record<string, RegExp[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Architecture pattern configuration interface.
|
|
50
|
+
* Allows customization of all pattern categories.
|
|
51
|
+
*/
|
|
52
|
+
export interface ArchitecturePatternConfig {
|
|
53
|
+
databases: Record<string, RegExp[]>;
|
|
54
|
+
transports: Record<string, RegExp[]>;
|
|
55
|
+
networkIndicators: RegExp[];
|
|
56
|
+
localOnlyIndicators: RegExp[];
|
|
57
|
+
externalServices: Record<string, RegExp[]>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get default architecture patterns configuration.
|
|
61
|
+
*/
|
|
62
|
+
export declare function getDefaultArchitecturePatterns(): ArchitecturePatternConfig;
|
|
63
|
+
/**
|
|
64
|
+
* Detect database backends from text content.
|
|
65
|
+
* Searches for patterns in tool descriptions, source code, or package.json.
|
|
66
|
+
*
|
|
67
|
+
* @param content - Text content to search (description, source code, etc.)
|
|
68
|
+
* @returns Array of detected database backends with match evidence
|
|
69
|
+
*/
|
|
70
|
+
export declare function detectDatabasesFromContent(content: string): Array<{
|
|
71
|
+
backend: DatabaseBackend;
|
|
72
|
+
evidence: string;
|
|
73
|
+
confidence: "high" | "medium" | "low";
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* Detect transport modes from text content.
|
|
77
|
+
*
|
|
78
|
+
* @param content - Text content to search
|
|
79
|
+
* @returns Array of detected transport modes
|
|
80
|
+
*/
|
|
81
|
+
export declare function detectTransportsFromContent(content: string): TransportMode[];
|
|
82
|
+
/**
|
|
83
|
+
* Check if content indicates network access requirements.
|
|
84
|
+
*
|
|
85
|
+
* @param content - Text content to search
|
|
86
|
+
* @returns Object with network access flag and matched indicators
|
|
87
|
+
*/
|
|
88
|
+
export declare function checkNetworkAccess(content: string): {
|
|
89
|
+
requiresNetwork: boolean;
|
|
90
|
+
indicators: string[];
|
|
91
|
+
localOnly: boolean;
|
|
92
|
+
localIndicators: string[];
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Detect external services from content.
|
|
96
|
+
*
|
|
97
|
+
* @param content - Text content to search
|
|
98
|
+
* @returns Array of detected service names
|
|
99
|
+
*/
|
|
100
|
+
export declare function detectExternalServices(content: string): string[];
|
|
101
|
+
//# sourceMappingURL=architecturePatterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecturePatterns.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/config/architecturePatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,OAAO,GACP,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,OAAO,GACP,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,eAAe,GACf,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,EACnC,MAAM,EAAE,CAiCT,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,CAyB9D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,EA6BtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAmBzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAW9D,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,yBAAyB,CAQ1E;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IACjE,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC,CAAC,CA4BD;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAa5E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAwBA;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAahE"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architecture Pattern Configuration
|
|
3
|
+
*
|
|
4
|
+
* Pattern database for detecting server architecture characteristics including:
|
|
5
|
+
* - Database backends (Neo4j, MongoDB, PostgreSQL, etc.)
|
|
6
|
+
* - Transport modes (stdio, HTTP, SSE)
|
|
7
|
+
* - Network access requirements
|
|
8
|
+
*
|
|
9
|
+
* Created as part of Issue #57: Architecture detection and behavior inference modules
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Database detection patterns.
|
|
13
|
+
* Each database has multiple patterns to catch various naming conventions.
|
|
14
|
+
*/
|
|
15
|
+
export const DATABASE_PATTERNS = {
|
|
16
|
+
neo4j: [
|
|
17
|
+
/\bneo4j\b/i,
|
|
18
|
+
/\bcypher\b/i,
|
|
19
|
+
/graph\s*database/i,
|
|
20
|
+
/neo4j:\/\//i,
|
|
21
|
+
/\bgraph\s*db\b/i,
|
|
22
|
+
],
|
|
23
|
+
mongodb: [
|
|
24
|
+
/\bmongodb\b/i,
|
|
25
|
+
/\bmongoose\b/i,
|
|
26
|
+
/\bmongo\b/i,
|
|
27
|
+
/mongodb:\/\//i,
|
|
28
|
+
/mongodb\+srv:\/\//i,
|
|
29
|
+
/\bpymongo\b/i,
|
|
30
|
+
],
|
|
31
|
+
sqlite: [/\bsqlite\b/i, /\bsqlite3\b/i, /\.sqlite\b/i, /\.db\b/i],
|
|
32
|
+
postgresql: [
|
|
33
|
+
/\bpostgres\b/i,
|
|
34
|
+
/\bpostgresql\b/i,
|
|
35
|
+
/\bpg\b/i,
|
|
36
|
+
/postgres:\/\//i,
|
|
37
|
+
/postgresql:\/\//i,
|
|
38
|
+
/\bpsycopg\b/i,
|
|
39
|
+
],
|
|
40
|
+
mysql: [/\bmysql\b/i, /\bmariadb\b/i, /mysql:\/\//i, /mariadb:\/\//i],
|
|
41
|
+
redis: [/\bredis\b/i, /redis:\/\//i, /\bupstash\b/i],
|
|
42
|
+
dynamodb: [/\bdynamodb\b/i, /\bdynamo\b/i, /aws.*dynamo/i],
|
|
43
|
+
firestore: [/\bfirestore\b/i, /firebase.*firestore/i],
|
|
44
|
+
supabase: [/\bsupabase\b/i, /supabase\.co/i],
|
|
45
|
+
cassandra: [/\bcassandra\b/i, /\bscylla\b/i, /cql/i],
|
|
46
|
+
elasticsearch: [/\belasticsearch\b/i, /\belastic\b/i, /\bopensearch\b/i],
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Transport detection patterns.
|
|
50
|
+
* Used to identify which transport modes a server supports.
|
|
51
|
+
*/
|
|
52
|
+
export const TRANSPORT_PATTERNS = {
|
|
53
|
+
stdio: [
|
|
54
|
+
/\bstdio\b/i,
|
|
55
|
+
/\bstdin\b/i,
|
|
56
|
+
/\bstdout\b/i,
|
|
57
|
+
/transport.*stdio/i,
|
|
58
|
+
/stdio.*transport/i,
|
|
59
|
+
/process\.stdin/i,
|
|
60
|
+
/process\.stdout/i,
|
|
61
|
+
],
|
|
62
|
+
http: [
|
|
63
|
+
/\bhttp\s*transport\b/i,
|
|
64
|
+
/streamable-http/i,
|
|
65
|
+
/rest\s*api/i,
|
|
66
|
+
/\bhttp\s*server\b/i,
|
|
67
|
+
/express|fastify|koa|hono/i,
|
|
68
|
+
/app\.listen/i,
|
|
69
|
+
],
|
|
70
|
+
sse: [
|
|
71
|
+
/\bsse\b/i,
|
|
72
|
+
/server-sent/i,
|
|
73
|
+
/event\s*stream/i,
|
|
74
|
+
/sse\s*transport/i,
|
|
75
|
+
/text\/event-stream/i,
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Network access indicators.
|
|
80
|
+
* Patterns that suggest the server requires network/internet access.
|
|
81
|
+
*/
|
|
82
|
+
export const NETWORK_INDICATORS = [
|
|
83
|
+
// URL patterns
|
|
84
|
+
/https?:\/\//i,
|
|
85
|
+
/wss?:\/\//i,
|
|
86
|
+
// API domain patterns
|
|
87
|
+
/api\.[a-z]+\./i,
|
|
88
|
+
/\.api\./i,
|
|
89
|
+
// HTTP client libraries
|
|
90
|
+
/\bfetch\s*\(/i,
|
|
91
|
+
/\baxios\b/i,
|
|
92
|
+
/\brequest\b/i,
|
|
93
|
+
/\bgot\b/i,
|
|
94
|
+
/\bnode-fetch\b/i,
|
|
95
|
+
/\bundici\b/i,
|
|
96
|
+
/\bhttpx\b/i,
|
|
97
|
+
/\brequests\b/i,
|
|
98
|
+
/\baiohttp\b/i,
|
|
99
|
+
// WebSocket patterns
|
|
100
|
+
/\bwebsocket\b/i,
|
|
101
|
+
/\bsocket\.io\b/i,
|
|
102
|
+
/\bws\b/i,
|
|
103
|
+
// Cloud service patterns
|
|
104
|
+
/aws-sdk/i,
|
|
105
|
+
/\bgoogle-cloud\b/i,
|
|
106
|
+
/azure/i,
|
|
107
|
+
];
|
|
108
|
+
/**
|
|
109
|
+
* Local-only indicators.
|
|
110
|
+
* Patterns that suggest the server operates locally without network.
|
|
111
|
+
*/
|
|
112
|
+
export const LOCAL_ONLY_INDICATORS = [
|
|
113
|
+
// File system operations
|
|
114
|
+
/\bfs\b/i,
|
|
115
|
+
/file\s*system/i,
|
|
116
|
+
/local\s*file/i,
|
|
117
|
+
/\.readFile/i,
|
|
118
|
+
/\.writeFile/i,
|
|
119
|
+
// SQLite (local database)
|
|
120
|
+
/\bsqlite\b/i,
|
|
121
|
+
// Local path patterns
|
|
122
|
+
/~\/|\/home\/|\/Users\//i,
|
|
123
|
+
// Local process execution
|
|
124
|
+
/child_process/i,
|
|
125
|
+
/subprocess/i,
|
|
126
|
+
/\bexec\b/i,
|
|
127
|
+
/\bspawn\b/i,
|
|
128
|
+
];
|
|
129
|
+
/**
|
|
130
|
+
* External service detection patterns.
|
|
131
|
+
* Maps service names to URL/import patterns.
|
|
132
|
+
*/
|
|
133
|
+
export const EXTERNAL_SERVICE_PATTERNS = {
|
|
134
|
+
github: [/github\.com/i, /api\.github/i, /\b@octokit\b/i, /\bgithub\b/i],
|
|
135
|
+
gitlab: [/gitlab\.com/i, /api\.gitlab/i, /\bgitlab\b/i],
|
|
136
|
+
aws: [/aws-sdk/i, /amazonaws\.com/i, /\baws\b/i],
|
|
137
|
+
gcp: [/google-cloud/i, /googleapis\.com/i, /\bgcp\b/i],
|
|
138
|
+
azure: [/azure/i, /microsoft\.com/i],
|
|
139
|
+
openai: [/openai\.com/i, /api\.openai/i, /\bopenai\b/i],
|
|
140
|
+
anthropic: [/anthropic\.com/i, /api\.anthropic/i, /\banthropic\b/i],
|
|
141
|
+
slack: [/slack\.com/i, /api\.slack/i, /\bslack\b/i],
|
|
142
|
+
discord: [/discord\.com/i, /discord\.gg/i, /\bdiscord\b/i],
|
|
143
|
+
stripe: [/stripe\.com/i, /api\.stripe/i, /\bstripe\b/i],
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Get default architecture patterns configuration.
|
|
147
|
+
*/
|
|
148
|
+
export function getDefaultArchitecturePatterns() {
|
|
149
|
+
return {
|
|
150
|
+
databases: DATABASE_PATTERNS,
|
|
151
|
+
transports: TRANSPORT_PATTERNS,
|
|
152
|
+
networkIndicators: NETWORK_INDICATORS,
|
|
153
|
+
localOnlyIndicators: LOCAL_ONLY_INDICATORS,
|
|
154
|
+
externalServices: EXTERNAL_SERVICE_PATTERNS,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Detect database backends from text content.
|
|
159
|
+
* Searches for patterns in tool descriptions, source code, or package.json.
|
|
160
|
+
*
|
|
161
|
+
* @param content - Text content to search (description, source code, etc.)
|
|
162
|
+
* @returns Array of detected database backends with match evidence
|
|
163
|
+
*/
|
|
164
|
+
export function detectDatabasesFromContent(content) {
|
|
165
|
+
const results = [];
|
|
166
|
+
for (const [backend, patterns] of Object.entries(DATABASE_PATTERNS)) {
|
|
167
|
+
for (const pattern of patterns) {
|
|
168
|
+
const match = content.match(pattern);
|
|
169
|
+
if (match) {
|
|
170
|
+
// Determine confidence based on pattern specificity
|
|
171
|
+
const confidence = pattern.source.includes("://") || pattern.source.includes("\\b")
|
|
172
|
+
? "high"
|
|
173
|
+
: "medium";
|
|
174
|
+
results.push({
|
|
175
|
+
backend: backend,
|
|
176
|
+
evidence: match[0],
|
|
177
|
+
confidence,
|
|
178
|
+
});
|
|
179
|
+
break; // Only one match per backend
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return results;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Detect transport modes from text content.
|
|
187
|
+
*
|
|
188
|
+
* @param content - Text content to search
|
|
189
|
+
* @returns Array of detected transport modes
|
|
190
|
+
*/
|
|
191
|
+
export function detectTransportsFromContent(content) {
|
|
192
|
+
const transports = new Set();
|
|
193
|
+
for (const [mode, patterns] of Object.entries(TRANSPORT_PATTERNS)) {
|
|
194
|
+
for (const pattern of patterns) {
|
|
195
|
+
if (pattern.test(content)) {
|
|
196
|
+
transports.add(mode);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return Array.from(transports);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check if content indicates network access requirements.
|
|
205
|
+
*
|
|
206
|
+
* @param content - Text content to search
|
|
207
|
+
* @returns Object with network access flag and matched indicators
|
|
208
|
+
*/
|
|
209
|
+
export function checkNetworkAccess(content) {
|
|
210
|
+
const networkMatches = [];
|
|
211
|
+
const localMatches = [];
|
|
212
|
+
for (const pattern of NETWORK_INDICATORS) {
|
|
213
|
+
const match = content.match(pattern);
|
|
214
|
+
if (match) {
|
|
215
|
+
networkMatches.push(match[0]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
for (const pattern of LOCAL_ONLY_INDICATORS) {
|
|
219
|
+
const match = content.match(pattern);
|
|
220
|
+
if (match) {
|
|
221
|
+
localMatches.push(match[0]);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
requiresNetwork: networkMatches.length > 0,
|
|
226
|
+
indicators: networkMatches,
|
|
227
|
+
localOnly: localMatches.length > 0 && networkMatches.length === 0,
|
|
228
|
+
localIndicators: localMatches,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Detect external services from content.
|
|
233
|
+
*
|
|
234
|
+
* @param content - Text content to search
|
|
235
|
+
* @returns Array of detected service names
|
|
236
|
+
*/
|
|
237
|
+
export function detectExternalServices(content) {
|
|
238
|
+
const services = new Set();
|
|
239
|
+
for (const [service, patterns] of Object.entries(EXTERNAL_SERVICE_PATTERNS)) {
|
|
240
|
+
for (const pattern of patterns) {
|
|
241
|
+
if (pattern.test(content)) {
|
|
242
|
+
services.add(service);
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return Array.from(services);
|
|
248
|
+
}
|