@liendev/core 0.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +336 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +46 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/merge.d.ts +20 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +71 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/migration-manager.d.ts +46 -0
- package/dist/config/migration-manager.d.ts.map +1 -0
- package/dist/config/migration-manager.js +119 -0
- package/dist/config/migration-manager.js.map +1 -0
- package/dist/config/migration.d.ts +20 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +155 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/schema.d.ts +101 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +58 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/service.d.ts +122 -0
- package/dist/config/service.d.ts.map +1 -0
- package/dist/config/service.js +477 -0
- package/dist/config/service.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/embeddings/cache.d.ts +45 -0
- package/dist/embeddings/cache.d.ts.map +1 -0
- package/dist/embeddings/cache.js +109 -0
- package/dist/embeddings/cache.js.map +1 -0
- package/dist/embeddings/local.d.ts +10 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +63 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/types.d.ts +9 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +5 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/errors/codes.d.ts +18 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +25 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/index.d.ts +85 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +134 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/frameworks/detector-service.d.ts +59 -0
- package/dist/frameworks/detector-service.d.ts.map +1 -0
- package/dist/frameworks/detector-service.js +219 -0
- package/dist/frameworks/detector-service.js.map +1 -0
- package/dist/frameworks/laravel/config.d.ts +6 -0
- package/dist/frameworks/laravel/config.d.ts.map +1 -0
- package/dist/frameworks/laravel/config.js +68 -0
- package/dist/frameworks/laravel/config.js.map +1 -0
- package/dist/frameworks/laravel/detector.d.ts +6 -0
- package/dist/frameworks/laravel/detector.d.ts.map +1 -0
- package/dist/frameworks/laravel/detector.js +96 -0
- package/dist/frameworks/laravel/detector.js.map +1 -0
- package/dist/frameworks/nodejs/config.d.ts +6 -0
- package/dist/frameworks/nodejs/config.d.ts.map +1 -0
- package/dist/frameworks/nodejs/config.js +57 -0
- package/dist/frameworks/nodejs/config.js.map +1 -0
- package/dist/frameworks/nodejs/detector.d.ts +6 -0
- package/dist/frameworks/nodejs/detector.d.ts.map +1 -0
- package/dist/frameworks/nodejs/detector.js +77 -0
- package/dist/frameworks/nodejs/detector.js.map +1 -0
- package/dist/frameworks/php/config.d.ts +6 -0
- package/dist/frameworks/php/config.d.ts.map +1 -0
- package/dist/frameworks/php/config.js +53 -0
- package/dist/frameworks/php/config.js.map +1 -0
- package/dist/frameworks/php/detector.d.ts +7 -0
- package/dist/frameworks/php/detector.d.ts.map +1 -0
- package/dist/frameworks/php/detector.js +101 -0
- package/dist/frameworks/php/detector.js.map +1 -0
- package/dist/frameworks/registry.d.ts +20 -0
- package/dist/frameworks/registry.d.ts.map +1 -0
- package/dist/frameworks/registry.js +38 -0
- package/dist/frameworks/registry.js.map +1 -0
- package/dist/frameworks/shopify/config.d.ts +6 -0
- package/dist/frameworks/shopify/config.d.ts.map +1 -0
- package/dist/frameworks/shopify/config.js +50 -0
- package/dist/frameworks/shopify/config.js.map +1 -0
- package/dist/frameworks/shopify/detector.d.ts +6 -0
- package/dist/frameworks/shopify/detector.d.ts.map +1 -0
- package/dist/frameworks/shopify/detector.js +103 -0
- package/dist/frameworks/shopify/detector.js.map +1 -0
- package/dist/frameworks/types.d.ts +51 -0
- package/dist/frameworks/types.d.ts.map +1 -0
- package/dist/frameworks/types.js +21 -0
- package/dist/frameworks/types.js.map +1 -0
- package/dist/git/tracker.d.ts +56 -0
- package/dist/git/tracker.d.ts.map +1 -0
- package/dist/git/tracker.js +189 -0
- package/dist/git/tracker.js.map +1 -0
- package/dist/git/utils.d.ts +60 -0
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/git/utils.js +152 -0
- package/dist/git/utils.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/ast/chunker.d.ts +28 -0
- package/dist/indexer/ast/chunker.d.ts.map +1 -0
- package/dist/indexer/ast/chunker.js +268 -0
- package/dist/indexer/ast/chunker.js.map +1 -0
- package/dist/indexer/ast/complexity/cognitive.d.ts +16 -0
- package/dist/indexer/ast/complexity/cognitive.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/cognitive.js +106 -0
- package/dist/indexer/ast/complexity/cognitive.js.map +1 -0
- package/dist/indexer/ast/complexity/cyclomatic.d.ts +12 -0
- package/dist/indexer/ast/complexity/cyclomatic.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/cyclomatic.js +61 -0
- package/dist/indexer/ast/complexity/cyclomatic.js.map +1 -0
- package/dist/indexer/ast/complexity/halstead.d.ts +55 -0
- package/dist/indexer/ast/complexity/halstead.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/halstead.js +290 -0
- package/dist/indexer/ast/complexity/halstead.js.map +1 -0
- package/dist/indexer/ast/complexity/index.d.ts +13 -0
- package/dist/indexer/ast/complexity/index.d.ts.map +1 -0
- package/dist/indexer/ast/complexity/index.js +12 -0
- package/dist/indexer/ast/complexity/index.js.map +1 -0
- package/dist/indexer/ast/parser.d.ts +27 -0
- package/dist/indexer/ast/parser.d.ts.map +1 -0
- package/dist/indexer/ast/parser.js +103 -0
- package/dist/indexer/ast/parser.js.map +1 -0
- package/dist/indexer/ast/symbols.d.ts +17 -0
- package/dist/indexer/ast/symbols.d.ts.map +1 -0
- package/dist/indexer/ast/symbols.js +265 -0
- package/dist/indexer/ast/symbols.js.map +1 -0
- package/dist/indexer/ast/traversers/index.d.ts +19 -0
- package/dist/indexer/ast/traversers/index.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/index.js +42 -0
- package/dist/indexer/ast/traversers/index.js.map +1 -0
- package/dist/indexer/ast/traversers/php.d.ts +21 -0
- package/dist/indexer/ast/traversers/php.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/php.js +67 -0
- package/dist/indexer/ast/traversers/php.js.map +1 -0
- package/dist/indexer/ast/traversers/python.d.ts +28 -0
- package/dist/indexer/ast/traversers/python.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/python.js +67 -0
- package/dist/indexer/ast/traversers/python.js.map +1 -0
- package/dist/indexer/ast/traversers/types.d.ts +98 -0
- package/dist/indexer/ast/traversers/types.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/types.js +2 -0
- package/dist/indexer/ast/traversers/types.js.map +1 -0
- package/dist/indexer/ast/traversers/typescript.d.ts +29 -0
- package/dist/indexer/ast/traversers/typescript.d.ts.map +1 -0
- package/dist/indexer/ast/traversers/typescript.js +88 -0
- package/dist/indexer/ast/traversers/typescript.js.map +1 -0
- package/dist/indexer/ast/types.d.ts +59 -0
- package/dist/indexer/ast/types.d.ts.map +1 -0
- package/dist/indexer/ast/types.js +2 -0
- package/dist/indexer/ast/types.js.map +1 -0
- package/dist/indexer/change-detector.d.ts +17 -0
- package/dist/indexer/change-detector.d.ts.map +1 -0
- package/dist/indexer/change-detector.js +207 -0
- package/dist/indexer/change-detector.js.map +1 -0
- package/dist/indexer/chunk-batch-processor.d.ts +103 -0
- package/dist/indexer/chunk-batch-processor.d.ts.map +1 -0
- package/dist/indexer/chunk-batch-processor.js +179 -0
- package/dist/indexer/chunk-batch-processor.js.map +1 -0
- package/dist/indexer/chunker.d.ts +10 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +96 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/dependency-analyzer.d.ts +60 -0
- package/dist/indexer/dependency-analyzer.d.ts.map +1 -0
- package/dist/indexer/dependency-analyzer.js +261 -0
- package/dist/indexer/dependency-analyzer.js.map +1 -0
- package/dist/indexer/incremental.d.ts +47 -0
- package/dist/indexer/incremental.d.ts.map +1 -0
- package/dist/indexer/incremental.js +284 -0
- package/dist/indexer/incremental.js.map +1 -0
- package/dist/indexer/index.d.ts +80 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +364 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/json-template-chunker.d.ts +9 -0
- package/dist/indexer/json-template-chunker.d.ts.map +1 -0
- package/dist/indexer/json-template-chunker.js +83 -0
- package/dist/indexer/json-template-chunker.js.map +1 -0
- package/dist/indexer/liquid-chunker.d.ts +13 -0
- package/dist/indexer/liquid-chunker.d.ts.map +1 -0
- package/dist/indexer/liquid-chunker.js +272 -0
- package/dist/indexer/liquid-chunker.js.map +1 -0
- package/dist/indexer/manifest.d.ts +122 -0
- package/dist/indexer/manifest.d.ts.map +1 -0
- package/dist/indexer/manifest.js +262 -0
- package/dist/indexer/manifest.js.map +1 -0
- package/dist/indexer/progress-tracker.d.ts +35 -0
- package/dist/indexer/progress-tracker.d.ts.map +1 -0
- package/dist/indexer/progress-tracker.js +33 -0
- package/dist/indexer/progress-tracker.js.map +1 -0
- package/dist/indexer/scanner.d.ts +16 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +159 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/symbol-extractor.d.ts +18 -0
- package/dist/indexer/symbol-extractor.d.ts.map +1 -0
- package/dist/indexer/symbol-extractor.js +351 -0
- package/dist/indexer/symbol-extractor.js.map +1 -0
- package/dist/indexer/types.d.ts +34 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +2 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/insights/complexity-analyzer.d.ts +82 -0
- package/dist/insights/complexity-analyzer.d.ts.map +1 -0
- package/dist/insights/complexity-analyzer.js +356 -0
- package/dist/insights/complexity-analyzer.js.map +1 -0
- package/dist/insights/formatters/index.d.ts +11 -0
- package/dist/insights/formatters/index.d.ts.map +1 -0
- package/dist/insights/formatters/index.js +20 -0
- package/dist/insights/formatters/index.js.map +1 -0
- package/dist/insights/formatters/json.d.ts +7 -0
- package/dist/insights/formatters/json.d.ts.map +1 -0
- package/dist/insights/formatters/json.js +14 -0
- package/dist/insights/formatters/json.js.map +1 -0
- package/dist/insights/formatters/sarif.d.ts +6 -0
- package/dist/insights/formatters/sarif.d.ts.map +1 -0
- package/dist/insights/formatters/sarif.js +113 -0
- package/dist/insights/formatters/sarif.js.map +1 -0
- package/dist/insights/formatters/text.d.ts +6 -0
- package/dist/insights/formatters/text.d.ts.map +1 -0
- package/dist/insights/formatters/text.js +154 -0
- package/dist/insights/formatters/text.js.map +1 -0
- package/dist/insights/types.d.ts +73 -0
- package/dist/insights/types.d.ts.map +1 -0
- package/dist/insights/types.js +9 -0
- package/dist/insights/types.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/path-matching.d.ts +69 -0
- package/dist/utils/path-matching.d.ts.map +1 -0
- package/dist/utils/path-matching.js +123 -0
- package/dist/utils/path-matching.js.map +1 -0
- package/dist/utils/result.d.ts +65 -0
- package/dist/utils/result.d.ts.map +1 -0
- package/dist/utils/result.js +67 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/version.d.ts +22 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +28 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/vectordb/batch-insert.d.ts +14 -0
- package/dist/vectordb/batch-insert.d.ts.map +1 -0
- package/dist/vectordb/batch-insert.js +185 -0
- package/dist/vectordb/batch-insert.js.map +1 -0
- package/dist/vectordb/boosting/composer.d.ts +51 -0
- package/dist/vectordb/boosting/composer.d.ts.map +1 -0
- package/dist/vectordb/boosting/composer.js +65 -0
- package/dist/vectordb/boosting/composer.js.map +1 -0
- package/dist/vectordb/boosting/index.d.ts +22 -0
- package/dist/vectordb/boosting/index.d.ts.map +1 -0
- package/dist/vectordb/boosting/index.js +22 -0
- package/dist/vectordb/boosting/index.js.map +1 -0
- package/dist/vectordb/boosting/strategies.d.ts +40 -0
- package/dist/vectordb/boosting/strategies.d.ts.map +1 -0
- package/dist/vectordb/boosting/strategies.js +174 -0
- package/dist/vectordb/boosting/strategies.js.map +1 -0
- package/dist/vectordb/boosting/types.d.ts +20 -0
- package/dist/vectordb/boosting/types.d.ts.map +1 -0
- package/dist/vectordb/boosting/types.js +2 -0
- package/dist/vectordb/boosting/types.js.map +1 -0
- package/dist/vectordb/intent-classifier.d.ts +99 -0
- package/dist/vectordb/intent-classifier.d.ts.map +1 -0
- package/dist/vectordb/intent-classifier.js +193 -0
- package/dist/vectordb/intent-classifier.js.map +1 -0
- package/dist/vectordb/lancedb.d.ts +45 -0
- package/dist/vectordb/lancedb.d.ts.map +1 -0
- package/dist/vectordb/lancedb.js +203 -0
- package/dist/vectordb/lancedb.js.map +1 -0
- package/dist/vectordb/maintenance.d.ts +18 -0
- package/dist/vectordb/maintenance.d.ts.map +1 -0
- package/dist/vectordb/maintenance.js +87 -0
- package/dist/vectordb/maintenance.js.map +1 -0
- package/dist/vectordb/query.d.ts +34 -0
- package/dist/vectordb/query.d.ts.map +1 -0
- package/dist/vectordb/query.js +303 -0
- package/dist/vectordb/query.js.map +1 -0
- package/dist/vectordb/relevance.d.ts +15 -0
- package/dist/vectordb/relevance.d.ts.map +1 -0
- package/dist/vectordb/relevance.js +19 -0
- package/dist/vectordb/relevance.js.map +1 -0
- package/dist/vectordb/types.d.ts +29 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +2 -0
- package/dist/vectordb/types.js.map +1 -0
- package/dist/vectordb/version.d.ts +16 -0
- package/dist/vectordb/version.d.ts.map +1 -0
- package/dist/vectordb/version.js +40 -0
- package/dist/vectordb/version.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { defaultConfig, isLegacyConfig, isModernConfig } from './schema.js';
|
|
4
|
+
import { deepMergeConfig } from './merge.js';
|
|
5
|
+
import { needsMigration as checkNeedsMigration, migrateConfig as performMigration } from './migration.js';
|
|
6
|
+
import { ConfigError, wrapError } from '../errors/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* ConfigService encapsulates all configuration operations including
|
|
9
|
+
* loading, saving, migration, and validation.
|
|
10
|
+
*
|
|
11
|
+
* This service provides a single point of truth for config management
|
|
12
|
+
* with comprehensive error handling and validation.
|
|
13
|
+
*/
|
|
14
|
+
export class ConfigService {
|
|
15
|
+
static CONFIG_FILENAME = '.lien.config.json';
|
|
16
|
+
/**
|
|
17
|
+
* Load configuration from the specified directory.
|
|
18
|
+
* Automatically handles migration if needed.
|
|
19
|
+
*
|
|
20
|
+
* @param rootDir - Root directory containing the config file
|
|
21
|
+
* @returns Loaded and validated configuration
|
|
22
|
+
* @throws {ConfigError} If config is invalid or cannot be loaded
|
|
23
|
+
*/
|
|
24
|
+
async load(rootDir = process.cwd()) {
|
|
25
|
+
const configPath = this.getConfigPath(rootDir);
|
|
26
|
+
try {
|
|
27
|
+
const configContent = await fs.readFile(configPath, 'utf-8');
|
|
28
|
+
const userConfig = JSON.parse(configContent);
|
|
29
|
+
// Check if migration is needed
|
|
30
|
+
if (this.needsMigration(userConfig)) {
|
|
31
|
+
console.log('🔄 Migrating config from v0.2.0 to v0.3.0...');
|
|
32
|
+
const result = await this.migrate(rootDir);
|
|
33
|
+
if (result.migrated && result.backupPath) {
|
|
34
|
+
const backupFilename = path.basename(result.backupPath);
|
|
35
|
+
console.log(`✅ Migration complete! Backup saved as ${backupFilename}`);
|
|
36
|
+
console.log('📝 Your config now uses the framework-based structure.');
|
|
37
|
+
}
|
|
38
|
+
return result.config;
|
|
39
|
+
}
|
|
40
|
+
// Merge with defaults first
|
|
41
|
+
const mergedConfig = deepMergeConfig(defaultConfig, userConfig);
|
|
42
|
+
// Then validate the merged config
|
|
43
|
+
const validation = this.validate(mergedConfig);
|
|
44
|
+
if (!validation.valid) {
|
|
45
|
+
throw new ConfigError(`Invalid configuration:\n${validation.errors.join('\n')}`, { errors: validation.errors, warnings: validation.warnings });
|
|
46
|
+
}
|
|
47
|
+
// Show warnings if any
|
|
48
|
+
if (validation.warnings.length > 0) {
|
|
49
|
+
console.warn('⚠️ Configuration warnings:');
|
|
50
|
+
validation.warnings.forEach(warning => console.warn(` ${warning}`));
|
|
51
|
+
}
|
|
52
|
+
return mergedConfig;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error.code === 'ENOENT') {
|
|
56
|
+
// Config doesn't exist, return defaults
|
|
57
|
+
return defaultConfig;
|
|
58
|
+
}
|
|
59
|
+
if (error instanceof ConfigError) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
if (error instanceof SyntaxError) {
|
|
63
|
+
throw new ConfigError('Failed to parse config file: Invalid JSON syntax', { path: configPath, originalError: error.message });
|
|
64
|
+
}
|
|
65
|
+
throw wrapError(error, 'Failed to load configuration', { path: configPath });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Save configuration to the specified directory.
|
|
70
|
+
* Validates the config before saving.
|
|
71
|
+
*
|
|
72
|
+
* @param rootDir - Root directory to save the config file
|
|
73
|
+
* @param config - Configuration to save
|
|
74
|
+
* @throws {ConfigError} If config is invalid or cannot be saved
|
|
75
|
+
*/
|
|
76
|
+
async save(rootDir, config) {
|
|
77
|
+
const configPath = this.getConfigPath(rootDir);
|
|
78
|
+
// Validate before saving
|
|
79
|
+
const validation = this.validate(config);
|
|
80
|
+
if (!validation.valid) {
|
|
81
|
+
throw new ConfigError(`Cannot save invalid configuration:\n${validation.errors.join('\n')}`, { errors: validation.errors });
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const configJson = JSON.stringify(config, null, 2) + '\n';
|
|
85
|
+
await fs.writeFile(configPath, configJson, 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw wrapError(error, 'Failed to save configuration', { path: configPath });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if a configuration file exists in the specified directory.
|
|
93
|
+
*
|
|
94
|
+
* @param rootDir - Root directory to check
|
|
95
|
+
* @returns True if config file exists
|
|
96
|
+
*/
|
|
97
|
+
async exists(rootDir = process.cwd()) {
|
|
98
|
+
const configPath = this.getConfigPath(rootDir);
|
|
99
|
+
try {
|
|
100
|
+
await fs.access(configPath);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Migrate configuration from v0.2.0 to v0.3.0 format.
|
|
109
|
+
* Creates a backup of the original config file.
|
|
110
|
+
*
|
|
111
|
+
* @param rootDir - Root directory containing the config file
|
|
112
|
+
* @returns Migration result with status and new config
|
|
113
|
+
* @throws {ConfigError} If migration fails
|
|
114
|
+
*/
|
|
115
|
+
async migrate(rootDir = process.cwd()) {
|
|
116
|
+
const configPath = this.getConfigPath(rootDir);
|
|
117
|
+
try {
|
|
118
|
+
// Read existing config
|
|
119
|
+
const configContent = await fs.readFile(configPath, 'utf-8');
|
|
120
|
+
const oldConfig = JSON.parse(configContent);
|
|
121
|
+
// Check if migration is needed
|
|
122
|
+
if (!this.needsMigration(oldConfig)) {
|
|
123
|
+
return {
|
|
124
|
+
migrated: false,
|
|
125
|
+
config: oldConfig,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Perform migration
|
|
129
|
+
const newConfig = performMigration(oldConfig);
|
|
130
|
+
// Validate migrated config
|
|
131
|
+
const validation = this.validate(newConfig);
|
|
132
|
+
if (!validation.valid) {
|
|
133
|
+
throw new ConfigError(`Migration produced invalid configuration:\n${validation.errors.join('\n')}`, { errors: validation.errors });
|
|
134
|
+
}
|
|
135
|
+
// Create backup
|
|
136
|
+
const backupPath = `${configPath}.v0.2.0.backup`;
|
|
137
|
+
await fs.copyFile(configPath, backupPath);
|
|
138
|
+
// Write migrated config
|
|
139
|
+
await this.save(rootDir, newConfig);
|
|
140
|
+
return {
|
|
141
|
+
migrated: true,
|
|
142
|
+
backupPath,
|
|
143
|
+
config: newConfig,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (error.code === 'ENOENT') {
|
|
148
|
+
return {
|
|
149
|
+
migrated: false,
|
|
150
|
+
config: defaultConfig,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (error instanceof ConfigError) {
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
throw wrapError(error, 'Configuration migration failed', { path: configPath });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if a config object needs migration from v0.2.0 to v0.3.0.
|
|
161
|
+
*
|
|
162
|
+
* @param config - Config object to check
|
|
163
|
+
* @returns True if migration is needed
|
|
164
|
+
*/
|
|
165
|
+
needsMigration(config) {
|
|
166
|
+
return checkNeedsMigration(config);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Validate a configuration object.
|
|
170
|
+
* Checks all constraints and returns detailed validation results.
|
|
171
|
+
*
|
|
172
|
+
* @param config - Configuration to validate
|
|
173
|
+
* @returns Validation result with errors and warnings
|
|
174
|
+
*/
|
|
175
|
+
validate(config) {
|
|
176
|
+
const errors = [];
|
|
177
|
+
const warnings = [];
|
|
178
|
+
// Type check
|
|
179
|
+
if (!config || typeof config !== 'object') {
|
|
180
|
+
return {
|
|
181
|
+
valid: false,
|
|
182
|
+
errors: ['Configuration must be an object'],
|
|
183
|
+
warnings: [],
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const cfg = config;
|
|
187
|
+
// Check for required top-level fields
|
|
188
|
+
if (!cfg.version) {
|
|
189
|
+
errors.push('Missing required field: version');
|
|
190
|
+
}
|
|
191
|
+
// Validate based on config type
|
|
192
|
+
if (isModernConfig(cfg)) {
|
|
193
|
+
this.validateModernConfig(cfg, errors, warnings);
|
|
194
|
+
}
|
|
195
|
+
else if (isLegacyConfig(cfg)) {
|
|
196
|
+
this.validateLegacyConfig(cfg, errors, warnings);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
errors.push('Configuration format not recognized. Must have either "frameworks" or "indexing" field');
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
valid: errors.length === 0,
|
|
203
|
+
errors,
|
|
204
|
+
warnings,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Validate a partial configuration object.
|
|
209
|
+
* Useful for validating user input before merging with defaults.
|
|
210
|
+
*
|
|
211
|
+
* @param config - Partial configuration to validate
|
|
212
|
+
* @returns Validation result with errors and warnings
|
|
213
|
+
*/
|
|
214
|
+
validatePartial(config) {
|
|
215
|
+
const errors = [];
|
|
216
|
+
const warnings = [];
|
|
217
|
+
// Validate core settings if present
|
|
218
|
+
if (config.core) {
|
|
219
|
+
this.validateCoreConfig(config.core, errors, warnings);
|
|
220
|
+
}
|
|
221
|
+
// Validate MCP settings if present
|
|
222
|
+
if (config.mcp) {
|
|
223
|
+
this.validateMCPConfig(config.mcp, errors, warnings);
|
|
224
|
+
}
|
|
225
|
+
// Validate git detection settings if present
|
|
226
|
+
if (config.gitDetection) {
|
|
227
|
+
this.validateGitDetectionConfig(config.gitDetection, errors, warnings);
|
|
228
|
+
}
|
|
229
|
+
// Validate file watching settings if present
|
|
230
|
+
if (config.fileWatching) {
|
|
231
|
+
this.validateFileWatchingConfig(config.fileWatching, errors, warnings);
|
|
232
|
+
}
|
|
233
|
+
// Validate frameworks if present
|
|
234
|
+
if (config.frameworks) {
|
|
235
|
+
this.validateFrameworks(config.frameworks, errors, warnings);
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
valid: errors.length === 0,
|
|
239
|
+
errors,
|
|
240
|
+
warnings,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get the full path to the config file
|
|
245
|
+
*/
|
|
246
|
+
getConfigPath(rootDir) {
|
|
247
|
+
return path.join(rootDir, ConfigService.CONFIG_FILENAME);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Validate modern (v0.3.0+) configuration
|
|
251
|
+
*/
|
|
252
|
+
validateModernConfig(config, errors, warnings) {
|
|
253
|
+
// Validate core settings
|
|
254
|
+
if (!config.core) {
|
|
255
|
+
errors.push('Missing required field: core');
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
this.validateCoreConfig(config.core, errors, warnings);
|
|
259
|
+
// Validate MCP settings
|
|
260
|
+
if (!config.mcp) {
|
|
261
|
+
errors.push('Missing required field: mcp');
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
this.validateMCPConfig(config.mcp, errors, warnings);
|
|
265
|
+
// Validate git detection settings
|
|
266
|
+
if (!config.gitDetection) {
|
|
267
|
+
errors.push('Missing required field: gitDetection');
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
this.validateGitDetectionConfig(config.gitDetection, errors, warnings);
|
|
271
|
+
// Validate file watching settings
|
|
272
|
+
if (!config.fileWatching) {
|
|
273
|
+
errors.push('Missing required field: fileWatching');
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
this.validateFileWatchingConfig(config.fileWatching, errors, warnings);
|
|
277
|
+
// Validate frameworks
|
|
278
|
+
if (!config.frameworks) {
|
|
279
|
+
errors.push('Missing required field: frameworks');
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
this.validateFrameworks(config.frameworks, errors, warnings);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Validate legacy (v0.2.0) configuration
|
|
286
|
+
*/
|
|
287
|
+
validateLegacyConfig(config, errors, warnings) {
|
|
288
|
+
warnings.push('Using legacy configuration format. Consider running "lien init" to migrate to v0.3.0');
|
|
289
|
+
// Validate indexing settings
|
|
290
|
+
if (!config.indexing) {
|
|
291
|
+
errors.push('Missing required field: indexing');
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const { indexing } = config;
|
|
295
|
+
if (typeof indexing.chunkSize !== 'number' || indexing.chunkSize <= 0) {
|
|
296
|
+
errors.push('indexing.chunkSize must be a positive number');
|
|
297
|
+
}
|
|
298
|
+
if (typeof indexing.chunkOverlap !== 'number' || indexing.chunkOverlap < 0) {
|
|
299
|
+
errors.push('indexing.chunkOverlap must be a non-negative number');
|
|
300
|
+
}
|
|
301
|
+
if (typeof indexing.concurrency !== 'number' || indexing.concurrency < 1 || indexing.concurrency > 16) {
|
|
302
|
+
errors.push('indexing.concurrency must be between 1 and 16');
|
|
303
|
+
}
|
|
304
|
+
if (typeof indexing.embeddingBatchSize !== 'number' || indexing.embeddingBatchSize <= 0) {
|
|
305
|
+
errors.push('indexing.embeddingBatchSize must be a positive number');
|
|
306
|
+
}
|
|
307
|
+
// Validate MCP settings (same for both)
|
|
308
|
+
if (config.mcp) {
|
|
309
|
+
this.validateMCPConfig(config.mcp, errors, warnings);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Validate core configuration settings
|
|
314
|
+
*/
|
|
315
|
+
validateCoreConfig(core, errors, warnings) {
|
|
316
|
+
if (core.chunkSize !== undefined) {
|
|
317
|
+
if (typeof core.chunkSize !== 'number' || core.chunkSize <= 0) {
|
|
318
|
+
errors.push('core.chunkSize must be a positive number');
|
|
319
|
+
}
|
|
320
|
+
else if (core.chunkSize < 50) {
|
|
321
|
+
warnings.push('core.chunkSize is very small (<50 lines). This may result in poor search quality');
|
|
322
|
+
}
|
|
323
|
+
else if (core.chunkSize > 500) {
|
|
324
|
+
warnings.push('core.chunkSize is very large (>500 lines). This may impact performance');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (core.chunkOverlap !== undefined) {
|
|
328
|
+
if (typeof core.chunkOverlap !== 'number' || core.chunkOverlap < 0) {
|
|
329
|
+
errors.push('core.chunkOverlap must be a non-negative number');
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (core.concurrency !== undefined) {
|
|
333
|
+
if (typeof core.concurrency !== 'number' || core.concurrency < 1 || core.concurrency > 16) {
|
|
334
|
+
errors.push('core.concurrency must be between 1 and 16');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (core.embeddingBatchSize !== undefined) {
|
|
338
|
+
if (typeof core.embeddingBatchSize !== 'number' || core.embeddingBatchSize <= 0) {
|
|
339
|
+
errors.push('core.embeddingBatchSize must be a positive number');
|
|
340
|
+
}
|
|
341
|
+
else if (core.embeddingBatchSize > 100) {
|
|
342
|
+
warnings.push('core.embeddingBatchSize is very large (>100). This may cause memory issues');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Validate MCP configuration settings
|
|
348
|
+
*/
|
|
349
|
+
validateMCPConfig(mcp, errors, _warnings) {
|
|
350
|
+
if (mcp.port !== undefined) {
|
|
351
|
+
if (typeof mcp.port !== 'number' || mcp.port < 1024 || mcp.port > 65535) {
|
|
352
|
+
errors.push('mcp.port must be between 1024 and 65535');
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (mcp.transport !== undefined) {
|
|
356
|
+
if (mcp.transport !== 'stdio' && mcp.transport !== 'socket') {
|
|
357
|
+
errors.push('mcp.transport must be either "stdio" or "socket"');
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (mcp.autoIndexOnFirstRun !== undefined) {
|
|
361
|
+
if (typeof mcp.autoIndexOnFirstRun !== 'boolean') {
|
|
362
|
+
errors.push('mcp.autoIndexOnFirstRun must be a boolean');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Validate git detection configuration settings
|
|
368
|
+
*/
|
|
369
|
+
validateGitDetectionConfig(gitDetection, errors, _warnings) {
|
|
370
|
+
if (gitDetection.enabled !== undefined) {
|
|
371
|
+
if (typeof gitDetection.enabled !== 'boolean') {
|
|
372
|
+
errors.push('gitDetection.enabled must be a boolean');
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (gitDetection.pollIntervalMs !== undefined) {
|
|
376
|
+
if (typeof gitDetection.pollIntervalMs !== 'number' || gitDetection.pollIntervalMs < 100) {
|
|
377
|
+
errors.push('gitDetection.pollIntervalMs must be at least 100ms');
|
|
378
|
+
}
|
|
379
|
+
else if (gitDetection.pollIntervalMs < 1000) {
|
|
380
|
+
_warnings.push('gitDetection.pollIntervalMs is very short (<1s). This may impact performance');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Validate file watching configuration settings
|
|
386
|
+
*/
|
|
387
|
+
validateFileWatchingConfig(fileWatching, errors, warnings) {
|
|
388
|
+
if (fileWatching.enabled !== undefined) {
|
|
389
|
+
if (typeof fileWatching.enabled !== 'boolean') {
|
|
390
|
+
errors.push('fileWatching.enabled must be a boolean');
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (fileWatching.debounceMs !== undefined) {
|
|
394
|
+
if (typeof fileWatching.debounceMs !== 'number' || fileWatching.debounceMs < 0) {
|
|
395
|
+
errors.push('fileWatching.debounceMs must be a non-negative number');
|
|
396
|
+
}
|
|
397
|
+
else if (fileWatching.debounceMs < 100) {
|
|
398
|
+
warnings.push('fileWatching.debounceMs is very short (<100ms). This may cause excessive reindexing');
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Validate frameworks configuration
|
|
404
|
+
*/
|
|
405
|
+
validateFrameworks(frameworks, errors, warnings) {
|
|
406
|
+
if (!Array.isArray(frameworks)) {
|
|
407
|
+
errors.push('frameworks must be an array');
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
frameworks.forEach((framework, index) => {
|
|
411
|
+
if (!framework || typeof framework !== 'object') {
|
|
412
|
+
errors.push(`frameworks[${index}] must be an object`);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
const fw = framework;
|
|
416
|
+
// Validate required fields
|
|
417
|
+
if (!fw.name) {
|
|
418
|
+
errors.push(`frameworks[${index}] missing required field: name`);
|
|
419
|
+
}
|
|
420
|
+
if (fw.path === undefined) {
|
|
421
|
+
errors.push(`frameworks[${index}] missing required field: path`);
|
|
422
|
+
}
|
|
423
|
+
else if (typeof fw.path !== 'string') {
|
|
424
|
+
errors.push(`frameworks[${index}].path must be a string`);
|
|
425
|
+
}
|
|
426
|
+
else if (path.isAbsolute(fw.path)) {
|
|
427
|
+
errors.push(`frameworks[${index}].path must be relative, got: ${fw.path}`);
|
|
428
|
+
}
|
|
429
|
+
if (fw.enabled === undefined) {
|
|
430
|
+
errors.push(`frameworks[${index}] missing required field: enabled`);
|
|
431
|
+
}
|
|
432
|
+
else if (typeof fw.enabled !== 'boolean') {
|
|
433
|
+
errors.push(`frameworks[${index}].enabled must be a boolean`);
|
|
434
|
+
}
|
|
435
|
+
if (!fw.config) {
|
|
436
|
+
errors.push(`frameworks[${index}] missing required field: config`);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
this.validateFrameworkConfig(fw.config, `frameworks[${index}].config`, errors, warnings);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Validate framework-specific configuration
|
|
445
|
+
*/
|
|
446
|
+
validateFrameworkConfig(config, prefix, errors, _warnings) {
|
|
447
|
+
if (!config || typeof config !== 'object') {
|
|
448
|
+
errors.push(`${prefix} must be an object`);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
// Validate include patterns
|
|
452
|
+
if (!Array.isArray(config.include)) {
|
|
453
|
+
errors.push(`${prefix}.include must be an array`);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
config.include.forEach((pattern, i) => {
|
|
457
|
+
if (typeof pattern !== 'string') {
|
|
458
|
+
errors.push(`${prefix}.include[${i}] must be a string`);
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
// Validate exclude patterns
|
|
463
|
+
if (!Array.isArray(config.exclude)) {
|
|
464
|
+
errors.push(`${prefix}.exclude must be an array`);
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
config.exclude.forEach((pattern, i) => {
|
|
468
|
+
if (typeof pattern !== 'string') {
|
|
469
|
+
errors.push(`${prefix}.exclude[${i}] must be a string`);
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
// Export a singleton instance for convenience
|
|
476
|
+
export const configService = new ConfigService();
|
|
477
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/config/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAgC,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,IAAI,mBAAmB,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoB5D;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAU,eAAe,GAAG,mBAAmB,CAAC;IAE9D;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE7C,+BAA+B;YAC/B,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBAE5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAE3C,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACzC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBACxD,OAAO,CAAC,GAAG,CAAC,yCAAyC,cAAc,EAAE,CAAC,CAAC;oBACvE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACxE,CAAC;gBAED,OAAO,MAAM,CAAC,MAAM,CAAC;YACvB,CAAC;YAED,4BAA4B;YAC5B,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,UAAiC,CAAC,CAAC;YAEvF,kCAAkC;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,WAAW,CACnB,2BAA2B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACzD,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAC7D,CAAC;YACJ,CAAC;YAED,uBAAuB;YACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC5C,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;YACxE,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,wCAAwC;gBACxC,OAAO,aAAa,CAAC;YACvB,CAAC;YAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,MAAM,IAAI,WAAW,CACnB,kDAAkD,EAClD,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,CACnD,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,CAAC,KAAK,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,MAAkB;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE/C,yBAAyB;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,WAAW,CACnB,uCAAuC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACrE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC9B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,CAAC,KAAK,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE5C,+BAA+B;YAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACL,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,SAAuB;iBAChC,CAAC;YACJ,CAAC;YAED,oBAAoB;YACpB,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAE9C,2BAA2B;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,WAAW,CACnB,8CAA8C,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC5E,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC9B,CAAC;YACJ,CAAC;YAED,gBAAgB;YAChB,MAAM,UAAU,GAAG,GAAG,UAAU,gBAAgB,CAAC;YACjD,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAE1C,wBAAwB;YACxB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAEpC,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,UAAU;gBACV,MAAM,EAAE,SAAS;aAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO;oBACL,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,aAAa;iBACtB,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,SAAS,CAAC,KAAK,EAAE,gCAAgC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,MAAe;QAC5B,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,MAAe;QACtB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,aAAa;QACb,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC,iCAAiC,CAAC;gBAC3C,QAAQ,EAAE,EAAE;aACb,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAA6B,CAAC;QAE1C,sCAAsC;QACtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAED,gCAAgC;QAChC,IAAI,cAAc,CAAC,GAAoC,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,oBAAoB,CAAC,GAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,cAAc,CAAC,GAAoC,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,oBAAoB,CAAC,GAAuB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;QACxG,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,MAA2B;QACzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,oCAAoC;QACpC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QAED,mCAAmC;QACnC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QAED,6CAA6C;QAC7C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzE,CAAC;QAED,6CAA6C;QAC7C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzE,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAe;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,MAAkB,EAClB,MAAgB,EAChB,QAAkB;QAElB,yBAAyB;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEvD,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErD,kCAAkC;QAClC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEvE,kCAAkC;QAClC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEvE,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,MAAwB,EACxB,MAAgB,EAChB,QAAkB;QAElB,QAAQ,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;QAEtG,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAE5B,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,IAAI,QAAQ,CAAC,WAAW,GAAG,CAAC,IAAI,QAAQ,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;YACtG,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,OAAO,QAAQ,CAAC,kBAAkB,KAAK,QAAQ,IAAI,QAAQ,CAAC,kBAAkB,IAAI,CAAC,EAAE,CAAC;YACxF,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,IAAiC,EACjC,MAAgB,EAChB,QAAkB;QAElB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;YACpG,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;gBAC1F,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,OAAO,IAAI,CAAC,kBAAkB,KAAK,QAAQ,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,EAAE,CAAC;gBAChF,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,IAAI,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,GAA+B,EAC/B,MAAgB,EAChB,SAAmB;QAEnB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,0BAA0B,CAChC,YAAiD,EACjD,MAAgB,EAChB,SAAmB;QAEnB,IAAI,YAAY,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAC9C,IAAI,OAAO,YAAY,CAAC,cAAc,KAAK,QAAQ,IAAI,YAAY,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;gBACzF,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,YAAY,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;gBAC9C,SAAS,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,0BAA0B,CAChC,YAAiD,EACjD,MAAgB,EAChB,QAAkB;QAElB,IAAI,YAAY,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,OAAO,YAAY,CAAC,UAAU,KAAK,QAAQ,IAAI,YAAY,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC/E,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,YAAY,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,UAAqB,EACrB,MAAgB,EAChB,QAAkB;QAElB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YACtC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,qBAAqB,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,MAAM,EAAE,GAAG,SAAyB,CAAC;YAErC,2BAA2B;YAC3B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,gCAAgC,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,gCAAgC,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,yBAAyB,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,iCAAiC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,mCAAmC,CAAC,CAAC;YACtE,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,6BAA6B,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,kCAAkC,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,MAAW,EACX,MAAc,EACd,MAAgB,EAChB,SAAmB;QAEnB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,oBAAoB,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,2BAA2B,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAgB,EAAE,CAAS,EAAE,EAAE;gBACrD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,2BAA2B,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAgB,EAAE,CAAS,EAAE,EAAE;gBACrD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;;AAGH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized constants for @liendev/core.
|
|
3
|
+
* This file contains all magic numbers and configuration defaults.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_CHUNK_SIZE = 75;
|
|
6
|
+
export declare const DEFAULT_CHUNK_OVERLAP = 10;
|
|
7
|
+
export declare const DEFAULT_CONCURRENCY = 4;
|
|
8
|
+
export declare const DEFAULT_EMBEDDING_BATCH_SIZE = 50;
|
|
9
|
+
export declare const EMBEDDING_MICRO_BATCH_SIZE = 10;
|
|
10
|
+
export declare const VECTOR_DB_MAX_BATCH_SIZE = 1000;
|
|
11
|
+
export declare const VECTOR_DB_MIN_BATCH_SIZE = 10;
|
|
12
|
+
export declare const EMBEDDING_DIMENSIONS = 384;
|
|
13
|
+
export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
|
|
14
|
+
export declare const DEFAULT_PORT = 7133;
|
|
15
|
+
export declare const VERSION_CHECK_INTERVAL_MS = 2000;
|
|
16
|
+
export declare const DEFAULT_GIT_POLL_INTERVAL_MS = 10000;
|
|
17
|
+
export declare const DEFAULT_DEBOUNCE_MS = 1000;
|
|
18
|
+
export declare const CURRENT_CONFIG_VERSION = "0.19.5";
|
|
19
|
+
export declare const INDEX_FORMAT_VERSION = 4;
|
|
20
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAGxC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAK/C,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAI7C,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAG3C,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAGjE,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAG9C,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAGlD,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAIxC,eAAO,MAAM,sBAAsB,WAAW,CAAC;AAW/C,eAAO,MAAM,oBAAoB,IAAI,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized constants for @liendev/core.
|
|
3
|
+
* This file contains all magic numbers and configuration defaults.
|
|
4
|
+
*/
|
|
5
|
+
// Chunking settings
|
|
6
|
+
export const DEFAULT_CHUNK_SIZE = 75;
|
|
7
|
+
export const DEFAULT_CHUNK_OVERLAP = 10;
|
|
8
|
+
// Concurrency and batching
|
|
9
|
+
export const DEFAULT_CONCURRENCY = 4;
|
|
10
|
+
export const DEFAULT_EMBEDDING_BATCH_SIZE = 50;
|
|
11
|
+
// Micro-batching for event loop yielding
|
|
12
|
+
// Process N embeddings at a time, then yield to event loop
|
|
13
|
+
// This prevents UI freezing during CPU-intensive embedding generation
|
|
14
|
+
export const EMBEDDING_MICRO_BATCH_SIZE = 10;
|
|
15
|
+
// Vector database batch size limits
|
|
16
|
+
// Maximum batch size before splitting (prevents LanceDB errors on very large batches)
|
|
17
|
+
export const VECTOR_DB_MAX_BATCH_SIZE = 1000;
|
|
18
|
+
// Minimum batch size for retry logic (stop splitting below this size)
|
|
19
|
+
export const VECTOR_DB_MIN_BATCH_SIZE = 10;
|
|
20
|
+
// Embedding model configuration
|
|
21
|
+
export const EMBEDDING_DIMENSIONS = 384; // all-MiniLM-L6-v2
|
|
22
|
+
export const DEFAULT_EMBEDDING_MODEL = 'Xenova/all-MiniLM-L6-v2';
|
|
23
|
+
// MCP server configuration
|
|
24
|
+
export const DEFAULT_PORT = 7133; // LIEN in leetspeak
|
|
25
|
+
export const VERSION_CHECK_INTERVAL_MS = 2000;
|
|
26
|
+
// Git detection
|
|
27
|
+
export const DEFAULT_GIT_POLL_INTERVAL_MS = 10000; // Check every 10 seconds
|
|
28
|
+
// File watching
|
|
29
|
+
export const DEFAULT_DEBOUNCE_MS = 1000;
|
|
30
|
+
// Configuration version - matches the CLI/core release version
|
|
31
|
+
// Core and CLI are always released together with matching versions
|
|
32
|
+
export const CURRENT_CONFIG_VERSION = '0.19.5';
|
|
33
|
+
// Index format version - bump on ANY breaking change to indexing
|
|
34
|
+
// Examples that require version bump:
|
|
35
|
+
// - Chunking algorithm changes
|
|
36
|
+
// - Embedding model changes (e.g., switch from all-MiniLM-L6-v2 to another model)
|
|
37
|
+
// - Vector DB schema changes (new metadata fields)
|
|
38
|
+
// - Metadata structure changes
|
|
39
|
+
// v2: AST-based chunking + enhanced metadata (symbolName, complexity, etc.)
|
|
40
|
+
// v3: Added cognitiveComplexity field to schema
|
|
41
|
+
// v4: Added Halstead metrics (volume, difficulty, effort, bugs)
|
|
42
|
+
export const INDEX_FORMAT_VERSION = 4;
|
|
43
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAoB;AACpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,yCAAyC;AACzC,2DAA2D;AAC3D,sEAAsE;AACtE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C,oCAAoC;AACpC,sFAAsF;AACtF,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAC7C,sEAAsE;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,gCAAgC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC,CAAC,mBAAmB;AAC5D,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAEjE,2BAA2B;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,oBAAoB;AACtD,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC,CAAC,yBAAyB;AAE5E,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,+DAA+D;AAC/D,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC;AAE/C,iEAAiE;AACjE,sCAAsC;AACtC,+BAA+B;AAC/B,kFAAkF;AAClF,mDAAmD;AACnD,+BAA+B;AAC/B,4EAA4E;AAC5E,gDAAgD;AAChD,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { EmbeddingService } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* LRU cache for embeddings with configurable max size.
|
|
4
|
+
* Wraps any EmbeddingService to add caching functionality.
|
|
5
|
+
*
|
|
6
|
+
* Benefits:
|
|
7
|
+
* - Faster repeated searches
|
|
8
|
+
* - Reduced CPU usage
|
|
9
|
+
* - Better user experience for common queries
|
|
10
|
+
*/
|
|
11
|
+
export declare class CachedEmbeddings implements EmbeddingService {
|
|
12
|
+
private cache;
|
|
13
|
+
private readonly maxSize;
|
|
14
|
+
private readonly underlying;
|
|
15
|
+
/**
|
|
16
|
+
* Creates a new cached embeddings service
|
|
17
|
+
* @param underlying - The underlying embedding service to wrap
|
|
18
|
+
* @param maxSize - Maximum number of embeddings to cache (default: 1000)
|
|
19
|
+
*/
|
|
20
|
+
constructor(underlying: EmbeddingService, maxSize?: number);
|
|
21
|
+
initialize(): Promise<void>;
|
|
22
|
+
embed(text: string): Promise<Float32Array>;
|
|
23
|
+
embedBatch(texts: string[]): Promise<Float32Array[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Gets the current cache size
|
|
26
|
+
*/
|
|
27
|
+
getCacheSize(): number;
|
|
28
|
+
/**
|
|
29
|
+
* Gets cache statistics
|
|
30
|
+
*/
|
|
31
|
+
getCacheStats(): {
|
|
32
|
+
size: number;
|
|
33
|
+
maxSize: number;
|
|
34
|
+
hitRate?: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Clears the cache
|
|
38
|
+
*/
|
|
39
|
+
clearCache(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Checks if a text is in the cache
|
|
42
|
+
*/
|
|
43
|
+
has(text: string): boolean;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/embeddings/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;GAQG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAE9C;;;;OAIG;gBACS,UAAU,EAAE,gBAAgB,EAAE,OAAO,GAAE,MAAa;IAK1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0C1D;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAOpE;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B"}
|