@bryan-thompson/inspector-assessment-client 1.31.0 → 1.32.1
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-CXcl26vR.js → OAuthCallback-DQqdKmh-.js} +1 -1
- package/dist/assets/{OAuthDebugCallback-J9s4SF_c.js → OAuthDebugCallback-CZ79tNPn.js} +1 -1
- package/dist/assets/{index-_HAw2b2G.js → index-7dGKjpGX.js} +4 -4
- package/dist/index.html +1 -1
- package/lib/lib/assessment/extendedTypes.d.ts +21 -0
- package/lib/lib/assessment/extendedTypes.d.ts.map +1 -1
- package/lib/lib/assessment/resultTypes.d.ts +12 -2
- package/lib/lib/assessment/resultTypes.d.ts.map +1 -1
- package/lib/lib/moduleScoring.d.ts.map +1 -1
- package/lib/lib/moduleScoring.js +5 -0
- package/lib/services/assessment/AssessmentOrchestrator.d.ts +1 -28
- package/lib/services/assessment/AssessmentOrchestrator.d.ts.map +1 -1
- package/lib/services/assessment/AssessmentOrchestrator.js +66 -576
- package/lib/services/assessment/modules/ConformanceAssessor.d.ts +4 -0
- package/lib/services/assessment/modules/ConformanceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ConformanceAssessor.js +21 -0
- package/lib/services/assessment/modules/ResourceAssessor.d.ts.map +1 -1
- package/lib/services/assessment/modules/ResourceAssessor.js +6 -1
- package/lib/services/assessment/registry/AssessorDefinitions.d.ts +38 -0
- package/lib/services/assessment/registry/AssessorDefinitions.d.ts.map +1 -0
- package/lib/services/assessment/registry/AssessorDefinitions.js +370 -0
- package/lib/services/assessment/registry/AssessorRegistry.d.ts +157 -0
- package/lib/services/assessment/registry/AssessorRegistry.d.ts.map +1 -0
- package/lib/services/assessment/registry/AssessorRegistry.js +364 -0
- package/lib/services/assessment/registry/estimators.d.ts +93 -0
- package/lib/services/assessment/registry/estimators.d.ts.map +1 -0
- package/lib/services/assessment/registry/estimators.js +176 -0
- package/lib/services/assessment/registry/index.d.ts +13 -0
- package/lib/services/assessment/registry/index.d.ts.map +1 -0
- package/lib/services/assessment/registry/index.js +16 -0
- package/lib/services/assessment/registry/types.d.ts +180 -0
- package/lib/services/assessment/registry/types.d.ts.map +1 -0
- package/lib/services/assessment/registry/types.js +35 -0
- package/lib/services/assessment/responseValidatorSchemas.d.ts +4 -4
- package/package.json +1 -1
|
@@ -36,6 +36,10 @@ export declare class ConformanceAssessor extends BaseAssessor<ConformanceAssessm
|
|
|
36
36
|
* Parse checks.json file from conformance results
|
|
37
37
|
*/
|
|
38
38
|
private parseChecksFile;
|
|
39
|
+
/**
|
|
40
|
+
* Check if the MCP conformance package is available
|
|
41
|
+
*/
|
|
42
|
+
private isConformancePackageAvailable;
|
|
39
43
|
/**
|
|
40
44
|
* Cleanup temporary directory
|
|
41
45
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConformanceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ConformanceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,gCAAgC,CAAC;AAgCxC;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAC1E;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ConformanceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ConformanceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,gCAAgC,CAAC;AAgCxC;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAC1E;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkGxE;;OAEG;YACW,WAAW;IAwEzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAarC;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA+BlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+C/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAmB5B"}
|
|
@@ -49,6 +49,11 @@ export class ConformanceAssessor extends BaseAssessor {
|
|
|
49
49
|
this.logger.info("Conformance tests skipped: serverUrl not available (requires HTTP/SSE transport)");
|
|
50
50
|
return this.createSkippedResult("Server URL not available. Conformance tests require HTTP or SSE transport.");
|
|
51
51
|
}
|
|
52
|
+
// Check if conformance package is available
|
|
53
|
+
if (!this.isConformancePackageAvailable()) {
|
|
54
|
+
this.logger.warn("MCP conformance package not available. Install with: npm install -g @modelcontextprotocol/conformance");
|
|
55
|
+
return this.createSkippedResult("MCP conformance package not installed. Run: npm install -g @modelcontextprotocol/conformance");
|
|
56
|
+
}
|
|
52
57
|
this.logger.info(`Running conformance tests against: ${serverUrl}`);
|
|
53
58
|
const scenarios = [];
|
|
54
59
|
const allChecks = [];
|
|
@@ -199,6 +204,22 @@ export class ConformanceAssessor extends BaseAssessor {
|
|
|
199
204
|
return [];
|
|
200
205
|
}
|
|
201
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if the MCP conformance package is available
|
|
209
|
+
*/
|
|
210
|
+
isConformancePackageAvailable() {
|
|
211
|
+
try {
|
|
212
|
+
execFileSync("npx", ["@modelcontextprotocol/conformance", "--version"], {
|
|
213
|
+
timeout: 30000,
|
|
214
|
+
stdio: "pipe",
|
|
215
|
+
encoding: "utf-8",
|
|
216
|
+
});
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
202
223
|
/**
|
|
203
224
|
* Cleanup temporary directory
|
|
204
225
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ResourceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,kBAAkB,EAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAuQ9D,qBAAa,gBAAiB,SAAQ,YAAY;IAC1C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8FrE,OAAO,CAAC,yBAAyB;YAiBnB,YAAY;IAoG1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;YAsBjB,oBAAoB;IAkGlC;;;OAGG;YACW,6BAA6B;IA4F3C;;;OAGG;YACW,2BAA2B;
|
|
1
|
+
{"version":3,"file":"ResourceAssessor.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/modules/ResourceAssessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,kBAAkB,EAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAuQ9D,qBAAa,gBAAiB,SAAQ,YAAY;IAC1C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8FrE,OAAO,CAAC,yBAAyB;YAiBnB,YAAY;IAoG1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;YAsBjB,oBAAoB;IAkGlC;;;OAGG;YACW,6BAA6B;IA4F3C;;;OAGG;YACW,2BAA2B;IAgEzC;;OAEG;YACW,mBAAmB;IAmEjC,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,wBAAwB;IAIhC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,mBAAmB;IAoC3B,OAAO,CAAC,uBAAuB;CA+DhC"}
|
|
@@ -605,7 +605,8 @@ export class ResourceAssessor extends BaseAssessor {
|
|
|
605
605
|
baseSchemes.add("file");
|
|
606
606
|
baseSchemes.add("resource");
|
|
607
607
|
}
|
|
608
|
-
// Test hidden resource patterns
|
|
608
|
+
// Test hidden resource patterns with rate limiting to avoid overwhelming target
|
|
609
|
+
const PROBE_DELAY_MS = 50; // 50ms delay between probes
|
|
609
610
|
for (const pattern of HIDDEN_RESOURCE_PATTERNS) {
|
|
610
611
|
// For patterns with their own scheme, test directly
|
|
611
612
|
if (pattern.includes("://")) {
|
|
@@ -614,6 +615,8 @@ export class ResourceAssessor extends BaseAssessor {
|
|
|
614
615
|
if (probeResult) {
|
|
615
616
|
results.push(probeResult);
|
|
616
617
|
}
|
|
618
|
+
// Rate limit between probes
|
|
619
|
+
await new Promise((resolve) => setTimeout(resolve, PROBE_DELAY_MS));
|
|
617
620
|
}
|
|
618
621
|
else {
|
|
619
622
|
// For file paths, combine with discovered schemes
|
|
@@ -624,6 +627,8 @@ export class ResourceAssessor extends BaseAssessor {
|
|
|
624
627
|
if (probeResult) {
|
|
625
628
|
results.push(probeResult);
|
|
626
629
|
}
|
|
630
|
+
// Rate limit between probes
|
|
631
|
+
await new Promise((resolve) => setTimeout(resolve, PROBE_DELAY_MS));
|
|
627
632
|
}
|
|
628
633
|
}
|
|
629
634
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessor Definitions
|
|
3
|
+
*
|
|
4
|
+
* Declarative configuration for all 19 assessors.
|
|
5
|
+
* Single source of truth for assessor registration, phase ordering,
|
|
6
|
+
* config flags, and Claude bridge support.
|
|
7
|
+
*
|
|
8
|
+
* @module assessment/registry/AssessorDefinitions
|
|
9
|
+
* @see GitHub Issue #91
|
|
10
|
+
*/
|
|
11
|
+
import type { AssessorDefinition } from "./types.js";
|
|
12
|
+
import { AssessmentPhase } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* All assessor definitions in phase order.
|
|
15
|
+
* This is the single source of truth for assessor registration.
|
|
16
|
+
*
|
|
17
|
+
* Order within phases:
|
|
18
|
+
* - Phase 0 (PRE): Temporal only
|
|
19
|
+
* - Phase 1 (CORE): Functionality, Security, Documentation, ErrorHandling, Usability
|
|
20
|
+
* - Phase 2 (PROTOCOL): ProtocolCompliance
|
|
21
|
+
* - Phase 3 (COMPLIANCE): AUP, Annotations, Libraries, Manifest, Portability, APIs, Auth
|
|
22
|
+
* - Phase 4 (CAPABILITY): Resources, Prompts, CrossCapability
|
|
23
|
+
* - Phase 5 (QUALITY): FileModularization, Conformance
|
|
24
|
+
*/
|
|
25
|
+
export declare const ASSESSOR_DEFINITIONS: AssessorDefinition[];
|
|
26
|
+
/**
|
|
27
|
+
* Map of assessor ID to definition for fast lookup.
|
|
28
|
+
*/
|
|
29
|
+
export declare const ASSESSOR_DEFINITION_MAP: Map<string, AssessorDefinition>;
|
|
30
|
+
/**
|
|
31
|
+
* Get assessor definitions by phase.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getDefinitionsByPhase(phase: AssessmentPhase): AssessorDefinition[];
|
|
34
|
+
/**
|
|
35
|
+
* Get all phases in execution order.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getOrderedPhases(): AssessmentPhase[];
|
|
38
|
+
//# sourceMappingURL=AssessorDefinitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssessorDefinitions.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/registry/AssessorDefinitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA4D1C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EA+SpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAEnE,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,GACrB,kBAAkB,EAAE,CAEtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,EAAE,CASpD"}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessor Definitions
|
|
3
|
+
*
|
|
4
|
+
* Declarative configuration for all 19 assessors.
|
|
5
|
+
* Single source of truth for assessor registration, phase ordering,
|
|
6
|
+
* config flags, and Claude bridge support.
|
|
7
|
+
*
|
|
8
|
+
* @module assessment/registry/AssessorDefinitions
|
|
9
|
+
* @see GitHub Issue #91
|
|
10
|
+
*/
|
|
11
|
+
import { AssessmentPhase } from "./types.js";
|
|
12
|
+
// Core assessor imports
|
|
13
|
+
import { FunctionalityAssessor } from "../modules/FunctionalityAssessor.js";
|
|
14
|
+
import { SecurityAssessor } from "../modules/SecurityAssessor.js";
|
|
15
|
+
import { DocumentationAssessor } from "../modules/DocumentationAssessor.js";
|
|
16
|
+
import { ErrorHandlingAssessor } from "../modules/ErrorHandlingAssessor.js";
|
|
17
|
+
import { UsabilityAssessor } from "../modules/UsabilityAssessor.js";
|
|
18
|
+
// Protocol compliance
|
|
19
|
+
import { ProtocolComplianceAssessor } from "../modules/ProtocolComplianceAssessor.js";
|
|
20
|
+
// MCP Directory compliance gap assessors
|
|
21
|
+
import { AUPComplianceAssessor } from "../modules/AUPComplianceAssessor.js";
|
|
22
|
+
import { ToolAnnotationAssessor } from "../modules/ToolAnnotationAssessor.js";
|
|
23
|
+
import { ProhibitedLibrariesAssessor } from "../modules/ProhibitedLibrariesAssessor.js";
|
|
24
|
+
import { ManifestValidationAssessor } from "../modules/ManifestValidationAssessor.js";
|
|
25
|
+
import { PortabilityAssessor } from "../modules/PortabilityAssessor.js";
|
|
26
|
+
import { ExternalAPIScannerAssessor } from "../modules/ExternalAPIScannerAssessor.js";
|
|
27
|
+
import { TemporalAssessor } from "../modules/TemporalAssessor.js";
|
|
28
|
+
import { AuthenticationAssessor } from "../modules/AuthenticationAssessor.js";
|
|
29
|
+
// Capability assessors
|
|
30
|
+
import { ResourceAssessor } from "../modules/ResourceAssessor.js";
|
|
31
|
+
import { PromptAssessor } from "../modules/PromptAssessor.js";
|
|
32
|
+
import { CrossCapabilitySecurityAssessor } from "../modules/CrossCapabilitySecurityAssessor.js";
|
|
33
|
+
// Code quality assessors
|
|
34
|
+
import { FileModularizationAssessor } from "../modules/FileModularizationAssessor.js";
|
|
35
|
+
import { ConformanceAssessor } from "../modules/ConformanceAssessor.js";
|
|
36
|
+
// Pattern configuration for ToolAnnotationAssessor
|
|
37
|
+
import { loadPatternConfig, compilePatterns, } from "../config/annotationPatterns.js";
|
|
38
|
+
// Test estimators
|
|
39
|
+
import { estimateTemporalTests, estimateFunctionalityTests, estimateSecurityTests, estimateDocumentationTests, estimateErrorHandlingTests, estimateUsabilityTests, estimateProtocolComplianceTests, estimateAUPComplianceTests, estimateToolAnnotationTests, estimateProhibitedLibrariesTests, estimateManifestValidationTests, estimatePortabilityTests, estimateExternalAPIScannerTests, estimateAuthenticationTests, estimateResourceTests, estimatePromptTests, estimateCrossCapabilityTests, estimateFileModularizationTests, estimateConformanceTests, } from "./estimators.js";
|
|
40
|
+
/**
|
|
41
|
+
* All assessor definitions in phase order.
|
|
42
|
+
* This is the single source of truth for assessor registration.
|
|
43
|
+
*
|
|
44
|
+
* Order within phases:
|
|
45
|
+
* - Phase 0 (PRE): Temporal only
|
|
46
|
+
* - Phase 1 (CORE): Functionality, Security, Documentation, ErrorHandling, Usability
|
|
47
|
+
* - Phase 2 (PROTOCOL): ProtocolCompliance
|
|
48
|
+
* - Phase 3 (COMPLIANCE): AUP, Annotations, Libraries, Manifest, Portability, APIs, Auth
|
|
49
|
+
* - Phase 4 (CAPABILITY): Resources, Prompts, CrossCapability
|
|
50
|
+
* - Phase 5 (QUALITY): FileModularization, Conformance
|
|
51
|
+
*/
|
|
52
|
+
export const ASSESSOR_DEFINITIONS = [
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Phase 0: PRE - Temporal (must run first for clean baseline)
|
|
55
|
+
// ============================================================================
|
|
56
|
+
{
|
|
57
|
+
id: "temporal",
|
|
58
|
+
displayName: "Temporal",
|
|
59
|
+
assessorClass: TemporalAssessor,
|
|
60
|
+
resultField: "temporal",
|
|
61
|
+
phase: AssessmentPhase.PRE,
|
|
62
|
+
configFlags: {
|
|
63
|
+
primary: "temporal",
|
|
64
|
+
defaultEnabled: false, // Opt-in
|
|
65
|
+
},
|
|
66
|
+
requiresExtended: true,
|
|
67
|
+
supportsClaudeBridge: false,
|
|
68
|
+
estimateTests: estimateTemporalTests,
|
|
69
|
+
},
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// Phase 1: CORE - The original 5 assessors
|
|
72
|
+
// ============================================================================
|
|
73
|
+
{
|
|
74
|
+
id: "functionality",
|
|
75
|
+
displayName: "Functionality",
|
|
76
|
+
assessorClass: FunctionalityAssessor,
|
|
77
|
+
resultField: "functionality",
|
|
78
|
+
phase: AssessmentPhase.CORE,
|
|
79
|
+
configFlags: {
|
|
80
|
+
primary: "functionality",
|
|
81
|
+
defaultEnabled: true, // Enabled unless explicitly disabled
|
|
82
|
+
},
|
|
83
|
+
requiresExtended: false,
|
|
84
|
+
supportsClaudeBridge: false,
|
|
85
|
+
estimateTests: estimateFunctionalityTests,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "security",
|
|
89
|
+
displayName: "Security",
|
|
90
|
+
assessorClass: SecurityAssessor,
|
|
91
|
+
resultField: "security",
|
|
92
|
+
phase: AssessmentPhase.CORE,
|
|
93
|
+
configFlags: {
|
|
94
|
+
primary: "security",
|
|
95
|
+
defaultEnabled: true,
|
|
96
|
+
},
|
|
97
|
+
requiresExtended: false,
|
|
98
|
+
supportsClaudeBridge: true, // Supports Claude semantic analysis
|
|
99
|
+
estimateTests: estimateSecurityTests,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "documentation",
|
|
103
|
+
displayName: "Documentation",
|
|
104
|
+
assessorClass: DocumentationAssessor,
|
|
105
|
+
resultField: "documentation",
|
|
106
|
+
phase: AssessmentPhase.CORE,
|
|
107
|
+
configFlags: {
|
|
108
|
+
primary: "documentation",
|
|
109
|
+
defaultEnabled: true,
|
|
110
|
+
},
|
|
111
|
+
requiresExtended: false,
|
|
112
|
+
supportsClaudeBridge: false,
|
|
113
|
+
estimateTests: estimateDocumentationTests,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: "errorHandling",
|
|
117
|
+
displayName: "Error Handling",
|
|
118
|
+
assessorClass: ErrorHandlingAssessor,
|
|
119
|
+
resultField: "errorHandling",
|
|
120
|
+
phase: AssessmentPhase.CORE,
|
|
121
|
+
configFlags: {
|
|
122
|
+
primary: "errorHandling",
|
|
123
|
+
defaultEnabled: true,
|
|
124
|
+
},
|
|
125
|
+
requiresExtended: false,
|
|
126
|
+
supportsClaudeBridge: false,
|
|
127
|
+
estimateTests: estimateErrorHandlingTests,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "usability",
|
|
131
|
+
displayName: "Usability",
|
|
132
|
+
assessorClass: UsabilityAssessor,
|
|
133
|
+
resultField: "usability",
|
|
134
|
+
phase: AssessmentPhase.CORE,
|
|
135
|
+
configFlags: {
|
|
136
|
+
primary: "usability",
|
|
137
|
+
defaultEnabled: true,
|
|
138
|
+
},
|
|
139
|
+
requiresExtended: false,
|
|
140
|
+
supportsClaudeBridge: false,
|
|
141
|
+
estimateTests: estimateUsabilityTests,
|
|
142
|
+
},
|
|
143
|
+
// ============================================================================
|
|
144
|
+
// Phase 2: PROTOCOL - Unified protocol compliance
|
|
145
|
+
// ============================================================================
|
|
146
|
+
{
|
|
147
|
+
id: "protocolCompliance",
|
|
148
|
+
displayName: "Protocol Compliance",
|
|
149
|
+
assessorClass: ProtocolComplianceAssessor,
|
|
150
|
+
resultField: "mcpSpecCompliance", // Legacy field name for BC
|
|
151
|
+
phase: AssessmentPhase.PROTOCOL,
|
|
152
|
+
configFlags: {
|
|
153
|
+
primary: "protocolCompliance",
|
|
154
|
+
// BC: Enable if ANY of these deprecated flags is true
|
|
155
|
+
deprecated: ["mcpSpecCompliance", "protocolConformance"],
|
|
156
|
+
defaultEnabled: false, // Opt-in
|
|
157
|
+
},
|
|
158
|
+
requiresExtended: true,
|
|
159
|
+
supportsClaudeBridge: false,
|
|
160
|
+
estimateTests: estimateProtocolComplianceTests,
|
|
161
|
+
},
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// Phase 3: COMPLIANCE - MCP Directory compliance gap assessors
|
|
164
|
+
// ============================================================================
|
|
165
|
+
{
|
|
166
|
+
id: "aupCompliance",
|
|
167
|
+
displayName: "AUP",
|
|
168
|
+
assessorClass: AUPComplianceAssessor,
|
|
169
|
+
resultField: "aupCompliance",
|
|
170
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
171
|
+
configFlags: {
|
|
172
|
+
primary: "aupCompliance",
|
|
173
|
+
defaultEnabled: false,
|
|
174
|
+
},
|
|
175
|
+
requiresExtended: true,
|
|
176
|
+
supportsClaudeBridge: true, // Supports Claude semantic analysis
|
|
177
|
+
estimateTests: estimateAUPComplianceTests,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: "toolAnnotations",
|
|
181
|
+
displayName: "Annotations",
|
|
182
|
+
assessorClass: ToolAnnotationAssessor,
|
|
183
|
+
resultField: "toolAnnotations",
|
|
184
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
185
|
+
configFlags: {
|
|
186
|
+
primary: "toolAnnotations",
|
|
187
|
+
defaultEnabled: false,
|
|
188
|
+
},
|
|
189
|
+
requiresExtended: true,
|
|
190
|
+
supportsClaudeBridge: true, // Supports Claude behavior inference
|
|
191
|
+
estimateTests: estimateToolAnnotationTests,
|
|
192
|
+
// Custom setup for pattern configuration
|
|
193
|
+
customSetup: (assessor, config, logger) => {
|
|
194
|
+
if (config.patternConfigPath) {
|
|
195
|
+
const patternConfig = loadPatternConfig(config.patternConfigPath, logger);
|
|
196
|
+
const compiledPatterns = compilePatterns(patternConfig);
|
|
197
|
+
assessor.setPatterns(compiledPatterns);
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
id: "prohibitedLibraries",
|
|
203
|
+
displayName: "Libraries",
|
|
204
|
+
assessorClass: ProhibitedLibrariesAssessor,
|
|
205
|
+
resultField: "prohibitedLibraries",
|
|
206
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
207
|
+
configFlags: {
|
|
208
|
+
primary: "prohibitedLibraries",
|
|
209
|
+
defaultEnabled: false,
|
|
210
|
+
},
|
|
211
|
+
requiresExtended: true,
|
|
212
|
+
supportsClaudeBridge: false,
|
|
213
|
+
estimateTests: estimateProhibitedLibrariesTests,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: "manifestValidation",
|
|
217
|
+
displayName: "Manifest",
|
|
218
|
+
assessorClass: ManifestValidationAssessor,
|
|
219
|
+
resultField: "manifestValidation",
|
|
220
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
221
|
+
configFlags: {
|
|
222
|
+
primary: "manifestValidation",
|
|
223
|
+
defaultEnabled: false,
|
|
224
|
+
},
|
|
225
|
+
requiresExtended: true,
|
|
226
|
+
supportsClaudeBridge: false,
|
|
227
|
+
estimateTests: estimateManifestValidationTests,
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
id: "portability",
|
|
231
|
+
displayName: "Portability",
|
|
232
|
+
assessorClass: PortabilityAssessor,
|
|
233
|
+
resultField: "portability",
|
|
234
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
235
|
+
configFlags: {
|
|
236
|
+
primary: "portability",
|
|
237
|
+
defaultEnabled: false,
|
|
238
|
+
},
|
|
239
|
+
requiresExtended: true,
|
|
240
|
+
supportsClaudeBridge: false,
|
|
241
|
+
estimateTests: estimatePortabilityTests,
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: "externalAPIScanner",
|
|
245
|
+
displayName: "External APIs",
|
|
246
|
+
assessorClass: ExternalAPIScannerAssessor,
|
|
247
|
+
resultField: "externalAPIScanner",
|
|
248
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
249
|
+
configFlags: {
|
|
250
|
+
primary: "externalAPIScanner",
|
|
251
|
+
defaultEnabled: false,
|
|
252
|
+
},
|
|
253
|
+
requiresExtended: true,
|
|
254
|
+
supportsClaudeBridge: false,
|
|
255
|
+
estimateTests: estimateExternalAPIScannerTests,
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
id: "authentication",
|
|
259
|
+
displayName: "Authentication",
|
|
260
|
+
assessorClass: AuthenticationAssessor,
|
|
261
|
+
resultField: "authentication",
|
|
262
|
+
phase: AssessmentPhase.COMPLIANCE,
|
|
263
|
+
configFlags: {
|
|
264
|
+
primary: "authentication",
|
|
265
|
+
defaultEnabled: false,
|
|
266
|
+
},
|
|
267
|
+
requiresExtended: true,
|
|
268
|
+
supportsClaudeBridge: false,
|
|
269
|
+
estimateTests: estimateAuthenticationTests,
|
|
270
|
+
},
|
|
271
|
+
// ============================================================================
|
|
272
|
+
// Phase 4: CAPABILITY - Resources, Prompts, Cross-capability
|
|
273
|
+
// ============================================================================
|
|
274
|
+
{
|
|
275
|
+
id: "resources",
|
|
276
|
+
displayName: "Resources",
|
|
277
|
+
assessorClass: ResourceAssessor,
|
|
278
|
+
resultField: "resources",
|
|
279
|
+
phase: AssessmentPhase.CAPABILITY,
|
|
280
|
+
configFlags: {
|
|
281
|
+
primary: "resources",
|
|
282
|
+
defaultEnabled: false,
|
|
283
|
+
},
|
|
284
|
+
requiresExtended: true,
|
|
285
|
+
supportsClaudeBridge: false,
|
|
286
|
+
estimateTests: estimateResourceTests,
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
id: "prompts",
|
|
290
|
+
displayName: "Prompts",
|
|
291
|
+
assessorClass: PromptAssessor,
|
|
292
|
+
resultField: "prompts",
|
|
293
|
+
phase: AssessmentPhase.CAPABILITY,
|
|
294
|
+
configFlags: {
|
|
295
|
+
primary: "prompts",
|
|
296
|
+
defaultEnabled: false,
|
|
297
|
+
},
|
|
298
|
+
requiresExtended: true,
|
|
299
|
+
supportsClaudeBridge: false,
|
|
300
|
+
estimateTests: estimatePromptTests,
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: "crossCapability",
|
|
304
|
+
displayName: "Cross-Capability",
|
|
305
|
+
assessorClass: CrossCapabilitySecurityAssessor,
|
|
306
|
+
resultField: "crossCapability",
|
|
307
|
+
phase: AssessmentPhase.CAPABILITY,
|
|
308
|
+
configFlags: {
|
|
309
|
+
primary: "crossCapability",
|
|
310
|
+
defaultEnabled: false,
|
|
311
|
+
},
|
|
312
|
+
requiresExtended: true,
|
|
313
|
+
supportsClaudeBridge: false,
|
|
314
|
+
estimateTests: estimateCrossCapabilityTests,
|
|
315
|
+
},
|
|
316
|
+
// ============================================================================
|
|
317
|
+
// Phase 5: QUALITY - Code quality and conformance
|
|
318
|
+
// ============================================================================
|
|
319
|
+
{
|
|
320
|
+
id: "fileModularization",
|
|
321
|
+
displayName: "File Modularization",
|
|
322
|
+
assessorClass: FileModularizationAssessor,
|
|
323
|
+
resultField: "fileModularization",
|
|
324
|
+
phase: AssessmentPhase.QUALITY,
|
|
325
|
+
configFlags: {
|
|
326
|
+
primary: "fileModularization",
|
|
327
|
+
defaultEnabled: false,
|
|
328
|
+
},
|
|
329
|
+
requiresExtended: true,
|
|
330
|
+
supportsClaudeBridge: false,
|
|
331
|
+
estimateTests: estimateFileModularizationTests,
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
id: "conformance",
|
|
335
|
+
displayName: "Conformance",
|
|
336
|
+
assessorClass: ConformanceAssessor,
|
|
337
|
+
resultField: "conformance",
|
|
338
|
+
phase: AssessmentPhase.QUALITY,
|
|
339
|
+
configFlags: {
|
|
340
|
+
primary: "conformance",
|
|
341
|
+
defaultEnabled: false,
|
|
342
|
+
},
|
|
343
|
+
requiresExtended: true,
|
|
344
|
+
supportsClaudeBridge: false,
|
|
345
|
+
estimateTests: estimateConformanceTests,
|
|
346
|
+
},
|
|
347
|
+
];
|
|
348
|
+
/**
|
|
349
|
+
* Map of assessor ID to definition for fast lookup.
|
|
350
|
+
*/
|
|
351
|
+
export const ASSESSOR_DEFINITION_MAP = new Map(ASSESSOR_DEFINITIONS.map((def) => [def.id, def]));
|
|
352
|
+
/**
|
|
353
|
+
* Get assessor definitions by phase.
|
|
354
|
+
*/
|
|
355
|
+
export function getDefinitionsByPhase(phase) {
|
|
356
|
+
return ASSESSOR_DEFINITIONS.filter((def) => def.phase === phase);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get all phases in execution order.
|
|
360
|
+
*/
|
|
361
|
+
export function getOrderedPhases() {
|
|
362
|
+
return [
|
|
363
|
+
AssessmentPhase.PRE,
|
|
364
|
+
AssessmentPhase.CORE,
|
|
365
|
+
AssessmentPhase.PROTOCOL,
|
|
366
|
+
AssessmentPhase.COMPLIANCE,
|
|
367
|
+
AssessmentPhase.CAPABILITY,
|
|
368
|
+
AssessmentPhase.QUALITY,
|
|
369
|
+
];
|
|
370
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessor Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for managing assessor instances with metadata.
|
|
5
|
+
* Provides phase-ordered execution, Claude bridge wiring, and test count aggregation.
|
|
6
|
+
*
|
|
7
|
+
* @module assessment/registry/AssessorRegistry
|
|
8
|
+
* @see GitHub Issue #91
|
|
9
|
+
*/
|
|
10
|
+
import type { AssessmentConfiguration } from "../../../lib/assessment/configTypes.js";
|
|
11
|
+
import type { MCPDirectoryAssessment } from "../../../lib/assessment/resultTypes.js";
|
|
12
|
+
import type { BaseAssessor } from "../modules/BaseAssessor.js";
|
|
13
|
+
import type { AssessmentContext } from "../AssessmentOrchestrator.js";
|
|
14
|
+
import type { ClaudeCodeBridge } from "../lib/claudeCodeBridge.js";
|
|
15
|
+
import { type AssessorDefinition, type RegisteredAssessor, AssessmentPhase } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* AssessorRegistry manages assessor instances and their execution.
|
|
18
|
+
*
|
|
19
|
+
* Key responsibilities:
|
|
20
|
+
* 1. Lazy instantiation based on configuration flags
|
|
21
|
+
* 2. Phase-ordered execution with Phase 0 always first and sequential
|
|
22
|
+
* 3. Claude bridge wiring to supporting assessors
|
|
23
|
+
* 4. Test count aggregation from all assessors
|
|
24
|
+
* 5. Backward-compatible property access via getAssessor()
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Information about a failed assessor registration.
|
|
28
|
+
*/
|
|
29
|
+
export interface FailedRegistration {
|
|
30
|
+
id: string;
|
|
31
|
+
error: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class AssessorRegistry {
|
|
34
|
+
private config;
|
|
35
|
+
private logger;
|
|
36
|
+
private assessors;
|
|
37
|
+
private claudeBridge?;
|
|
38
|
+
private failedRegistrations;
|
|
39
|
+
constructor(config: AssessmentConfiguration);
|
|
40
|
+
/**
|
|
41
|
+
* Register all enabled assessors based on configuration.
|
|
42
|
+
* Called during orchestrator initialization.
|
|
43
|
+
*/
|
|
44
|
+
registerAll(definitions?: AssessorDefinition[]): void;
|
|
45
|
+
/**
|
|
46
|
+
* Register a single assessor.
|
|
47
|
+
*/
|
|
48
|
+
private register;
|
|
49
|
+
/**
|
|
50
|
+
* Check if an assessor should be enabled based on configuration.
|
|
51
|
+
* Implements OR logic for backward-compatible deprecated flags.
|
|
52
|
+
*/
|
|
53
|
+
isEnabled(definition: AssessorDefinition): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Check a single config flag value.
|
|
56
|
+
* If defaultEnabled is true, returns true unless flag is explicitly false.
|
|
57
|
+
* If defaultEnabled is false, returns true only if flag is explicitly true.
|
|
58
|
+
*/
|
|
59
|
+
private checkFlag;
|
|
60
|
+
/**
|
|
61
|
+
* Get a registered assessor by ID.
|
|
62
|
+
* Returns undefined if not registered or disabled.
|
|
63
|
+
*/
|
|
64
|
+
getAssessor<T extends BaseAssessor = BaseAssessor>(id: string): T | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Get all registered assessors for a specific phase.
|
|
67
|
+
*/
|
|
68
|
+
getByPhase(phase: AssessmentPhase): RegisteredAssessor[];
|
|
69
|
+
/**
|
|
70
|
+
* Set Claude bridge for all supporting assessors.
|
|
71
|
+
* Called when Claude Code is enabled.
|
|
72
|
+
*/
|
|
73
|
+
setClaudeBridge(bridge: ClaudeCodeBridge): void;
|
|
74
|
+
/**
|
|
75
|
+
* Wire Claude bridge to a single assessor.
|
|
76
|
+
*/
|
|
77
|
+
private wireClaudeBridge;
|
|
78
|
+
/**
|
|
79
|
+
* Execute all assessors in phase order.
|
|
80
|
+
* Phase 0 (PRE) always runs first and sequentially.
|
|
81
|
+
* Other phases run based on parallelTesting config.
|
|
82
|
+
*
|
|
83
|
+
* @returns Partial MCPDirectoryAssessment with results from all assessors
|
|
84
|
+
*/
|
|
85
|
+
executeAll(context: AssessmentContext): Promise<Partial<MCPDirectoryAssessment>>;
|
|
86
|
+
/**
|
|
87
|
+
* Execute all assessors in a single phase.
|
|
88
|
+
*/
|
|
89
|
+
private executePhase;
|
|
90
|
+
/**
|
|
91
|
+
* Execute assessors in parallel with graceful degradation.
|
|
92
|
+
* Uses Promise.allSettled to continue execution even if some assessors fail.
|
|
93
|
+
*/
|
|
94
|
+
private executeParallel;
|
|
95
|
+
/**
|
|
96
|
+
* Execute assessors sequentially.
|
|
97
|
+
*/
|
|
98
|
+
private executeSequential;
|
|
99
|
+
/**
|
|
100
|
+
* Extract status string from assessment result.
|
|
101
|
+
* Most results have a 'status' property.
|
|
102
|
+
*/
|
|
103
|
+
private extractStatus;
|
|
104
|
+
/**
|
|
105
|
+
* Get tool count from context (respects selectedToolsForTesting config).
|
|
106
|
+
*/
|
|
107
|
+
private getToolCountForContext;
|
|
108
|
+
/**
|
|
109
|
+
* Get total test count from all registered assessors.
|
|
110
|
+
*/
|
|
111
|
+
getTotalTestCount(): number;
|
|
112
|
+
/**
|
|
113
|
+
* Get test count for a specific assessor.
|
|
114
|
+
*/
|
|
115
|
+
getTestCount(id: string): number;
|
|
116
|
+
/**
|
|
117
|
+
* Get all registered assessor IDs.
|
|
118
|
+
*/
|
|
119
|
+
getRegisteredIds(): string[];
|
|
120
|
+
/**
|
|
121
|
+
* Check if a specific assessor is registered.
|
|
122
|
+
*/
|
|
123
|
+
isRegistered(id: string): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Get the count of registered assessors.
|
|
126
|
+
*/
|
|
127
|
+
get size(): number;
|
|
128
|
+
/**
|
|
129
|
+
* Update configuration for future operations.
|
|
130
|
+
*
|
|
131
|
+
* **Important**: This does NOT re-register assessors. Assessors are registered
|
|
132
|
+
* once during construction based on the initial config. To change which
|
|
133
|
+
* assessors are enabled, create a new AssessorRegistry instance.
|
|
134
|
+
*
|
|
135
|
+
* @param config - New configuration to use
|
|
136
|
+
*/
|
|
137
|
+
updateConfig(config: AssessmentConfiguration): void;
|
|
138
|
+
/**
|
|
139
|
+
* Reset test counts for all registered assessors.
|
|
140
|
+
* Called at the start of each assessment run.
|
|
141
|
+
*/
|
|
142
|
+
resetAllTestCounts(): void;
|
|
143
|
+
/**
|
|
144
|
+
* Get list of assessors that failed to register.
|
|
145
|
+
* Useful for reporting partial assessment results.
|
|
146
|
+
*
|
|
147
|
+
* @returns Array of failed registration info (id and error message)
|
|
148
|
+
*/
|
|
149
|
+
getFailedRegistrations(): FailedRegistration[];
|
|
150
|
+
/**
|
|
151
|
+
* Check if any assessors failed to register.
|
|
152
|
+
*
|
|
153
|
+
* @returns true if at least one assessor failed registration
|
|
154
|
+
*/
|
|
155
|
+
hasFailedRegistrations(): boolean;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=AssessorRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssessorRegistry.d.ts","sourceRoot":"","sources":["../../../../src/services/assessment/registry/AssessorRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAEvB,eAAe,EAEhB,MAAM,SAAS,CAAC;AAOjB;;;;;;;;;GASG;AACH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,YAAY,CAAC,CAAmB;IACxC,OAAO,CAAC,mBAAmB,CAA4B;gBAE3C,MAAM,EAAE,uBAAuB;IAQ3C;;;OAGG;IACH,WAAW,CAAC,WAAW,GAAE,kBAAkB,EAAyB,GAAG,IAAI;IAc3E;;OAEG;IACH,OAAO,CAAC,QAAQ;IAmChB;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAmClD;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAajB;;;OAGG;IACH,WAAW,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC/C,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,SAAS;IAKhB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,kBAAkB,EAAE;IAMxD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAU/C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;;;OAMG;IACG,UAAU,CACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IA+B3C;;OAEG;YACW,YAAY;IAoB1B;;;OAGG;YACW,eAAe;IA6D7B;;OAEG;YACW,iBAAiB;IA6C/B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAKhC;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAInD;;;OAGG;IACH,kBAAkB,IAAI,IAAI;IAM1B;;;;;OAKG;IACH,sBAAsB,IAAI,kBAAkB,EAAE;IAI9C;;;;OAIG;IACH,sBAAsB,IAAI,OAAO;CAGlC"}
|