agentic-qe 2.6.3 → 2.6.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +26 -1
  3. package/dist/cli/commands/providers/index.d.ts +20 -0
  4. package/dist/cli/commands/providers/index.d.ts.map +1 -0
  5. package/dist/cli/commands/providers/index.js +143 -0
  6. package/dist/cli/commands/providers/index.js.map +1 -0
  7. package/dist/cli/commands/providers/status.d.ts +117 -0
  8. package/dist/cli/commands/providers/status.d.ts.map +1 -0
  9. package/dist/cli/commands/providers/status.js +368 -0
  10. package/dist/cli/commands/providers/status.js.map +1 -0
  11. package/dist/cli/index.js +8 -62
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  14. package/dist/mcp/server-instructions.d.ts +1 -1
  15. package/dist/mcp/server-instructions.js +1 -1
  16. package/dist/monitoring/ProviderHealthMonitor.d.ts +195 -0
  17. package/dist/monitoring/ProviderHealthMonitor.d.ts.map +1 -0
  18. package/dist/monitoring/ProviderHealthMonitor.js +431 -0
  19. package/dist/monitoring/ProviderHealthMonitor.js.map +1 -0
  20. package/dist/monitoring/QuotaManager.d.ts +122 -0
  21. package/dist/monitoring/QuotaManager.d.ts.map +1 -0
  22. package/dist/monitoring/QuotaManager.js +351 -0
  23. package/dist/monitoring/QuotaManager.js.map +1 -0
  24. package/dist/providers/GitHubModelsProvider.d.ts +117 -0
  25. package/dist/providers/GitHubModelsProvider.d.ts.map +1 -0
  26. package/dist/providers/GitHubModelsProvider.js +464 -0
  27. package/dist/providers/GitHubModelsProvider.js.map +1 -0
  28. package/dist/providers/GroqProvider.d.ts +115 -0
  29. package/dist/providers/GroqProvider.d.ts.map +1 -0
  30. package/dist/providers/GroqProvider.js +443 -0
  31. package/dist/providers/GroqProvider.js.map +1 -0
  32. package/dist/providers/HybridRouterHealthIntegration.d.ts +191 -0
  33. package/dist/providers/HybridRouterHealthIntegration.d.ts.map +1 -0
  34. package/dist/providers/HybridRouterHealthIntegration.js +439 -0
  35. package/dist/providers/HybridRouterHealthIntegration.js.map +1 -0
  36. package/dist/providers/index.d.ts +6 -0
  37. package/dist/providers/index.d.ts.map +1 -1
  38. package/dist/providers/index.js +12 -1
  39. package/dist/providers/index.js.map +1 -1
  40. package/package.json +3 -2
  41. package/dist/cli/commands/providers.d.ts +0 -50
  42. package/dist/cli/commands/providers.d.ts.map +0 -1
  43. package/dist/cli/commands/providers.js +0 -403
  44. package/dist/cli/commands/providers.js.map +0 -1
@@ -0,0 +1,431 @@
1
+ "use strict";
2
+ /**
3
+ * ProviderHealthMonitor - Health monitoring and circuit breaker for LLM providers
4
+ *
5
+ * Monitors provider health with circuit breaker pattern to prevent cascading failures.
6
+ * Tracks response time, error rate, availability, and manages circuit state transitions.
7
+ *
8
+ * @module monitoring/ProviderHealthMonitor
9
+ * @version 1.0.0
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProviderHealthMonitor = void 0;
13
+ const events_1 = require("events");
14
+ const Logger_1 = require("../utils/Logger");
15
+ /**
16
+ * Default configuration values
17
+ */
18
+ const DEFAULT_CONFIG = {
19
+ checkIntervalMs: 30000,
20
+ timeoutMs: 5000,
21
+ failureThreshold: 3,
22
+ recoveryTimeMs: 60000,
23
+ healthyLatencyThresholdMs: 3000
24
+ };
25
+ /**
26
+ * ProviderHealthMonitor - Monitors LLM provider health with circuit breaker pattern
27
+ *
28
+ * Features:
29
+ * - Automatic health checks at configurable intervals
30
+ * - Circuit breaker pattern (closed → open → half-open → closed)
31
+ * - Error rate and availability tracking with sliding window
32
+ * - Event emission for health changes and circuit state transitions
33
+ * - Concurrent health checks with timeout protection
34
+ * - Manual circuit control (force open, reset)
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const monitor = new ProviderHealthMonitor({
39
+ * checkIntervalMs: 30000,
40
+ * failureThreshold: 3
41
+ * });
42
+ *
43
+ * monitor.registerProvider('ollama', async () => {
44
+ * return await ollamaProvider.healthCheck();
45
+ * });
46
+ *
47
+ * monitor.on('health-change', (data) => {
48
+ * console.log(`Provider ${data.providerId} health: ${data.healthy}`);
49
+ * });
50
+ *
51
+ * monitor.startMonitoring();
52
+ * ```
53
+ */
54
+ class ProviderHealthMonitor extends events_1.EventEmitter {
55
+ constructor(config) {
56
+ super();
57
+ this.logger = Logger_1.Logger.getInstance();
58
+ this.config = { ...DEFAULT_CONFIG, ...config };
59
+ this.providers = new Map();
60
+ this.isMonitoring = false;
61
+ this.logger.debug('ProviderHealthMonitor initialized', { config: this.config });
62
+ }
63
+ /**
64
+ * Register a provider for health monitoring
65
+ *
66
+ * @param providerId - Unique identifier for the provider
67
+ * @param healthCheckFn - Function that returns provider health status
68
+ */
69
+ registerProvider(providerId, healthCheckFn) {
70
+ if (this.providers.has(providerId)) {
71
+ this.logger.warn(`Provider ${providerId} already registered, replacing`);
72
+ }
73
+ const state = {
74
+ providerId,
75
+ healthy: true,
76
+ latency: 0,
77
+ errorRate: 0,
78
+ availability: 1.0,
79
+ consecutiveFailures: 0,
80
+ circuitState: 'closed',
81
+ lastCheck: new Date(),
82
+ checkCount: 0,
83
+ successCount: 0
84
+ };
85
+ this.providers.set(providerId, {
86
+ providerId,
87
+ healthCheckFn,
88
+ state
89
+ });
90
+ this.logger.info(`Provider ${providerId} registered for health monitoring`);
91
+ }
92
+ /**
93
+ * Unregister a provider from health monitoring
94
+ *
95
+ * @param providerId - Provider to unregister
96
+ */
97
+ unregisterProvider(providerId) {
98
+ if (!this.providers.has(providerId)) {
99
+ this.logger.warn(`Provider ${providerId} not registered`);
100
+ return;
101
+ }
102
+ this.providers.delete(providerId);
103
+ this.logger.info(`Provider ${providerId} unregistered from health monitoring`);
104
+ }
105
+ /**
106
+ * Start automatic health monitoring
107
+ *
108
+ * Begins periodic health checks for all registered providers.
109
+ */
110
+ startMonitoring() {
111
+ if (this.isMonitoring) {
112
+ this.logger.warn('Health monitoring already started');
113
+ return;
114
+ }
115
+ this.isMonitoring = true;
116
+ // Perform immediate check on start
117
+ this.checkAllProviders().catch(error => {
118
+ this.logger.error('Initial health check failed', { error: error.message });
119
+ });
120
+ // Schedule periodic checks
121
+ this.monitoringInterval = setInterval(() => {
122
+ this.checkAllProviders().catch(error => {
123
+ this.logger.error('Periodic health check failed', { error: error.message });
124
+ });
125
+ }, this.config.checkIntervalMs);
126
+ this.logger.info('Health monitoring started', {
127
+ interval: this.config.checkIntervalMs,
128
+ providers: Array.from(this.providers.keys())
129
+ });
130
+ }
131
+ /**
132
+ * Stop automatic health monitoring
133
+ */
134
+ stopMonitoring() {
135
+ if (!this.isMonitoring) {
136
+ this.logger.warn('Health monitoring not started');
137
+ return;
138
+ }
139
+ if (this.monitoringInterval) {
140
+ clearInterval(this.monitoringInterval);
141
+ this.monitoringInterval = undefined;
142
+ }
143
+ this.isMonitoring = false;
144
+ this.logger.info('Health monitoring stopped');
145
+ }
146
+ /**
147
+ * Check health of a specific provider
148
+ *
149
+ * @param providerId - Provider to check
150
+ * @returns Health check result
151
+ */
152
+ async checkProviderHealth(providerId) {
153
+ const provider = this.providers.get(providerId);
154
+ if (!provider) {
155
+ throw new Error(`Provider ${providerId} not registered`);
156
+ }
157
+ const startTime = Date.now();
158
+ let result;
159
+ try {
160
+ // Check if circuit is open and recovery time has passed
161
+ if (provider.state.circuitState === 'open') {
162
+ const timeSinceOpen = Date.now() - (provider.circuitOpenedAt?.getTime() || 0);
163
+ if (timeSinceOpen >= this.config.recoveryTimeMs) {
164
+ // Transition to half-open for retry
165
+ this.transitionCircuitState(provider, 'half-open');
166
+ }
167
+ else {
168
+ // Circuit still open, fail fast
169
+ result = {
170
+ providerId,
171
+ healthy: false,
172
+ latency: 0,
173
+ timestamp: new Date(),
174
+ error: 'Circuit breaker is open'
175
+ };
176
+ this.updateProviderState(provider, result);
177
+ return result;
178
+ }
179
+ }
180
+ // Perform health check with timeout
181
+ const healthStatus = await this.withTimeout(provider.healthCheckFn(), this.config.timeoutMs, `Health check timeout for ${providerId}`);
182
+ const latency = Date.now() - startTime;
183
+ // Evaluate health based on response and latency
184
+ const healthy = healthStatus.healthy &&
185
+ latency < this.config.healthyLatencyThresholdMs;
186
+ result = {
187
+ providerId,
188
+ healthy,
189
+ latency,
190
+ timestamp: new Date(),
191
+ error: healthStatus.error
192
+ };
193
+ // Update state and handle circuit breaker logic
194
+ this.updateProviderState(provider, result);
195
+ if (result.healthy) {
196
+ this.handleSuccessfulCheck(provider);
197
+ }
198
+ else {
199
+ this.handleFailedCheck(provider, result.error);
200
+ }
201
+ return result;
202
+ }
203
+ catch (error) {
204
+ const latency = Date.now() - startTime;
205
+ const errorMessage = error.message;
206
+ result = {
207
+ providerId,
208
+ healthy: false,
209
+ latency,
210
+ timestamp: new Date(),
211
+ error: errorMessage
212
+ };
213
+ this.updateProviderState(provider, result);
214
+ this.handleFailedCheck(provider, errorMessage);
215
+ return result;
216
+ }
217
+ }
218
+ /**
219
+ * Check health of all registered providers concurrently
220
+ *
221
+ * @returns Array of health check results
222
+ */
223
+ async checkAllProviders() {
224
+ if (this.providers.size === 0) {
225
+ this.logger.warn('No providers registered for health check');
226
+ return [];
227
+ }
228
+ const providerIds = Array.from(this.providers.keys());
229
+ const results = await Promise.all(providerIds.map(id => this.checkProviderHealth(id)));
230
+ this.logger.debug('Completed health check for all providers', {
231
+ total: results.length,
232
+ healthy: results.filter(r => r.healthy).length,
233
+ unhealthy: results.filter(r => !r.healthy).length
234
+ });
235
+ return results;
236
+ }
237
+ /**
238
+ * Get current health state of a provider
239
+ *
240
+ * @param providerId - Provider to query
241
+ * @returns Current health state or undefined if not registered
242
+ */
243
+ getProviderHealth(providerId) {
244
+ const provider = this.providers.get(providerId);
245
+ return provider ? { ...provider.state } : undefined;
246
+ }
247
+ /**
248
+ * Get health state of all registered providers
249
+ *
250
+ * @returns Map of provider IDs to health states
251
+ */
252
+ getAllProviderHealth() {
253
+ const healthMap = new Map();
254
+ for (const [id, provider] of this.providers.entries()) {
255
+ healthMap.set(id, { ...provider.state });
256
+ }
257
+ return healthMap;
258
+ }
259
+ /**
260
+ * Get list of healthy providers
261
+ *
262
+ * @returns Array of provider IDs that are currently healthy
263
+ */
264
+ getHealthyProviders() {
265
+ return Array.from(this.providers.entries())
266
+ .filter(([_, provider]) => provider.state.healthy && provider.state.circuitState === 'closed')
267
+ .map(([id, _]) => id);
268
+ }
269
+ /**
270
+ * Check if a specific provider is healthy
271
+ *
272
+ * @param providerId - Provider to check
273
+ * @returns True if provider is healthy and circuit is closed
274
+ */
275
+ isProviderHealthy(providerId) {
276
+ const provider = this.providers.get(providerId);
277
+ if (!provider) {
278
+ return false;
279
+ }
280
+ return provider.state.healthy && provider.state.circuitState === 'closed';
281
+ }
282
+ /**
283
+ * Get current circuit breaker state for a provider
284
+ *
285
+ * @param providerId - Provider to query
286
+ * @returns Circuit state or 'closed' if not registered
287
+ */
288
+ getCircuitState(providerId) {
289
+ const provider = this.providers.get(providerId);
290
+ return provider?.state.circuitState || 'closed';
291
+ }
292
+ /**
293
+ * Manually force a circuit to open
294
+ *
295
+ * Useful for maintenance or emergency situations.
296
+ *
297
+ * @param providerId - Provider to open circuit for
298
+ */
299
+ forceCircuitOpen(providerId) {
300
+ const provider = this.providers.get(providerId);
301
+ if (!provider) {
302
+ throw new Error(`Provider ${providerId} not registered`);
303
+ }
304
+ const previousState = provider.state.circuitState;
305
+ this.transitionCircuitState(provider, 'open');
306
+ provider.circuitOpenedAt = new Date();
307
+ this.logger.warn(`Circuit manually forced open for provider ${providerId}`, {
308
+ previousState
309
+ });
310
+ }
311
+ /**
312
+ * Reset circuit breaker to closed state
313
+ *
314
+ * Useful for manual recovery or testing.
315
+ *
316
+ * @param providerId - Provider to reset
317
+ */
318
+ resetCircuit(providerId) {
319
+ const provider = this.providers.get(providerId);
320
+ if (!provider) {
321
+ throw new Error(`Provider ${providerId} not registered`);
322
+ }
323
+ const previousState = provider.state.circuitState;
324
+ provider.state.consecutiveFailures = 0;
325
+ provider.circuitOpenedAt = undefined;
326
+ this.transitionCircuitState(provider, 'closed');
327
+ this.logger.info(`Circuit reset for provider ${providerId}`, {
328
+ previousState
329
+ });
330
+ }
331
+ /**
332
+ * Update provider state based on health check result
333
+ */
334
+ updateProviderState(provider, result) {
335
+ const prevHealthy = provider.state.healthy;
336
+ provider.state.healthy = result.healthy;
337
+ provider.state.latency = result.latency;
338
+ provider.state.lastCheck = result.timestamp;
339
+ provider.state.lastError = result.error;
340
+ provider.state.checkCount++;
341
+ if (result.healthy) {
342
+ provider.state.successCount++;
343
+ }
344
+ // Calculate error rate (last 100 checks)
345
+ const recentWindow = Math.min(provider.state.checkCount, 100);
346
+ const recentSuccesses = Math.min(provider.state.successCount, recentWindow);
347
+ provider.state.errorRate = 1 - (recentSuccesses / recentWindow);
348
+ // Calculate availability (all-time)
349
+ provider.state.availability = provider.state.successCount / provider.state.checkCount;
350
+ // Emit health change event if status changed
351
+ if (prevHealthy !== result.healthy) {
352
+ this.emit('health-change', {
353
+ providerId: provider.providerId,
354
+ healthy: result.healthy,
355
+ previousHealthy: prevHealthy,
356
+ errorRate: provider.state.errorRate,
357
+ availability: provider.state.availability,
358
+ latency: result.latency,
359
+ timestamp: result.timestamp
360
+ });
361
+ }
362
+ }
363
+ /**
364
+ * Handle successful health check
365
+ */
366
+ handleSuccessfulCheck(provider) {
367
+ // Reset consecutive failures on success
368
+ provider.state.consecutiveFailures = 0;
369
+ // If circuit was half-open, close it
370
+ if (provider.state.circuitState === 'half-open') {
371
+ this.transitionCircuitState(provider, 'closed');
372
+ provider.circuitOpenedAt = undefined;
373
+ this.logger.info(`Circuit closed for provider ${provider.providerId} after successful recovery`);
374
+ }
375
+ }
376
+ /**
377
+ * Handle failed health check
378
+ */
379
+ handleFailedCheck(provider, error) {
380
+ provider.state.consecutiveFailures++;
381
+ this.logger.warn(`Health check failed for provider ${provider.providerId}`, {
382
+ consecutiveFailures: provider.state.consecutiveFailures,
383
+ failureThreshold: this.config.failureThreshold,
384
+ error
385
+ });
386
+ // Open circuit if failure threshold exceeded
387
+ if (provider.state.consecutiveFailures >= this.config.failureThreshold &&
388
+ provider.state.circuitState !== 'open') {
389
+ this.transitionCircuitState(provider, 'open');
390
+ provider.circuitOpenedAt = new Date();
391
+ this.logger.error(`Circuit opened for provider ${provider.providerId}`, {
392
+ consecutiveFailures: provider.state.consecutiveFailures,
393
+ failureThreshold: this.config.failureThreshold
394
+ });
395
+ }
396
+ }
397
+ /**
398
+ * Transition circuit breaker state
399
+ */
400
+ transitionCircuitState(provider, newState) {
401
+ const prevState = provider.state.circuitState;
402
+ provider.state.circuitState = newState;
403
+ // Emit circuit change event
404
+ this.emit('circuit-change', {
405
+ providerId: provider.providerId,
406
+ circuitState: newState,
407
+ previousState: prevState,
408
+ consecutiveFailures: provider.state.consecutiveFailures,
409
+ timestamp: new Date()
410
+ });
411
+ }
412
+ /**
413
+ * Execute a promise with timeout
414
+ */
415
+ async withTimeout(promise, timeoutMs, errorMessage) {
416
+ let timeoutHandle;
417
+ const timeoutPromise = new Promise((_, reject) => {
418
+ timeoutHandle = setTimeout(() => {
419
+ reject(new Error(errorMessage));
420
+ }, timeoutMs);
421
+ });
422
+ try {
423
+ return await Promise.race([promise, timeoutPromise]);
424
+ }
425
+ finally {
426
+ clearTimeout(timeoutHandle);
427
+ }
428
+ }
429
+ }
430
+ exports.ProviderHealthMonitor = ProviderHealthMonitor;
431
+ //# sourceMappingURL=ProviderHealthMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderHealthMonitor.js","sourceRoot":"","sources":["../../src/monitoring/ProviderHealthMonitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * Quota configuration for a specific LLM provider
4
+ */
5
+ export interface ProviderQuota {
6
+ providerId: string;
7
+ dailyLimit: number;
8
+ minuteLimit?: number;
9
+ resetTimeUtc: string;
10
+ warningThresholds: number[];
11
+ }
12
+ /**
13
+ * Current quota status for a provider
14
+ */
15
+ export interface QuotaStatus {
16
+ providerId: string;
17
+ dailyUsed: number;
18
+ dailyRemaining: number;
19
+ dailyLimit: number;
20
+ minuteUsed: number;
21
+ minuteRemaining: number;
22
+ minuteLimit: number;
23
+ percentageUsed: number;
24
+ nextResetTime: Date;
25
+ isExhausted: boolean;
26
+ warningLevel: 'none' | 'warning' | 'critical' | 'exhausted';
27
+ }
28
+ /**
29
+ * Configuration for QuotaManager
30
+ */
31
+ export interface QuotaManagerConfig {
32
+ providers: ProviderQuota[];
33
+ enforcementMode: 'warn' | 'block' | 'none';
34
+ alertCallback?: (status: QuotaStatus) => void;
35
+ persistState?: boolean;
36
+ }
37
+ /**
38
+ * Manages quota tracking and enforcement across LLM providers
39
+ */
40
+ export declare class QuotaManager extends EventEmitter {
41
+ private config;
42
+ private quotas;
43
+ private usage;
44
+ private resetTimers;
45
+ private cleanupInterval?;
46
+ constructor(config: QuotaManagerConfig);
47
+ /**
48
+ * Register a new provider with quota limits
49
+ */
50
+ registerProvider(quota: ProviderQuota): void;
51
+ /**
52
+ * Update quota configuration for a provider
53
+ */
54
+ updateQuota(providerId: string, updates: Partial<ProviderQuota>): void;
55
+ /**
56
+ * Record a single request for a provider
57
+ */
58
+ recordRequest(providerId: string): void;
59
+ /**
60
+ * Record multiple requests for a provider
61
+ */
62
+ recordRequests(providerId: string, count: number): void;
63
+ /**
64
+ * Check if a request can be made without exceeding quota
65
+ */
66
+ canMakeRequest(providerId: string): boolean;
67
+ /**
68
+ * Get remaining quota for a provider
69
+ */
70
+ getRemainingQuota(providerId: string): {
71
+ daily: number;
72
+ minute: number;
73
+ };
74
+ /**
75
+ * Get current quota status for a provider
76
+ */
77
+ getQuotaStatus(providerId: string): QuotaStatus | undefined;
78
+ /**
79
+ * Get quota status for all providers
80
+ */
81
+ getAllQuotaStatus(): Map<string, QuotaStatus>;
82
+ /**
83
+ * Reset daily quota for a provider
84
+ */
85
+ resetDailyQuota(providerId: string): void;
86
+ /**
87
+ * Reset daily quotas for all providers
88
+ */
89
+ resetAllDailyQuotas(): void;
90
+ /**
91
+ * Start automatic quota reset scheduling
92
+ */
93
+ startAutoReset(): void;
94
+ /**
95
+ * Stop automatic quota reset scheduling
96
+ */
97
+ stopAutoReset(): void;
98
+ /**
99
+ * Stop cleanup interval (alias for use in CLI commands)
100
+ */
101
+ stopCleanup(): void;
102
+ /**
103
+ * Save current state for persistence
104
+ */
105
+ saveState(): void;
106
+ /**
107
+ * Load persisted state
108
+ */
109
+ loadState(): void;
110
+ private scheduleNextReset;
111
+ private getMinuteUsage;
112
+ private cleanupOldMinuteEntries;
113
+ private cleanupMinuteWindows;
114
+ private determineWarningLevel;
115
+ private checkThresholds;
116
+ private calculateNextResetTime;
117
+ }
118
+ /**
119
+ * Factory function to create QuotaManager with common provider presets
120
+ */
121
+ export declare function createQuotaManager(config?: Partial<QuotaManagerConfig>): QuotaManager;
122
+ //# sourceMappingURL=QuotaManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuotaManager.d.ts","sourceRoot":"","sources":["../../src/monitoring/QuotaManager.ts"],"names":[],"mappings":"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"}