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.
Files changed (170) hide show
  1. package/README.md +166 -0
  2. package/dist/__tests__/fakes/FakeDockerManager.d.ts +115 -0
  3. package/dist/__tests__/fakes/FakeDockerManager.d.ts.map +1 -0
  4. package/dist/__tests__/fakes/FakeDockerManager.js +203 -0
  5. package/dist/__tests__/fakes/FakeDockerManager.js.map +1 -0
  6. package/dist/acceptanceChecker.d.ts +26 -0
  7. package/dist/acceptanceChecker.d.ts.map +1 -0
  8. package/dist/acceptanceChecker.js +64 -0
  9. package/dist/acceptanceChecker.js.map +1 -0
  10. package/dist/advancedAgent.d.ts +161 -0
  11. package/dist/advancedAgent.d.ts.map +1 -0
  12. package/dist/advancedAgent.js +604 -0
  13. package/dist/advancedAgent.js.map +1 -0
  14. package/dist/agent.d.ts +101 -0
  15. package/dist/agent.d.ts.map +1 -0
  16. package/dist/agent.js +490 -0
  17. package/dist/agent.js.map +1 -0
  18. package/dist/api/jobStatusApi.d.ts +88 -0
  19. package/dist/api/jobStatusApi.d.ts.map +1 -0
  20. package/dist/api/jobStatusApi.js +240 -0
  21. package/dist/api/jobStatusApi.js.map +1 -0
  22. package/dist/autoUpdater.d.ts +135 -0
  23. package/dist/autoUpdater.d.ts.map +1 -0
  24. package/dist/autoUpdater.js +494 -0
  25. package/dist/autoUpdater.js.map +1 -0
  26. package/dist/cacheManager.d.ts +108 -0
  27. package/dist/cacheManager.d.ts.map +1 -0
  28. package/dist/cacheManager.js +300 -0
  29. package/dist/cacheManager.js.map +1 -0
  30. package/dist/cli.d.ts +11 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +749 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/config/index.d.ts +30 -0
  35. package/dist/config/index.d.ts.map +1 -0
  36. package/dist/config/index.js +35 -0
  37. package/dist/config/index.js.map +1 -0
  38. package/dist/config/loader.d.ts +45 -0
  39. package/dist/config/loader.d.ts.map +1 -0
  40. package/dist/config/loader.js +269 -0
  41. package/dist/config/loader.js.map +1 -0
  42. package/dist/config/types.d.ts +193 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +90 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/config/validation.d.ts +28 -0
  47. package/dist/config/validation.d.ts.map +1 -0
  48. package/dist/config/validation.js +397 -0
  49. package/dist/config/validation.js.map +1 -0
  50. package/dist/docker.d.ts +96 -0
  51. package/dist/docker.d.ts.map +1 -0
  52. package/dist/docker.js +411 -0
  53. package/dist/docker.js.map +1 -0
  54. package/dist/enhancedJobExecutor.d.ts +81 -0
  55. package/dist/enhancedJobExecutor.d.ts.map +1 -0
  56. package/dist/enhancedJobExecutor.js +223 -0
  57. package/dist/enhancedJobExecutor.js.map +1 -0
  58. package/dist/executors/executorFactory.d.ts +46 -0
  59. package/dist/executors/executorFactory.d.ts.map +1 -0
  60. package/dist/executors/executorFactory.js +80 -0
  61. package/dist/executors/executorFactory.js.map +1 -0
  62. package/dist/executors/index.d.ts +7 -0
  63. package/dist/executors/index.d.ts.map +1 -0
  64. package/dist/executors/index.js +6 -0
  65. package/dist/executors/index.js.map +1 -0
  66. package/dist/executors/nativeExecutor.d.ts +60 -0
  67. package/dist/executors/nativeExecutor.d.ts.map +1 -0
  68. package/dist/executors/nativeExecutor.js +311 -0
  69. package/dist/executors/nativeExecutor.js.map +1 -0
  70. package/dist/executors/types.d.ts +38 -0
  71. package/dist/executors/types.d.ts.map +1 -0
  72. package/dist/executors/types.js +9 -0
  73. package/dist/executors/types.js.map +1 -0
  74. package/dist/healthMonitor.d.ts +213 -0
  75. package/dist/healthMonitor.d.ts.map +1 -0
  76. package/dist/healthMonitor.js +547 -0
  77. package/dist/healthMonitor.js.map +1 -0
  78. package/dist/index.d.ts +16 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +16 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/jobExecutor.d.ts +117 -0
  83. package/dist/jobExecutor.d.ts.map +1 -0
  84. package/dist/jobExecutor.js +458 -0
  85. package/dist/jobExecutor.js.map +1 -0
  86. package/dist/lifecycleExecutor.d.ts +54 -0
  87. package/dist/lifecycleExecutor.d.ts.map +1 -0
  88. package/dist/lifecycleExecutor.js +230 -0
  89. package/dist/lifecycleExecutor.js.map +1 -0
  90. package/dist/main.d.ts +15 -0
  91. package/dist/main.d.ts.map +1 -0
  92. package/dist/main.js +77 -0
  93. package/dist/main.js.map +1 -0
  94. package/dist/metrics.d.ts +103 -0
  95. package/dist/metrics.d.ts.map +1 -0
  96. package/dist/metrics.js +360 -0
  97. package/dist/metrics.js.map +1 -0
  98. package/dist/recipes/builtinRecipes.d.ts +11 -0
  99. package/dist/recipes/builtinRecipes.d.ts.map +1 -0
  100. package/dist/recipes/builtinRecipes.js +688 -0
  101. package/dist/recipes/builtinRecipes.js.map +1 -0
  102. package/dist/recipes/index.d.ts +18 -0
  103. package/dist/recipes/index.d.ts.map +1 -0
  104. package/dist/recipes/index.js +17 -0
  105. package/dist/recipes/index.js.map +1 -0
  106. package/dist/recipes/recipeRegistry.d.ts +49 -0
  107. package/dist/recipes/recipeRegistry.d.ts.map +1 -0
  108. package/dist/recipes/recipeRegistry.js +264 -0
  109. package/dist/recipes/recipeRegistry.js.map +1 -0
  110. package/dist/recipes/types.d.ts +116 -0
  111. package/dist/recipes/types.d.ts.map +1 -0
  112. package/dist/recipes/types.js +10 -0
  113. package/dist/recipes/types.js.map +1 -0
  114. package/dist/recovery.d.ts +133 -0
  115. package/dist/recovery.d.ts.map +1 -0
  116. package/dist/recovery.js +299 -0
  117. package/dist/recovery.js.map +1 -0
  118. package/dist/registration/apiClient.d.ts +44 -0
  119. package/dist/registration/apiClient.d.ts.map +1 -0
  120. package/dist/registration/apiClient.js +149 -0
  121. package/dist/registration/apiClient.js.map +1 -0
  122. package/dist/registration/index.d.ts +41 -0
  123. package/dist/registration/index.d.ts.map +1 -0
  124. package/dist/registration/index.js +141 -0
  125. package/dist/registration/index.js.map +1 -0
  126. package/dist/registration/machineId.d.ts +30 -0
  127. package/dist/registration/machineId.d.ts.map +1 -0
  128. package/dist/registration/machineId.js +89 -0
  129. package/dist/registration/machineId.js.map +1 -0
  130. package/dist/registration/types.d.ts +32 -0
  131. package/dist/registration/types.d.ts.map +1 -0
  132. package/dist/registration/types.js +9 -0
  133. package/dist/registration/types.js.map +1 -0
  134. package/dist/resourceGovernor.d.ts +57 -0
  135. package/dist/resourceGovernor.d.ts.map +1 -0
  136. package/dist/resourceGovernor.js +125 -0
  137. package/dist/resourceGovernor.js.map +1 -0
  138. package/dist/security/secretManager.d.ts +107 -0
  139. package/dist/security/secretManager.d.ts.map +1 -0
  140. package/dist/security/secretManager.js +361 -0
  141. package/dist/security/secretManager.js.map +1 -0
  142. package/dist/security.d.ts +134 -0
  143. package/dist/security.d.ts.map +1 -0
  144. package/dist/security.js +470 -0
  145. package/dist/security.js.map +1 -0
  146. package/dist/storage/artifactUploader.d.ts +155 -0
  147. package/dist/storage/artifactUploader.d.ts.map +1 -0
  148. package/dist/storage/artifactUploader.js +554 -0
  149. package/dist/storage/artifactUploader.js.map +1 -0
  150. package/dist/types.d.ts +49 -0
  151. package/dist/types.d.ts.map +1 -0
  152. package/dist/types.js +7 -0
  153. package/dist/types.js.map +1 -0
  154. package/dist/utils/capabilities.d.ts +23 -0
  155. package/dist/utils/capabilities.d.ts.map +1 -0
  156. package/dist/utils/capabilities.js +200 -0
  157. package/dist/utils/capabilities.js.map +1 -0
  158. package/dist/utils/logger.d.ts +20 -0
  159. package/dist/utils/logger.d.ts.map +1 -0
  160. package/dist/utils/logger.js +188 -0
  161. package/dist/utils/logger.js.map +1 -0
  162. package/dist/utils/sdkScanner.d.ts +105 -0
  163. package/dist/utils/sdkScanner.d.ts.map +1 -0
  164. package/dist/utils/sdkScanner.js +459 -0
  165. package/dist/utils/sdkScanner.js.map +1 -0
  166. package/dist/websocketClient.d.ts +154 -0
  167. package/dist/websocketClient.d.ts.map +1 -0
  168. package/dist/websocketClient.js +422 -0
  169. package/dist/websocketClient.js.map +1 -0
  170. 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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"}