agentic-qe 2.6.0 → 2.6.2
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/CHANGELOG.md +156 -0
- package/README.md +222 -159
- package/dist/agents/BaseAgent.d.ts +19 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +41 -1
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CodeIntelligenceAgent.d.ts +14 -0
- package/dist/agents/CodeIntelligenceAgent.d.ts.map +1 -1
- package/dist/agents/CodeIntelligenceAgent.js +66 -0
- package/dist/agents/CodeIntelligenceAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +8 -0
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +65 -1
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +2 -2
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +16 -6
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/adapters/AgentLLMAdapter.d.ts +127 -0
- package/dist/agents/adapters/AgentLLMAdapter.d.ts.map +1 -0
- package/dist/agents/adapters/AgentLLMAdapter.js +366 -0
- package/dist/agents/adapters/AgentLLMAdapter.js.map +1 -0
- package/dist/agents/adapters/index.d.ts +1 -0
- package/dist/agents/adapters/index.d.ts.map +1 -1
- package/dist/agents/adapters/index.js +5 -1
- package/dist/agents/adapters/index.js.map +1 -1
- package/dist/agents/interfaces/IAgentLLM.d.ts +257 -0
- package/dist/agents/interfaces/IAgentLLM.d.ts.map +1 -0
- package/dist/agents/interfaces/IAgentLLM.js +39 -0
- package/dist/agents/interfaces/IAgentLLM.js.map +1 -0
- package/dist/agents/interfaces/index.d.ts +10 -0
- package/dist/agents/interfaces/index.d.ts.map +1 -0
- package/dist/agents/interfaces/index.js +14 -0
- package/dist/agents/interfaces/index.js.map +1 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts +18 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts.map +1 -1
- package/dist/agents/n8n/N8nBaseAgent.js +80 -0
- package/dist/agents/n8n/N8nBaseAgent.js.map +1 -1
- package/dist/agents/pool/AgentPool.d.ts +112 -0
- package/dist/agents/pool/AgentPool.d.ts.map +1 -0
- package/dist/agents/pool/AgentPool.js +573 -0
- package/dist/agents/pool/AgentPool.js.map +1 -0
- package/dist/agents/pool/QEAgentPoolFactory.d.ts +118 -0
- package/dist/agents/pool/QEAgentPoolFactory.d.ts.map +1 -0
- package/dist/agents/pool/QEAgentPoolFactory.js +251 -0
- package/dist/agents/pool/QEAgentPoolFactory.js.map +1 -0
- package/dist/agents/pool/index.d.ts +34 -0
- package/dist/agents/pool/index.d.ts.map +1 -0
- package/dist/agents/pool/index.js +44 -0
- package/dist/agents/pool/index.js.map +1 -0
- package/dist/agents/pool/types.d.ts +227 -0
- package/dist/agents/pool/types.d.ts.map +1 -0
- package/dist/agents/pool/types.js +28 -0
- package/dist/agents/pool/types.js.map +1 -0
- package/dist/cli/commands/providers.d.ts +50 -0
- package/dist/cli/commands/providers.d.ts.map +1 -0
- package/dist/cli/commands/providers.js +403 -0
- package/dist/cli/commands/providers.js.map +1 -0
- package/dist/cli/index.js +62 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/code-intelligence/indexing/FileWatcher.d.ts.map +1 -1
- package/dist/code-intelligence/indexing/FileWatcher.js +11 -8
- package/dist/code-intelligence/indexing/FileWatcher.js.map +1 -1
- package/dist/config/ConfigLoader.d.ts +85 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +420 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/ProviderConfig.d.ts +153 -0
- package/dist/config/ProviderConfig.d.ts.map +1 -0
- package/dist/config/ProviderConfig.js +155 -0
- package/dist/config/ProviderConfig.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +45 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/mcp/handlers/agent-spawn.d.ts +71 -5
- package/dist/mcp/handlers/agent-spawn.d.ts.map +1 -1
- package/dist/mcp/handlers/agent-spawn.js +336 -110
- package/dist/mcp/handlers/agent-spawn.js.map +1 -1
- package/dist/mcp/handlers/fleet-init.d.ts +24 -0
- package/dist/mcp/handlers/fleet-init.d.ts.map +1 -1
- package/dist/mcp/handlers/fleet-init.js +56 -4
- package/dist/mcp/handlers/fleet-init.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/memory/HNSWPatternStore.d.ts.map +1 -1
- package/dist/memory/HNSWPatternStore.js +23 -0
- package/dist/memory/HNSWPatternStore.js.map +1 -1
- package/dist/memory/RuVectorPatternStore.d.ts +5 -0
- package/dist/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/memory/RuVectorPatternStore.js +11 -0
- package/dist/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/plugins/BasePlugin.d.ts +111 -0
- package/dist/plugins/BasePlugin.d.ts.map +1 -0
- package/dist/plugins/BasePlugin.js +154 -0
- package/dist/plugins/BasePlugin.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +145 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +862 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/adapters/McpToolsPlugin.d.ts +98 -0
- package/dist/plugins/adapters/McpToolsPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/McpToolsPlugin.js +518 -0
- package/dist/plugins/adapters/McpToolsPlugin.js.map +1 -0
- package/dist/plugins/adapters/PlaywrightPlugin.d.ts +63 -0
- package/dist/plugins/adapters/PlaywrightPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/PlaywrightPlugin.js +451 -0
- package/dist/plugins/adapters/PlaywrightPlugin.js.map +1 -0
- package/dist/plugins/adapters/VitestPlugin.d.ts +74 -0
- package/dist/plugins/adapters/VitestPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/VitestPlugin.js +589 -0
- package/dist/plugins/adapters/VitestPlugin.js.map +1 -0
- package/dist/plugins/adapters/index.d.ts +8 -0
- package/dist/plugins/adapters/index.d.ts.map +1 -0
- package/dist/plugins/adapters/index.js +17 -0
- package/dist/plugins/adapters/index.js.map +1 -0
- package/dist/plugins/index.d.ts +32 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +48 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +528 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +61 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/CostOptimizationStrategies.d.ts +297 -0
- package/dist/providers/CostOptimizationStrategies.d.ts.map +1 -0
- package/dist/providers/CostOptimizationStrategies.js +831 -0
- package/dist/providers/CostOptimizationStrategies.js.map +1 -0
- package/dist/providers/HybridRouter.d.ts +142 -5
- package/dist/providers/HybridRouter.d.ts.map +1 -1
- package/dist/providers/HybridRouter.js +472 -6
- package/dist/providers/HybridRouter.js.map +1 -1
- package/dist/providers/HybridRouterComplexityIntegration.d.ts +169 -0
- package/dist/providers/HybridRouterComplexityIntegration.d.ts.map +1 -0
- package/dist/providers/HybridRouterComplexityIntegration.js +319 -0
- package/dist/providers/HybridRouterComplexityIntegration.js.map +1 -0
- package/dist/providers/HybridRouterModelSelection.d.ts +106 -0
- package/dist/providers/HybridRouterModelSelection.d.ts.map +1 -0
- package/dist/providers/HybridRouterModelSelection.js +420 -0
- package/dist/providers/HybridRouterModelSelection.js.map +1 -0
- package/dist/providers/LLMProviderFactory.d.ts +23 -9
- package/dist/providers/LLMProviderFactory.d.ts.map +1 -1
- package/dist/providers/LLMProviderFactory.js +54 -11
- package/dist/providers/LLMProviderFactory.js.map +1 -1
- package/dist/providers/OllamaProvider.d.ts +122 -0
- package/dist/providers/OllamaProvider.d.ts.map +1 -0
- package/dist/providers/OllamaProvider.js +425 -0
- package/dist/providers/OllamaProvider.js.map +1 -0
- package/dist/providers/index.d.ts +6 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +17 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/routing/ComplexityClassifier.d.ts +266 -0
- package/dist/routing/ComplexityClassifier.d.ts.map +1 -0
- package/dist/routing/ComplexityClassifier.js +567 -0
- package/dist/routing/ComplexityClassifier.js.map +1 -0
- package/dist/routing/ModelCapabilityRegistry.d.ts +98 -0
- package/dist/routing/ModelCapabilityRegistry.d.ts.map +1 -0
- package/dist/routing/ModelCapabilityRegistry.js +216 -0
- package/dist/routing/ModelCapabilityRegistry.js.map +1 -0
- package/dist/routing/index.d.ts +13 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +24 -0
- package/dist/routing/index.js.map +1 -0
- package/docs/reference/model-capability-registry.md +402 -0
- package/docs/reference/provider-config-schema.md +608 -0
- package/package.json +21 -3
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration Loader for Multi-Provider LLM System
|
|
4
|
+
*
|
|
5
|
+
* Loads and validates provider configurations from:
|
|
6
|
+
* - YAML files (.aqe/providers.yaml)
|
|
7
|
+
* - Environment variables
|
|
8
|
+
* - Programmatic configuration objects
|
|
9
|
+
*
|
|
10
|
+
* Supports environment variable interpolation and schema validation.
|
|
11
|
+
*
|
|
12
|
+
* @module config/ConfigLoader
|
|
13
|
+
* @version 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.ConfigLoader = void 0;
|
|
50
|
+
exports.loadConfig = loadConfig;
|
|
51
|
+
exports.validateConfig = validateConfig;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const yaml = __importStar(require("yaml"));
|
|
55
|
+
const Logger_1 = require("../utils/Logger");
|
|
56
|
+
const ProviderConfig_1 = require("./ProviderConfig");
|
|
57
|
+
/**
|
|
58
|
+
* Environment variable mapping for providers
|
|
59
|
+
*/
|
|
60
|
+
const ENV_VAR_MAPPING = {
|
|
61
|
+
'ANTHROPIC_API_KEY': 'claude.apiKey',
|
|
62
|
+
'OPENROUTER_API_KEY': 'openrouter.apiKey',
|
|
63
|
+
'GROQ_API_KEY': 'groq.apiKey',
|
|
64
|
+
'GOOGLE_API_KEY': 'google.apiKey',
|
|
65
|
+
'TOGETHER_API_KEY': 'together.apiKey',
|
|
66
|
+
'GITHUB_TOKEN': 'github.apiKey',
|
|
67
|
+
'OLLAMA_HOST': 'ollama.baseUrl',
|
|
68
|
+
'RUVLLM_HOST': 'ruvllm.baseUrl',
|
|
69
|
+
'LLM_PROVIDER': 'defaultProvider',
|
|
70
|
+
'LLM_MODE': 'mode',
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Configuration loader class
|
|
74
|
+
*/
|
|
75
|
+
class ConfigLoader {
|
|
76
|
+
constructor(baseDir) {
|
|
77
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
78
|
+
this.baseDir = baseDir || process.cwd();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Load configuration from various sources
|
|
82
|
+
*/
|
|
83
|
+
async load(options = {}) {
|
|
84
|
+
const { configPath, loadFromEnv = true, mergeDefaults = true, validate = true, interpolateEnv = true, } = options;
|
|
85
|
+
let config = {};
|
|
86
|
+
// 1. Load from YAML file if provided
|
|
87
|
+
if (configPath) {
|
|
88
|
+
const yamlConfig = await this.loadFromYaml(configPath);
|
|
89
|
+
config = this.deepMerge(config, yamlConfig);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// Try default locations
|
|
93
|
+
const defaultPaths = [
|
|
94
|
+
path.join(this.baseDir, '.aqe', 'providers.yaml'),
|
|
95
|
+
path.join(this.baseDir, '.aqe', 'providers.yml'),
|
|
96
|
+
path.join(this.baseDir, 'aqe.config.yaml'),
|
|
97
|
+
path.join(this.baseDir, 'aqe.config.yml'),
|
|
98
|
+
];
|
|
99
|
+
for (const defaultPath of defaultPaths) {
|
|
100
|
+
if (fs.existsSync(defaultPath)) {
|
|
101
|
+
this.logger.debug(`Loading config from: ${defaultPath}`);
|
|
102
|
+
const yamlConfig = await this.loadFromYaml(defaultPath);
|
|
103
|
+
config = this.deepMerge(config, yamlConfig);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 2. Load from environment variables
|
|
109
|
+
if (loadFromEnv) {
|
|
110
|
+
const envConfig = this.loadFromEnvironment();
|
|
111
|
+
config = this.deepMerge(config, envConfig);
|
|
112
|
+
}
|
|
113
|
+
// 3. Merge with defaults
|
|
114
|
+
if (mergeDefaults) {
|
|
115
|
+
config = this.mergeWithDefaults(config);
|
|
116
|
+
}
|
|
117
|
+
// 4. Interpolate environment variables
|
|
118
|
+
if (interpolateEnv) {
|
|
119
|
+
config = this.interpolateEnvironmentVariables(config);
|
|
120
|
+
}
|
|
121
|
+
// 5. Validate configuration
|
|
122
|
+
const finalConfig = config;
|
|
123
|
+
if (validate) {
|
|
124
|
+
const validation = this.validate(finalConfig);
|
|
125
|
+
if (!validation.valid) {
|
|
126
|
+
throw new Error(`Configuration validation failed:\n${validation.errors.join('\n')}`);
|
|
127
|
+
}
|
|
128
|
+
if (validation.warnings.length > 0) {
|
|
129
|
+
this.logger.warn('Configuration warnings:', validation.warnings);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return finalConfig;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Load configuration from YAML file
|
|
136
|
+
*/
|
|
137
|
+
async loadFromYaml(configPath) {
|
|
138
|
+
try {
|
|
139
|
+
const absolutePath = path.isAbsolute(configPath)
|
|
140
|
+
? configPath
|
|
141
|
+
: path.join(this.baseDir, configPath);
|
|
142
|
+
if (!fs.existsSync(absolutePath)) {
|
|
143
|
+
throw new Error(`Configuration file not found: ${absolutePath}`);
|
|
144
|
+
}
|
|
145
|
+
const content = fs.readFileSync(absolutePath, 'utf-8');
|
|
146
|
+
const config = yaml.parse(content);
|
|
147
|
+
this.logger.info(`Loaded configuration from: ${absolutePath}`);
|
|
148
|
+
return config;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
this.logger.error('Failed to load YAML configuration', { error });
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Load configuration from environment variables
|
|
157
|
+
*/
|
|
158
|
+
loadFromEnvironment() {
|
|
159
|
+
const config = {
|
|
160
|
+
providers: [],
|
|
161
|
+
};
|
|
162
|
+
// Map environment variables to config
|
|
163
|
+
for (const [envVar, configPath] of Object.entries(ENV_VAR_MAPPING)) {
|
|
164
|
+
const value = process.env[envVar];
|
|
165
|
+
if (value) {
|
|
166
|
+
this.setNestedProperty(config, configPath, value);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Auto-detect and configure providers based on available API keys
|
|
170
|
+
const providers = [];
|
|
171
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
172
|
+
providers.push({
|
|
173
|
+
...ProviderConfig_1.DEFAULT_PROVIDER_CONFIGS.claude,
|
|
174
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
175
|
+
enabled: true,
|
|
176
|
+
priority: 10,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (process.env.OPENROUTER_API_KEY) {
|
|
180
|
+
providers.push({
|
|
181
|
+
...ProviderConfig_1.DEFAULT_PROVIDER_CONFIGS.openrouter,
|
|
182
|
+
apiKey: process.env.OPENROUTER_API_KEY,
|
|
183
|
+
enabled: true,
|
|
184
|
+
priority: 20,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (process.env.GROQ_API_KEY) {
|
|
188
|
+
providers.push({
|
|
189
|
+
...ProviderConfig_1.DEFAULT_PROVIDER_CONFIGS.groq,
|
|
190
|
+
apiKey: process.env.GROQ_API_KEY,
|
|
191
|
+
enabled: true,
|
|
192
|
+
priority: 30,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (process.env.GOOGLE_API_KEY) {
|
|
196
|
+
providers.push({
|
|
197
|
+
...ProviderConfig_1.DEFAULT_PROVIDER_CONFIGS.google,
|
|
198
|
+
apiKey: process.env.GOOGLE_API_KEY,
|
|
199
|
+
enabled: true,
|
|
200
|
+
priority: 40,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (providers.length > 0) {
|
|
204
|
+
config.providers = providers;
|
|
205
|
+
}
|
|
206
|
+
// Set mode from environment
|
|
207
|
+
const mode = process.env.LLM_MODE;
|
|
208
|
+
if (mode) {
|
|
209
|
+
config.mode = mode;
|
|
210
|
+
}
|
|
211
|
+
return config;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Merge configuration with defaults
|
|
215
|
+
*/
|
|
216
|
+
mergeWithDefaults(config) {
|
|
217
|
+
// Get mode-specific defaults
|
|
218
|
+
const mode = config.mode || 'hybrid';
|
|
219
|
+
const modeDefaults = ProviderConfig_1.DEFAULT_MODE_CONFIGS[mode] || {};
|
|
220
|
+
// Merge mode defaults
|
|
221
|
+
let merged = this.deepMerge(modeDefaults, config);
|
|
222
|
+
// Merge provider defaults
|
|
223
|
+
if (merged.providers) {
|
|
224
|
+
merged.providers = merged.providers.map((provider) => {
|
|
225
|
+
const defaults = ProviderConfig_1.DEFAULT_PROVIDER_CONFIGS[provider.type];
|
|
226
|
+
return this.deepMerge(defaults, provider);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return merged;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Interpolate environment variables in configuration
|
|
233
|
+
* Replaces ${ENV_VAR} with the value of ENV_VAR
|
|
234
|
+
*/
|
|
235
|
+
interpolateEnvironmentVariables(config) {
|
|
236
|
+
const interpolate = (value) => {
|
|
237
|
+
if (typeof value === 'string') {
|
|
238
|
+
// Match ${VAR_NAME} or $VAR_NAME
|
|
239
|
+
return value.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g, (match, p1, p2) => {
|
|
240
|
+
const varName = p1 || p2;
|
|
241
|
+
const envValue = process.env[varName];
|
|
242
|
+
if (envValue === undefined) {
|
|
243
|
+
this.logger.warn(`Environment variable not found: ${varName}`);
|
|
244
|
+
return match; // Keep original if not found
|
|
245
|
+
}
|
|
246
|
+
return envValue;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (Array.isArray(value)) {
|
|
250
|
+
return value.map(interpolate);
|
|
251
|
+
}
|
|
252
|
+
if (value && typeof value === 'object') {
|
|
253
|
+
const result = {};
|
|
254
|
+
for (const [key, val] of Object.entries(value)) {
|
|
255
|
+
result[key] = interpolate(val);
|
|
256
|
+
}
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
return value;
|
|
260
|
+
};
|
|
261
|
+
return interpolate(config);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Validate configuration
|
|
265
|
+
*/
|
|
266
|
+
validate(config) {
|
|
267
|
+
const errors = [];
|
|
268
|
+
const warnings = [];
|
|
269
|
+
// Check mode
|
|
270
|
+
if (!config.mode) {
|
|
271
|
+
errors.push('Deployment mode is required');
|
|
272
|
+
}
|
|
273
|
+
const validModes = ['local_first', 'hosted', 'free_only', 'hybrid'];
|
|
274
|
+
if (config.mode && !validModes.includes(config.mode)) {
|
|
275
|
+
errors.push(`Invalid deployment mode: ${config.mode}`);
|
|
276
|
+
}
|
|
277
|
+
// Check providers
|
|
278
|
+
if (!config.providers || config.providers.length === 0) {
|
|
279
|
+
errors.push('At least one provider must be configured');
|
|
280
|
+
}
|
|
281
|
+
// Validate each provider
|
|
282
|
+
config.providers?.forEach((provider, index) => {
|
|
283
|
+
const prefix = `Provider ${index} (${provider.type})`;
|
|
284
|
+
if (!provider.type) {
|
|
285
|
+
errors.push(`${prefix}: type is required`);
|
|
286
|
+
}
|
|
287
|
+
if (!provider.defaultModel) {
|
|
288
|
+
errors.push(`${prefix}: defaultModel is required`);
|
|
289
|
+
}
|
|
290
|
+
if (provider.enabled && !provider.apiKey && provider.type !== 'ollama' && provider.type !== 'ruvllm') {
|
|
291
|
+
warnings.push(`${prefix}: apiKey is missing (may fail if not provided via environment)`);
|
|
292
|
+
}
|
|
293
|
+
if (provider.priority < 0) {
|
|
294
|
+
warnings.push(`${prefix}: priority should be >= 0`);
|
|
295
|
+
}
|
|
296
|
+
// Validate fallback chain
|
|
297
|
+
if (provider.fallbackProvider) {
|
|
298
|
+
const fallbackExists = config.providers?.some(p => p.type === provider.fallbackProvider);
|
|
299
|
+
if (!fallbackExists) {
|
|
300
|
+
warnings.push(`${prefix}: fallback provider '${provider.fallbackProvider}' not found`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Validate rate limits
|
|
304
|
+
if (provider.limits) {
|
|
305
|
+
if (provider.limits.requestsPerMinute && provider.limits.requestsPerMinute <= 0) {
|
|
306
|
+
errors.push(`${prefix}: requestsPerMinute must be > 0`);
|
|
307
|
+
}
|
|
308
|
+
if (provider.limits.tokensPerMinute && provider.limits.tokensPerMinute <= 0) {
|
|
309
|
+
errors.push(`${prefix}: tokensPerMinute must be > 0`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Validate cost config
|
|
313
|
+
if (provider.costPer1MTokens) {
|
|
314
|
+
if (provider.costPer1MTokens.input < 0) {
|
|
315
|
+
errors.push(`${prefix}: input cost cannot be negative`);
|
|
316
|
+
}
|
|
317
|
+
if (provider.costPer1MTokens.output < 0) {
|
|
318
|
+
errors.push(`${prefix}: output cost cannot be negative`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
// Validate cost budget
|
|
323
|
+
if (config.costBudget) {
|
|
324
|
+
if (config.costBudget.daily && config.costBudget.daily <= 0) {
|
|
325
|
+
errors.push('Daily cost budget must be > 0');
|
|
326
|
+
}
|
|
327
|
+
if (config.costBudget.monthly && config.costBudget.monthly <= 0) {
|
|
328
|
+
errors.push('Monthly cost budget must be > 0');
|
|
329
|
+
}
|
|
330
|
+
if (config.costBudget.warnThreshold && (config.costBudget.warnThreshold <= 0 || config.costBudget.warnThreshold > 100)) {
|
|
331
|
+
errors.push('Warn threshold must be between 0 and 100');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Validate fallback chain
|
|
335
|
+
if (config.fallbackChain) {
|
|
336
|
+
config.fallbackChain.forEach(providerName => {
|
|
337
|
+
const exists = config.providers?.some(p => p.type === providerName);
|
|
338
|
+
if (!exists) {
|
|
339
|
+
warnings.push(`Fallback chain references unknown provider: ${providerName}`);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
valid: errors.length === 0,
|
|
345
|
+
errors,
|
|
346
|
+
warnings,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Deep merge two objects
|
|
351
|
+
*/
|
|
352
|
+
deepMerge(target, source) {
|
|
353
|
+
if (!source)
|
|
354
|
+
return target;
|
|
355
|
+
if (!target)
|
|
356
|
+
return source;
|
|
357
|
+
const result = { ...target };
|
|
358
|
+
for (const key of Object.keys(source)) {
|
|
359
|
+
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
360
|
+
result[key] = this.deepMerge(result[key] || {}, source[key]);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
result[key] = source[key];
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Set nested property using dot notation
|
|
370
|
+
*/
|
|
371
|
+
setNestedProperty(obj, path, value) {
|
|
372
|
+
const parts = path.split('.');
|
|
373
|
+
let current = obj;
|
|
374
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
375
|
+
const part = parts[i];
|
|
376
|
+
if (!(part in current)) {
|
|
377
|
+
current[part] = {};
|
|
378
|
+
}
|
|
379
|
+
current = current[part];
|
|
380
|
+
}
|
|
381
|
+
current[parts[parts.length - 1]] = value;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Save configuration to YAML file
|
|
385
|
+
*/
|
|
386
|
+
async save(config, outputPath) {
|
|
387
|
+
try {
|
|
388
|
+
const absolutePath = path.isAbsolute(outputPath)
|
|
389
|
+
? outputPath
|
|
390
|
+
: path.join(this.baseDir, outputPath);
|
|
391
|
+
const dir = path.dirname(absolutePath);
|
|
392
|
+
if (!fs.existsSync(dir)) {
|
|
393
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
394
|
+
}
|
|
395
|
+
const yamlContent = yaml.stringify(config);
|
|
396
|
+
fs.writeFileSync(absolutePath, yamlContent, 'utf-8');
|
|
397
|
+
this.logger.info(`Configuration saved to: ${absolutePath}`);
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
this.logger.error('Failed to save configuration', { error });
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
exports.ConfigLoader = ConfigLoader;
|
|
406
|
+
/**
|
|
407
|
+
* Convenience function to load configuration
|
|
408
|
+
*/
|
|
409
|
+
async function loadConfig(options) {
|
|
410
|
+
const loader = new ConfigLoader(options?.baseDir);
|
|
411
|
+
return loader.load(options);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Convenience function to validate configuration
|
|
415
|
+
*/
|
|
416
|
+
function validateConfig(config) {
|
|
417
|
+
const loader = new ConfigLoader();
|
|
418
|
+
return loader.validate(config);
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=ConfigLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.js","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Provider Configuration System
|
|
3
|
+
*
|
|
4
|
+
* Defines configuration types for managing multiple LLM providers
|
|
5
|
+
* with support for YAML-based configuration, environment variables,
|
|
6
|
+
* rate limiting, cost tracking, and fallback chains.
|
|
7
|
+
*
|
|
8
|
+
* @module config/ProviderConfig
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Task types for provider-specific model routing
|
|
13
|
+
*/
|
|
14
|
+
export type TaskType = 'test-generation' | 'coverage-analysis' | 'code-review' | 'bug-detection' | 'documentation' | 'refactoring' | 'performance-testing' | 'security-scanning' | 'accessibility-testing';
|
|
15
|
+
/**
|
|
16
|
+
* Supported LLM provider types
|
|
17
|
+
*/
|
|
18
|
+
export type ProviderType = 'ollama' | 'openrouter' | 'groq' | 'claude' | 'ruvllm' | 'google' | 'together' | 'github';
|
|
19
|
+
/**
|
|
20
|
+
* Deployment modes for multi-provider configuration
|
|
21
|
+
*/
|
|
22
|
+
export type DeploymentMode = 'local_first' | 'hosted' | 'free_only' | 'hybrid';
|
|
23
|
+
/**
|
|
24
|
+
* Rate limiting configuration for a provider
|
|
25
|
+
*/
|
|
26
|
+
export interface RateLimitConfig {
|
|
27
|
+
/** Maximum requests per minute */
|
|
28
|
+
requestsPerMinute?: number;
|
|
29
|
+
/** Maximum requests per day */
|
|
30
|
+
requestsPerDay?: number;
|
|
31
|
+
/** Maximum tokens per minute */
|
|
32
|
+
tokensPerMinute?: number;
|
|
33
|
+
/** Maximum tokens per day */
|
|
34
|
+
tokensPerDay?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Cost configuration for a provider
|
|
38
|
+
*/
|
|
39
|
+
export interface CostConfig {
|
|
40
|
+
/** Cost per 1 million input tokens (USD) */
|
|
41
|
+
input: number;
|
|
42
|
+
/** Cost per 1 million output tokens (USD) */
|
|
43
|
+
output: number;
|
|
44
|
+
/** Cost multiplier for cached reads (e.g., 0.1 for 90% discount) */
|
|
45
|
+
cacheReadMultiplier?: number;
|
|
46
|
+
/** Cost multiplier for cache writes (e.g., 1.25 for 25% premium) */
|
|
47
|
+
cacheWriteMultiplier?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Configuration for a single LLM provider
|
|
51
|
+
*/
|
|
52
|
+
export interface ProviderConfig {
|
|
53
|
+
/** Provider type */
|
|
54
|
+
type: ProviderType;
|
|
55
|
+
/** Whether this provider is enabled */
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
/** Priority for provider selection (lower = higher priority) */
|
|
58
|
+
priority: number;
|
|
59
|
+
/** API key for the provider (supports env var interpolation) */
|
|
60
|
+
apiKey?: string;
|
|
61
|
+
/** Base URL for the provider API */
|
|
62
|
+
baseUrl?: string;
|
|
63
|
+
/** Additional headers for requests */
|
|
64
|
+
headers?: Record<string, string>;
|
|
65
|
+
/** Default model to use for this provider */
|
|
66
|
+
defaultModel: string;
|
|
67
|
+
/** Model overrides for specific task types */
|
|
68
|
+
modelOverrides?: Partial<Record<TaskType, string>>;
|
|
69
|
+
/** List of available models (for validation) */
|
|
70
|
+
availableModels?: string[];
|
|
71
|
+
/** Rate limit configuration */
|
|
72
|
+
limits?: RateLimitConfig;
|
|
73
|
+
/** Cost per 1M tokens (input/output) */
|
|
74
|
+
costPer1MTokens?: CostConfig;
|
|
75
|
+
/** Name of fallback provider if this one fails */
|
|
76
|
+
fallbackProvider?: string;
|
|
77
|
+
/** Whether this provider supports streaming */
|
|
78
|
+
supportsStreaming?: boolean;
|
|
79
|
+
/** Whether this provider supports prompt caching */
|
|
80
|
+
supportsCaching?: boolean;
|
|
81
|
+
/** Whether this provider supports embeddings */
|
|
82
|
+
supportsEmbeddings?: boolean;
|
|
83
|
+
/** Whether this provider supports vision/multimodal */
|
|
84
|
+
supportsVision?: boolean;
|
|
85
|
+
/** Additional provider-specific configuration */
|
|
86
|
+
options?: Record<string, any>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Cost budget configuration
|
|
90
|
+
*/
|
|
91
|
+
export interface CostBudgetConfig {
|
|
92
|
+
/** Daily cost limit in USD */
|
|
93
|
+
daily?: number;
|
|
94
|
+
/** Monthly cost limit in USD */
|
|
95
|
+
monthly?: number;
|
|
96
|
+
/** Warn when cost reaches this percentage of budget */
|
|
97
|
+
warnThreshold?: number;
|
|
98
|
+
/** Block requests when cost exceeds budget */
|
|
99
|
+
enforceLimit?: boolean;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Multi-provider configuration
|
|
103
|
+
*/
|
|
104
|
+
export interface MultiProviderConfig {
|
|
105
|
+
/** Deployment mode */
|
|
106
|
+
mode: DeploymentMode;
|
|
107
|
+
/** List of provider configurations */
|
|
108
|
+
providers: ProviderConfig[];
|
|
109
|
+
/** Fallback chain (provider names in order of preference) */
|
|
110
|
+
fallbackChain?: string[];
|
|
111
|
+
/** Cost budget tracking */
|
|
112
|
+
costBudget?: CostBudgetConfig;
|
|
113
|
+
/** Enable automatic provider health checks */
|
|
114
|
+
enableHealthChecks?: boolean;
|
|
115
|
+
/** Health check interval in milliseconds */
|
|
116
|
+
healthCheckInterval?: number;
|
|
117
|
+
/** Maximum consecutive failures before marking provider unhealthy */
|
|
118
|
+
maxConsecutiveFailures?: number;
|
|
119
|
+
/** Enable request retries with exponential backoff */
|
|
120
|
+
enableRetries?: boolean;
|
|
121
|
+
/** Maximum retry attempts per request */
|
|
122
|
+
maxRetries?: number;
|
|
123
|
+
/** Enable request caching */
|
|
124
|
+
enableCaching?: boolean;
|
|
125
|
+
/** Cache TTL in seconds */
|
|
126
|
+
cacheTTL?: number;
|
|
127
|
+
/** Enable cost tracking and logging */
|
|
128
|
+
enableCostTracking?: boolean;
|
|
129
|
+
/** Log level for provider operations */
|
|
130
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
131
|
+
/** Additional global options */
|
|
132
|
+
options?: Record<string, any>;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Configuration validation result
|
|
136
|
+
*/
|
|
137
|
+
export interface ConfigValidationResult {
|
|
138
|
+
/** Whether the configuration is valid */
|
|
139
|
+
valid: boolean;
|
|
140
|
+
/** Validation errors (if any) */
|
|
141
|
+
errors: string[];
|
|
142
|
+
/** Validation warnings (non-blocking) */
|
|
143
|
+
warnings: string[];
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Default provider configurations for common providers
|
|
147
|
+
*/
|
|
148
|
+
export declare const DEFAULT_PROVIDER_CONFIGS: Record<ProviderType, Partial<ProviderConfig>>;
|
|
149
|
+
/**
|
|
150
|
+
* Default multi-provider configurations for common deployment modes
|
|
151
|
+
*/
|
|
152
|
+
export declare const DEFAULT_MODE_CONFIGS: Record<DeploymentMode, Partial<MultiProviderConfig>>;
|
|
153
|
+
//# sourceMappingURL=ProviderConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderConfig.d.ts","sourceRoot":"","sources":["../../src/config/ProviderConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,aAAa,GACb,eAAe,GACf,eAAe,GACf,aAAa,GACb,qBAAqB,GACrB,mBAAmB,GACnB,uBAAuB,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,YAAY,GACZ,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,QAAQ,GACR,WAAW,GACX,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,IAAI,EAAE,YAAY,CAAC;IAEnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IAEjB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IAGjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGjC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAG3B,+BAA+B;IAC/B,MAAM,CAAC,EAAE,eAAe,CAAC;IAGzB,wCAAwC;IACxC,eAAe,CAAC,EAAE,UAAU,CAAC;IAG7B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sBAAsB;IACtB,IAAI,EAAE,cAAc,CAAC;IAErB,sCAAsC;IACtC,SAAS,EAAE,cAAc,EAAE,CAAC;IAE5B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,qEAAqE;IACrE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAE/C,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC,CAmGlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,mBAAmB,CAAC,CA4CrF,CAAC"}
|