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,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Lineage - Git History-Based Context
|
|
3
|
+
*
|
|
4
|
+
* Inspired by Augment Code's context lineage feature.
|
|
5
|
+
* Uses git history to understand code evolution and prioritize
|
|
6
|
+
* symbols from recently modified files.
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
export interface FileHistory {
|
|
11
|
+
filePath: string;
|
|
12
|
+
lastModified: Date;
|
|
13
|
+
commitCount: number;
|
|
14
|
+
recentCommits: string[];
|
|
15
|
+
authors: Set<string>;
|
|
16
|
+
changeFrequency: number;
|
|
17
|
+
}
|
|
18
|
+
export interface LineageContext {
|
|
19
|
+
recentlyModifiedFiles: string[];
|
|
20
|
+
hotspotFiles: string[];
|
|
21
|
+
relatedFiles: Map<string, string[]>;
|
|
22
|
+
fileHistories: Map<string, FileHistory>;
|
|
23
|
+
}
|
|
24
|
+
declare class ContextLineageClass {
|
|
25
|
+
private git;
|
|
26
|
+
private projectPath;
|
|
27
|
+
private cache;
|
|
28
|
+
private pendingFetch;
|
|
29
|
+
private readonly CACHE_TTL_MS;
|
|
30
|
+
/**
|
|
31
|
+
* Initialize git for a project
|
|
32
|
+
*/
|
|
33
|
+
initialize(projectPath: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Get lineage context for a project
|
|
36
|
+
*/
|
|
37
|
+
getLineageContext(projectPath: string, options?: {
|
|
38
|
+
commitDepth?: number;
|
|
39
|
+
minChangeFrequency?: number;
|
|
40
|
+
}): Promise<LineageContext | null>;
|
|
41
|
+
private fetchLineageContext;
|
|
42
|
+
/**
|
|
43
|
+
* Get relevance score for a file based on git history
|
|
44
|
+
*/
|
|
45
|
+
getFileLineageScore(filePath: string, context: LineageContext | null): number;
|
|
46
|
+
/**
|
|
47
|
+
* Get symbols from files related to a given file
|
|
48
|
+
*/
|
|
49
|
+
getRelatedFileSymbols(filePath: string, context: LineageContext | null): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Clear all caches
|
|
52
|
+
*/
|
|
53
|
+
clear(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Fetch file lists for all commits ONCE. Reused by buildFileHistories,
|
|
56
|
+
* getRecentlyModifiedFiles, and findRelatedFiles to avoid spawning
|
|
57
|
+
* redundant git subprocesses (was ~110 subprocesses, now ~50).
|
|
58
|
+
*/
|
|
59
|
+
private fetchCommitFiles;
|
|
60
|
+
/**
|
|
61
|
+
* Build file histories from pre-fetched commit data (no git subprocesses)
|
|
62
|
+
*/
|
|
63
|
+
private buildFileHistoriesFromCache;
|
|
64
|
+
/**
|
|
65
|
+
* Get files modified in recent commits from pre-fetched data (no git subprocesses)
|
|
66
|
+
*/
|
|
67
|
+
private getRecentlyModifiedFilesFromCache;
|
|
68
|
+
/**
|
|
69
|
+
* Identify hotspot files (frequently changed)
|
|
70
|
+
*/
|
|
71
|
+
private identifyHotspots;
|
|
72
|
+
/**
|
|
73
|
+
* Find files that are often changed together from pre-fetched data (no git subprocesses)
|
|
74
|
+
*/
|
|
75
|
+
private findRelatedFilesFromCache;
|
|
76
|
+
}
|
|
77
|
+
export declare const contextLineage: ContextLineageClass;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=contextLineage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextLineage.d.ts","sourceRoot":"","sources":["../../src/context/contextLineage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACzC;AAED,cAAM,mBAAmB;IACvB,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,YAAY,CAA0D;IAC9E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAE/C;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD;;OAEG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KACxB,GACL,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAuBnB,mBAAmB;IA+DjC;;OAEG;IACH,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,GAAG,IAAI,GAC7B,MAAM;IA0BT;;OAEG;IACH,qBAAqB,CACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,GAAG,IAAI,GAC7B,MAAM,EAAE;IAOX;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;YACW,gBAAgB;IA0B9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAiDnC;;OAEG;IACH,OAAO,CAAC,iCAAiC;IAkBzC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,yBAAyB;CAwClC;AAGD,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Lineage - Git History-Based Context
|
|
3
|
+
*
|
|
4
|
+
* Inspired by Augment Code's context lineage feature.
|
|
5
|
+
* Uses git history to understand code evolution and prioritize
|
|
6
|
+
* symbols from recently modified files.
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
import { simpleGit } from "simple-git";
|
|
11
|
+
import { logger } from "../utils/logger.js";
|
|
12
|
+
class ContextLineageClass {
|
|
13
|
+
git = null;
|
|
14
|
+
projectPath = "";
|
|
15
|
+
cache = new Map();
|
|
16
|
+
pendingFetch = new Map();
|
|
17
|
+
CACHE_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
18
|
+
/**
|
|
19
|
+
* Initialize git for a project
|
|
20
|
+
*/
|
|
21
|
+
async initialize(projectPath) {
|
|
22
|
+
this.projectPath = projectPath;
|
|
23
|
+
this.git = simpleGit(projectPath);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get lineage context for a project
|
|
27
|
+
*/
|
|
28
|
+
async getLineageContext(projectPath, options = {}) {
|
|
29
|
+
const { commitDepth = 50, minChangeFrequency = 0.1 } = options;
|
|
30
|
+
// Check cache
|
|
31
|
+
const cacheKey = `${projectPath}:${commitDepth}`;
|
|
32
|
+
const cached = this.cache.get(cacheKey);
|
|
33
|
+
if (cached) {
|
|
34
|
+
return cached;
|
|
35
|
+
}
|
|
36
|
+
// Lock: if another call is already fetching this, wait for it instead
|
|
37
|
+
// of spawning another ~50+ git subprocesses in parallel
|
|
38
|
+
const pending = this.pendingFetch.get(cacheKey);
|
|
39
|
+
if (pending) {
|
|
40
|
+
return pending;
|
|
41
|
+
}
|
|
42
|
+
const fetchPromise = this.fetchLineageContext(projectPath, cacheKey, commitDepth, minChangeFrequency);
|
|
43
|
+
this.pendingFetch.set(cacheKey, fetchPromise);
|
|
44
|
+
fetchPromise.finally(() => this.pendingFetch.delete(cacheKey));
|
|
45
|
+
return fetchPromise;
|
|
46
|
+
}
|
|
47
|
+
async fetchLineageContext(projectPath, cacheKey, commitDepth, minChangeFrequency) {
|
|
48
|
+
try {
|
|
49
|
+
if (!this.git || this.projectPath !== projectPath) {
|
|
50
|
+
await this.initialize(projectPath);
|
|
51
|
+
}
|
|
52
|
+
if (!this.git) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
// Check if we're in a git repo
|
|
56
|
+
const isRepo = await this.git.checkIsRepo();
|
|
57
|
+
if (!isRepo) {
|
|
58
|
+
logger.debug("Not a git repository, skipping lineage context");
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
// Get recent commits
|
|
62
|
+
const log = await this.git.log({ maxCount: commitDepth });
|
|
63
|
+
// Fetch commit file lists ONCE and reuse across all analyses.
|
|
64
|
+
// Previously buildFileHistories, getRecentlyModifiedFiles, and findRelatedFiles
|
|
65
|
+
// each called `git show` per commit independently — tripling subprocess count.
|
|
66
|
+
const commitFilesMap = await this.fetchCommitFiles(log);
|
|
67
|
+
// Build file histories (reuses pre-fetched data)
|
|
68
|
+
const fileHistories = this.buildFileHistoriesFromCache(log, commitFilesMap);
|
|
69
|
+
// Identify recently modified files (reuses pre-fetched data)
|
|
70
|
+
const recentlyModifiedFiles = this.getRecentlyModifiedFilesFromCache(log, commitFilesMap, 10);
|
|
71
|
+
// Identify hotspot files (high change frequency)
|
|
72
|
+
const hotspotFiles = this.identifyHotspots(fileHistories, minChangeFrequency);
|
|
73
|
+
// Find files often changed together (reuses pre-fetched data)
|
|
74
|
+
const relatedFiles = this.findRelatedFilesFromCache(log, commitFilesMap);
|
|
75
|
+
const context = {
|
|
76
|
+
recentlyModifiedFiles,
|
|
77
|
+
hotspotFiles,
|
|
78
|
+
relatedFiles,
|
|
79
|
+
fileHistories,
|
|
80
|
+
};
|
|
81
|
+
// Cache the result
|
|
82
|
+
this.cache.set(cacheKey, context);
|
|
83
|
+
setTimeout(() => this.cache.delete(cacheKey), this.CACHE_TTL_MS);
|
|
84
|
+
return context;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
logger.debug("Failed to get lineage context:", error);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get relevance score for a file based on git history
|
|
93
|
+
*/
|
|
94
|
+
getFileLineageScore(filePath, context) {
|
|
95
|
+
if (!context)
|
|
96
|
+
return 0;
|
|
97
|
+
let score = 0;
|
|
98
|
+
// Recently modified files get high score
|
|
99
|
+
const recentIndex = context.recentlyModifiedFiles.indexOf(filePath);
|
|
100
|
+
if (recentIndex !== -1) {
|
|
101
|
+
score += 0.8 - recentIndex * 0.05; // Decay with position
|
|
102
|
+
}
|
|
103
|
+
// Hotspot files (frequently changed) get medium score
|
|
104
|
+
if (context.hotspotFiles.includes(filePath)) {
|
|
105
|
+
score += 0.4;
|
|
106
|
+
}
|
|
107
|
+
// Files with high commit count get small boost
|
|
108
|
+
const history = context.fileHistories.get(filePath);
|
|
109
|
+
if (history) {
|
|
110
|
+
const commitBoost = Math.min(0.2, history.commitCount / 100);
|
|
111
|
+
score += commitBoost;
|
|
112
|
+
}
|
|
113
|
+
return Math.min(1.0, score);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get symbols from files related to a given file
|
|
117
|
+
*/
|
|
118
|
+
getRelatedFileSymbols(filePath, context) {
|
|
119
|
+
if (!context)
|
|
120
|
+
return [];
|
|
121
|
+
const related = context.relatedFiles.get(filePath) || [];
|
|
122
|
+
return related;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Clear all caches
|
|
126
|
+
*/
|
|
127
|
+
clear() {
|
|
128
|
+
this.cache.clear();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Fetch file lists for all commits ONCE. Reused by buildFileHistories,
|
|
132
|
+
* getRecentlyModifiedFiles, and findRelatedFiles to avoid spawning
|
|
133
|
+
* redundant git subprocesses (was ~110 subprocesses, now ~50).
|
|
134
|
+
*/
|
|
135
|
+
async fetchCommitFiles(log) {
|
|
136
|
+
const commitFilesMap = new Map();
|
|
137
|
+
if (!this.git)
|
|
138
|
+
return commitFilesMap;
|
|
139
|
+
for (const commit of log.all) {
|
|
140
|
+
try {
|
|
141
|
+
const diff = await this.git.show([
|
|
142
|
+
"--name-only",
|
|
143
|
+
"--format=",
|
|
144
|
+
commit.hash,
|
|
145
|
+
]);
|
|
146
|
+
const files = diff
|
|
147
|
+
.split("\n")
|
|
148
|
+
.filter((f) => f.trim() && !f.startsWith("diff"));
|
|
149
|
+
commitFilesMap.set(commit.hash, files);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
commitFilesMap.set(commit.hash, []);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return commitFilesMap;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Build file histories from pre-fetched commit data (no git subprocesses)
|
|
159
|
+
*/
|
|
160
|
+
buildFileHistoriesFromCache(log, commitFilesMap) {
|
|
161
|
+
const histories = new Map();
|
|
162
|
+
for (const commit of log.all) {
|
|
163
|
+
const files = commitFilesMap.get(commit.hash) || [];
|
|
164
|
+
for (const file of files) {
|
|
165
|
+
if (!histories.has(file)) {
|
|
166
|
+
histories.set(file, {
|
|
167
|
+
filePath: file,
|
|
168
|
+
lastModified: new Date(commit.date),
|
|
169
|
+
commitCount: 0,
|
|
170
|
+
recentCommits: [],
|
|
171
|
+
authors: new Set(),
|
|
172
|
+
changeFrequency: 0,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
const history = histories.get(file);
|
|
176
|
+
history.commitCount++;
|
|
177
|
+
if (history.recentCommits.length < 5) {
|
|
178
|
+
history.recentCommits.push(commit.hash);
|
|
179
|
+
}
|
|
180
|
+
history.authors.add(commit.author_name);
|
|
181
|
+
// Update last modified if this commit is more recent
|
|
182
|
+
const commitDate = new Date(commit.date);
|
|
183
|
+
if (commitDate > history.lastModified) {
|
|
184
|
+
history.lastModified = commitDate;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Calculate change frequency (commits per day)
|
|
189
|
+
const now = Date.now();
|
|
190
|
+
for (const history of histories.values()) {
|
|
191
|
+
const daysSinceLastModified = (now - history.lastModified.getTime()) / (1000 * 60 * 60 * 24);
|
|
192
|
+
if (daysSinceLastModified > 0) {
|
|
193
|
+
history.changeFrequency = history.commitCount / daysSinceLastModified;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return histories;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get files modified in recent commits from pre-fetched data (no git subprocesses)
|
|
200
|
+
*/
|
|
201
|
+
getRecentlyModifiedFilesFromCache(log, commitFilesMap, commitCount) {
|
|
202
|
+
const files = new Set();
|
|
203
|
+
const recentCommits = log.all.slice(0, commitCount);
|
|
204
|
+
for (const commit of recentCommits) {
|
|
205
|
+
const commitFiles = commitFilesMap.get(commit.hash) || [];
|
|
206
|
+
for (const file of commitFiles) {
|
|
207
|
+
files.add(file);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return Array.from(files);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Identify hotspot files (frequently changed)
|
|
214
|
+
*/
|
|
215
|
+
identifyHotspots(histories, minFrequency) {
|
|
216
|
+
return Array.from(histories.entries())
|
|
217
|
+
.filter(([_, history]) => history.changeFrequency >= minFrequency)
|
|
218
|
+
.sort((a, b) => b[1].changeFrequency - a[1].changeFrequency)
|
|
219
|
+
.map(([file, _]) => file)
|
|
220
|
+
.slice(0, 20); // Top 20 hotspots
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Find files that are often changed together from pre-fetched data (no git subprocesses)
|
|
224
|
+
*/
|
|
225
|
+
findRelatedFilesFromCache(log, commitFilesMap) {
|
|
226
|
+
const relatedFiles = new Map();
|
|
227
|
+
const coChangeMatrix = new Map();
|
|
228
|
+
// Build co-change matrix from pre-fetched data
|
|
229
|
+
for (const commit of log.all) {
|
|
230
|
+
const files = commitFilesMap.get(commit.hash) || [];
|
|
231
|
+
// Record co-changes
|
|
232
|
+
for (const file1 of files) {
|
|
233
|
+
if (!coChangeMatrix.has(file1)) {
|
|
234
|
+
coChangeMatrix.set(file1, new Map());
|
|
235
|
+
}
|
|
236
|
+
for (const file2 of files) {
|
|
237
|
+
if (file1 !== file2) {
|
|
238
|
+
const matrix = coChangeMatrix.get(file1);
|
|
239
|
+
matrix.set(file2, (matrix.get(file2) || 0) + 1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Extract top related files for each file
|
|
245
|
+
for (const [file, coChanges] of coChangeMatrix.entries()) {
|
|
246
|
+
const related = Array.from(coChanges.entries())
|
|
247
|
+
.sort((a, b) => b[1] - a[1])
|
|
248
|
+
.slice(0, 5) // Top 5 related files
|
|
249
|
+
.map(([f, _]) => f);
|
|
250
|
+
if (related.length > 0) {
|
|
251
|
+
relatedFiles.set(file, related);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return relatedFiles;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Singleton instance
|
|
258
|
+
export const contextLineage = new ContextLineageClass();
|
|
259
|
+
//# sourceMappingURL=contextLineage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextLineage.js","sourceRoot":"","sources":["../../src/context/contextLineage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all context features to work together seamlessly.
|
|
5
|
+
* Inspired by Augment Code's invisible, harmonious integration.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
*/
|
|
9
|
+
import { type ProjectContext } from "./projectContext.js";
|
|
10
|
+
import { type LineageContext } from "./contextLineage.js";
|
|
11
|
+
import { type ApiContractIssue } from "../api-contract/validators/index.js";
|
|
12
|
+
export interface OrchestrationContext {
|
|
13
|
+
projectContext: ProjectContext;
|
|
14
|
+
lineageContext: LineageContext | null;
|
|
15
|
+
relevantSymbols: string[];
|
|
16
|
+
useIncremental: boolean;
|
|
17
|
+
contextQuality: "excellent" | "good" | "fair" | "poor";
|
|
18
|
+
recommendations: string[];
|
|
19
|
+
apiContractIssues?: ApiContractIssue[];
|
|
20
|
+
apiContractSummary?: {
|
|
21
|
+
totalIssues: number;
|
|
22
|
+
critical: number;
|
|
23
|
+
high: number;
|
|
24
|
+
matchedEndpoints: number;
|
|
25
|
+
matchedTypes: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Orchestrate all context features to work together
|
|
30
|
+
*/
|
|
31
|
+
export declare function orchestrateContext(options: {
|
|
32
|
+
projectPath: string;
|
|
33
|
+
language: string;
|
|
34
|
+
newCode?: string;
|
|
35
|
+
imports?: string[];
|
|
36
|
+
useSmartContext?: boolean;
|
|
37
|
+
includeLineage?: boolean;
|
|
38
|
+
forceRebuild?: boolean;
|
|
39
|
+
includeTests?: boolean;
|
|
40
|
+
maxFiles?: number;
|
|
41
|
+
sessionId?: string;
|
|
42
|
+
currentFile?: string;
|
|
43
|
+
recentlyEditedFiles?: string[];
|
|
44
|
+
}): Promise<OrchestrationContext>;
|
|
45
|
+
/**
|
|
46
|
+
* Record validation event for future context
|
|
47
|
+
*/
|
|
48
|
+
export declare function recordValidationEvent(options: {
|
|
49
|
+
filePath?: string;
|
|
50
|
+
symbols: string[];
|
|
51
|
+
language: string;
|
|
52
|
+
}): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get context quality explanation
|
|
55
|
+
*/
|
|
56
|
+
export declare function explainContextQuality(quality: "excellent" | "good" | "fair" | "poor"): string;
|
|
57
|
+
//# sourceMappingURL=contextOrchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextOrchestrator.d.ts","sourceRoot":"","sources":["../../src/context/contextOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAqB,KAAK,cAAc,EAA2B,MAAM,qBAAqB,CAAC;AAEtG,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAmC,KAAK,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE7G,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,kBAAkB,CAAC,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiKhC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAWP;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAC9C,MAAM,CAWR"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all context features to work together seamlessly.
|
|
5
|
+
* Inspired by Augment Code's invisible, harmonious integration.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
*/
|
|
9
|
+
import { getProjectContext } from "./projectContext.js";
|
|
10
|
+
import { intentTracker } from "./intentTracker.js";
|
|
11
|
+
import { contextLineage } from "./contextLineage.js";
|
|
12
|
+
import { getRelevantSymbolsForValidation } from "../analyzers/relevanceScorer.js";
|
|
13
|
+
import { logger } from "../utils/logger.js";
|
|
14
|
+
import { validateApiContractsFromContext } from "../api-contract/validators/index.js";
|
|
15
|
+
/**
|
|
16
|
+
* Orchestrate all context features to work together
|
|
17
|
+
*/
|
|
18
|
+
export async function orchestrateContext(options) {
|
|
19
|
+
const orchestrationStart = Date.now();
|
|
20
|
+
const { projectPath, language, newCode, imports = [], useSmartContext = true, includeLineage = false, forceRebuild = false, includeTests = true, maxFiles, sessionId, currentFile, recentlyEditedFiles = [], } = options;
|
|
21
|
+
const recommendations = [];
|
|
22
|
+
let contextQuality = "good";
|
|
23
|
+
// 1. Get project context (with branch-aware caching)
|
|
24
|
+
const contextStart = Date.now();
|
|
25
|
+
const projectContext = await getProjectContext(projectPath, {
|
|
26
|
+
language, // Use the requested language without overriding
|
|
27
|
+
forceRebuild,
|
|
28
|
+
includeTests,
|
|
29
|
+
...(typeof maxFiles === "number" ? { maxFiles } : {}),
|
|
30
|
+
});
|
|
31
|
+
logger.debug(`Project context loaded in ${Date.now() - contextStart}ms`);
|
|
32
|
+
// 2. Get developer intent
|
|
33
|
+
const intent = intentTracker.getCurrentIntent();
|
|
34
|
+
if (intent.recentFiles.length > 0) {
|
|
35
|
+
logger.debug(`Developer intent: ${intent.recentFiles.length} recent files, focus: ${intent.focusArea || "none"}`);
|
|
36
|
+
}
|
|
37
|
+
// 3. Determine if we should use smart context (cheap checks only)
|
|
38
|
+
const shouldUseSmartContext = useSmartContext &&
|
|
39
|
+
projectContext.symbolGraph &&
|
|
40
|
+
projectContext.symbolIndex.size > 100 &&
|
|
41
|
+
(imports.length > 0 || intent.recentSymbols.size > 0);
|
|
42
|
+
// 4. Get git lineage context
|
|
43
|
+
let lineageContext = null;
|
|
44
|
+
// - for validate_code: only when smart context is enabled (performance)
|
|
45
|
+
// - for build_context: always when includeLineage is explicitly requested
|
|
46
|
+
if (includeLineage || shouldUseSmartContext) {
|
|
47
|
+
try {
|
|
48
|
+
lineageContext = await contextLineage.getLineageContext(projectPath, {
|
|
49
|
+
commitDepth: 20,
|
|
50
|
+
});
|
|
51
|
+
if (lineageContext) {
|
|
52
|
+
logger.debug(`Git lineage: ${lineageContext.recentlyModifiedFiles.length} recent files, ${lineageContext.hotspotFiles.length} hotspots`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
logger.debug("Git lineage not available");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 5. Get relevant symbols using all available context
|
|
60
|
+
let relevantSymbols = [];
|
|
61
|
+
if (shouldUseSmartContext) {
|
|
62
|
+
relevantSymbols = getRelevantSymbolsForValidation(projectContext, {
|
|
63
|
+
importedSymbols: imports,
|
|
64
|
+
currentFile,
|
|
65
|
+
recentFiles: [...new Set([...intent.recentFiles, ...recentlyEditedFiles])],
|
|
66
|
+
lineageContext,
|
|
67
|
+
}, 0.3, // Min relevance score
|
|
68
|
+
200);
|
|
69
|
+
const reductionPercent = Math.round((1 - relevantSymbols.length / projectContext.symbolIndex.size) * 100);
|
|
70
|
+
logger.debug(`Smart context: ${relevantSymbols.length}/${projectContext.symbolIndex.size} symbols (${reductionPercent}% reduction)`);
|
|
71
|
+
if (reductionPercent > 70) {
|
|
72
|
+
contextQuality = "excellent";
|
|
73
|
+
}
|
|
74
|
+
else if (reductionPercent > 50) {
|
|
75
|
+
contextQuality = "good";
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
contextQuality = "fair";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
contextQuality = "fair";
|
|
83
|
+
if (projectContext.symbolIndex.size > 100) {
|
|
84
|
+
recommendations.push(useSmartContext
|
|
85
|
+
? "Consider providing imports or using sessionId for better context"
|
|
86
|
+
: "Smart context disabled; running full-context validation");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 6. Determine if incremental validation is beneficial
|
|
90
|
+
const useIncremental = Boolean(sessionId && newCode && newCode.split("\n").length > 10);
|
|
91
|
+
// 7. Quality assessment
|
|
92
|
+
if (!projectContext.symbolGraph) {
|
|
93
|
+
contextQuality = "poor";
|
|
94
|
+
recommendations.push("Symbol graph not available - rebuild context");
|
|
95
|
+
}
|
|
96
|
+
if (intent.recentFiles.length === 0 && !lineageContext) {
|
|
97
|
+
recommendations.push("No session context - provide sessionId for better results");
|
|
98
|
+
}
|
|
99
|
+
// 8. API Contract validation (if context has API Contract info)
|
|
100
|
+
let apiContractIssues;
|
|
101
|
+
let apiContractSummary;
|
|
102
|
+
if (projectContext.apiContract) {
|
|
103
|
+
const validationResult = validateApiContractsFromContext(projectContext);
|
|
104
|
+
apiContractIssues = validationResult.issues;
|
|
105
|
+
apiContractSummary = {
|
|
106
|
+
totalIssues: validationResult.summary.totalIssues,
|
|
107
|
+
critical: validationResult.summary.critical,
|
|
108
|
+
high: validationResult.summary.high,
|
|
109
|
+
matchedEndpoints: validationResult.summary.matchedEndpoints,
|
|
110
|
+
matchedTypes: validationResult.summary.matchedTypes,
|
|
111
|
+
};
|
|
112
|
+
if (validationResult.summary.critical > 0) {
|
|
113
|
+
recommendations.push(`${validationResult.summary.critical} critical API contract issues detected - review recommended`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const totalTime = Date.now() - orchestrationStart;
|
|
117
|
+
logger.info(`Context orchestration completed in ${totalTime}ms (quality: ${contextQuality})`);
|
|
118
|
+
// Performance warning
|
|
119
|
+
if (totalTime > 5000) {
|
|
120
|
+
logger.warn(`Slow orchestration detected (${totalTime}ms) - consider limiting project scope`);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
projectContext,
|
|
124
|
+
lineageContext,
|
|
125
|
+
relevantSymbols,
|
|
126
|
+
useIncremental,
|
|
127
|
+
contextQuality,
|
|
128
|
+
recommendations,
|
|
129
|
+
apiContractIssues,
|
|
130
|
+
apiContractSummary,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Record validation event for future context
|
|
135
|
+
*/
|
|
136
|
+
export function recordValidationEvent(options) {
|
|
137
|
+
const { filePath, symbols, language } = options;
|
|
138
|
+
if (filePath) {
|
|
139
|
+
intentTracker.recordEdit({
|
|
140
|
+
filePath,
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
symbols,
|
|
143
|
+
language,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get context quality explanation
|
|
149
|
+
*/
|
|
150
|
+
export function explainContextQuality(quality) {
|
|
151
|
+
switch (quality) {
|
|
152
|
+
case "excellent":
|
|
153
|
+
return "All context features active: smart filtering (>70% reduction), git history, and session tracking";
|
|
154
|
+
case "good":
|
|
155
|
+
return "Most context features active: smart filtering (>50% reduction) with some history";
|
|
156
|
+
case "fair":
|
|
157
|
+
return "Basic context available: limited filtering or missing session data";
|
|
158
|
+
case "poor":
|
|
159
|
+
return "Minimal context: missing symbol graph or project data";
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=contextOrchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextOrchestrator.js","sourceRoot":"","sources":["../../src/context/contextOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAgD,MAAM,qBAAqB,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAuB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,+BAA+B,EAAyB,MAAM,qCAAqC,CAAC;AAoB7G;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAaxC;IACC,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,EACJ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,OAAO,GAAG,EAAE,EACZ,eAAe,GAAG,IAAI,EACtB,cAAc,GAAG,KAAK,EACtB,YAAY,GAAG,KAAK,EACpB,YAAY,GAAG,IAAI,EACnB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,mBAAmB,GAAG,EAAE,GACzB,GAAG,OAAO,CAAC;IAEZ,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,cAAc,GAA2C,MAAM,CAAC;IAEpE,qDAAqD;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE;QAC1D,QAAQ,EAAE,gDAAgD;QAC1D,YAAY;QACZ,YAAY;QACZ,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,IAAI,CAAC,CAAC;IAEzE,0BAA0B;IAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,gBAAgB,EAAE,CAAC;IAChD,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CACV,qBAAqB,MAAM,CAAC,WAAW,CAAC,MAAM,yBAAyB,MAAM,CAAC,SAAS,IAAI,MAAM,EAAE,CACpG,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,MAAM,qBAAqB,GACzB,eAAe;QACf,cAAc,CAAC,WAAW;QAC1B,cAAc,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG;QACrC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAExD,6BAA6B;IAC7B,IAAI,cAAc,GAA0B,IAAI,CAAC;IACjD,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,cAAc,IAAI,qBAAqB,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,WAAW,EAAE;gBACnE,WAAW,EAAE,EAAE;aAChB,CAAC,CAAC;YACH,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,CAAC,KAAK,CACV,gBAAgB,cAAc,CAAC,qBAAqB,CAAC,MAAM,kBAAkB,cAAc,CAAC,YAAY,CAAC,MAAM,WAAW,CAC3H,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,eAAe,GAAa,EAAE,CAAC;IACnC,IAAI,qBAAqB,EAAE,CAAC;QAC1B,eAAe,GAAG,+BAA+B,CAC/C,cAAc,EACd;YACE,eAAe,EAAE,OAAO;YACxB,WAAW;YACX,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,mBAAmB,CAAC,CAAC,CAAC;YAC1E,cAAc;SACf,EACD,GAAG,EAAE,sBAAsB;QAC3B,GAAG,CACJ,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CACjC,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CACrE,CAAC;QACF,MAAM,CAAC,KAAK,CACV,kBAAkB,eAAe,CAAC,MAAM,IAAI,cAAc,CAAC,WAAW,CAAC,IAAI,aAAa,gBAAgB,cAAc,CACvH,CAAC;QAEF,IAAI,gBAAgB,GAAG,EAAE,EAAE,CAAC;YAC1B,cAAc,GAAG,WAAW,CAAC;QAC/B,CAAC;aAAM,IAAI,gBAAgB,GAAG,EAAE,EAAE,CAAC;YACjC,cAAc,GAAG,MAAM,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,MAAM,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,MAAM,CAAC;QACxB,IAAI,cAAc,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;YAC1C,eAAe,CAAC,IAAI,CAClB,eAAe;gBACb,CAAC,CAAC,kEAAkE;gBACpE,CAAC,CAAC,yDAAyD,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,cAAc,GAAG,OAAO,CAC5B,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CACxD,CAAC;IAEF,wBAAwB;IACxB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;QAChC,cAAc,GAAG,MAAM,CAAC;QACxB,eAAe,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvD,eAAe,CAAC,IAAI,CAClB,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,IAAI,iBAAiD,CAAC;IACtD,IAAI,kBAA0E,CAAC;IAE/E,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,+BAA+B,CAAC,cAAc,CAAC,CAAC;QACzE,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAC5C,kBAAkB,GAAG;YACnB,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,WAAW;YACjD,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ;YAC3C,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI;YACnC,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,gBAAgB;YAC3D,YAAY,EAAE,gBAAgB,CAAC,OAAO,CAAC,YAAY;SACpD,CAAC;QAEF,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC1C,eAAe,CAAC,IAAI,CAClB,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,6DAA6D,CAClG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,sCAAsC,SAAS,gBAAgB,cAAc,GAAG,CAAC,CAAC;IAE9F,sBAAsB;IACtB,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,gCAAgC,SAAS,uCAAuC,CAAC,CAAC;IAChG,CAAC;IAED,OAAO;QACL,cAAc;QACd,cAAc;QACd,eAAe;QACf,cAAc;QACd,cAAc;QACd,eAAe;QACf,iBAAiB;QACjB,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAIrC;IACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEhD,IAAI,QAAQ,EAAE,CAAC;QACb,aAAa,CAAC,UAAU,CAAC;YACvB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA+C;IAE/C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,kGAAkG,CAAC;QAC5G,KAAK,MAAM;YACT,OAAO,kFAAkF,CAAC;QAC5F,KAAK,MAAM;YACT,OAAO,oEAAoE,CAAC;QAC9E,KAAK,MAAM;YACT,OAAO,uDAAuD,CAAC;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent Tracker - Understands Developer Intent from Edit History
|
|
3
|
+
*
|
|
4
|
+
* Inspired by Augment Code's intent-based context system.
|
|
5
|
+
* Tracks recent file edits to understand what the developer is working on
|
|
6
|
+
* and prioritizes related symbols in validation.
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
export interface EditEvent {
|
|
11
|
+
filePath: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
symbols: string[];
|
|
14
|
+
language: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DeveloperIntent {
|
|
17
|
+
recentFiles: string[];
|
|
18
|
+
recentSymbols: Set<string>;
|
|
19
|
+
focusArea: string | null;
|
|
20
|
+
language: string | null;
|
|
21
|
+
}
|
|
22
|
+
declare class IntentTrackerClass {
|
|
23
|
+
private editHistory;
|
|
24
|
+
private readonly MAX_HISTORY;
|
|
25
|
+
private readonly INTENT_WINDOW_MS;
|
|
26
|
+
/**
|
|
27
|
+
* Record a file edit event
|
|
28
|
+
*/
|
|
29
|
+
recordEdit(event: EditEvent): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get current developer intent based on recent edits
|
|
32
|
+
*/
|
|
33
|
+
getCurrentIntent(): DeveloperIntent;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a file is in the current focus area
|
|
36
|
+
*/
|
|
37
|
+
isInFocusArea(filePath: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a symbol is recently used
|
|
40
|
+
*/
|
|
41
|
+
isRecentlyUsed(symbol: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get relevance score for a file based on intent
|
|
44
|
+
*/
|
|
45
|
+
getFileRelevance(filePath: string): number;
|
|
46
|
+
/**
|
|
47
|
+
* Get relevance score for a symbol based on intent
|
|
48
|
+
*/
|
|
49
|
+
getSymbolRelevance(symbol: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Clear all edit history
|
|
52
|
+
*/
|
|
53
|
+
clear(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Get recent edits within the intent window
|
|
56
|
+
*/
|
|
57
|
+
private getRecentEdits;
|
|
58
|
+
/**
|
|
59
|
+
* Remove events older than the intent window
|
|
60
|
+
*/
|
|
61
|
+
private cleanupOldEvents;
|
|
62
|
+
/**
|
|
63
|
+
* Determine the focus area from recent files
|
|
64
|
+
*/
|
|
65
|
+
private determineFocusArea;
|
|
66
|
+
/**
|
|
67
|
+
* Determine primary language from recent edits
|
|
68
|
+
*/
|
|
69
|
+
private determinePrimaryLanguage;
|
|
70
|
+
}
|
|
71
|
+
export declare const intentTracker: IntentTrackerClass;
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=intentTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intentTracker.d.ts","sourceRoot":"","sources":["../../src/context/intentTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,cAAM,kBAAkB;IACtB,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAElD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAYlC;;OAEG;IACH,gBAAgB,IAAI,eAAe;IA6BnC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOxC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAmB1C;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAU1C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAsBjC;AAGD,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
|