@skillsmith/core 0.2.0 → 2.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/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -6
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1303: Tree-sitter Parser Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages tree-sitter parser instances with lazy loading.
|
|
5
|
+
* Uses web-tree-sitter (WASM) to avoid native module conflicts.
|
|
6
|
+
*
|
|
7
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
8
|
+
* @see ADR-002: Docker glibc Requirement
|
|
9
|
+
* @module analysis/tree-sitter/manager
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Manages tree-sitter parser instances with lazy loading
|
|
13
|
+
*
|
|
14
|
+
* Parsers are loaded on-demand and cached for reuse.
|
|
15
|
+
* Uses WASM-based web-tree-sitter to avoid native module issues.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const manager = new TreeSitterManager()
|
|
20
|
+
* const parser = await manager.getParser('python')
|
|
21
|
+
* const tree = parser.parse('def main(): pass')
|
|
22
|
+
* manager.dispose()
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class TreeSitterManager {
|
|
26
|
+
parsers = new Map();
|
|
27
|
+
loading = new Map();
|
|
28
|
+
maxParsers;
|
|
29
|
+
initialized = false;
|
|
30
|
+
initPromise = null;
|
|
31
|
+
ParserClass = null;
|
|
32
|
+
// SMI-1333: Track access order for proper LRU eviction
|
|
33
|
+
accessOrder = [];
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.maxParsers = options.maxParsers ?? 6;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SMI-1333: Update access order for LRU tracking
|
|
39
|
+
* Moves the accessed language to the end (most recently used)
|
|
40
|
+
*/
|
|
41
|
+
updateAccessOrder(language) {
|
|
42
|
+
const index = this.accessOrder.indexOf(language);
|
|
43
|
+
if (index > -1) {
|
|
44
|
+
this.accessOrder.splice(index, 1);
|
|
45
|
+
}
|
|
46
|
+
this.accessOrder.push(language);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize web-tree-sitter (must be called before first use)
|
|
50
|
+
*
|
|
51
|
+
* This initializes the WASM runtime. Called automatically by getParser().
|
|
52
|
+
*/
|
|
53
|
+
async initialize() {
|
|
54
|
+
if (this.initialized)
|
|
55
|
+
return;
|
|
56
|
+
if (this.initPromise) {
|
|
57
|
+
await this.initPromise;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.initPromise = this.doInitialize();
|
|
61
|
+
await this.initPromise;
|
|
62
|
+
}
|
|
63
|
+
async doInitialize() {
|
|
64
|
+
try {
|
|
65
|
+
// Dynamic import for web-tree-sitter (WASM-based)
|
|
66
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
67
|
+
const TreeSitter = await import('web-tree-sitter');
|
|
68
|
+
await TreeSitter.default.init();
|
|
69
|
+
this.ParserClass = TreeSitter.default;
|
|
70
|
+
this.initialized = true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Fallback: try native tree-sitter if WASM unavailable
|
|
74
|
+
try {
|
|
75
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
76
|
+
const TreeSitterNative = await import('tree-sitter');
|
|
77
|
+
this.ParserClass = TreeSitterNative.default;
|
|
78
|
+
this.initialized = true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new Error('tree-sitter is not available. Install web-tree-sitter or tree-sitter to enable multi-language analysis.');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get parser for a language, loading if necessary
|
|
87
|
+
*
|
|
88
|
+
* Parsers are cached for reuse. If the maximum number of
|
|
89
|
+
* parsers is reached, the least recently used is evicted.
|
|
90
|
+
*
|
|
91
|
+
* @param language - Language to get parser for
|
|
92
|
+
* @returns Configured parser instance
|
|
93
|
+
* @throws Error if language is not supported or tree-sitter unavailable
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const parser = await manager.getParser('python')
|
|
98
|
+
* const tree = parser.parse(pythonCode)
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
async getParser(language) {
|
|
102
|
+
// Ensure initialized
|
|
103
|
+
await this.initialize();
|
|
104
|
+
// Return cached parser
|
|
105
|
+
const cached = this.parsers.get(language);
|
|
106
|
+
if (cached) {
|
|
107
|
+
// SMI-1333: Update access order on cache hit
|
|
108
|
+
this.updateAccessOrder(language);
|
|
109
|
+
return cached;
|
|
110
|
+
}
|
|
111
|
+
// Return in-progress load
|
|
112
|
+
const loading = this.loading.get(language);
|
|
113
|
+
if (loading) {
|
|
114
|
+
return loading;
|
|
115
|
+
}
|
|
116
|
+
// Start new load
|
|
117
|
+
const loadPromise = this.loadParser(language);
|
|
118
|
+
this.loading.set(language, loadPromise);
|
|
119
|
+
try {
|
|
120
|
+
const parser = await loadPromise;
|
|
121
|
+
// SMI-1333: Evict LRU (first in accessOrder) if at capacity
|
|
122
|
+
if (this.parsers.size >= this.maxParsers) {
|
|
123
|
+
const lru = this.accessOrder.shift();
|
|
124
|
+
if (lru) {
|
|
125
|
+
const oldParser = this.parsers.get(lru);
|
|
126
|
+
oldParser?.delete();
|
|
127
|
+
this.parsers.delete(lru);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.parsers.set(language, parser);
|
|
131
|
+
// SMI-1333: Track new parser in access order
|
|
132
|
+
this.updateAccessOrder(language);
|
|
133
|
+
return parser;
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
this.loading.delete(language);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Load a parser for a specific language
|
|
141
|
+
*/
|
|
142
|
+
async loadParser(language) {
|
|
143
|
+
if (!this.ParserClass) {
|
|
144
|
+
throw new Error('TreeSitterManager not initialized. Call initialize() first.');
|
|
145
|
+
}
|
|
146
|
+
const parser = new this.ParserClass();
|
|
147
|
+
const languageModule = await this.loadLanguageModule(language);
|
|
148
|
+
parser.setLanguage(languageModule);
|
|
149
|
+
return parser;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Load the language module for tree-sitter
|
|
153
|
+
*/
|
|
154
|
+
async loadLanguageModule(language) {
|
|
155
|
+
try {
|
|
156
|
+
switch (language) {
|
|
157
|
+
case 'typescript':
|
|
158
|
+
case 'javascript': {
|
|
159
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
160
|
+
const mod = await import('tree-sitter-typescript');
|
|
161
|
+
// tree-sitter-typescript exports { typescript, tsx }
|
|
162
|
+
return mod.typescript;
|
|
163
|
+
}
|
|
164
|
+
case 'python': {
|
|
165
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
166
|
+
const mod = await import('tree-sitter-python');
|
|
167
|
+
return mod.default;
|
|
168
|
+
}
|
|
169
|
+
case 'go': {
|
|
170
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
171
|
+
const mod = await import('tree-sitter-go');
|
|
172
|
+
return mod.default;
|
|
173
|
+
}
|
|
174
|
+
case 'rust': {
|
|
175
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
176
|
+
const mod = await import('tree-sitter-rust');
|
|
177
|
+
return mod.default;
|
|
178
|
+
}
|
|
179
|
+
case 'java': {
|
|
180
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
181
|
+
const mod = await import('tree-sitter-java');
|
|
182
|
+
return mod.default;
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const err = error;
|
|
190
|
+
throw new Error(`Failed to load tree-sitter language module for ${language}: ${err.message}. ` +
|
|
191
|
+
`Make sure tree-sitter-${language} is installed.`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if a language is available
|
|
196
|
+
*
|
|
197
|
+
* @param language - Language to check
|
|
198
|
+
* @returns True if the language can be loaded
|
|
199
|
+
*/
|
|
200
|
+
async isLanguageAvailable(language) {
|
|
201
|
+
try {
|
|
202
|
+
await this.loadLanguageModule(language);
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get list of currently loaded languages
|
|
211
|
+
*/
|
|
212
|
+
getLoadedLanguages() {
|
|
213
|
+
return Array.from(this.parsers.keys());
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Clean up all parser resources
|
|
217
|
+
*
|
|
218
|
+
* Call this when the manager is no longer needed
|
|
219
|
+
* to free memory and WASM resources.
|
|
220
|
+
*/
|
|
221
|
+
dispose() {
|
|
222
|
+
for (const parser of this.parsers.values()) {
|
|
223
|
+
try {
|
|
224
|
+
parser.delete();
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Ignore errors during cleanup
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
this.parsers.clear();
|
|
231
|
+
this.loading.clear();
|
|
232
|
+
// SMI-1333: Clear access order
|
|
233
|
+
this.accessOrder = [];
|
|
234
|
+
this.initialized = false;
|
|
235
|
+
this.initPromise = null;
|
|
236
|
+
this.ParserClass = null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-600: Codebase Analysis Types
|
|
3
3
|
* SMI-1189: Extracted from CodebaseAnalyzer.ts
|
|
4
|
+
* SMI-1303: Extended with multi-language support
|
|
4
5
|
*
|
|
5
|
-
* Type definitions for codebase analysis
|
|
6
|
+
* Type definitions for multi-language codebase analysis.
|
|
6
7
|
*
|
|
7
8
|
* @see ADR-010: Codebase Analysis Scope
|
|
9
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
10
|
+
* @module analysis/types
|
|
8
11
|
*/
|
|
9
12
|
/**
|
|
10
|
-
* Supported
|
|
13
|
+
* Supported languages for multi-language analysis
|
|
14
|
+
*/
|
|
15
|
+
export type SupportedLanguage = 'typescript' | 'javascript' | 'python' | 'go' | 'rust' | 'java';
|
|
16
|
+
/**
|
|
17
|
+
* Supported file extensions for analysis (legacy, for backwards compatibility)
|
|
11
18
|
*/
|
|
12
19
|
export declare const SUPPORTED_EXTENSIONS: string[];
|
|
20
|
+
/**
|
|
21
|
+
* Multi-language file extensions mapping
|
|
22
|
+
*/
|
|
23
|
+
export declare const LANGUAGE_EXTENSIONS: Record<SupportedLanguage, string[]>;
|
|
13
24
|
/**
|
|
14
25
|
* Default directories to exclude from analysis
|
|
15
26
|
*/
|
|
16
27
|
export declare const DEFAULT_EXCLUDE_DIRS: string[];
|
|
28
|
+
/**
|
|
29
|
+
* Export kind enumeration (extended for multi-language)
|
|
30
|
+
*/
|
|
31
|
+
export type ExportKind = 'function' | 'class' | 'variable' | 'type' | 'interface' | 'enum' | 'struct' | 'trait' | 'module' | 'unknown';
|
|
17
32
|
/**
|
|
18
33
|
* Import information extracted from source files
|
|
19
34
|
*/
|
|
20
35
|
export interface ImportInfo {
|
|
21
|
-
/** Module specifier (e.g., 'react', './utils') */
|
|
36
|
+
/** Module specifier (e.g., 'react', './utils', 'os') */
|
|
22
37
|
module: string;
|
|
23
38
|
/** Named imports (e.g., ['useState', 'useEffect']) */
|
|
24
39
|
namedImports: string[];
|
|
@@ -30,6 +45,10 @@ export interface ImportInfo {
|
|
|
30
45
|
isTypeOnly: boolean;
|
|
31
46
|
/** Source file where import was found */
|
|
32
47
|
sourceFile: string;
|
|
48
|
+
/** Source language */
|
|
49
|
+
language?: SupportedLanguage;
|
|
50
|
+
/** Line number */
|
|
51
|
+
line?: number;
|
|
33
52
|
}
|
|
34
53
|
/**
|
|
35
54
|
* Export information extracted from source files
|
|
@@ -37,12 +56,18 @@ export interface ImportInfo {
|
|
|
37
56
|
export interface ExportInfo {
|
|
38
57
|
/** Exported name */
|
|
39
58
|
name: string;
|
|
40
|
-
/** Kind of export (function, class, variable, type, interface) */
|
|
41
|
-
kind:
|
|
59
|
+
/** Kind of export (function, class, variable, type, interface, etc.) */
|
|
60
|
+
kind: ExportKind;
|
|
42
61
|
/** Whether this is a default export */
|
|
43
62
|
isDefault: boolean;
|
|
44
63
|
/** Source file where export was found */
|
|
45
64
|
sourceFile: string;
|
|
65
|
+
/** Source language */
|
|
66
|
+
language?: SupportedLanguage;
|
|
67
|
+
/** Visibility (for Go, Rust, Java) */
|
|
68
|
+
visibility?: 'public' | 'private' | 'protected' | 'internal';
|
|
69
|
+
/** Line number */
|
|
70
|
+
line?: number;
|
|
46
71
|
}
|
|
47
72
|
/**
|
|
48
73
|
* Function information extracted from source files
|
|
@@ -60,6 +85,14 @@ export interface FunctionInfo {
|
|
|
60
85
|
sourceFile: string;
|
|
61
86
|
/** Line number */
|
|
62
87
|
line: number;
|
|
88
|
+
/** Source language */
|
|
89
|
+
language?: SupportedLanguage;
|
|
90
|
+
/** Method receiver (Go) */
|
|
91
|
+
receiver?: string;
|
|
92
|
+
/** Decorators (Python, Java) */
|
|
93
|
+
decorators?: string[];
|
|
94
|
+
/** Attributes (Rust) */
|
|
95
|
+
attributes?: string[];
|
|
63
96
|
}
|
|
64
97
|
/**
|
|
65
98
|
* Detected framework information
|
|
@@ -97,7 +130,7 @@ export interface CodebaseContext {
|
|
|
97
130
|
functions: FunctionInfo[];
|
|
98
131
|
/** Detected frameworks */
|
|
99
132
|
frameworks: FrameworkInfo[];
|
|
100
|
-
/** Dependencies from package
|
|
133
|
+
/** Dependencies from all package managers */
|
|
101
134
|
dependencies: DependencyInfo[];
|
|
102
135
|
/** File statistics */
|
|
103
136
|
stats: {
|
|
@@ -105,6 +138,8 @@ export interface CodebaseContext {
|
|
|
105
138
|
totalFiles: number;
|
|
106
139
|
/** Files by extension */
|
|
107
140
|
filesByExtension: Record<string, number>;
|
|
141
|
+
/** Files by language (optional for backward compatibility) */
|
|
142
|
+
filesByLanguage?: Record<SupportedLanguage, number>;
|
|
108
143
|
/** Total lines of code (approximate) */
|
|
109
144
|
totalLines: number;
|
|
110
145
|
};
|
|
@@ -114,6 +149,10 @@ export interface CodebaseContext {
|
|
|
114
149
|
durationMs: number;
|
|
115
150
|
/** Analyzer version */
|
|
116
151
|
version: string;
|
|
152
|
+
/** Languages detected (optional for backward compatibility) */
|
|
153
|
+
languages?: SupportedLanguage[];
|
|
154
|
+
/** Cache hit rate (0-1, optional for backward compatibility) */
|
|
155
|
+
cacheHitRate?: number;
|
|
117
156
|
};
|
|
118
157
|
}
|
|
119
158
|
/**
|
|
@@ -135,4 +174,28 @@ export interface ParseResult {
|
|
|
135
174
|
exports: ExportInfo[];
|
|
136
175
|
functions: FunctionInfo[];
|
|
137
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Framework detection rule
|
|
179
|
+
*/
|
|
180
|
+
export interface FrameworkRule {
|
|
181
|
+
/** Framework name */
|
|
182
|
+
name: string;
|
|
183
|
+
/** Dependency indicators (package names) */
|
|
184
|
+
depIndicators: string[];
|
|
185
|
+
/** Import indicators (module specifiers) */
|
|
186
|
+
importIndicators: string[];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Cache statistics
|
|
190
|
+
*/
|
|
191
|
+
export interface CacheStats {
|
|
192
|
+
/** Current size in bytes */
|
|
193
|
+
size: number;
|
|
194
|
+
/** Number of entries */
|
|
195
|
+
entries: number;
|
|
196
|
+
/** Maximum size in bytes */
|
|
197
|
+
maxSize: number;
|
|
198
|
+
/** Cache hit rate (0-1) */
|
|
199
|
+
hitRate: number;
|
|
200
|
+
}
|
|
138
201
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analysis/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analysis/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-600: Codebase Analysis Types
|
|
3
3
|
* SMI-1189: Extracted from CodebaseAnalyzer.ts
|
|
4
|
+
* SMI-1303: Extended with multi-language support
|
|
4
5
|
*
|
|
5
|
-
* Type definitions for codebase analysis
|
|
6
|
+
* Type definitions for multi-language codebase analysis.
|
|
6
7
|
*
|
|
7
8
|
* @see ADR-010: Codebase Analysis Scope
|
|
9
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
10
|
+
* @module analysis/types
|
|
8
11
|
*/
|
|
9
12
|
/**
|
|
10
|
-
* Supported file extensions for analysis
|
|
13
|
+
* Supported file extensions for analysis (legacy, for backwards compatibility)
|
|
11
14
|
*/
|
|
12
15
|
export const SUPPORTED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
|
|
16
|
+
/**
|
|
17
|
+
* Multi-language file extensions mapping
|
|
18
|
+
*/
|
|
19
|
+
export const LANGUAGE_EXTENSIONS = {
|
|
20
|
+
typescript: ['.ts', '.tsx', '.mts', '.cts'],
|
|
21
|
+
javascript: ['.js', '.jsx', '.mjs', '.cjs'],
|
|
22
|
+
python: ['.py', '.pyi', '.pyw'],
|
|
23
|
+
go: ['.go'],
|
|
24
|
+
rust: ['.rs'],
|
|
25
|
+
java: ['.java'],
|
|
26
|
+
};
|
|
13
27
|
/**
|
|
14
28
|
* Default directories to exclude from analysis
|
|
15
29
|
*/
|
|
@@ -21,5 +35,12 @@ export const DEFAULT_EXCLUDE_DIRS = [
|
|
|
21
35
|
'coverage',
|
|
22
36
|
'.next',
|
|
23
37
|
'.nuxt',
|
|
38
|
+
'__pycache__',
|
|
39
|
+
'.pytest_cache',
|
|
40
|
+
'target',
|
|
41
|
+
'vendor',
|
|
42
|
+
'venv',
|
|
43
|
+
'.venv',
|
|
44
|
+
'env',
|
|
24
45
|
];
|
|
25
46
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analysis/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analysis/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAElF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwC;IACtE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,KAAK,CAAC;IACX,IAAI,EAAE,CAAC,KAAK,CAAC;IACb,IAAI,EAAE,CAAC,OAAO,CAAC;CAChB,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,OAAO;IACP,OAAO;IACP,aAAa;IACb,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACN,CAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1308: Worker Thread Pool for Parallel File Parsing
|
|
3
|
+
* SMI-1337: Added metrics integration
|
|
4
|
+
*
|
|
5
|
+
* Uses Node.js worker_threads for true parallelism,
|
|
6
|
+
* bypassing the single-threaded event loop limitation.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
|
+
* @module analysis/worker-pool
|
|
10
|
+
*/
|
|
11
|
+
import { isMainThread, parentPort, workerData } from 'worker_threads';
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
import type { ParseResult } from './types.js';
|
|
14
|
+
import { type AnalysisMetrics } from './metrics.js';
|
|
15
|
+
/**
|
|
16
|
+
* Task to be parsed by a worker
|
|
17
|
+
*/
|
|
18
|
+
export interface ParseTask {
|
|
19
|
+
/** Path to the file */
|
|
20
|
+
filePath: string;
|
|
21
|
+
/** File content to parse */
|
|
22
|
+
content: string;
|
|
23
|
+
/** Programming language */
|
|
24
|
+
language: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result from a worker parse operation
|
|
28
|
+
*/
|
|
29
|
+
export interface WorkerResult {
|
|
30
|
+
/** Path to the file */
|
|
31
|
+
filePath: string;
|
|
32
|
+
/** Parse result */
|
|
33
|
+
result: ParseResult;
|
|
34
|
+
/** Time taken to parse in milliseconds */
|
|
35
|
+
durationMs: number;
|
|
36
|
+
/** Error message if parsing failed */
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Options for ParserWorkerPool
|
|
41
|
+
*/
|
|
42
|
+
export interface WorkerPoolOptions {
|
|
43
|
+
/** Number of workers in pool (default: CPU cores - 1) */
|
|
44
|
+
poolSize?: number;
|
|
45
|
+
/** Minimum batch size to use workers (default: 10) */
|
|
46
|
+
minBatchForWorkers?: number;
|
|
47
|
+
/** Custom metrics instance (uses default if not provided) */
|
|
48
|
+
metrics?: AnalysisMetrics;
|
|
49
|
+
}
|
|
50
|
+
export declare class ParserWorkerPool extends EventEmitter {
|
|
51
|
+
private workers;
|
|
52
|
+
private taskQueue;
|
|
53
|
+
private activeWorkers;
|
|
54
|
+
private readonly poolSize;
|
|
55
|
+
private readonly minBatchForWorkers;
|
|
56
|
+
private readonly metrics;
|
|
57
|
+
private disposed;
|
|
58
|
+
private router;
|
|
59
|
+
private routerPromise;
|
|
60
|
+
constructor(options?: WorkerPoolOptions);
|
|
61
|
+
/**
|
|
62
|
+
* SMI-1330/1331: Get or create shared router instance
|
|
63
|
+
* Lazily initializes the router on first use and caches it
|
|
64
|
+
*/
|
|
65
|
+
private getRouter;
|
|
66
|
+
/**
|
|
67
|
+
* SMI-1330/1331: Initialize router with all adapters
|
|
68
|
+
*/
|
|
69
|
+
private initializeRouter;
|
|
70
|
+
/**
|
|
71
|
+
* Parse files in parallel using worker threads
|
|
72
|
+
*
|
|
73
|
+
* SMI-1337: Records worker pool metrics.
|
|
74
|
+
*
|
|
75
|
+
* @param tasks - Array of parse tasks
|
|
76
|
+
* @returns Array of worker results
|
|
77
|
+
* @throws Error if pool has been disposed
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const results = await pool.parseFiles([
|
|
82
|
+
* { filePath: 'a.ts', content: 'export const a = 1', language: 'typescript' },
|
|
83
|
+
* { filePath: 'b.ts', content: 'export const b = 2', language: 'typescript' },
|
|
84
|
+
* ])
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
parseFiles(tasks: ParseTask[]): Promise<WorkerResult[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Record parse metrics for completed results
|
|
90
|
+
* SMI-1337: Helper to record metrics after parsing
|
|
91
|
+
*/
|
|
92
|
+
private recordParseMetrics;
|
|
93
|
+
/**
|
|
94
|
+
* Get language from file extension
|
|
95
|
+
* SMI-1337: Helper for metrics
|
|
96
|
+
*/
|
|
97
|
+
private getLanguageFromExtension;
|
|
98
|
+
/**
|
|
99
|
+
* Parse files inline (no workers)
|
|
100
|
+
*
|
|
101
|
+
* Used for small batches where worker overhead exceeds benefit.
|
|
102
|
+
* SMI-1330/1331: Uses cached router to avoid recreation overhead
|
|
103
|
+
*/
|
|
104
|
+
private parseInline;
|
|
105
|
+
/**
|
|
106
|
+
* Parse files using worker threads
|
|
107
|
+
*
|
|
108
|
+
* Chunks tasks across available workers for parallel processing.
|
|
109
|
+
*/
|
|
110
|
+
private parseWithWorkers;
|
|
111
|
+
/**
|
|
112
|
+
* Dispatch a chunk of tasks to a worker
|
|
113
|
+
*/
|
|
114
|
+
private dispatchToWorker;
|
|
115
|
+
/**
|
|
116
|
+
* Chunk an array into smaller arrays
|
|
117
|
+
*/
|
|
118
|
+
private chunkArray;
|
|
119
|
+
/**
|
|
120
|
+
* Get pool statistics
|
|
121
|
+
*
|
|
122
|
+
* SMI-1337: Also updates metrics.
|
|
123
|
+
*
|
|
124
|
+
* @returns Current pool statistics
|
|
125
|
+
*/
|
|
126
|
+
getStats(): {
|
|
127
|
+
poolSize: number;
|
|
128
|
+
activeWorkers: number;
|
|
129
|
+
queuedTasks: number;
|
|
130
|
+
utilization: number;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Dispose of worker pool
|
|
134
|
+
*
|
|
135
|
+
* Terminates all workers and clears the task queue.
|
|
136
|
+
* SMI-1330/1331: Also disposes cached router
|
|
137
|
+
*/
|
|
138
|
+
dispose(): void;
|
|
139
|
+
}
|
|
140
|
+
export { isMainThread, parentPort, workerData };
|
|
141
|
+
//# sourceMappingURL=worker-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../src/analysis/worker-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAU,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE7E,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAEvE;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB;IACnB,MAAM,EAAE,WAAW,CAAA;IACnB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,eAAe,CAAA;CAC1B;AA8BD,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAIV;IACP,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,aAAa,CAA2C;gBAEpD,OAAO,GAAE,iBAAsB;IAO3C;;;OAGG;YACW,SAAS;IASvB;;OAEG;YACW,gBAAgB;IAkB9B;;;;;;;;;;;;;;;;OAgBG;IACG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwB7D;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;;;;OAKG;YACW,WAAW;IAsCzB;;;;OAIG;YACW,gBAAgB;IAU9B;;OAEG;YACW,gBAAgB;IAyK9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;;;OAMG;IACH,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAA;QAChB,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;KACpB;IAcD;;;;;OAKG;IACH,OAAO,IAAI,IAAI;CAchB;AAGD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAA"}
|