vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1739

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 (202) hide show
  1. package/README.md +240 -0
  2. package/package.json +10 -2
  3. package/src/agents/Agent.js +300 -0
  4. package/src/agents/AgentAdditionService.js +311 -0
  5. package/src/agents/AgentCheckService.js +690 -0
  6. package/src/agents/AgentInstallationService.js +140 -0
  7. package/src/agents/AgentSetupService.js +467 -0
  8. package/src/agents/AgentStatus.js +183 -0
  9. package/src/agents/AgentVerificationService.js +634 -0
  10. package/src/agents/ConfigurationSchemaValidator.js +543 -0
  11. package/src/agents/EnvironmentConfigurationManager.js +602 -0
  12. package/src/agents/InstallationErrorHandler.js +372 -0
  13. package/src/agents/InstallationLog.js +363 -0
  14. package/src/agents/InstallationMethod.js +510 -0
  15. package/src/agents/InstallationOrchestrator.js +352 -0
  16. package/src/agents/InstallationProgressReporter.js +372 -0
  17. package/src/agents/InstallationRetryManager.js +322 -0
  18. package/src/agents/InstallationType.js +254 -0
  19. package/src/agents/OperationTypes.js +310 -0
  20. package/src/agents/PerformanceMetricsCollector.js +493 -0
  21. package/src/agents/SecurityValidationService.js +534 -0
  22. package/src/agents/VerificationTest.js +354 -0
  23. package/src/agents/VerificationType.js +226 -0
  24. package/src/agents/WindowsPermissionHandler.js +518 -0
  25. package/src/agents/config/AgentConfigManager.js +393 -0
  26. package/src/agents/config/AgentDefaultsRegistry.js +373 -0
  27. package/src/agents/config/ConfigValidator.js +281 -0
  28. package/src/agents/discovery/AgentDiscoveryService.js +707 -0
  29. package/src/agents/logging/AgentLogger.js +511 -0
  30. package/src/agents/status/AgentStatusManager.js +481 -0
  31. package/src/agents/storage/FileManager.js +454 -0
  32. package/src/agents/verification/AgentCommunicationTester.js +474 -0
  33. package/src/agents/verification/BaseVerifier.js +430 -0
  34. package/src/agents/verification/CommandVerifier.js +480 -0
  35. package/src/agents/verification/FileOperationVerifier.js +453 -0
  36. package/src/agents/verification/ResultAnalyzer.js +707 -0
  37. package/src/agents/verification/TestRequirementManager.js +495 -0
  38. package/src/agents/verification/VerificationRunner.js +433 -0
  39. package/src/agents/windows/BaseWindowsInstaller.js +441 -0
  40. package/src/agents/windows/ChocolateyInstaller.js +509 -0
  41. package/src/agents/windows/DirectInstaller.js +443 -0
  42. package/src/agents/windows/InstallerFactory.js +391 -0
  43. package/src/agents/windows/NpmInstaller.js +505 -0
  44. package/src/agents/windows/PowerShellInstaller.js +458 -0
  45. package/src/agents/windows/WinGetInstaller.js +390 -0
  46. package/src/analysis/analysis-reporter.js +132 -0
  47. package/src/analysis/boundary-detector.js +712 -0
  48. package/src/analysis/categorizer.js +340 -0
  49. package/src/analysis/codebase-scanner.js +384 -0
  50. package/src/analysis/line-counter.js +513 -0
  51. package/src/analysis/priority-calculator.js +679 -0
  52. package/src/analysis/report/analysis-report.js +250 -0
  53. package/src/analysis/report/package-analyzer.js +278 -0
  54. package/src/analysis/report/recommendation-generator.js +382 -0
  55. package/src/analysis/report/statistics-generator.js +515 -0
  56. package/src/analysis/reports/analysis-report-model.js +101 -0
  57. package/src/analysis/reports/recommendation-generator.js +283 -0
  58. package/src/analysis/reports/report-generators.js +191 -0
  59. package/src/analysis/reports/statistics-calculator.js +231 -0
  60. package/src/analysis/reports/trend-analyzer.js +219 -0
  61. package/src/analysis/strategy-generator.js +814 -0
  62. package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
  63. package/src/config/refactoring-config.js +307 -0
  64. package/src/health-tracking/json-storage.js +38 -2
  65. package/src/ide-integration/applescript-manager-core.js +233 -0
  66. package/src/ide-integration/applescript-manager.cjs +357 -28
  67. package/src/ide-integration/applescript-manager.js +89 -3599
  68. package/src/ide-integration/cdp-manager.js +306 -0
  69. package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
  70. package/src/ide-integration/continuation-handler.js +337 -0
  71. package/src/ide-integration/ide-status-checker.js +292 -0
  72. package/src/ide-integration/macos-ide-manager.js +627 -0
  73. package/src/ide-integration/macos-text-sender.js +528 -0
  74. package/src/ide-integration/response-reader.js +548 -0
  75. package/src/ide-integration/windows-automation-manager.js +121 -0
  76. package/src/ide-integration/windows-ide-manager.js +373 -0
  77. package/src/index.cjs +25 -3
  78. package/src/index.js +15 -1
  79. package/src/llm/direct-llm-manager.cjs +90 -2
  80. package/src/models/compliance-report.js +538 -0
  81. package/src/models/file-analysis.js +681 -0
  82. package/src/models/refactoring-plan.js +770 -0
  83. package/src/monitoring/alert-system.js +834 -0
  84. package/src/monitoring/compliance-progress-tracker.js +437 -0
  85. package/src/monitoring/continuous-scan-notifications.js +661 -0
  86. package/src/monitoring/continuous-scanner.js +279 -0
  87. package/src/monitoring/file-monitor/file-analyzer.js +262 -0
  88. package/src/monitoring/file-monitor/file-monitor.js +237 -0
  89. package/src/monitoring/file-monitor/watcher.js +194 -0
  90. package/src/monitoring/file-monitor.js +17 -0
  91. package/src/monitoring/notification-manager.js +437 -0
  92. package/src/monitoring/scanner-core.js +368 -0
  93. package/src/monitoring/scanner-events.js +214 -0
  94. package/src/monitoring/violation-notification-system.js +515 -0
  95. package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
  96. package/src/refactoring/boundaries/extraction-result.js +285 -0
  97. package/src/refactoring/boundaries/extraction-strategies.js +392 -0
  98. package/src/refactoring/boundaries/module-boundary.js +209 -0
  99. package/src/refactoring/boundary/boundary-detector.js +741 -0
  100. package/src/refactoring/boundary/boundary-types.js +405 -0
  101. package/src/refactoring/boundary/extraction-strategies.js +554 -0
  102. package/src/refactoring/boundary-extraction-result.js +77 -0
  103. package/src/refactoring/boundary-extraction-strategies.js +330 -0
  104. package/src/refactoring/boundary-extractor.js +384 -0
  105. package/src/refactoring/boundary-types.js +46 -0
  106. package/src/refactoring/circular/circular-dependency.js +88 -0
  107. package/src/refactoring/circular/cycle-detection.js +147 -0
  108. package/src/refactoring/circular/dependency-node.js +82 -0
  109. package/src/refactoring/circular/dependency-result.js +107 -0
  110. package/src/refactoring/circular/dependency-types.js +58 -0
  111. package/src/refactoring/circular/graph-builder.js +213 -0
  112. package/src/refactoring/circular/resolution-strategy.js +72 -0
  113. package/src/refactoring/circular/strategy-generator.js +229 -0
  114. package/src/refactoring/circular-dependency-resolver-original.js +809 -0
  115. package/src/refactoring/circular-dependency-resolver.js +200 -0
  116. package/src/refactoring/code-mover.js +761 -0
  117. package/src/refactoring/file-splitter.js +696 -0
  118. package/src/refactoring/functionality-validator.js +816 -0
  119. package/src/refactoring/import-manager.js +774 -0
  120. package/src/refactoring/module-boundary.js +107 -0
  121. package/src/refactoring/refactoring-executor.js +672 -0
  122. package/src/refactoring/refactoring-rollback.js +614 -0
  123. package/src/refactoring/test-validator.js +631 -0
  124. package/src/requirement-management/default-requirement-manager.js +321 -0
  125. package/src/requirement-management/requirement-file-parser.js +159 -0
  126. package/src/requirement-management/requirement-sequencer.js +221 -0
  127. package/src/rui/commands/AgentCommandParser.js +600 -0
  128. package/src/rui/commands/AgentCommands.js +487 -0
  129. package/src/rui/commands/AgentResponseFormatter.js +832 -0
  130. package/src/scripts/verify-full-compliance.js +269 -0
  131. package/src/sync/sync-engine-core.js +1 -0
  132. package/src/sync/sync-engine-remote-handlers.js +135 -0
  133. package/src/task-generation/automated-task-generator.js +351 -0
  134. package/src/task-generation/prioritizer.js +287 -0
  135. package/src/task-generation/task-list-updater.js +215 -0
  136. package/src/task-generation/task-management-integration.js +480 -0
  137. package/src/task-generation/task-manager-integration.js +270 -0
  138. package/src/task-generation/violation-task-generator.js +474 -0
  139. package/src/task-management/continuous-scan-integration.js +342 -0
  140. package/src/timeout-management/index.js +12 -3
  141. package/src/timeout-management/response-time-tracker.js +167 -0
  142. package/src/timeout-management/timeout-calculator.js +159 -0
  143. package/src/timeout-management/timeout-config-manager.js +172 -0
  144. package/src/utils/ast-analyzer.js +417 -0
  145. package/src/utils/current-requirement-manager.js +276 -0
  146. package/src/utils/current-requirement-operations.js +472 -0
  147. package/src/utils/dependency-mapper.js +456 -0
  148. package/src/utils/download-with-progress.js +4 -2
  149. package/src/utils/electron-update-checker.js +4 -1
  150. package/src/utils/file-size-analyzer.js +272 -0
  151. package/src/utils/import-updater.js +280 -0
  152. package/src/utils/refactoring-tools.js +512 -0
  153. package/src/utils/report-generator.js +569 -0
  154. package/src/utils/reports/report-analysis.js +218 -0
  155. package/src/utils/reports/report-types.js +55 -0
  156. package/src/utils/reports/summary-generators.js +102 -0
  157. package/src/utils/requirement-file-management.js +157 -0
  158. package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
  159. package/src/utils/requirement-helpers/requirement-mover.js +414 -0
  160. package/src/utils/requirement-helpers/requirement-parser.js +326 -0
  161. package/src/utils/requirement-helpers/requirement-status.js +320 -0
  162. package/src/utils/requirement-helpers-new.js +55 -0
  163. package/src/utils/requirement-helpers-refactored.js +367 -0
  164. package/src/utils/requirement-helpers.js +291 -1191
  165. package/src/utils/requirement-movement-operations.js +450 -0
  166. package/src/utils/requirement-movement.js +312 -0
  167. package/src/utils/requirement-parsing-helpers.js +56 -0
  168. package/src/utils/requirement-statistics.js +200 -0
  169. package/src/utils/requirement-text-utils.js +58 -0
  170. package/src/utils/rollback/rollback-handlers.js +125 -0
  171. package/src/utils/rollback/rollback-operation.js +63 -0
  172. package/src/utils/rollback/rollback-recorder.js +166 -0
  173. package/src/utils/rollback/rollback-state-manager.js +175 -0
  174. package/src/utils/rollback/rollback-types.js +33 -0
  175. package/src/utils/rollback/rollback-utils.js +110 -0
  176. package/src/utils/rollback-manager-original.js +569 -0
  177. package/src/utils/rollback-manager.js +202 -0
  178. package/src/utils/smoke-test-cli.js +362 -0
  179. package/src/utils/smoke-test-gui.js +351 -0
  180. package/src/utils/smoke-test-orchestrator.js +321 -0
  181. package/src/utils/smoke-test-runner.js +60 -0
  182. package/src/utils/smoke-test-web.js +347 -0
  183. package/src/utils/specification-helpers.js +39 -13
  184. package/src/utils/specification-migration.js +97 -0
  185. package/src/utils/test-runner.js +579 -0
  186. package/src/utils/validation-framework.js +518 -0
  187. package/src/validation/compliance-analyzer.js +197 -0
  188. package/src/validation/compliance-report-generator.js +343 -0
  189. package/src/validation/compliance-reporter.js +711 -0
  190. package/src/validation/compliance-rules.js +127 -0
  191. package/src/validation/constitution-validator-new.js +196 -0
  192. package/src/validation/constitution-validator.js +17 -0
  193. package/src/validation/file-validators.js +170 -0
  194. package/src/validation/line-limit/file-analyzer.js +201 -0
  195. package/src/validation/line-limit/line-limit-validator.js +208 -0
  196. package/src/validation/line-limit/validation-result.js +144 -0
  197. package/src/validation/line-limit-core.js +225 -0
  198. package/src/validation/line-limit-reporter.js +134 -0
  199. package/src/validation/line-limit-result.js +125 -0
  200. package/src/validation/line-limit-validator.js +41 -0
  201. package/src/validation/metrics-calculator.js +660 -0
  202. package/src/sync/sync-engine-backup.js +0 -559
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Installation Orchestrator
3
+ *
4
+ * Orchestrates agent installation across multiple installers.
5
+ * Follows constitutional requirements: <555 lines, test-first approach.
6
+ */
7
+
8
+ const InstallerFactory = require('./windows/InstallerFactory');
9
+ const InstallationErrorHandler = require('./InstallationErrorHandler');
10
+ const InstallationProgressReporter = require('./InstallationProgressReporter');
11
+ const { AgentStatus } = require('./AgentStatus');
12
+ const { OperationType, OperationStatus } = require('./OperationTypes');
13
+
14
+ /**
15
+ * Installation Orchestrator class
16
+ */
17
+ class InstallationOrchestrator {
18
+ /**
19
+ * Create orchestrator instance
20
+ * @param {Object} config - Orchestrator configuration
21
+ */
22
+ constructor(config = {}) {
23
+ this.configManager = config.configManager || null;
24
+ this.logger = config.logger || null;
25
+ this.fileManager = config.fileManager || null;
26
+ this.parallel = config.parallel !== false;
27
+ this.maxConcurrency = config.maxConcurrency || 2;
28
+ this.timeout = config.timeout || 300000;
29
+ this.retryAttempts = config.retryAttempts || 3;
30
+ this.retryDelay = config.retryDelay || 5000;
31
+
32
+ // Initialize services
33
+ this.errorHandler = new InstallationErrorHandler({
34
+ logger: this.logger,
35
+ platform: config.platform,
36
+ arch: config.arch
37
+ });
38
+
39
+ this.progressReporter = new InstallationProgressReporter({
40
+ logger: this.logger,
41
+ updateInterval: config.progressUpdateInterval || 2000,
42
+ verbose: config.verboseProgress || false
43
+ });
44
+ }
45
+
46
+ /**
47
+ * Install agent with orchestration
48
+ * @param {Object} agent - Agent to install
49
+ * @param {Object} options - Installation options
50
+ * @returns {Promise<Object>} - Installation result
51
+ */
52
+ async installAgent(agent, options = {}) {
53
+ const { force = false, installerType = null, timeout = this.timeout } = options;
54
+
55
+ if (this.logger) {
56
+ await this.logger.info('Starting agent installation', {
57
+ agentId: agent.id,
58
+ agentName: agent.name,
59
+ force,
60
+ installerType,
61
+ timeout
62
+ });
63
+ }
64
+
65
+ const startTime = Date.now();
66
+ const operationId = `install-${agent.id}-${Date.now()}`;
67
+
68
+ try {
69
+ // Update agent status to INSTALLING
70
+ await this.updateAgentStatus(agent.id, AgentStatus.INSTALLING, 'Starting installation');
71
+
72
+ // Get available installers first
73
+ const installers = await this.getAvailableInstallers(agent, installerType);
74
+
75
+ // Start progress tracking
76
+ const progress = this.progressReporter.startProgress(operationId, {
77
+ agentId: agent.id,
78
+ installerType: installerType || 'AUTO',
79
+ totalSteps: installers.length * 2 + 2,
80
+ estimatedDuration: timeout
81
+ });
82
+
83
+ progress.updateStep('Checking available installers');
84
+
85
+ if (installers.length === 0) {
86
+ progress.fail(new Error('No available installers found for agent'));
87
+ throw new Error('No available installers found for agent');
88
+ }
89
+
90
+ progress.updateStep(`Found ${installers.length} available installers`, {
91
+ installers: installers.map(i => i.type)
92
+ });
93
+
94
+ // Try installers in order of preference
95
+ let installationResult = await this.tryInstallers(agent, installers, progress, options);
96
+
97
+ if (!installationResult || !installationResult.success) {
98
+ progress.fail(new Error('All installation attempts failed'));
99
+ throw new Error('All installation attempts failed');
100
+ }
101
+
102
+ progress.complete(installationResult);
103
+
104
+ const duration = Date.now() - startTime;
105
+
106
+ // Log installation success
107
+ await this.logInstallation(agent, installationResult, duration);
108
+
109
+ return {
110
+ success: true,
111
+ agentId: agent.id,
112
+ installerType: installationResult.installer,
113
+ duration,
114
+ result: installationResult,
115
+ timestamp: new Date().toISOString()
116
+ };
117
+
118
+ } catch (error) {
119
+ const duration = Date.now() - startTime;
120
+
121
+ // Enhanced error handling for main installation failure
122
+ const enhancedError = this.errorHandler.handleError(error, {
123
+ agentId: agent.id,
124
+ installerType: installerType || 'AUTO',
125
+ phase: 'MAIN_INSTALLATION'
126
+ });
127
+
128
+ // Update agent status to ERROR
129
+ await this.updateAgentStatus(agent.id, AgentStatus.ERROR, enhancedError.userMessage);
130
+
131
+ if (this.logger) {
132
+ await this.logger.error('Agent installation failed', {
133
+ agentId: agent.id,
134
+ duration,
135
+ error: error.message,
136
+ enhancedError: enhancedError.userMessage,
137
+ category: enhancedError.category,
138
+ severity: enhancedError.severity,
139
+ resolutionSteps: enhancedError.resolutionSteps
140
+ });
141
+ }
142
+
143
+ return {
144
+ success: false,
145
+ agentId: agent.id,
146
+ error: enhancedError.userMessage,
147
+ technicalError: error.message,
148
+ category: enhancedError.category,
149
+ severity: enhancedError.severity,
150
+ resolutionSteps: enhancedError.resolutionSteps,
151
+ duration,
152
+ timestamp: new Date().toISOString()
153
+ };
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Try installers in order
159
+ * @param {Object} agent - Agent to install
160
+ * @param {Array} installers - Available installers
161
+ * @param {Object} progress - Progress tracker
162
+ * @param {Object} options - Installation options
163
+ * @returns {Promise<Object>} - Installation result
164
+ */
165
+ async tryInstallers(agent, installers, progress, options) {
166
+ let lastError = null;
167
+
168
+ for (const installer of installers) {
169
+ try {
170
+ progress.updateStep(`Trying ${installer.type} installer`);
171
+
172
+ if (this.logger) {
173
+ await this.logger.info(`Trying installer: ${installer.type}`, {
174
+ agentId: agent.id,
175
+ installerType: installer.type
176
+ });
177
+ }
178
+
179
+ // Check requirements before installation
180
+ progress.updateStep(`Checking ${installer.type} requirements`);
181
+ const requirements = await installer.checkRequirements();
182
+ if (!requirements.allMet) {
183
+ const unmet = requirements.requirements
184
+ .filter(req => !req.met)
185
+ .map(req => req.requirement);
186
+
187
+ progress.updateStep(`${installer.type} requirements not met`, { unmet });
188
+
189
+ if (this.logger) {
190
+ await this.logger.warn(`Installer requirements not met: ${installer.type}`, {
191
+ agentId: agent.id,
192
+ installerType: installer.type,
193
+ unmetRequirements: unmet
194
+ });
195
+ }
196
+
197
+ lastError = new Error(`Requirements not met: ${unmet.join(', ')}`);
198
+ continue;
199
+ }
200
+
201
+ progress.updateStep(`Installing with ${installer.type}`);
202
+ const installationResult = await installer.install(agent, {
203
+ force: options.force,
204
+ timeout: Math.floor(options.timeout / installers.length)
205
+ });
206
+
207
+ if (installationResult && installationResult.success) {
208
+ progress.updateStep(`${installer.type} installation successful`, {
209
+ result: installationResult
210
+ });
211
+ return installationResult;
212
+ } else {
213
+ progress.updateStep(`${installer.type} installation failed`);
214
+ }
215
+
216
+ } catch (error) {
217
+ lastError = error;
218
+
219
+ // Enhanced error handling with comprehensive messages
220
+ const enhancedError = this.errorHandler.handleError(error, {
221
+ agentId: agent.id,
222
+ installerType: installer.type,
223
+ command: installer.command,
224
+ phase: 'INSTALLATION'
225
+ });
226
+
227
+ if (this.logger) {
228
+ await this.logger.error(`Installer error: ${installer.type}`, {
229
+ agentId: agent.id,
230
+ installerType: installer.type,
231
+ error: error.message,
232
+ enhancedError: enhancedError.userMessage,
233
+ category: enhancedError.category,
234
+ severity: enhancedError.severity
235
+ });
236
+ }
237
+ }
238
+ }
239
+
240
+ throw lastError || new Error('All installation attempts failed');
241
+ }
242
+
243
+ /**
244
+ * Get available installers for agent
245
+ * @param {Object} agent - Agent configuration
246
+ * @param {string} preferredType - Preferred installer type
247
+ * @returns {Promise<Array>} - Available installers
248
+ */
249
+ async getAvailableInstallers(agent, preferredType = null) {
250
+ const installers = [];
251
+
252
+ if (preferredType) {
253
+ // Try preferred installer first
254
+ try {
255
+ const installer = InstallerFactory.create(preferredType, {
256
+ configManager: this.configManager,
257
+ logger: this.logger,
258
+ fileManager: this.fileManager
259
+ });
260
+
261
+ const isAvailable = await installer.isAvailable();
262
+ const requirements = await installer.checkRequirements();
263
+
264
+ if (isAvailable && requirements.allMet) {
265
+ installers.push(installer);
266
+ }
267
+ } catch (error) {
268
+ if (this.logger) {
269
+ await this.logger.warn(`Preferred installer not available: ${preferredType}`, {
270
+ agentId: agent.id,
271
+ error: error.message
272
+ });
273
+ }
274
+ }
275
+ }
276
+
277
+ // Try all available installers
278
+ const availableTypes = ['WINGET', 'NPM', 'POWERSHELL', 'CHOCOLATEY', 'DIRECT'];
279
+
280
+ for (const type of availableTypes) {
281
+ if (type === preferredType) continue; // Already tried preferred
282
+
283
+ try {
284
+ const installer = InstallerFactory.create(type, {
285
+ configManager: this.configManager,
286
+ logger: this.logger,
287
+ fileManager: this.fileManager
288
+ });
289
+
290
+ const isAvailable = await installer.isAvailable();
291
+ const requirements = await installer.checkRequirements();
292
+
293
+ if (isAvailable && requirements.allMet) {
294
+ installers.push(installer);
295
+ }
296
+ } catch (error) {
297
+ if (this.logger) {
298
+ await this.logger.warn(`Installer check failed: ${type}`, {
299
+ agentId: agent.id,
300
+ error: error.message
301
+ });
302
+ }
303
+ }
304
+ }
305
+
306
+ // Sort by priority
307
+ return installers.sort((a, b) => (a.priority || 999) - (b.priority || 999));
308
+ }
309
+
310
+ /**
311
+ * Update agent status
312
+ * @param {string} agentId - Agent identifier
313
+ * @param {string} status - New status
314
+ * @param {string} message - Status message
315
+ */
316
+ async updateAgentStatus(agentId, status, message) {
317
+ if (this.configManager && this.configManager.updateAgentStatus) {
318
+ try {
319
+ await this.configManager.updateAgentStatus(agentId, status, message);
320
+ } catch (error) {
321
+ if (this.logger) {
322
+ await this.logger.warn('Failed to update agent status', {
323
+ agentId,
324
+ status,
325
+ error: error.message
326
+ });
327
+ }
328
+ }
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Log installation result
334
+ * @param {Object} agent - Agent configuration
335
+ * @param {Object} result - Installation result
336
+ * @param {number} duration - Installation duration
337
+ */
338
+ async logInstallation(agent, result, duration) {
339
+ if (this.logger) {
340
+ await this.logger.info('Agent installation completed', {
341
+ agentId: agent.id,
342
+ agentName: agent.name,
343
+ installerType: result.installer,
344
+ duration,
345
+ success: result.success,
346
+ exitCode: result.exitCode
347
+ });
348
+ }
349
+ }
350
+ }
351
+
352
+ module.exports = InstallationOrchestrator;