buildhive-agent 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -0
- package/dist/__tests__/fakes/FakeDockerManager.d.ts +115 -0
- package/dist/__tests__/fakes/FakeDockerManager.d.ts.map +1 -0
- package/dist/__tests__/fakes/FakeDockerManager.js +203 -0
- package/dist/__tests__/fakes/FakeDockerManager.js.map +1 -0
- package/dist/acceptanceChecker.d.ts +26 -0
- package/dist/acceptanceChecker.d.ts.map +1 -0
- package/dist/acceptanceChecker.js +64 -0
- package/dist/acceptanceChecker.js.map +1 -0
- package/dist/advancedAgent.d.ts +161 -0
- package/dist/advancedAgent.d.ts.map +1 -0
- package/dist/advancedAgent.js +604 -0
- package/dist/advancedAgent.js.map +1 -0
- package/dist/agent.d.ts +101 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +490 -0
- package/dist/agent.js.map +1 -0
- package/dist/api/jobStatusApi.d.ts +88 -0
- package/dist/api/jobStatusApi.d.ts.map +1 -0
- package/dist/api/jobStatusApi.js +240 -0
- package/dist/api/jobStatusApi.js.map +1 -0
- package/dist/autoUpdater.d.ts +135 -0
- package/dist/autoUpdater.d.ts.map +1 -0
- package/dist/autoUpdater.js +494 -0
- package/dist/autoUpdater.js.map +1 -0
- package/dist/cacheManager.d.ts +108 -0
- package/dist/cacheManager.d.ts.map +1 -0
- package/dist/cacheManager.js +300 -0
- package/dist/cacheManager.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +30 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +35 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +45 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +269 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +193 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +90 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +28 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +397 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/docker.d.ts +96 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +411 -0
- package/dist/docker.js.map +1 -0
- package/dist/enhancedJobExecutor.d.ts +81 -0
- package/dist/enhancedJobExecutor.d.ts.map +1 -0
- package/dist/enhancedJobExecutor.js +223 -0
- package/dist/enhancedJobExecutor.js.map +1 -0
- package/dist/executors/executorFactory.d.ts +46 -0
- package/dist/executors/executorFactory.d.ts.map +1 -0
- package/dist/executors/executorFactory.js +80 -0
- package/dist/executors/executorFactory.js.map +1 -0
- package/dist/executors/index.d.ts +7 -0
- package/dist/executors/index.d.ts.map +1 -0
- package/dist/executors/index.js +6 -0
- package/dist/executors/index.js.map +1 -0
- package/dist/executors/nativeExecutor.d.ts +60 -0
- package/dist/executors/nativeExecutor.d.ts.map +1 -0
- package/dist/executors/nativeExecutor.js +311 -0
- package/dist/executors/nativeExecutor.js.map +1 -0
- package/dist/executors/types.d.ts +38 -0
- package/dist/executors/types.d.ts.map +1 -0
- package/dist/executors/types.js +9 -0
- package/dist/executors/types.js.map +1 -0
- package/dist/healthMonitor.d.ts +213 -0
- package/dist/healthMonitor.d.ts.map +1 -0
- package/dist/healthMonitor.js +547 -0
- package/dist/healthMonitor.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/jobExecutor.d.ts +117 -0
- package/dist/jobExecutor.d.ts.map +1 -0
- package/dist/jobExecutor.js +458 -0
- package/dist/jobExecutor.js.map +1 -0
- package/dist/lifecycleExecutor.d.ts +54 -0
- package/dist/lifecycleExecutor.d.ts.map +1 -0
- package/dist/lifecycleExecutor.js +230 -0
- package/dist/lifecycleExecutor.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +77 -0
- package/dist/main.js.map +1 -0
- package/dist/metrics.d.ts +103 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +360 -0
- package/dist/metrics.js.map +1 -0
- package/dist/recipes/builtinRecipes.d.ts +11 -0
- package/dist/recipes/builtinRecipes.d.ts.map +1 -0
- package/dist/recipes/builtinRecipes.js +688 -0
- package/dist/recipes/builtinRecipes.js.map +1 -0
- package/dist/recipes/index.d.ts +18 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +17 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/recipeRegistry.d.ts +49 -0
- package/dist/recipes/recipeRegistry.d.ts.map +1 -0
- package/dist/recipes/recipeRegistry.js +264 -0
- package/dist/recipes/recipeRegistry.js.map +1 -0
- package/dist/recipes/types.d.ts +116 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +10 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/recovery.d.ts +133 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +299 -0
- package/dist/recovery.js.map +1 -0
- package/dist/registration/apiClient.d.ts +44 -0
- package/dist/registration/apiClient.d.ts.map +1 -0
- package/dist/registration/apiClient.js +149 -0
- package/dist/registration/apiClient.js.map +1 -0
- package/dist/registration/index.d.ts +41 -0
- package/dist/registration/index.d.ts.map +1 -0
- package/dist/registration/index.js +141 -0
- package/dist/registration/index.js.map +1 -0
- package/dist/registration/machineId.d.ts +30 -0
- package/dist/registration/machineId.d.ts.map +1 -0
- package/dist/registration/machineId.js +89 -0
- package/dist/registration/machineId.js.map +1 -0
- package/dist/registration/types.d.ts +32 -0
- package/dist/registration/types.d.ts.map +1 -0
- package/dist/registration/types.js +9 -0
- package/dist/registration/types.js.map +1 -0
- package/dist/resourceGovernor.d.ts +57 -0
- package/dist/resourceGovernor.d.ts.map +1 -0
- package/dist/resourceGovernor.js +125 -0
- package/dist/resourceGovernor.js.map +1 -0
- package/dist/security/secretManager.d.ts +107 -0
- package/dist/security/secretManager.d.ts.map +1 -0
- package/dist/security/secretManager.js +361 -0
- package/dist/security/secretManager.js.map +1 -0
- package/dist/security.d.ts +134 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +470 -0
- package/dist/security.js.map +1 -0
- package/dist/storage/artifactUploader.d.ts +155 -0
- package/dist/storage/artifactUploader.d.ts.map +1 -0
- package/dist/storage/artifactUploader.js +554 -0
- package/dist/storage/artifactUploader.js.map +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/capabilities.d.ts +23 -0
- package/dist/utils/capabilities.d.ts.map +1 -0
- package/dist/utils/capabilities.js +200 -0
- package/dist/utils/capabilities.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +188 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sdkScanner.d.ts +105 -0
- package/dist/utils/sdkScanner.d.ts.map +1 -0
- package/dist/utils/sdkScanner.js +459 -0
- package/dist/utils/sdkScanner.js.map +1 -0
- package/dist/websocketClient.d.ts +154 -0
- package/dist/websocketClient.d.ts.map +1 -0
- package/dist/websocketClient.js +422 -0
- package/dist/websocketClient.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced BuildHive Agent - Enhanced Agent Implementation
|
|
3
|
+
*
|
|
4
|
+
* Enhanced agent class with advanced features including:
|
|
5
|
+
* - Auto-update capabilities
|
|
6
|
+
* - Configuration hot-reloading
|
|
7
|
+
* - Advanced health checks
|
|
8
|
+
* - Performance optimization
|
|
9
|
+
*
|
|
10
|
+
* Requirements: 6.1
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as crypto from 'crypto';
|
|
14
|
+
import { EventEmitter } from 'events';
|
|
15
|
+
import { BuildHiveAgent } from './agent.js';
|
|
16
|
+
import { ConfigLoader } from './config/loader.js';
|
|
17
|
+
import { createLogger } from './utils/logger.js';
|
|
18
|
+
const logger = createLogger('advanced-agent');
|
|
19
|
+
export class AdvancedBuildHiveAgent extends EventEmitter {
|
|
20
|
+
baseAgent;
|
|
21
|
+
config;
|
|
22
|
+
configWatcher = null;
|
|
23
|
+
configFileHash = null;
|
|
24
|
+
healthCheckInterval = null;
|
|
25
|
+
updateCheckInterval = null;
|
|
26
|
+
performanceTracker;
|
|
27
|
+
isUpdating = false;
|
|
28
|
+
lastHealthCheck = null;
|
|
29
|
+
jobHistory = [];
|
|
30
|
+
constructor(config) {
|
|
31
|
+
super();
|
|
32
|
+
this.config = config;
|
|
33
|
+
this.baseAgent = new BuildHiveAgent(config);
|
|
34
|
+
this.performanceTracker = new PerformanceTracker();
|
|
35
|
+
this.setupAdvancedFeatures();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Start the advanced agent
|
|
39
|
+
*/
|
|
40
|
+
async start() {
|
|
41
|
+
logger.info('Starting Advanced BuildHive Agent with enhanced features');
|
|
42
|
+
try {
|
|
43
|
+
// Start base agent
|
|
44
|
+
await this.baseAgent.start();
|
|
45
|
+
// Start advanced features
|
|
46
|
+
await this.startConfigWatcher();
|
|
47
|
+
await this.startHealthChecks();
|
|
48
|
+
await this.startUpdateChecker();
|
|
49
|
+
await this.startPerformanceOptimization();
|
|
50
|
+
logger.info('Advanced BuildHive Agent started successfully');
|
|
51
|
+
this.emit('started');
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
logger.error('Failed to start advanced agent:', error);
|
|
55
|
+
await this.cleanup();
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Stop the advanced agent
|
|
61
|
+
*/
|
|
62
|
+
async stop() {
|
|
63
|
+
logger.info('Stopping Advanced BuildHive Agent...');
|
|
64
|
+
try {
|
|
65
|
+
await this.cleanup();
|
|
66
|
+
await this.baseAgent.stop();
|
|
67
|
+
logger.info('Advanced BuildHive Agent stopped successfully');
|
|
68
|
+
this.emit('stopped');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
logger.error('Error during advanced agent shutdown:', error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Execute a job with performance tracking
|
|
77
|
+
*/
|
|
78
|
+
async executeJob(job) {
|
|
79
|
+
const startTime = Date.now();
|
|
80
|
+
try {
|
|
81
|
+
const result = await this.baseAgent.executeJob(job);
|
|
82
|
+
// Track performance
|
|
83
|
+
const duration = (Date.now() - startTime) / 1000;
|
|
84
|
+
this.jobHistory.push({
|
|
85
|
+
duration,
|
|
86
|
+
success: result.status === 'COMPLETED',
|
|
87
|
+
timestamp: new Date()
|
|
88
|
+
});
|
|
89
|
+
// Keep only last 100 jobs for performance tracking
|
|
90
|
+
if (this.jobHistory.length > 100) {
|
|
91
|
+
this.jobHistory = this.jobHistory.slice(-100);
|
|
92
|
+
}
|
|
93
|
+
this.performanceTracker.recordJob(duration, result.status === 'COMPLETED');
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const duration = (Date.now() - startTime) / 1000;
|
|
98
|
+
this.jobHistory.push({
|
|
99
|
+
duration,
|
|
100
|
+
success: false,
|
|
101
|
+
timestamp: new Date()
|
|
102
|
+
});
|
|
103
|
+
this.performanceTracker.recordJob(duration, false);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get comprehensive agent status including advanced metrics
|
|
109
|
+
*/
|
|
110
|
+
getAdvancedStatus() {
|
|
111
|
+
return {
|
|
112
|
+
basic: this.baseAgent.getStatus(),
|
|
113
|
+
health: this.lastHealthCheck,
|
|
114
|
+
performance: this.performanceTracker.getMetrics(),
|
|
115
|
+
updateInfo: null, // Will be populated by update checker
|
|
116
|
+
configStatus: {
|
|
117
|
+
lastReload: null, // Will be tracked
|
|
118
|
+
watcherActive: this.configWatcher !== null,
|
|
119
|
+
configFile: ConfigLoader.findConfigFile()
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Perform manual health check
|
|
125
|
+
*/
|
|
126
|
+
async performHealthCheck() {
|
|
127
|
+
logger.debug('Performing comprehensive health check');
|
|
128
|
+
const checks = {};
|
|
129
|
+
let totalScore = 0;
|
|
130
|
+
let checkCount = 0;
|
|
131
|
+
// System resource checks
|
|
132
|
+
const systemMetrics = await this.getSystemMetrics();
|
|
133
|
+
// CPU usage check
|
|
134
|
+
checks.cpuUsage = {
|
|
135
|
+
status: systemMetrics.cpuUsage > 90 ? 'fail' : systemMetrics.cpuUsage > 70 ? 'warn' : 'pass',
|
|
136
|
+
message: `CPU usage: ${systemMetrics.cpuUsage.toFixed(1)}%`,
|
|
137
|
+
value: systemMetrics.cpuUsage,
|
|
138
|
+
threshold: 70
|
|
139
|
+
};
|
|
140
|
+
totalScore += checks.cpuUsage.status === 'pass' ? 100 : checks.cpuUsage.status === 'warn' ? 50 : 0;
|
|
141
|
+
checkCount++;
|
|
142
|
+
// Memory usage check
|
|
143
|
+
checks.memoryUsage = {
|
|
144
|
+
status: systemMetrics.memoryUsage > 90 ? 'fail' : systemMetrics.memoryUsage > 80 ? 'warn' : 'pass',
|
|
145
|
+
message: `Memory usage: ${systemMetrics.memoryUsage.toFixed(1)}%`,
|
|
146
|
+
value: systemMetrics.memoryUsage,
|
|
147
|
+
threshold: 80
|
|
148
|
+
};
|
|
149
|
+
totalScore += checks.memoryUsage.status === 'pass' ? 100 : checks.memoryUsage.status === 'warn' ? 50 : 0;
|
|
150
|
+
checkCount++;
|
|
151
|
+
// Disk usage check
|
|
152
|
+
checks.diskUsage = {
|
|
153
|
+
status: systemMetrics.diskUsage > 95 ? 'fail' : systemMetrics.diskUsage > 85 ? 'warn' : 'pass',
|
|
154
|
+
message: `Disk usage: ${systemMetrics.diskUsage.toFixed(1)}%`,
|
|
155
|
+
value: systemMetrics.diskUsage,
|
|
156
|
+
threshold: 85
|
|
157
|
+
};
|
|
158
|
+
totalScore += checks.diskUsage.status === 'pass' ? 100 : checks.diskUsage.status === 'warn' ? 50 : 0;
|
|
159
|
+
checkCount++;
|
|
160
|
+
// Job performance check
|
|
161
|
+
const performance = this.performanceTracker.getMetrics();
|
|
162
|
+
checks.jobPerformance = {
|
|
163
|
+
status: performance.errorRate > 20 ? 'fail' : performance.errorRate > 10 ? 'warn' : 'pass',
|
|
164
|
+
message: `Job error rate: ${performance.errorRate.toFixed(1)}%`,
|
|
165
|
+
value: performance.errorRate,
|
|
166
|
+
threshold: 10
|
|
167
|
+
};
|
|
168
|
+
totalScore += checks.jobPerformance.status === 'pass' ? 100 : checks.jobPerformance.status === 'warn' ? 50 : 0;
|
|
169
|
+
checkCount++;
|
|
170
|
+
// Connection health check
|
|
171
|
+
const baseStatus = this.baseAgent.getStatus();
|
|
172
|
+
checks.connectivity = {
|
|
173
|
+
status: baseStatus.isRunning ? 'pass' : 'fail',
|
|
174
|
+
message: baseStatus.isRunning ? 'Connected to platform' : 'Disconnected from platform'
|
|
175
|
+
};
|
|
176
|
+
totalScore += checks.connectivity.status === 'pass' ? 100 : 0;
|
|
177
|
+
checkCount++;
|
|
178
|
+
// Docker health check
|
|
179
|
+
checks.dockerHealth = await this.checkDockerHealth();
|
|
180
|
+
totalScore += checks.dockerHealth.status === 'pass' ? 100 : checks.dockerHealth.status === 'warn' ? 50 : 0;
|
|
181
|
+
checkCount++;
|
|
182
|
+
const overallScore = checkCount > 0 ? totalScore / checkCount : 0;
|
|
183
|
+
const status = overallScore >= 80 ? 'healthy' :
|
|
184
|
+
overallScore >= 60 ? 'warning' : 'critical';
|
|
185
|
+
const result = {
|
|
186
|
+
status,
|
|
187
|
+
checks,
|
|
188
|
+
timestamp: new Date(),
|
|
189
|
+
overallScore
|
|
190
|
+
};
|
|
191
|
+
this.lastHealthCheck = result;
|
|
192
|
+
this.emit('healthCheck', result);
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Trigger manual configuration reload
|
|
197
|
+
*/
|
|
198
|
+
async reloadConfiguration() {
|
|
199
|
+
logger.info('Manually reloading configuration');
|
|
200
|
+
try {
|
|
201
|
+
const newConfig = await ConfigLoader.load();
|
|
202
|
+
await this.applyConfigurationChanges(newConfig);
|
|
203
|
+
logger.info('Configuration reloaded successfully');
|
|
204
|
+
this.emit('configReloaded', newConfig);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
logger.error('Failed to reload configuration:', error);
|
|
208
|
+
this.emit('configReloadError', error);
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check for and apply updates
|
|
214
|
+
*/
|
|
215
|
+
async checkForUpdates() {
|
|
216
|
+
logger.debug('Checking for agent updates');
|
|
217
|
+
try {
|
|
218
|
+
// In a real implementation, this would check a remote update server
|
|
219
|
+
const updateInfo = {
|
|
220
|
+
currentVersion: this.getCurrentVersion(),
|
|
221
|
+
latestVersion: await this.getLatestVersion(),
|
|
222
|
+
updateAvailable: false
|
|
223
|
+
};
|
|
224
|
+
updateInfo.updateAvailable = this.compareVersions(updateInfo.latestVersion, updateInfo.currentVersion) > 0;
|
|
225
|
+
if (updateInfo.updateAvailable) {
|
|
226
|
+
logger.info(`Update available: ${updateInfo.currentVersion} -> ${updateInfo.latestVersion}`);
|
|
227
|
+
this.emit('updateAvailable', updateInfo);
|
|
228
|
+
if (this.config.enableAutoUpdates) {
|
|
229
|
+
await this.performUpdate(updateInfo);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return updateInfo;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
logger.error('Failed to check for updates:', error);
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Setup advanced features
|
|
241
|
+
*/
|
|
242
|
+
setupAdvancedFeatures() {
|
|
243
|
+
// Set up performance optimization
|
|
244
|
+
this.optimizePerformance();
|
|
245
|
+
// Set up event handlers
|
|
246
|
+
this.on('healthCheck', (result) => {
|
|
247
|
+
if (result.status === 'critical') {
|
|
248
|
+
logger.warn('Critical health check failure detected');
|
|
249
|
+
// Could trigger alerts or recovery actions
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
this.on('configReloaded', (config) => {
|
|
253
|
+
logger.info('Configuration successfully reloaded');
|
|
254
|
+
});
|
|
255
|
+
this.on('updateAvailable', (updateInfo) => {
|
|
256
|
+
logger.info(`Update available: ${updateInfo.latestVersion}`);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Start configuration file watcher for hot-reloading
|
|
261
|
+
*/
|
|
262
|
+
async startConfigWatcher() {
|
|
263
|
+
const configFile = ConfigLoader.findConfigFile();
|
|
264
|
+
if (!configFile) {
|
|
265
|
+
logger.debug('No configuration file found, skipping config watcher');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
// Calculate initial hash
|
|
270
|
+
this.configFileHash = await this.calculateFileHash(configFile);
|
|
271
|
+
// Watch for changes
|
|
272
|
+
this.configWatcher = fs.watch(configFile, async (eventType) => {
|
|
273
|
+
if (eventType === 'change') {
|
|
274
|
+
await this.handleConfigFileChange(configFile);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
logger.info(`Configuration watcher started for: ${configFile}`);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
logger.error('Failed to start configuration watcher:', error);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Start periodic health checks
|
|
285
|
+
*/
|
|
286
|
+
async startHealthChecks() {
|
|
287
|
+
// Perform initial health check
|
|
288
|
+
await this.performHealthCheck();
|
|
289
|
+
// Schedule periodic health checks
|
|
290
|
+
this.healthCheckInterval = setInterval(async () => {
|
|
291
|
+
try {
|
|
292
|
+
await this.performHealthCheck();
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
logger.error('Health check failed:', error);
|
|
296
|
+
}
|
|
297
|
+
}, 60000); // Every minute
|
|
298
|
+
logger.info('Health check monitoring started');
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Start update checker
|
|
302
|
+
*/
|
|
303
|
+
async startUpdateChecker() {
|
|
304
|
+
if (!this.config.enableAutoUpdates) {
|
|
305
|
+
logger.debug('Auto-updates disabled, skipping update checker');
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
// Check for updates immediately
|
|
309
|
+
try {
|
|
310
|
+
await this.checkForUpdates();
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
logger.error('Initial update check failed:', error);
|
|
314
|
+
}
|
|
315
|
+
// Schedule periodic update checks
|
|
316
|
+
this.updateCheckInterval = setInterval(async () => {
|
|
317
|
+
try {
|
|
318
|
+
await this.checkForUpdates();
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
logger.error('Periodic update check failed:', error);
|
|
322
|
+
}
|
|
323
|
+
}, 4 * 60 * 60 * 1000); // Every 4 hours
|
|
324
|
+
logger.info('Update checker started');
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Start performance optimization
|
|
328
|
+
*/
|
|
329
|
+
async startPerformanceOptimization() {
|
|
330
|
+
// Enable Node.js performance optimizations
|
|
331
|
+
if (process.env.NODE_ENV === 'production') {
|
|
332
|
+
// Optimize garbage collection
|
|
333
|
+
if (process.argv.indexOf('--max-old-space-size') === -1) {
|
|
334
|
+
logger.info('Applying memory optimization settings');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Start performance monitoring
|
|
338
|
+
setInterval(() => {
|
|
339
|
+
this.performanceTracker.collectSystemMetrics();
|
|
340
|
+
}, 30000); // Every 30 seconds
|
|
341
|
+
logger.info('Performance optimization started');
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Handle configuration file changes
|
|
345
|
+
*/
|
|
346
|
+
async handleConfigFileChange(configFile) {
|
|
347
|
+
try {
|
|
348
|
+
// Debounce rapid changes
|
|
349
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
350
|
+
const newHash = await this.calculateFileHash(configFile);
|
|
351
|
+
if (newHash === this.configFileHash) {
|
|
352
|
+
return; // No actual change
|
|
353
|
+
}
|
|
354
|
+
logger.info('Configuration file changed, reloading...');
|
|
355
|
+
this.configFileHash = newHash;
|
|
356
|
+
const newConfig = await ConfigLoader.load();
|
|
357
|
+
await this.applyConfigurationChanges(newConfig);
|
|
358
|
+
logger.info('Configuration hot-reloaded successfully');
|
|
359
|
+
this.emit('configReloaded', newConfig);
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
logger.error('Failed to handle configuration file change:', error);
|
|
363
|
+
this.emit('configReloadError', error);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Apply configuration changes
|
|
368
|
+
*/
|
|
369
|
+
async applyConfigurationChanges(newConfig) {
|
|
370
|
+
const oldConfig = this.config;
|
|
371
|
+
this.config = newConfig;
|
|
372
|
+
// Check what changed and apply accordingly
|
|
373
|
+
if (oldConfig.heartbeatInterval !== newConfig.heartbeatInterval) {
|
|
374
|
+
logger.info(`Heartbeat interval changed: ${oldConfig.heartbeatInterval}s -> ${newConfig.heartbeatInterval}s`);
|
|
375
|
+
// Would need to restart heartbeat with new interval
|
|
376
|
+
}
|
|
377
|
+
if (oldConfig.maxConcurrentJobs !== newConfig.maxConcurrentJobs) {
|
|
378
|
+
logger.info(`Max concurrent jobs changed: ${oldConfig.maxConcurrentJobs} -> ${newConfig.maxConcurrentJobs}`);
|
|
379
|
+
// Update job capacity
|
|
380
|
+
}
|
|
381
|
+
if (oldConfig.logLevel !== newConfig.logLevel) {
|
|
382
|
+
logger.info(`Log level changed: ${oldConfig.logLevel} -> ${newConfig.logLevel}`);
|
|
383
|
+
// Update logger configuration
|
|
384
|
+
}
|
|
385
|
+
// Apply other configuration changes as needed
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Get system metrics
|
|
389
|
+
*/
|
|
390
|
+
async getSystemMetrics() {
|
|
391
|
+
// This would use the existing metrics collector
|
|
392
|
+
// For now, return mock data
|
|
393
|
+
return {
|
|
394
|
+
cpuUsage: Math.random() * 100,
|
|
395
|
+
memoryUsage: Math.random() * 100,
|
|
396
|
+
diskUsage: Math.random() * 100
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Check Docker health
|
|
401
|
+
*/
|
|
402
|
+
async checkDockerHealth() {
|
|
403
|
+
try {
|
|
404
|
+
// This would check Docker daemon status
|
|
405
|
+
// For now, return a mock check
|
|
406
|
+
return {
|
|
407
|
+
status: 'pass',
|
|
408
|
+
message: 'Docker daemon is running and accessible'
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
return {
|
|
413
|
+
status: 'fail',
|
|
414
|
+
message: `Docker health check failed: ${error}`
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Calculate file hash for change detection
|
|
420
|
+
*/
|
|
421
|
+
async calculateFileHash(filePath) {
|
|
422
|
+
return new Promise((resolve, reject) => {
|
|
423
|
+
const hash = crypto.createHash('sha256');
|
|
424
|
+
const stream = fs.createReadStream(filePath);
|
|
425
|
+
stream.on('data', data => hash.update(data));
|
|
426
|
+
stream.on('end', () => resolve(hash.digest('hex')));
|
|
427
|
+
stream.on('error', reject);
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Get current agent version
|
|
432
|
+
*/
|
|
433
|
+
getCurrentVersion() {
|
|
434
|
+
// In a real implementation, this would read from package.json or version file
|
|
435
|
+
return '1.0.0';
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Get latest available version
|
|
439
|
+
*/
|
|
440
|
+
async getLatestVersion() {
|
|
441
|
+
// In a real implementation, this would query a remote update server
|
|
442
|
+
return '1.0.0';
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Compare version strings
|
|
446
|
+
*/
|
|
447
|
+
compareVersions(a, b) {
|
|
448
|
+
const aParts = a.split('.').map(Number);
|
|
449
|
+
const bParts = b.split('.').map(Number);
|
|
450
|
+
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
451
|
+
const aPart = aParts[i] || 0;
|
|
452
|
+
const bPart = bParts[i] || 0;
|
|
453
|
+
if (aPart > bPart)
|
|
454
|
+
return 1;
|
|
455
|
+
if (aPart < bPart)
|
|
456
|
+
return -1;
|
|
457
|
+
}
|
|
458
|
+
return 0;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Perform agent update
|
|
462
|
+
*/
|
|
463
|
+
async performUpdate(updateInfo) {
|
|
464
|
+
if (this.isUpdating) {
|
|
465
|
+
logger.warn('Update already in progress');
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
this.isUpdating = true;
|
|
469
|
+
logger.info(`Starting update to version ${updateInfo.latestVersion}`);
|
|
470
|
+
try {
|
|
471
|
+
// In a real implementation, this would:
|
|
472
|
+
// 1. Download the new version
|
|
473
|
+
// 2. Verify the download
|
|
474
|
+
// 3. Stop the current agent gracefully
|
|
475
|
+
// 4. Replace the binary
|
|
476
|
+
// 5. Restart the agent
|
|
477
|
+
this.emit('updateStarted', updateInfo);
|
|
478
|
+
// Mock update process
|
|
479
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
480
|
+
this.emit('updateCompleted', updateInfo);
|
|
481
|
+
logger.info('Update completed successfully');
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
logger.error('Update failed:', error);
|
|
485
|
+
this.emit('updateFailed', { updateInfo, error });
|
|
486
|
+
throw error;
|
|
487
|
+
}
|
|
488
|
+
finally {
|
|
489
|
+
this.isUpdating = false;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Optimize performance settings
|
|
494
|
+
*/
|
|
495
|
+
optimizePerformance() {
|
|
496
|
+
// Set optimal Node.js flags for performance
|
|
497
|
+
if (process.env.NODE_ENV === 'production') {
|
|
498
|
+
// These would typically be set at startup
|
|
499
|
+
logger.debug('Performance optimizations applied');
|
|
500
|
+
}
|
|
501
|
+
// Configure garbage collection optimization
|
|
502
|
+
if (global.gc) {
|
|
503
|
+
setInterval(() => {
|
|
504
|
+
if (process.memoryUsage().heapUsed > 100 * 1024 * 1024) { // 100MB
|
|
505
|
+
global.gc?.();
|
|
506
|
+
}
|
|
507
|
+
}, 60000); // Every minute
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Clean up resources
|
|
512
|
+
*/
|
|
513
|
+
async cleanup() {
|
|
514
|
+
// Stop config watcher
|
|
515
|
+
if (this.configWatcher) {
|
|
516
|
+
this.configWatcher.close();
|
|
517
|
+
this.configWatcher = null;
|
|
518
|
+
}
|
|
519
|
+
// Stop intervals
|
|
520
|
+
if (this.healthCheckInterval) {
|
|
521
|
+
clearInterval(this.healthCheckInterval);
|
|
522
|
+
this.healthCheckInterval = null;
|
|
523
|
+
}
|
|
524
|
+
if (this.updateCheckInterval) {
|
|
525
|
+
clearInterval(this.updateCheckInterval);
|
|
526
|
+
this.updateCheckInterval = null;
|
|
527
|
+
}
|
|
528
|
+
logger.debug('Advanced agent cleanup completed');
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Performance tracking utility
|
|
533
|
+
*/
|
|
534
|
+
class PerformanceTracker {
|
|
535
|
+
jobStats = [];
|
|
536
|
+
startTime = Date.now();
|
|
537
|
+
recordJob(duration, success) {
|
|
538
|
+
this.jobStats.push({
|
|
539
|
+
duration,
|
|
540
|
+
success,
|
|
541
|
+
timestamp: new Date()
|
|
542
|
+
});
|
|
543
|
+
// Keep only last 1000 jobs
|
|
544
|
+
if (this.jobStats.length > 1000) {
|
|
545
|
+
this.jobStats = this.jobStats.slice(-1000);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
getMetrics() {
|
|
549
|
+
const now = Date.now();
|
|
550
|
+
const uptime = (now - this.startTime) / 1000;
|
|
551
|
+
if (this.jobStats.length === 0) {
|
|
552
|
+
return {
|
|
553
|
+
jobThroughput: 0,
|
|
554
|
+
averageJobDuration: 0,
|
|
555
|
+
resourceEfficiency: 100,
|
|
556
|
+
errorRate: 0,
|
|
557
|
+
uptime,
|
|
558
|
+
memoryLeakDetection: false,
|
|
559
|
+
cpuOptimization: 100
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
const recentJobs = this.jobStats.filter(job => now - job.timestamp.getTime() < 60 * 60 * 1000 // Last hour
|
|
563
|
+
);
|
|
564
|
+
const totalJobs = recentJobs.length;
|
|
565
|
+
const successfulJobs = recentJobs.filter(job => job.success).length;
|
|
566
|
+
const failedJobs = totalJobs - successfulJobs;
|
|
567
|
+
const jobThroughput = totalJobs > 0 ? (totalJobs / (60 * 60)) * 3600 : 0; // jobs per hour
|
|
568
|
+
const averageJobDuration = totalJobs > 0 ?
|
|
569
|
+
recentJobs.reduce((sum, job) => sum + job.duration, 0) / totalJobs : 0;
|
|
570
|
+
const errorRate = totalJobs > 0 ? (failedJobs / totalJobs) * 100 : 0;
|
|
571
|
+
return {
|
|
572
|
+
jobThroughput,
|
|
573
|
+
averageJobDuration,
|
|
574
|
+
resourceEfficiency: Math.max(0, 100 - errorRate), // Simple efficiency calculation
|
|
575
|
+
errorRate,
|
|
576
|
+
uptime,
|
|
577
|
+
memoryLeakDetection: this.detectMemoryLeak(),
|
|
578
|
+
cpuOptimization: this.calculateCpuOptimization()
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
collectSystemMetrics() {
|
|
582
|
+
// Collect system metrics for performance analysis
|
|
583
|
+
const memUsage = process.memoryUsage();
|
|
584
|
+
const cpuUsage = process.cpuUsage();
|
|
585
|
+
// Store metrics for trend analysis
|
|
586
|
+
// This would be expanded in a real implementation
|
|
587
|
+
}
|
|
588
|
+
detectMemoryLeak() {
|
|
589
|
+
const memUsage = process.memoryUsage();
|
|
590
|
+
// Simple memory leak detection based on heap growth
|
|
591
|
+
return memUsage.heapUsed > 500 * 1024 * 1024; // 500MB threshold
|
|
592
|
+
}
|
|
593
|
+
calculateCpuOptimization() {
|
|
594
|
+
// Calculate CPU optimization score based on job efficiency
|
|
595
|
+
const recentJobs = this.jobStats.slice(-10); // Last 10 jobs
|
|
596
|
+
if (recentJobs.length === 0)
|
|
597
|
+
return 100;
|
|
598
|
+
const avgDuration = recentJobs.reduce((sum, job) => sum + job.duration, 0) / recentJobs.length;
|
|
599
|
+
const successRate = recentJobs.filter(job => job.success).length / recentJobs.length;
|
|
600
|
+
// Simple optimization score
|
|
601
|
+
return Math.min(100, (successRate * 100) - (avgDuration / 60)); // Penalize long durations
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=advancedAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advancedAgent.js","sourceRoot":"","sources":["../src/advancedAgent.ts"],"names":[],"mappings":"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"}
|