codeguardian-mcp 1.0.0
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/LICENSE +21 -0
- package/README.md +348 -0
- package/dist/agent/agentTools.d.ts +26 -0
- package/dist/agent/agentTools.d.ts.map +1 -0
- package/dist/agent/agentTools.js +699 -0
- package/dist/agent/agentTools.js.map +1 -0
- package/dist/agent/autoValidator.d.ts +110 -0
- package/dist/agent/autoValidator.d.ts.map +1 -0
- package/dist/agent/autoValidator.js +964 -0
- package/dist/agent/autoValidator.js.map +1 -0
- package/dist/agent/fileWatcher.d.ts +28 -0
- package/dist/agent/fileWatcher.d.ts.map +1 -0
- package/dist/agent/fileWatcher.js +88 -0
- package/dist/agent/fileWatcher.js.map +1 -0
- package/dist/agent/guardianPersistence.d.ts +98 -0
- package/dist/agent/guardianPersistence.d.ts.map +1 -0
- package/dist/agent/guardianPersistence.js +296 -0
- package/dist/agent/guardianPersistence.js.map +1 -0
- package/dist/agent/mcpNotifications.d.ts +38 -0
- package/dist/agent/mcpNotifications.d.ts.map +1 -0
- package/dist/agent/mcpNotifications.js +81 -0
- package/dist/agent/mcpNotifications.js.map +1 -0
- package/dist/analyzers/aiPatterns.d.ts +16 -0
- package/dist/analyzers/aiPatterns.d.ts.map +1 -0
- package/dist/analyzers/aiPatterns.js +103 -0
- package/dist/analyzers/aiPatterns.js.map +1 -0
- package/dist/analyzers/antiPatterns.d.ts +60 -0
- package/dist/analyzers/antiPatterns.d.ts.map +1 -0
- package/dist/analyzers/antiPatterns.js +198 -0
- package/dist/analyzers/antiPatterns.js.map +1 -0
- package/dist/analyzers/builtinTypes.d.ts +18 -0
- package/dist/analyzers/builtinTypes.d.ts.map +1 -0
- package/dist/analyzers/builtinTypes.js +1275 -0
- package/dist/analyzers/builtinTypes.js.map +1 -0
- package/dist/analyzers/complexity.d.ts +14 -0
- package/dist/analyzers/complexity.d.ts.map +1 -0
- package/dist/analyzers/complexity.js +610 -0
- package/dist/analyzers/complexity.js.map +1 -0
- package/dist/analyzers/findingVerifier.d.ts +59 -0
- package/dist/analyzers/findingVerifier.d.ts.map +1 -0
- package/dist/analyzers/findingVerifier.js +1169 -0
- package/dist/analyzers/findingVerifier.js.map +1 -0
- package/dist/analyzers/impactAnalyzer.d.ts +53 -0
- package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/impactAnalyzer.js +152 -0
- package/dist/analyzers/impactAnalyzer.js.map +1 -0
- package/dist/analyzers/languageDetector.d.ts +48 -0
- package/dist/analyzers/languageDetector.d.ts.map +1 -0
- package/dist/analyzers/languageDetector.js +404 -0
- package/dist/analyzers/languageDetector.js.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.js +193 -0
- package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.js +324 -0
- package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.js +429 -0
- package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.js +709 -0
- package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
- package/dist/analyzers/relevanceScorer.d.ts +43 -0
- package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
- package/dist/analyzers/relevanceScorer.js +200 -0
- package/dist/analyzers/relevanceScorer.js.map +1 -0
- package/dist/analyzers/standardLibrary.d.ts +22 -0
- package/dist/analyzers/standardLibrary.d.ts.map +1 -0
- package/dist/analyzers/standardLibrary.js +211 -0
- package/dist/analyzers/standardLibrary.js.map +1 -0
- package/dist/analyzers/symbolGraph.d.ts +30 -0
- package/dist/analyzers/symbolGraph.d.ts.map +1 -0
- package/dist/analyzers/symbolGraph.js +380 -0
- package/dist/analyzers/symbolGraph.js.map +1 -0
- package/dist/analyzers/symbolTable.d.ts +18 -0
- package/dist/analyzers/symbolTable.d.ts.map +1 -0
- package/dist/analyzers/symbolTable.js +176 -0
- package/dist/analyzers/symbolTable.js.map +1 -0
- package/dist/analyzers/typeChecker.d.ts +13 -0
- package/dist/analyzers/typeChecker.d.ts.map +1 -0
- package/dist/analyzers/typeChecker.js +580 -0
- package/dist/analyzers/typeChecker.js.map +1 -0
- package/dist/analyzers/usagePatterns.d.ts +42 -0
- package/dist/analyzers/usagePatterns.d.ts.map +1 -0
- package/dist/analyzers/usagePatterns.js +75 -0
- package/dist/analyzers/usagePatterns.js.map +1 -0
- package/dist/api-contract/context/backend.d.ts +19 -0
- package/dist/api-contract/context/backend.d.ts.map +1 -0
- package/dist/api-contract/context/backend.js +64 -0
- package/dist/api-contract/context/backend.js.map +1 -0
- package/dist/api-contract/context/contract.d.ts +34 -0
- package/dist/api-contract/context/contract.d.ts.map +1 -0
- package/dist/api-contract/context/contract.js +306 -0
- package/dist/api-contract/context/contract.js.map +1 -0
- package/dist/api-contract/context/frontend.d.ts +19 -0
- package/dist/api-contract/context/frontend.d.ts.map +1 -0
- package/dist/api-contract/context/frontend.js +64 -0
- package/dist/api-contract/context/frontend.js.map +1 -0
- package/dist/api-contract/detector.d.ts +28 -0
- package/dist/api-contract/detector.d.ts.map +1 -0
- package/dist/api-contract/detector.js +393 -0
- package/dist/api-contract/detector.js.map +1 -0
- package/dist/api-contract/extractors/python.d.ts +32 -0
- package/dist/api-contract/extractors/python.d.ts.map +1 -0
- package/dist/api-contract/extractors/python.js +521 -0
- package/dist/api-contract/extractors/python.js.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
- package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.js +173 -0
- package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/typescript.d.ts +32 -0
- package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
- package/dist/api-contract/extractors/typescript.js +666 -0
- package/dist/api-contract/extractors/typescript.js.map +1 -0
- package/dist/api-contract/index.d.ts +104 -0
- package/dist/api-contract/index.d.ts.map +1 -0
- package/dist/api-contract/index.js +232 -0
- package/dist/api-contract/index.js.map +1 -0
- package/dist/api-contract/types.d.ts +151 -0
- package/dist/api-contract/types.d.ts.map +1 -0
- package/dist/api-contract/types.js +19 -0
- package/dist/api-contract/types.js.map +1 -0
- package/dist/api-contract/validators/endpoint.d.ts +21 -0
- package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
- package/dist/api-contract/validators/endpoint.js +224 -0
- package/dist/api-contract/validators/endpoint.js.map +1 -0
- package/dist/api-contract/validators/index.d.ts +40 -0
- package/dist/api-contract/validators/index.d.ts.map +1 -0
- package/dist/api-contract/validators/index.js +875 -0
- package/dist/api-contract/validators/index.js.map +1 -0
- package/dist/api-contract/validators/parameter.d.ts +17 -0
- package/dist/api-contract/validators/parameter.d.ts.map +1 -0
- package/dist/api-contract/validators/parameter.js +250 -0
- package/dist/api-contract/validators/parameter.js.map +1 -0
- package/dist/api-contract/validators/type.d.ts +38 -0
- package/dist/api-contract/validators/type.d.ts.map +1 -0
- package/dist/api-contract/validators/type.js +244 -0
- package/dist/api-contract/validators/type.js.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.js +665 -0
- package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
- package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
- package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
- package/dist/context/apiContract/graphqlSupport.js +671 -0
- package/dist/context/apiContract/graphqlSupport.js.map +1 -0
- package/dist/context/apiContract/index.d.ts +14 -0
- package/dist/context/apiContract/index.d.ts.map +1 -0
- package/dist/context/apiContract/index.js +17 -0
- package/dist/context/apiContract/index.js.map +1 -0
- package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
- package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
- package/dist/context/apiContract/webSocketSupport.js +465 -0
- package/dist/context/apiContract/webSocketSupport.js.map +1 -0
- package/dist/context/apiContractContext.d.ts +15 -0
- package/dist/context/apiContractContext.d.ts.map +1 -0
- package/dist/context/apiContractContext.js +979 -0
- package/dist/context/apiContractContext.js.map +1 -0
- package/dist/context/apiContractExtraction.d.ts +52 -0
- package/dist/context/apiContractExtraction.d.ts.map +1 -0
- package/dist/context/apiContractExtraction.js +438 -0
- package/dist/context/apiContractExtraction.js.map +1 -0
- package/dist/context/contextLineage.d.ts +79 -0
- package/dist/context/contextLineage.d.ts.map +1 -0
- package/dist/context/contextLineage.js +259 -0
- package/dist/context/contextLineage.js.map +1 -0
- package/dist/context/contextOrchestrator.d.ts +57 -0
- package/dist/context/contextOrchestrator.d.ts.map +1 -0
- package/dist/context/contextOrchestrator.js +162 -0
- package/dist/context/contextOrchestrator.js.map +1 -0
- package/dist/context/intentTracker.d.ts +73 -0
- package/dist/context/intentTracker.d.ts.map +1 -0
- package/dist/context/intentTracker.js +168 -0
- package/dist/context/intentTracker.js.map +1 -0
- package/dist/context/projectContext.d.ts +219 -0
- package/dist/context/projectContext.d.ts.map +1 -0
- package/dist/context/projectContext.js +1984 -0
- package/dist/context/projectContext.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +260 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/library.d.ts +51 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +65 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/prompts/templates.d.ts +44 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +97 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/queue/jobPersistence.d.ts +46 -0
- package/dist/queue/jobPersistence.d.ts.map +1 -0
- package/dist/queue/jobPersistence.js +158 -0
- package/dist/queue/jobPersistence.js.map +1 -0
- package/dist/queue/jobQueue.d.ts +116 -0
- package/dist/queue/jobQueue.d.ts.map +1 -0
- package/dist/queue/jobQueue.js +275 -0
- package/dist/queue/jobQueue.js.map +1 -0
- package/dist/queue/validationJob.d.ts +69 -0
- package/dist/queue/validationJob.d.ts.map +1 -0
- package/dist/queue/validationJob.js +435 -0
- package/dist/queue/validationJob.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +328 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/validationReportStore.d.ts +170 -0
- package/dist/resources/validationReportStore.d.ts.map +1 -0
- package/dist/resources/validationReportStore.js +515 -0
- package/dist/resources/validationReportStore.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +102 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/asyncValidation.d.ts +19 -0
- package/dist/tools/asyncValidation.d.ts.map +1 -0
- package/dist/tools/asyncValidation.js +346 -0
- package/dist/tools/asyncValidation.js.map +1 -0
- package/dist/tools/buildContext.d.ts +17 -0
- package/dist/tools/buildContext.d.ts.map +1 -0
- package/dist/tools/buildContext.js +188 -0
- package/dist/tools/buildContext.js.map +1 -0
- package/dist/tools/getDependencyGraph.d.ts +16 -0
- package/dist/tools/getDependencyGraph.d.ts.map +1 -0
- package/dist/tools/getDependencyGraph.js +436 -0
- package/dist/tools/getDependencyGraph.js.map +1 -0
- package/dist/tools/incrementalValidation.d.ts +71 -0
- package/dist/tools/incrementalValidation.d.ts.map +1 -0
- package/dist/tools/incrementalValidation.js +203 -0
- package/dist/tools/incrementalValidation.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/validateCode.d.ts +17 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +368 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateCodeLite.d.ts +2 -0
- package/dist/tools/validateCodeLite.d.ts.map +1 -0
- package/dist/tools/validateCodeLite.js +2 -0
- package/dist/tools/validateCodeLite.js.map +1 -0
- package/dist/tools/validation/builtins.d.ts +92 -0
- package/dist/tools/validation/builtins.d.ts.map +1 -0
- package/dist/tools/validation/builtins.js +2184 -0
- package/dist/tools/validation/builtins.js.map +1 -0
- package/dist/tools/validation/contextualNaming.d.ts +99 -0
- package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
- package/dist/tools/validation/contextualNaming.js +959 -0
- package/dist/tools/validation/contextualNaming.js.map +1 -0
- package/dist/tools/validation/deadCode.d.ts +115 -0
- package/dist/tools/validation/deadCode.d.ts.map +1 -0
- package/dist/tools/validation/deadCode.js +861 -0
- package/dist/tools/validation/deadCode.js.map +1 -0
- package/dist/tools/validation/extractors/index.d.ts +131 -0
- package/dist/tools/validation/extractors/index.d.ts.map +1 -0
- package/dist/tools/validation/extractors/index.js +233 -0
- package/dist/tools/validation/extractors/index.js.map +1 -0
- package/dist/tools/validation/extractors/javascript.d.ts +73 -0
- package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
- package/dist/tools/validation/extractors/javascript.js +1841 -0
- package/dist/tools/validation/extractors/javascript.js.map +1 -0
- package/dist/tools/validation/extractors/python.d.ts +93 -0
- package/dist/tools/validation/extractors/python.d.ts.map +1 -0
- package/dist/tools/validation/extractors/python.js +799 -0
- package/dist/tools/validation/extractors/python.js.map +1 -0
- package/dist/tools/validation/manifest.d.ts +45 -0
- package/dist/tools/validation/manifest.d.ts.map +1 -0
- package/dist/tools/validation/manifest.js +719 -0
- package/dist/tools/validation/manifest.js.map +1 -0
- package/dist/tools/validation/parser.d.ts +58 -0
- package/dist/tools/validation/parser.d.ts.map +1 -0
- package/dist/tools/validation/parser.js +232 -0
- package/dist/tools/validation/parser.js.map +1 -0
- package/dist/tools/validation/registry.d.ts +15 -0
- package/dist/tools/validation/registry.d.ts.map +1 -0
- package/dist/tools/validation/registry.js +169 -0
- package/dist/tools/validation/registry.js.map +1 -0
- package/dist/tools/validation/scoring.d.ts +54 -0
- package/dist/tools/validation/scoring.d.ts.map +1 -0
- package/dist/tools/validation/scoring.js +242 -0
- package/dist/tools/validation/scoring.js.map +1 -0
- package/dist/tools/validation/types.d.ts +120 -0
- package/dist/tools/validation/types.d.ts.map +1 -0
- package/dist/tools/validation/types.js +11 -0
- package/dist/tools/validation/types.js.map +1 -0
- package/dist/tools/validation/unusedLocals.d.ts +36 -0
- package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
- package/dist/tools/validation/unusedLocals.js +333 -0
- package/dist/tools/validation/unusedLocals.js.map +1 -0
- package/dist/tools/validation/validation.d.ts +98 -0
- package/dist/tools/validation/validation.d.ts.map +1 -0
- package/dist/tools/validation/validation.js +1837 -0
- package/dist/tools/validation/validation.js.map +1 -0
- package/dist/types/codeGraph.d.ts +163 -0
- package/dist/types/codeGraph.d.ts.map +1 -0
- package/dist/types/codeGraph.js +9 -0
- package/dist/types/codeGraph.js.map +1 -0
- package/dist/types/symbolGraph.d.ts +68 -0
- package/dist/types/symbolGraph.d.ts.map +1 -0
- package/dist/types/symbolGraph.js +10 -0
- package/dist/types/symbolGraph.js.map +1 -0
- package/dist/types/tools.d.ts +43 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +7 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/fileFilter.d.ts +37 -0
- package/dist/utils/fileFilter.d.ts.map +1 -0
- package/dist/utils/fileFilter.js +91 -0
- package/dist/utils/fileFilter.js.map +1 -0
- package/dist/utils/gitUtils.d.ts +28 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +81 -0
- package/dist/utils/gitUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/serialization.d.ts +25 -0
- package/dist/utils/serialization.d.ts.map +1 -0
- package/dist/utils/serialization.js +53 -0
- package/dist/utils/serialization.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST-Based Unused Local Detection
|
|
3
|
+
*
|
|
4
|
+
* This module provides superior dead code detection using AST parsing instead of regex.
|
|
5
|
+
* It properly handles:
|
|
6
|
+
* - All naming conventions (camelCase, PascalCase, UPPER_SNAKE_CASE)
|
|
7
|
+
* - Both JavaScript/TypeScript AND Python
|
|
8
|
+
* - Exported vs non-exported symbols
|
|
9
|
+
* - Local function declarations, const/let/var, and Python def
|
|
10
|
+
* - React hooks and framework patterns
|
|
11
|
+
*
|
|
12
|
+
* @format
|
|
13
|
+
*/
|
|
14
|
+
import { extractSymbolsAST, extractUsagesAST, extractImportsAST, collectLocalDefinitionsAST, } from "./extractors/index.js";
|
|
15
|
+
import { getParser } from "./parser.js";
|
|
16
|
+
import { logger } from "../../utils/logger.js";
|
|
17
|
+
/**
|
|
18
|
+
* Detect unused local functions and variables within a single file using AST parsing.
|
|
19
|
+
* This is the AST-based replacement for the regex-based detectUnusedLocals.
|
|
20
|
+
*
|
|
21
|
+
* Advantages over regex approach:
|
|
22
|
+
* - Handles all naming conventions (camelCase, PascalCase, UPPER_SNAKE_CASE)
|
|
23
|
+
* - Properly distinguishes exported vs non-exported symbols
|
|
24
|
+
* - Accurate line numbers from AST
|
|
25
|
+
* - Works for both JS/TS and Python with proper language support
|
|
26
|
+
* - Understands scope (won't flag parameters as unused when they're used in function body)
|
|
27
|
+
*
|
|
28
|
+
* @param code - The source code string to analyze
|
|
29
|
+
* @param filePath - Path to the file (used to determine language from extension)
|
|
30
|
+
* @returns Array of dead code issues found
|
|
31
|
+
*/
|
|
32
|
+
export function detectUnusedLocalsAST(code, filePath) {
|
|
33
|
+
const issues = [];
|
|
34
|
+
// Detect language from file extension
|
|
35
|
+
const language = detectFileLanguage(filePath);
|
|
36
|
+
if (language === "unknown") {
|
|
37
|
+
logger.debug(`Unknown language for file: ${filePath}`);
|
|
38
|
+
return issues;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
// Step 1: Extract all symbol definitions from the file
|
|
42
|
+
const symbols = extractSymbolsAST(code, filePath, language);
|
|
43
|
+
// Step 2: Extract all imports (to identify external symbols)
|
|
44
|
+
const imports = extractImportsAST(code, language);
|
|
45
|
+
const importedNames = new Set();
|
|
46
|
+
for (const imp of imports) {
|
|
47
|
+
for (const name of imp.names) {
|
|
48
|
+
importedNames.add(name.local);
|
|
49
|
+
// For Python dotted imports, also add base module
|
|
50
|
+
if (language === "python" && name.local.includes(".")) {
|
|
51
|
+
importedNames.add(name.local.split(".")[0]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Step 3: Collect all locally-defined names (params, destructured vars, etc.)
|
|
56
|
+
// This prevents false positives on function parameters
|
|
57
|
+
const localDefinitions = collectLocalDefinitionsAST(code, language);
|
|
58
|
+
// Step 4: Extract all symbol usages (cross-file focused)
|
|
59
|
+
const usages = extractUsagesAST(code, language, imports);
|
|
60
|
+
const usedNames = new Set();
|
|
61
|
+
for (const usage of usages) {
|
|
62
|
+
usedNames.add(usage.name);
|
|
63
|
+
}
|
|
64
|
+
// Step 4b: Build a comprehensive set of ALL identifier references in the file.
|
|
65
|
+
// extractUsagesAST only tracks cross-file symbol usages (for hallucination detection),
|
|
66
|
+
// so we need our own set that includes local references like `resolve` in
|
|
67
|
+
// `new Promise(resolve => setTimeout(resolve, ms))` and `ProtectedComponent` in
|
|
68
|
+
// `return function ProtectedComponent(props) {...}`.
|
|
69
|
+
if (language === "typescript" || language === "javascript") {
|
|
70
|
+
try {
|
|
71
|
+
const parser = getParser(language);
|
|
72
|
+
const tree = parser.parse(code);
|
|
73
|
+
const collectRefs = (node) => {
|
|
74
|
+
if (!node)
|
|
75
|
+
return;
|
|
76
|
+
if (node.type === "identifier" || node.type === "property_identifier" || node.type === "type_identifier") {
|
|
77
|
+
const parentType = node.parent?.type;
|
|
78
|
+
// Skip declaration positions (variable_declarator name, function declaration name)
|
|
79
|
+
const isDecl = (parentType === "variable_declarator" && node.parent?.childForFieldName?.("name")?.id === node.id) ||
|
|
80
|
+
((parentType === "function_declaration" || parentType === "method_definition") &&
|
|
81
|
+
node.parent?.childForFieldName?.("name")?.id === node.id);
|
|
82
|
+
if (!isDecl) {
|
|
83
|
+
const text = node.text || code.slice(node.startIndex, node.endIndex);
|
|
84
|
+
if (text)
|
|
85
|
+
usedNames.add(text);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (node.children) {
|
|
89
|
+
for (const child of node.children)
|
|
90
|
+
collectRefs(child);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
collectRefs(tree.rootNode);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Best-effort
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Step 5: Check each local symbol to see if it's used
|
|
100
|
+
for (const sym of symbols) {
|
|
101
|
+
// Skip exported symbols - they may be used by other files
|
|
102
|
+
if (sym.isExported)
|
|
103
|
+
continue;
|
|
104
|
+
// Skip class/object methods and properties — they are NOT locals.
|
|
105
|
+
// They are accessed via their parent instance (e.g., spoonacularService.getRecipeDetails())
|
|
106
|
+
// and their usage is cross-file, not detectable by single-file analysis.
|
|
107
|
+
// Also skip ALL method-type symbols regardless of scope — they are always properties
|
|
108
|
+
// of an object literal (e.g., { queryFn: async () => {...} } inside useQuery()),
|
|
109
|
+
// consumed by the parent object, not standalone locals.
|
|
110
|
+
if (sym.scope || sym.type === "method")
|
|
111
|
+
continue;
|
|
112
|
+
// Python: Skip ALL module-level functions and classes.
|
|
113
|
+
// In Python, there is no `export` keyword — all module-level functions and classes
|
|
114
|
+
// are implicitly part of the module's public API and can be imported by other modules.
|
|
115
|
+
// Single-file analysis cannot determine if they're used elsewhere.
|
|
116
|
+
// Additionally, decorated functions (FastAPI routes, event handlers, etc.) are consumed
|
|
117
|
+
// by the framework at runtime and won't appear as local references.
|
|
118
|
+
// This is fundamentally different from JS/TS where `export` is explicit.
|
|
119
|
+
if (language === "python" && (sym.type === "function" || sym.type === "class"))
|
|
120
|
+
continue;
|
|
121
|
+
// Skip imported symbols
|
|
122
|
+
if (importedNames.has(sym.name))
|
|
123
|
+
continue;
|
|
124
|
+
// Skip React hooks and common framework patterns
|
|
125
|
+
if (shouldSkipFrameworkPattern(sym.name))
|
|
126
|
+
continue;
|
|
127
|
+
// Skip variable-type symbols that are local definitions (function params,
|
|
128
|
+
// destructured vars, catch clause vars, etc.) — these are inner-scope
|
|
129
|
+
// variables, not top-level locals worth flagging. We only skip "variable"
|
|
130
|
+
// types to preserve detection of unused function declarations.
|
|
131
|
+
if (sym.type === "variable" && localDefinitions.has(sym.name))
|
|
132
|
+
continue;
|
|
133
|
+
if (isParameterSymbol(sym, code, language))
|
|
134
|
+
continue;
|
|
135
|
+
// Check if the symbol is used
|
|
136
|
+
const isUsed = usedNames.has(sym.name);
|
|
137
|
+
if (!isUsed) {
|
|
138
|
+
const issueType = sym.type === "function" ? "unusedFunction" : "unusedExport";
|
|
139
|
+
const displayType = sym.type === "function" ? "Function" : "Variable";
|
|
140
|
+
issues.push({
|
|
141
|
+
type: issueType,
|
|
142
|
+
severity: "medium",
|
|
143
|
+
name: sym.name,
|
|
144
|
+
file: filePath,
|
|
145
|
+
line: sym.line,
|
|
146
|
+
message: `${displayType} '${sym.name}' is defined but never used in this file`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Step 6: Check for unused local definitions (const/let/var that aren't in symbols)
|
|
151
|
+
// This catches variables that might not be detected as symbols
|
|
152
|
+
const unusedLocals = findUnusedLocalDefinitions(code, filePath, language, usedNames, importedNames);
|
|
153
|
+
issues.push(...unusedLocals);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
logger.warn(`Error analyzing unused locals in ${filePath}:`, error);
|
|
157
|
+
}
|
|
158
|
+
return issues;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Detect file language from extension
|
|
162
|
+
*/
|
|
163
|
+
function detectFileLanguage(filePath) {
|
|
164
|
+
const ext = filePath.toLowerCase().split(".").pop();
|
|
165
|
+
switch (ext) {
|
|
166
|
+
case "ts":
|
|
167
|
+
case "tsx":
|
|
168
|
+
return "typescript";
|
|
169
|
+
case "js":
|
|
170
|
+
case "jsx":
|
|
171
|
+
case "mjs":
|
|
172
|
+
case "cjs":
|
|
173
|
+
return "javascript";
|
|
174
|
+
case "py":
|
|
175
|
+
return "python";
|
|
176
|
+
default:
|
|
177
|
+
return "unknown";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if a symbol should be skipped due to framework patterns
|
|
182
|
+
*/
|
|
183
|
+
function shouldSkipFrameworkPattern(name) {
|
|
184
|
+
// React hooks
|
|
185
|
+
if (name.startsWith("use") && name.length > 3 && /[A-Z]/.test(name[3])) {
|
|
186
|
+
return false; // Actually check these - they might be custom hooks
|
|
187
|
+
}
|
|
188
|
+
// Common framework patterns that are often auto-used
|
|
189
|
+
const skipPatterns = [
|
|
190
|
+
"default",
|
|
191
|
+
"constructor",
|
|
192
|
+
"render",
|
|
193
|
+
"componentDidMount",
|
|
194
|
+
"componentWillUnmount",
|
|
195
|
+
"getStaticProps",
|
|
196
|
+
"getServerSideProps",
|
|
197
|
+
];
|
|
198
|
+
return skipPatterns.includes(name);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a symbol is a function parameter (not a top-level definition)
|
|
202
|
+
*/
|
|
203
|
+
function isParameterSymbol(sym, code, language) {
|
|
204
|
+
// This is a heuristic - if the symbol type suggests it's a parameter, skip it
|
|
205
|
+
// The extractSymbolsAST should handle this, but we double-check here
|
|
206
|
+
return false; // Let the extractor handle this
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Find unused local variable definitions that might not be in the symbol table
|
|
210
|
+
* This catches const/let/var declarations using AST parsing
|
|
211
|
+
*/
|
|
212
|
+
function findUnusedLocalDefinitions(code, filePath, language, usedNames, importedNames) {
|
|
213
|
+
const issues = [];
|
|
214
|
+
if (language !== "typescript" && language !== "javascript") {
|
|
215
|
+
return issues; // Python is handled by extractSymbolsAST
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const parser = getParser(language);
|
|
219
|
+
const tree = parser.parse(code);
|
|
220
|
+
// Build a comprehensive set of ALL identifier references in the file.
|
|
221
|
+
// extractUsagesAST only tracks cross-file symbol usages (for hallucination detection),
|
|
222
|
+
// so we need our own set that includes local references like `validAisles.includes(...)`.
|
|
223
|
+
const allReferences = new Set();
|
|
224
|
+
function collectReferences(node) {
|
|
225
|
+
if (!node)
|
|
226
|
+
return;
|
|
227
|
+
// Collect identifiers that are NOT in declaration positions
|
|
228
|
+
if (node.type === "identifier" || node.type === "property_identifier" || node.type === "type_identifier") {
|
|
229
|
+
const parentType = node.parent?.type;
|
|
230
|
+
// Skip if this is the NAME side of a variable_declarator (declaration, not usage)
|
|
231
|
+
const isDeclarationName = parentType === "variable_declarator" && node.parent?.childForFieldName?.("name")?.id === node.id;
|
|
232
|
+
// Skip if this is a function/method declaration name
|
|
233
|
+
const isFuncDeclName = (parentType === "function_declaration" || parentType === "method_definition") &&
|
|
234
|
+
node.parent?.childForFieldName?.("name")?.id === node.id;
|
|
235
|
+
if (!isDeclarationName && !isFuncDeclName) {
|
|
236
|
+
const text = node.text || getNodeText(node, code);
|
|
237
|
+
if (text)
|
|
238
|
+
allReferences.add(text);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (node.children) {
|
|
242
|
+
for (const child of node.children) {
|
|
243
|
+
collectReferences(child);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
collectReferences(tree.rootNode);
|
|
248
|
+
// Merge with usedNames from extractUsagesAST
|
|
249
|
+
const combinedUsed = new Set([...usedNames, ...allReferences]);
|
|
250
|
+
// Only check MODULE-LEVEL variable declarations (direct children of program).
|
|
251
|
+
// Variables inside function/method bodies are local to that scope and their
|
|
252
|
+
// usage is NOT tracked by extractUsagesAST (which focuses on cross-file symbols).
|
|
253
|
+
// Recursing into function bodies would produce massive false positives
|
|
254
|
+
// (e.g., `const where = {}` inside an Express handler).
|
|
255
|
+
const root = tree.rootNode;
|
|
256
|
+
for (const topNode of root.children) {
|
|
257
|
+
// Handle both direct declarations and export_statement wrappers
|
|
258
|
+
const declNode = (topNode.type === "lexical_declaration" || topNode.type === "variable_declaration")
|
|
259
|
+
? topNode
|
|
260
|
+
: (topNode.type === "export_statement"
|
|
261
|
+
? topNode.children?.find((c) => c.type === "lexical_declaration" || c.type === "variable_declaration")
|
|
262
|
+
: null);
|
|
263
|
+
if (!declNode)
|
|
264
|
+
continue;
|
|
265
|
+
const isExported = declNode.parent?.type === "export_statement";
|
|
266
|
+
for (const child of declNode.children) {
|
|
267
|
+
if (child.type === "variable_declarator") {
|
|
268
|
+
const nameNode = child.childForFieldName?.("name");
|
|
269
|
+
if (nameNode && nameNode.type === "identifier") {
|
|
270
|
+
const name = nameNode.text || getNodeText(nameNode, code);
|
|
271
|
+
const line = nameNode.startPosition?.row + 1 || 1;
|
|
272
|
+
// Skip if exported
|
|
273
|
+
if (isExported)
|
|
274
|
+
continue;
|
|
275
|
+
// Skip if used (check both cross-file usages and local references)
|
|
276
|
+
if (combinedUsed.has(name))
|
|
277
|
+
continue;
|
|
278
|
+
// Skip if imported
|
|
279
|
+
if (importedNames.has(name))
|
|
280
|
+
continue;
|
|
281
|
+
// Skip if it starts with _ (intentionally unused)
|
|
282
|
+
if (name.startsWith("_"))
|
|
283
|
+
continue;
|
|
284
|
+
// Skip React hooks (useXxx)
|
|
285
|
+
if (name.startsWith("use") && name.length > 3 && /[A-Z]/.test(name[3]))
|
|
286
|
+
continue;
|
|
287
|
+
// Check if this is a function assignment (already handled by extractSymbolsAST)
|
|
288
|
+
const valueNode = child.childForFieldName?.("value");
|
|
289
|
+
if (valueNode && (valueNode.type === "arrow_function" ||
|
|
290
|
+
valueNode.type === "function" ||
|
|
291
|
+
valueNode.type === "function_expression")) {
|
|
292
|
+
// Already handled by extractSymbolsAST
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
// This is an unused variable
|
|
296
|
+
issues.push({
|
|
297
|
+
type: "unusedExport",
|
|
298
|
+
severity: "medium",
|
|
299
|
+
name,
|
|
300
|
+
file: filePath,
|
|
301
|
+
line,
|
|
302
|
+
message: `Variable '${name}' is defined but never used in this file`,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
logger.debug(`Error in findUnusedLocalDefinitions for ${filePath}:`, error);
|
|
311
|
+
}
|
|
312
|
+
return issues;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get text from an AST node
|
|
316
|
+
*/
|
|
317
|
+
function getNodeText(node, code) {
|
|
318
|
+
if (node.text)
|
|
319
|
+
return node.text;
|
|
320
|
+
if (node.startIndex !== undefined && node.endIndex !== undefined) {
|
|
321
|
+
return code.slice(node.startIndex, node.endIndex);
|
|
322
|
+
}
|
|
323
|
+
return "";
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Backwards-compatible wrapper that uses AST-based detection
|
|
327
|
+
* This replaces the old regex-based detectUnusedLocals
|
|
328
|
+
*/
|
|
329
|
+
export function detectUnusedLocals(code, filePath) {
|
|
330
|
+
// Use the new AST-based implementation
|
|
331
|
+
return detectUnusedLocalsAST(code, filePath);
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=unusedLocals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unusedLocals.js","sourceRoot":"","sources":["../../../src/tools/validation/unusedLocals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Validation Logic Module
|
|
3
|
+
*
|
|
4
|
+
* This module contains the core validation algorithms for detecting hallucinations
|
|
5
|
+
* and validating symbols against the project context.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - Validate that imported packages exist in manifest files
|
|
9
|
+
* - Validate that used symbols exist in the project symbol table
|
|
10
|
+
* - Check parameter counts for function calls
|
|
11
|
+
* - Calculate confidence scores for validation issues
|
|
12
|
+
* - Generate reasoning explanations for each issue
|
|
13
|
+
* - Build symbol lookup tables from project context
|
|
14
|
+
* - Handle strict mode vs. non-strict mode validation
|
|
15
|
+
*
|
|
16
|
+
* @format
|
|
17
|
+
*/
|
|
18
|
+
import type { ProjectContext } from "../../context/projectContext.js";
|
|
19
|
+
import type { ValidationIssue, ProjectSymbol, ManifestDependencies, ASTUsage, ASTImport, ASTTypeReference } from "./types.js";
|
|
20
|
+
/**
|
|
21
|
+
* Validate that all imported packages exist in manifest files.
|
|
22
|
+
* Checks package.json for JavaScript/TypeScript and requirements.txt/pyproject.toml for Python.
|
|
23
|
+
*
|
|
24
|
+
* @param imports - Array of import statements extracted from code
|
|
25
|
+
* @param manifest - Manifest dependencies loaded from package files
|
|
26
|
+
* @param newCode - The source code being validated (for extracting line content)
|
|
27
|
+
* @param language - Programming language (default: typescript)
|
|
28
|
+
* @returns Array of validation issues for missing dependencies
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateManifest(imports: ASTImport[], manifest: ManifestDependencies, newCode: string, language?: string, filePath?: string): Promise<ValidationIssue[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Extract a specific line from code by line number.
|
|
33
|
+
*
|
|
34
|
+
* @param code - The source code
|
|
35
|
+
* @param lineNum - Line number (1-indexed)
|
|
36
|
+
* @returns The trimmed line content
|
|
37
|
+
*/
|
|
38
|
+
export declare function getLineFromCode(code: string, lineNum: number): string;
|
|
39
|
+
/**
|
|
40
|
+
* Build a symbol table from project context for validation.
|
|
41
|
+
* Converts the project context symbol index into a flat array of ProjectSymbol objects.
|
|
42
|
+
*
|
|
43
|
+
* @param context - The project context containing all symbols
|
|
44
|
+
* @param relevantSymbols - Optional list of symbol names to include (for smart context filtering)
|
|
45
|
+
* @returns Array of project symbols for validation
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildSymbolTable(context: ProjectContext, relevantSymbols?: string[]): ProjectSymbol[];
|
|
48
|
+
/**
|
|
49
|
+
* Calculate confidence score for a validation issue.
|
|
50
|
+
* Based on multiple factors: similarity to existing symbols, context, etc.
|
|
51
|
+
*
|
|
52
|
+
* @param options - Configuration for confidence calculation
|
|
53
|
+
* @returns Object containing confidence score (0-100) and reasoning explanation
|
|
54
|
+
*/
|
|
55
|
+
export declare function calculateConfidence(options: {
|
|
56
|
+
issueType: ValidationIssue["type"];
|
|
57
|
+
symbolName: string;
|
|
58
|
+
similarSymbols: string[];
|
|
59
|
+
existsInProject: boolean;
|
|
60
|
+
strictMode: boolean;
|
|
61
|
+
}): {
|
|
62
|
+
confidence: number;
|
|
63
|
+
reasoning: string;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Validate that all used symbols exist in the project symbol table.
|
|
67
|
+
* Performs comprehensive validation including:
|
|
68
|
+
* - Function calls
|
|
69
|
+
* - Method calls
|
|
70
|
+
* - Class instantiations
|
|
71
|
+
* - Parameter count checking
|
|
72
|
+
* - Import validation
|
|
73
|
+
* - Python __all__ export validation
|
|
74
|
+
*
|
|
75
|
+
* @param usedSymbols - Array of symbol usages extracted from code
|
|
76
|
+
* @param symbolTable - Array of project symbols for validation
|
|
77
|
+
* @param newCode - The source code being validated
|
|
78
|
+
* @param language - Programming language ('python', 'javascript', 'typescript')
|
|
79
|
+
* @param strictMode - If true, requires explicit imports for all symbols
|
|
80
|
+
* @param imports - Array of import statements (for internal import validation)
|
|
81
|
+
* @param pythonExports - Map of Python module exports (for __all__ validation)
|
|
82
|
+
* @param typeReferences - Optional array of type references (for unused import detection)
|
|
83
|
+
* @returns Array of validation issues
|
|
84
|
+
*/
|
|
85
|
+
export declare function validateSymbols(usedSymbols: ASTUsage[], symbolTable: ProjectSymbol[], newCode: string, language: string, strictMode: boolean, imports?: ASTImport[], pythonExports?: Map<string, Set<string>>, context?: ProjectContext | null, // Added context
|
|
86
|
+
filePath?: string, // Added file path
|
|
87
|
+
missingPackages?: Set<string>, // Added missing packages for smart validation
|
|
88
|
+
typeReferences?: ASTTypeReference[]): ValidationIssue[];
|
|
89
|
+
/**
|
|
90
|
+
* Validate that usage of symbols follows established project patterns (Secret #5).
|
|
91
|
+
* Detects "ritual" deviations such as missing co-occurring calls.
|
|
92
|
+
*
|
|
93
|
+
* @param usedSymbols - Symbols used in the new code
|
|
94
|
+
* @param projectContext - Project context with symbol graph and patterns
|
|
95
|
+
* @returns Array of pattern deviation issues
|
|
96
|
+
*/
|
|
97
|
+
export declare function validateUsagePatterns(usedSymbols: ASTUsage[], projectContext: ProjectContext, filePath?: string): ValidationIssue[];
|
|
98
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/tools/validation/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAyBpB;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAqB,EAC/B,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CA0F5B;AA4BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrE;AAMD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,aAAa,EAAE,CAwBjB;AA+BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAiE5C;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,QAAQ,EAAE,EACvB,WAAW,EAAE,aAAa,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,SAAS,EAAO,EACzB,aAAa,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa,EACnD,OAAO,GAAE,cAAc,GAAG,IAAW,EAAE,gBAAgB;AACvD,QAAQ,GAAE,MAAW,EAAE,kBAAkB;AACzC,eAAe,GAAE,GAAG,CAAC,MAAM,CAAa,EAAE,8CAA8C;AACxF,cAAc,GAAE,gBAAgB,EAAO,GACtC,eAAe,EAAE,CA0jDnB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,QAAQ,EAAE,EACvB,cAAc,EAAE,cAAc,EAC9B,QAAQ,GAAE,MAAW,GACpB,eAAe,EAAE,CAkCnB"}
|