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.
Files changed (170) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +222 -159
  3. package/dist/agents/BaseAgent.d.ts +19 -0
  4. package/dist/agents/BaseAgent.d.ts.map +1 -1
  5. package/dist/agents/BaseAgent.js +41 -1
  6. package/dist/agents/BaseAgent.js.map +1 -1
  7. package/dist/agents/CodeIntelligenceAgent.d.ts +14 -0
  8. package/dist/agents/CodeIntelligenceAgent.d.ts.map +1 -1
  9. package/dist/agents/CodeIntelligenceAgent.js +66 -0
  10. package/dist/agents/CodeIntelligenceAgent.js.map +1 -1
  11. package/dist/agents/CoverageAnalyzerAgent.d.ts +8 -0
  12. package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
  13. package/dist/agents/CoverageAnalyzerAgent.js +65 -1
  14. package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
  15. package/dist/agents/TestGeneratorAgent.d.ts +2 -2
  16. package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
  17. package/dist/agents/TestGeneratorAgent.js +16 -6
  18. package/dist/agents/TestGeneratorAgent.js.map +1 -1
  19. package/dist/agents/adapters/AgentLLMAdapter.d.ts +127 -0
  20. package/dist/agents/adapters/AgentLLMAdapter.d.ts.map +1 -0
  21. package/dist/agents/adapters/AgentLLMAdapter.js +366 -0
  22. package/dist/agents/adapters/AgentLLMAdapter.js.map +1 -0
  23. package/dist/agents/adapters/index.d.ts +1 -0
  24. package/dist/agents/adapters/index.d.ts.map +1 -1
  25. package/dist/agents/adapters/index.js +5 -1
  26. package/dist/agents/adapters/index.js.map +1 -1
  27. package/dist/agents/interfaces/IAgentLLM.d.ts +257 -0
  28. package/dist/agents/interfaces/IAgentLLM.d.ts.map +1 -0
  29. package/dist/agents/interfaces/IAgentLLM.js +39 -0
  30. package/dist/agents/interfaces/IAgentLLM.js.map +1 -0
  31. package/dist/agents/interfaces/index.d.ts +10 -0
  32. package/dist/agents/interfaces/index.d.ts.map +1 -0
  33. package/dist/agents/interfaces/index.js +14 -0
  34. package/dist/agents/interfaces/index.js.map +1 -0
  35. package/dist/agents/n8n/N8nBaseAgent.d.ts +18 -0
  36. package/dist/agents/n8n/N8nBaseAgent.d.ts.map +1 -1
  37. package/dist/agents/n8n/N8nBaseAgent.js +80 -0
  38. package/dist/agents/n8n/N8nBaseAgent.js.map +1 -1
  39. package/dist/agents/pool/AgentPool.d.ts +112 -0
  40. package/dist/agents/pool/AgentPool.d.ts.map +1 -0
  41. package/dist/agents/pool/AgentPool.js +573 -0
  42. package/dist/agents/pool/AgentPool.js.map +1 -0
  43. package/dist/agents/pool/QEAgentPoolFactory.d.ts +118 -0
  44. package/dist/agents/pool/QEAgentPoolFactory.d.ts.map +1 -0
  45. package/dist/agents/pool/QEAgentPoolFactory.js +251 -0
  46. package/dist/agents/pool/QEAgentPoolFactory.js.map +1 -0
  47. package/dist/agents/pool/index.d.ts +34 -0
  48. package/dist/agents/pool/index.d.ts.map +1 -0
  49. package/dist/agents/pool/index.js +44 -0
  50. package/dist/agents/pool/index.js.map +1 -0
  51. package/dist/agents/pool/types.d.ts +227 -0
  52. package/dist/agents/pool/types.d.ts.map +1 -0
  53. package/dist/agents/pool/types.js +28 -0
  54. package/dist/agents/pool/types.js.map +1 -0
  55. package/dist/cli/commands/providers.d.ts +50 -0
  56. package/dist/cli/commands/providers.d.ts.map +1 -0
  57. package/dist/cli/commands/providers.js +403 -0
  58. package/dist/cli/commands/providers.js.map +1 -0
  59. package/dist/cli/index.js +62 -0
  60. package/dist/cli/index.js.map +1 -1
  61. package/dist/code-intelligence/indexing/FileWatcher.d.ts.map +1 -1
  62. package/dist/code-intelligence/indexing/FileWatcher.js +11 -8
  63. package/dist/code-intelligence/indexing/FileWatcher.js.map +1 -1
  64. package/dist/config/ConfigLoader.d.ts +85 -0
  65. package/dist/config/ConfigLoader.d.ts.map +1 -0
  66. package/dist/config/ConfigLoader.js +420 -0
  67. package/dist/config/ConfigLoader.js.map +1 -0
  68. package/dist/config/ProviderConfig.d.ts +153 -0
  69. package/dist/config/ProviderConfig.d.ts.map +1 -0
  70. package/dist/config/ProviderConfig.js +155 -0
  71. package/dist/config/ProviderConfig.js.map +1 -0
  72. package/dist/config/index.d.ts +35 -0
  73. package/dist/config/index.d.ts.map +1 -0
  74. package/dist/config/index.js +45 -0
  75. package/dist/config/index.js.map +1 -0
  76. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  77. package/dist/mcp/handlers/agent-spawn.d.ts +71 -5
  78. package/dist/mcp/handlers/agent-spawn.d.ts.map +1 -1
  79. package/dist/mcp/handlers/agent-spawn.js +336 -110
  80. package/dist/mcp/handlers/agent-spawn.js.map +1 -1
  81. package/dist/mcp/handlers/fleet-init.d.ts +24 -0
  82. package/dist/mcp/handlers/fleet-init.d.ts.map +1 -1
  83. package/dist/mcp/handlers/fleet-init.js +56 -4
  84. package/dist/mcp/handlers/fleet-init.js.map +1 -1
  85. package/dist/mcp/server-instructions.d.ts +1 -1
  86. package/dist/mcp/server-instructions.js +1 -1
  87. package/dist/mcp/server.d.ts +1 -0
  88. package/dist/mcp/server.d.ts.map +1 -1
  89. package/dist/memory/HNSWPatternStore.d.ts.map +1 -1
  90. package/dist/memory/HNSWPatternStore.js +23 -0
  91. package/dist/memory/HNSWPatternStore.js.map +1 -1
  92. package/dist/memory/RuVectorPatternStore.d.ts +5 -0
  93. package/dist/memory/RuVectorPatternStore.d.ts.map +1 -1
  94. package/dist/memory/RuVectorPatternStore.js +11 -0
  95. package/dist/memory/RuVectorPatternStore.js.map +1 -1
  96. package/dist/plugins/BasePlugin.d.ts +111 -0
  97. package/dist/plugins/BasePlugin.d.ts.map +1 -0
  98. package/dist/plugins/BasePlugin.js +154 -0
  99. package/dist/plugins/BasePlugin.js.map +1 -0
  100. package/dist/plugins/PluginManager.d.ts +145 -0
  101. package/dist/plugins/PluginManager.d.ts.map +1 -0
  102. package/dist/plugins/PluginManager.js +862 -0
  103. package/dist/plugins/PluginManager.js.map +1 -0
  104. package/dist/plugins/adapters/McpToolsPlugin.d.ts +98 -0
  105. package/dist/plugins/adapters/McpToolsPlugin.d.ts.map +1 -0
  106. package/dist/plugins/adapters/McpToolsPlugin.js +518 -0
  107. package/dist/plugins/adapters/McpToolsPlugin.js.map +1 -0
  108. package/dist/plugins/adapters/PlaywrightPlugin.d.ts +63 -0
  109. package/dist/plugins/adapters/PlaywrightPlugin.d.ts.map +1 -0
  110. package/dist/plugins/adapters/PlaywrightPlugin.js +451 -0
  111. package/dist/plugins/adapters/PlaywrightPlugin.js.map +1 -0
  112. package/dist/plugins/adapters/VitestPlugin.d.ts +74 -0
  113. package/dist/plugins/adapters/VitestPlugin.d.ts.map +1 -0
  114. package/dist/plugins/adapters/VitestPlugin.js +589 -0
  115. package/dist/plugins/adapters/VitestPlugin.js.map +1 -0
  116. package/dist/plugins/adapters/index.d.ts +8 -0
  117. package/dist/plugins/adapters/index.d.ts.map +1 -0
  118. package/dist/plugins/adapters/index.js +17 -0
  119. package/dist/plugins/adapters/index.js.map +1 -0
  120. package/dist/plugins/index.d.ts +32 -0
  121. package/dist/plugins/index.d.ts.map +1 -0
  122. package/dist/plugins/index.js +48 -0
  123. package/dist/plugins/index.js.map +1 -0
  124. package/dist/plugins/types.d.ts +528 -0
  125. package/dist/plugins/types.d.ts.map +1 -0
  126. package/dist/plugins/types.js +61 -0
  127. package/dist/plugins/types.js.map +1 -0
  128. package/dist/providers/CostOptimizationStrategies.d.ts +297 -0
  129. package/dist/providers/CostOptimizationStrategies.d.ts.map +1 -0
  130. package/dist/providers/CostOptimizationStrategies.js +831 -0
  131. package/dist/providers/CostOptimizationStrategies.js.map +1 -0
  132. package/dist/providers/HybridRouter.d.ts +142 -5
  133. package/dist/providers/HybridRouter.d.ts.map +1 -1
  134. package/dist/providers/HybridRouter.js +472 -6
  135. package/dist/providers/HybridRouter.js.map +1 -1
  136. package/dist/providers/HybridRouterComplexityIntegration.d.ts +169 -0
  137. package/dist/providers/HybridRouterComplexityIntegration.d.ts.map +1 -0
  138. package/dist/providers/HybridRouterComplexityIntegration.js +319 -0
  139. package/dist/providers/HybridRouterComplexityIntegration.js.map +1 -0
  140. package/dist/providers/HybridRouterModelSelection.d.ts +106 -0
  141. package/dist/providers/HybridRouterModelSelection.d.ts.map +1 -0
  142. package/dist/providers/HybridRouterModelSelection.js +420 -0
  143. package/dist/providers/HybridRouterModelSelection.js.map +1 -0
  144. package/dist/providers/LLMProviderFactory.d.ts +23 -9
  145. package/dist/providers/LLMProviderFactory.d.ts.map +1 -1
  146. package/dist/providers/LLMProviderFactory.js +54 -11
  147. package/dist/providers/LLMProviderFactory.js.map +1 -1
  148. package/dist/providers/OllamaProvider.d.ts +122 -0
  149. package/dist/providers/OllamaProvider.d.ts.map +1 -0
  150. package/dist/providers/OllamaProvider.js +425 -0
  151. package/dist/providers/OllamaProvider.js.map +1 -0
  152. package/dist/providers/index.d.ts +6 -1
  153. package/dist/providers/index.d.ts.map +1 -1
  154. package/dist/providers/index.js +17 -1
  155. package/dist/providers/index.js.map +1 -1
  156. package/dist/routing/ComplexityClassifier.d.ts +266 -0
  157. package/dist/routing/ComplexityClassifier.d.ts.map +1 -0
  158. package/dist/routing/ComplexityClassifier.js +567 -0
  159. package/dist/routing/ComplexityClassifier.js.map +1 -0
  160. package/dist/routing/ModelCapabilityRegistry.d.ts +98 -0
  161. package/dist/routing/ModelCapabilityRegistry.d.ts.map +1 -0
  162. package/dist/routing/ModelCapabilityRegistry.js +216 -0
  163. package/dist/routing/ModelCapabilityRegistry.js.map +1 -0
  164. package/dist/routing/index.d.ts +13 -0
  165. package/dist/routing/index.d.ts.map +1 -0
  166. package/dist/routing/index.js +24 -0
  167. package/dist/routing/index.js.map +1 -0
  168. package/docs/reference/model-capability-registry.md +402 -0
  169. package/docs/reference/provider-config-schema.md +608 -0
  170. 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":"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"}