agentic-qe 2.6.4 → 2.6.6

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 (182) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +26 -1
  3. package/dist/agents/CoverageAnalyzerAgent.d.ts +31 -0
  4. package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
  5. package/dist/agents/CoverageAnalyzerAgent.js +159 -0
  6. package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
  7. package/dist/agents/FleetCommanderAgent.d.ts +36 -0
  8. package/dist/agents/FleetCommanderAgent.d.ts.map +1 -1
  9. package/dist/agents/FleetCommanderAgent.js +226 -0
  10. package/dist/agents/FleetCommanderAgent.js.map +1 -1
  11. package/dist/cli/commands/kg/mincut.d.ts +50 -0
  12. package/dist/cli/commands/kg/mincut.d.ts.map +1 -0
  13. package/dist/cli/commands/kg/mincut.js +372 -0
  14. package/dist/cli/commands/kg/mincut.js.map +1 -0
  15. package/dist/cli/commands/providers/index.d.ts +20 -0
  16. package/dist/cli/commands/providers/index.d.ts.map +1 -0
  17. package/dist/cli/commands/providers/index.js +143 -0
  18. package/dist/cli/commands/providers/index.js.map +1 -0
  19. package/dist/cli/commands/providers/status.d.ts +117 -0
  20. package/dist/cli/commands/providers/status.d.ts.map +1 -0
  21. package/dist/cli/commands/providers/status.js +368 -0
  22. package/dist/cli/commands/providers/status.js.map +1 -0
  23. package/dist/cli/index.js +99 -62
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/cli/init/claude-config.js +2 -2
  26. package/dist/code-intelligence/analysis/mincut/CircularDependencyDetector.d.ts +148 -0
  27. package/dist/code-intelligence/analysis/mincut/CircularDependencyDetector.d.ts.map +1 -0
  28. package/dist/code-intelligence/analysis/mincut/CircularDependencyDetector.js +393 -0
  29. package/dist/code-intelligence/analysis/mincut/CircularDependencyDetector.js.map +1 -0
  30. package/dist/code-intelligence/analysis/mincut/GraphAdapter.d.ts +169 -0
  31. package/dist/code-intelligence/analysis/mincut/GraphAdapter.d.ts.map +1 -0
  32. package/dist/code-intelligence/analysis/mincut/GraphAdapter.js +335 -0
  33. package/dist/code-intelligence/analysis/mincut/GraphAdapter.js.map +1 -0
  34. package/dist/code-intelligence/analysis/mincut/JsMinCut.d.ts +55 -0
  35. package/dist/code-intelligence/analysis/mincut/JsMinCut.d.ts.map +1 -0
  36. package/dist/code-intelligence/analysis/mincut/JsMinCut.js +265 -0
  37. package/dist/code-intelligence/analysis/mincut/JsMinCut.js.map +1 -0
  38. package/dist/code-intelligence/analysis/mincut/MinCutAnalyzer.d.ts +92 -0
  39. package/dist/code-intelligence/analysis/mincut/MinCutAnalyzer.d.ts.map +1 -0
  40. package/dist/code-intelligence/analysis/mincut/MinCutAnalyzer.js +200 -0
  41. package/dist/code-intelligence/analysis/mincut/MinCutAnalyzer.js.map +1 -0
  42. package/dist/code-intelligence/analysis/mincut/ModuleCouplingAnalyzer.d.ts +157 -0
  43. package/dist/code-intelligence/analysis/mincut/ModuleCouplingAnalyzer.d.ts.map +1 -0
  44. package/dist/code-intelligence/analysis/mincut/ModuleCouplingAnalyzer.js +434 -0
  45. package/dist/code-intelligence/analysis/mincut/ModuleCouplingAnalyzer.js.map +1 -0
  46. package/dist/code-intelligence/analysis/mincut/index.d.ts +12 -0
  47. package/dist/code-intelligence/analysis/mincut/index.d.ts.map +1 -0
  48. package/dist/code-intelligence/analysis/mincut/index.js +20 -0
  49. package/dist/code-intelligence/analysis/mincut/index.js.map +1 -0
  50. package/dist/code-intelligence/analysis/mincut/types.d.ts +145 -0
  51. package/dist/code-intelligence/analysis/mincut/types.d.ts.map +1 -0
  52. package/dist/code-intelligence/analysis/mincut/types.js +16 -0
  53. package/dist/code-intelligence/analysis/mincut/types.js.map +1 -0
  54. package/dist/code-intelligence/chunking/ASTChunker.d.ts +1 -1
  55. package/dist/code-intelligence/chunking/ASTChunker.d.ts.map +1 -1
  56. package/dist/code-intelligence/chunking/ASTChunker.js +4 -4
  57. package/dist/code-intelligence/chunking/ASTChunker.js.map +1 -1
  58. package/dist/code-intelligence/graph/GraphBuilder.d.ts +120 -0
  59. package/dist/code-intelligence/graph/GraphBuilder.d.ts.map +1 -1
  60. package/dist/code-intelligence/graph/GraphBuilder.js +517 -0
  61. package/dist/code-intelligence/graph/GraphBuilder.js.map +1 -1
  62. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.d.ts.map +1 -1
  63. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.js +3 -3
  64. package/dist/code-intelligence/orchestrator/CodeIntelligenceOrchestrator.js.map +1 -1
  65. package/dist/code-intelligence/parser/{TreeSitterParser.d.ts → WebTreeSitterParser.d.ts} +45 -10
  66. package/dist/code-intelligence/parser/WebTreeSitterParser.d.ts.map +1 -0
  67. package/dist/code-intelligence/parser/{TreeSitterParser.js → WebTreeSitterParser.js} +147 -54
  68. package/dist/code-intelligence/parser/WebTreeSitterParser.js.map +1 -0
  69. package/dist/code-intelligence/parser/extractors/BaseExtractor.d.ts +12 -10
  70. package/dist/code-intelligence/parser/extractors/BaseExtractor.d.ts.map +1 -1
  71. package/dist/code-intelligence/parser/extractors/BaseExtractor.js +7 -3
  72. package/dist/code-intelligence/parser/extractors/BaseExtractor.js.map +1 -1
  73. package/dist/code-intelligence/parser/extractors/GoExtractor.d.ts +7 -5
  74. package/dist/code-intelligence/parser/extractors/GoExtractor.d.ts.map +1 -1
  75. package/dist/code-intelligence/parser/extractors/GoExtractor.js +2 -2
  76. package/dist/code-intelligence/parser/extractors/GoExtractor.js.map +1 -1
  77. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.d.ts +7 -5
  78. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.d.ts.map +1 -1
  79. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.js +2 -2
  80. package/dist/code-intelligence/parser/extractors/JavaScriptExtractor.js.map +1 -1
  81. package/dist/code-intelligence/parser/extractors/PythonExtractor.d.ts +7 -5
  82. package/dist/code-intelligence/parser/extractors/PythonExtractor.d.ts.map +1 -1
  83. package/dist/code-intelligence/parser/extractors/PythonExtractor.js +2 -2
  84. package/dist/code-intelligence/parser/extractors/PythonExtractor.js.map +1 -1
  85. package/dist/code-intelligence/parser/extractors/RustExtractor.d.ts +7 -5
  86. package/dist/code-intelligence/parser/extractors/RustExtractor.d.ts.map +1 -1
  87. package/dist/code-intelligence/parser/extractors/RustExtractor.js +2 -2
  88. package/dist/code-intelligence/parser/extractors/RustExtractor.js.map +1 -1
  89. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.d.ts +7 -5
  90. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.d.ts.map +1 -1
  91. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.js +2 -2
  92. package/dist/code-intelligence/parser/extractors/TypeScriptExtractor.js.map +1 -1
  93. package/dist/code-intelligence/parser/index.d.ts +7 -1
  94. package/dist/code-intelligence/parser/index.d.ts.map +1 -1
  95. package/dist/code-intelligence/parser/index.js +11 -3
  96. package/dist/code-intelligence/parser/index.js.map +1 -1
  97. package/dist/code-intelligence/service/CodeIntelligenceService.d.ts.map +1 -1
  98. package/dist/code-intelligence/service/CodeIntelligenceService.js +7 -5
  99. package/dist/code-intelligence/service/CodeIntelligenceService.js.map +1 -1
  100. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  101. package/dist/coverage/CriticalPathDetector.d.ts +240 -0
  102. package/dist/coverage/CriticalPathDetector.d.ts.map +1 -0
  103. package/dist/coverage/CriticalPathDetector.js +388 -0
  104. package/dist/coverage/CriticalPathDetector.js.map +1 -0
  105. package/dist/coverage/index.d.ts +13 -0
  106. package/dist/coverage/index.d.ts.map +1 -0
  107. package/dist/coverage/index.js +16 -0
  108. package/dist/coverage/index.js.map +1 -0
  109. package/dist/fleet/topology/SPOFMonitor.d.ts +181 -0
  110. package/dist/fleet/topology/SPOFMonitor.d.ts.map +1 -0
  111. package/dist/fleet/topology/SPOFMonitor.js +286 -0
  112. package/dist/fleet/topology/SPOFMonitor.js.map +1 -0
  113. package/dist/fleet/topology/TopologyMinCutAnalyzer.d.ts +87 -0
  114. package/dist/fleet/topology/TopologyMinCutAnalyzer.d.ts.map +1 -0
  115. package/dist/fleet/topology/TopologyMinCutAnalyzer.js +472 -0
  116. package/dist/fleet/topology/TopologyMinCutAnalyzer.js.map +1 -0
  117. package/dist/fleet/topology/index.d.ts +13 -0
  118. package/dist/fleet/topology/index.d.ts.map +1 -0
  119. package/dist/fleet/topology/index.js +20 -0
  120. package/dist/fleet/topology/index.js.map +1 -0
  121. package/dist/fleet/topology/types.d.ts +139 -0
  122. package/dist/fleet/topology/types.d.ts.map +1 -0
  123. package/dist/fleet/topology/types.js +19 -0
  124. package/dist/fleet/topology/types.js.map +1 -0
  125. package/dist/mcp/handlers/test/test-execute-parallel.d.ts +34 -3
  126. package/dist/mcp/handlers/test/test-execute-parallel.d.ts.map +1 -1
  127. package/dist/mcp/handlers/test/test-execute-parallel.js +120 -5
  128. package/dist/mcp/handlers/test/test-execute-parallel.js.map +1 -1
  129. package/dist/mcp/server-instructions.d.ts +2 -2
  130. package/dist/mcp/server-instructions.d.ts.map +1 -1
  131. package/dist/mcp/server-instructions.js +2 -2
  132. package/dist/monitoring/ProviderHealthMonitor.d.ts +195 -0
  133. package/dist/monitoring/ProviderHealthMonitor.d.ts.map +1 -0
  134. package/dist/monitoring/ProviderHealthMonitor.js +431 -0
  135. package/dist/monitoring/ProviderHealthMonitor.js.map +1 -0
  136. package/dist/monitoring/QuotaManager.d.ts +122 -0
  137. package/dist/monitoring/QuotaManager.d.ts.map +1 -0
  138. package/dist/monitoring/QuotaManager.js +351 -0
  139. package/dist/monitoring/QuotaManager.js.map +1 -0
  140. package/dist/providers/GitHubModelsProvider.d.ts +117 -0
  141. package/dist/providers/GitHubModelsProvider.d.ts.map +1 -0
  142. package/dist/providers/GitHubModelsProvider.js +464 -0
  143. package/dist/providers/GitHubModelsProvider.js.map +1 -0
  144. package/dist/providers/GroqProvider.d.ts +115 -0
  145. package/dist/providers/GroqProvider.d.ts.map +1 -0
  146. package/dist/providers/GroqProvider.js +443 -0
  147. package/dist/providers/GroqProvider.js.map +1 -0
  148. package/dist/providers/HybridRouterHealthIntegration.d.ts +191 -0
  149. package/dist/providers/HybridRouterHealthIntegration.d.ts.map +1 -0
  150. package/dist/providers/HybridRouterHealthIntegration.js +439 -0
  151. package/dist/providers/HybridRouterHealthIntegration.js.map +1 -0
  152. package/dist/providers/index.d.ts +6 -0
  153. package/dist/providers/index.d.ts.map +1 -1
  154. package/dist/providers/index.js +12 -1
  155. package/dist/providers/index.js.map +1 -1
  156. package/dist/test/partition/MinCutPartitioner.d.ts +97 -0
  157. package/dist/test/partition/MinCutPartitioner.d.ts.map +1 -0
  158. package/dist/test/partition/MinCutPartitioner.js +459 -0
  159. package/dist/test/partition/MinCutPartitioner.js.map +1 -0
  160. package/dist/test/partition/RealTestExecutor.d.ts +86 -0
  161. package/dist/test/partition/RealTestExecutor.d.ts.map +1 -0
  162. package/dist/test/partition/RealTestExecutor.js +279 -0
  163. package/dist/test/partition/RealTestExecutor.js.map +1 -0
  164. package/dist/test/partition/TestDependencyAnalyzer.d.ts +75 -0
  165. package/dist/test/partition/TestDependencyAnalyzer.d.ts.map +1 -0
  166. package/dist/test/partition/TestDependencyAnalyzer.js +297 -0
  167. package/dist/test/partition/TestDependencyAnalyzer.js.map +1 -0
  168. package/dist/test/partition/index.d.ts +10 -0
  169. package/dist/test/partition/index.d.ts.map +1 -0
  170. package/dist/test/partition/index.js +26 -0
  171. package/dist/test/partition/index.js.map +1 -0
  172. package/dist/test/partition/types.d.ts +120 -0
  173. package/dist/test/partition/types.d.ts.map +1 -0
  174. package/dist/test/partition/types.js +21 -0
  175. package/dist/test/partition/types.js.map +1 -0
  176. package/package.json +5 -8
  177. package/dist/cli/commands/providers.d.ts +0 -50
  178. package/dist/cli/commands/providers.d.ts.map +0 -1
  179. package/dist/cli/commands/providers.js +0 -403
  180. package/dist/cli/commands/providers.js.map +0 -1
  181. package/dist/code-intelligence/parser/TreeSitterParser.d.ts.map +0 -1
  182. package/dist/code-intelligence/parser/TreeSitterParser.js.map +0 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * ProviderHealthMonitor - Health monitoring and circuit breaker for LLM providers
3
+ *
4
+ * Monitors provider health with circuit breaker pattern to prevent cascading failures.
5
+ * Tracks response time, error rate, availability, and manages circuit state transitions.
6
+ *
7
+ * @module monitoring/ProviderHealthMonitor
8
+ * @version 1.0.0
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ import { LLMHealthStatus } from '../providers/ILLMProvider';
12
+ /**
13
+ * Configuration for health monitoring
14
+ */
15
+ export interface ProviderHealthConfig {
16
+ /** How often to check health (default: 30000ms) */
17
+ checkIntervalMs: number;
18
+ /** Health check timeout (default: 5000ms) */
19
+ timeoutMs: number;
20
+ /** Failures before circuit opens (default: 3) */
21
+ failureThreshold: number;
22
+ /** Time before retry after circuit opens (default: 60000ms) */
23
+ recoveryTimeMs: number;
24
+ /** Max latency considered healthy (default: 3000ms) */
25
+ healthyLatencyThresholdMs: number;
26
+ }
27
+ /**
28
+ * Current health state of a provider
29
+ */
30
+ export interface ProviderHealthState {
31
+ providerId: string;
32
+ healthy: boolean;
33
+ latency: number;
34
+ errorRate: number;
35
+ availability: number;
36
+ consecutiveFailures: number;
37
+ circuitState: 'closed' | 'open' | 'half-open';
38
+ lastCheck: Date;
39
+ lastError?: string;
40
+ checkCount: number;
41
+ successCount: number;
42
+ }
43
+ /**
44
+ * Result of a single health check
45
+ */
46
+ export interface HealthCheckResult {
47
+ providerId: string;
48
+ healthy: boolean;
49
+ latency: number;
50
+ timestamp: Date;
51
+ error?: string;
52
+ }
53
+ /**
54
+ * ProviderHealthMonitor - Monitors LLM provider health with circuit breaker pattern
55
+ *
56
+ * Features:
57
+ * - Automatic health checks at configurable intervals
58
+ * - Circuit breaker pattern (closed → open → half-open → closed)
59
+ * - Error rate and availability tracking with sliding window
60
+ * - Event emission for health changes and circuit state transitions
61
+ * - Concurrent health checks with timeout protection
62
+ * - Manual circuit control (force open, reset)
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const monitor = new ProviderHealthMonitor({
67
+ * checkIntervalMs: 30000,
68
+ * failureThreshold: 3
69
+ * });
70
+ *
71
+ * monitor.registerProvider('ollama', async () => {
72
+ * return await ollamaProvider.healthCheck();
73
+ * });
74
+ *
75
+ * monitor.on('health-change', (data) => {
76
+ * console.log(`Provider ${data.providerId} health: ${data.healthy}`);
77
+ * });
78
+ *
79
+ * monitor.startMonitoring();
80
+ * ```
81
+ */
82
+ export declare class ProviderHealthMonitor extends EventEmitter {
83
+ private readonly logger;
84
+ private readonly config;
85
+ private providers;
86
+ private monitoringInterval?;
87
+ private isMonitoring;
88
+ constructor(config?: Partial<ProviderHealthConfig>);
89
+ /**
90
+ * Register a provider for health monitoring
91
+ *
92
+ * @param providerId - Unique identifier for the provider
93
+ * @param healthCheckFn - Function that returns provider health status
94
+ */
95
+ registerProvider(providerId: string, healthCheckFn: () => Promise<LLMHealthStatus>): void;
96
+ /**
97
+ * Unregister a provider from health monitoring
98
+ *
99
+ * @param providerId - Provider to unregister
100
+ */
101
+ unregisterProvider(providerId: string): void;
102
+ /**
103
+ * Start automatic health monitoring
104
+ *
105
+ * Begins periodic health checks for all registered providers.
106
+ */
107
+ startMonitoring(): void;
108
+ /**
109
+ * Stop automatic health monitoring
110
+ */
111
+ stopMonitoring(): void;
112
+ /**
113
+ * Check health of a specific provider
114
+ *
115
+ * @param providerId - Provider to check
116
+ * @returns Health check result
117
+ */
118
+ checkProviderHealth(providerId: string): Promise<HealthCheckResult>;
119
+ /**
120
+ * Check health of all registered providers concurrently
121
+ *
122
+ * @returns Array of health check results
123
+ */
124
+ checkAllProviders(): Promise<HealthCheckResult[]>;
125
+ /**
126
+ * Get current health state of a provider
127
+ *
128
+ * @param providerId - Provider to query
129
+ * @returns Current health state or undefined if not registered
130
+ */
131
+ getProviderHealth(providerId: string): ProviderHealthState | undefined;
132
+ /**
133
+ * Get health state of all registered providers
134
+ *
135
+ * @returns Map of provider IDs to health states
136
+ */
137
+ getAllProviderHealth(): Map<string, ProviderHealthState>;
138
+ /**
139
+ * Get list of healthy providers
140
+ *
141
+ * @returns Array of provider IDs that are currently healthy
142
+ */
143
+ getHealthyProviders(): string[];
144
+ /**
145
+ * Check if a specific provider is healthy
146
+ *
147
+ * @param providerId - Provider to check
148
+ * @returns True if provider is healthy and circuit is closed
149
+ */
150
+ isProviderHealthy(providerId: string): boolean;
151
+ /**
152
+ * Get current circuit breaker state for a provider
153
+ *
154
+ * @param providerId - Provider to query
155
+ * @returns Circuit state or 'closed' if not registered
156
+ */
157
+ getCircuitState(providerId: string): 'closed' | 'open' | 'half-open';
158
+ /**
159
+ * Manually force a circuit to open
160
+ *
161
+ * Useful for maintenance or emergency situations.
162
+ *
163
+ * @param providerId - Provider to open circuit for
164
+ */
165
+ forceCircuitOpen(providerId: string): void;
166
+ /**
167
+ * Reset circuit breaker to closed state
168
+ *
169
+ * Useful for manual recovery or testing.
170
+ *
171
+ * @param providerId - Provider to reset
172
+ */
173
+ resetCircuit(providerId: string): void;
174
+ /**
175
+ * Update provider state based on health check result
176
+ */
177
+ private updateProviderState;
178
+ /**
179
+ * Handle successful health check
180
+ */
181
+ private handleSuccessfulCheck;
182
+ /**
183
+ * Handle failed health check
184
+ */
185
+ private handleFailedCheck;
186
+ /**
187
+ * Transition circuit breaker state
188
+ */
189
+ private transitionCircuitState;
190
+ /**
191
+ * Execute a promise with timeout
192
+ */
193
+ private withTimeout;
194
+ }
195
+ //# sourceMappingURL=ProviderHealthMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderHealthMonitor.d.ts","sourceRoot":"","sources":["../../src/monitoring/ProviderHealthMonitor.ts"],"names":[],"mappings":"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"}
@@ -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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"}