vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1642

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,140 @@
1
+ /**
2
+ * Agent Installation Service
3
+ *
4
+ * Simplified service that delegates to InstallationOrchestrator.
5
+ * Follows constitutional requirements: <555 lines, test-first approach.
6
+ */
7
+
8
+ const InstallationOrchestrator = require('./InstallationOrchestrator');
9
+ const { AgentStatus } = require('./AgentStatus');
10
+ const { OperationType, OperationStatus } = require('./OperationTypes');
11
+
12
+ /**
13
+ * Agent Installation Service class
14
+ */
15
+ class AgentInstallationService {
16
+ /**
17
+ * Create installation service instance
18
+ * @param {Object} config - Service configuration
19
+ */
20
+ constructor(config = {}) {
21
+ this.configManager = config.configManager || null;
22
+ this.logger = config.logger || null;
23
+ this.fileManager = config.fileManager || null;
24
+ this.parallel = config.parallel !== false;
25
+ this.maxConcurrency = config.maxConcurrency || 2;
26
+ this.timeout = config.timeout || 300000;
27
+ this.retryAttempts = config.retryAttempts || 3;
28
+ this.retryDelay = config.retryDelay || 5000;
29
+
30
+ // Initialize orchestrator
31
+ this.orchestrator = new InstallationOrchestrator({
32
+ configManager: this.configManager,
33
+ logger: this.logger,
34
+ fileManager: this.fileManager,
35
+ parallel: this.parallel,
36
+ maxConcurrency: this.maxConcurrency,
37
+ timeout: this.timeout,
38
+ retryAttempts: this.retryAttempts,
39
+ retryDelay: this.retryDelay,
40
+ ...config.orchestrator
41
+ });
42
+ }
43
+
44
+ /**
45
+ * Install agent using orchestrator
46
+ * @param {Object} agent - Agent to install
47
+ * @param {Object} options - Installation options
48
+ * @returns {Promise<Object>} - Installation result
49
+ */
50
+ async installAgent(agent, options = {}) {
51
+ return this.orchestrator.installAgent(agent, options);
52
+ }
53
+
54
+ /**
55
+ * Install multiple agents
56
+ * @param {Array<Object>} agents - Agents to install
57
+ * @param {Object} options - Installation options
58
+ * @returns {Promise<Object>} - Batch installation result
59
+ */
60
+ async installAgents(agents, options = {}) {
61
+ const results = {
62
+ success: true,
63
+ totalAgents: agents.length,
64
+ completed: [],
65
+ failed: [],
66
+ summary: {
67
+ allSuccessful: true,
68
+ totalDuration: 0,
69
+ averageDuration: 0
70
+ }
71
+ };
72
+
73
+ const startTime = Date.now();
74
+
75
+ if (this.parallel) {
76
+ // Parallel installation
77
+ const promises = agents.map(agent =>
78
+ this.installAgent(agent, options).catch(error => ({
79
+ success: false,
80
+ agentId: agent.id,
81
+ error: error.message || error
82
+ }))
83
+ );
84
+
85
+ const agentResults = await Promise.all(promises);
86
+
87
+ for (const result of agentResults) {
88
+ if (result.success) {
89
+ results.completed.push(result);
90
+ } else {
91
+ results.failed.push(result);
92
+ results.success = false;
93
+ results.summary.allSuccessful = false;
94
+ }
95
+ }
96
+ } else {
97
+ // Sequential installation
98
+ for (const agent of agents) {
99
+ try {
100
+ const result = await this.installAgent(agent, options);
101
+ results.completed.push(result);
102
+ } catch (error) {
103
+ results.failed.push({
104
+ success: false,
105
+ agentId: agent.id,
106
+ error: error.message || error
107
+ });
108
+ results.success = false;
109
+ results.summary.allSuccessful = false;
110
+ }
111
+ }
112
+ }
113
+
114
+ results.summary.totalDuration = Date.now() - startTime;
115
+ results.summary.averageDuration = results.summary.totalDuration / agents.length;
116
+
117
+ if (this.logger) {
118
+ await this.logger.info('Batch installation completed', {
119
+ totalAgents: results.totalAgents,
120
+ completed: results.completed.length,
121
+ failed: results.failed.length,
122
+ allSuccessful: results.summary.allSuccessful,
123
+ totalDuration: results.summary.totalDuration
124
+ });
125
+ }
126
+
127
+ return results;
128
+ }
129
+
130
+ /**
131
+ * Create default installation service
132
+ * @param {Object} config - Configuration
133
+ * @returns {AgentInstallationService} - Service instance
134
+ */
135
+ static createDefault(config = {}) {
136
+ return new AgentInstallationService(config);
137
+ }
138
+ }
139
+
140
+ module.exports = AgentInstallationService;
@@ -0,0 +1,467 @@
1
+ /**
2
+ * Agent Setup Service
3
+ *
4
+ * Handles interactive setup for agents including authentication and initialization.
5
+ * Follows constitutional requirements: <555 lines, test-first approach.
6
+ */
7
+
8
+ const { spawn } = require('child_process');
9
+ const { VerificationType } = require('./VerificationType');
10
+
11
+ /**
12
+ * Agent setup service class
13
+ */
14
+ class AgentSetupService {
15
+ /**
16
+ * Create setup service instance
17
+ * @param {Object} options - Service options
18
+ */
19
+ constructor(options = {}) {
20
+ this.logger = options.logger || null;
21
+ this.timeout = options.timeout || 60000; // 1 minute default for setup
22
+ this.maxRetries = options.maxRetries || 2;
23
+ this.interactiveMode = options.interactiveMode !== false; // Default to interactive
24
+ }
25
+
26
+ /**
27
+ * Perform setup for multiple agents
28
+ * @param {Object[]} agents - Array of agent configurations
29
+ * @param {Object} options - Setup options
30
+ * @returns {Promise<Object>} - Batch setup result
31
+ */
32
+ async performSetupBatch(agents, options = {}) {
33
+ const batchId = `batch-setup-${Date.now()}`;
34
+ const startTime = Date.now();
35
+
36
+ try {
37
+ if (this.logger) {
38
+ await this.logger.info('Starting batch agent setup', {
39
+ batchId,
40
+ agentCount: agents.length
41
+ });
42
+ }
43
+
44
+ const results = {};
45
+ const promises = agents.map(async (agent) => {
46
+ const result = await this.performSetup(agent, options);
47
+ results[agent.id] = result;
48
+ return result;
49
+ });
50
+
51
+ // Wait for all setups to complete
52
+ await Promise.allSettled(promises);
53
+
54
+ const successful = Object.values(results).filter(r => r.success).length;
55
+ const total = agents.length;
56
+
57
+ return {
58
+ success: successful === total,
59
+ batchId,
60
+ totalAgents: total,
61
+ successful,
62
+ failed: total - successful,
63
+ results,
64
+ timestamp: new Date().toISOString(),
65
+ duration: Date.now() - startTime
66
+ };
67
+
68
+ } catch (error) {
69
+ if (this.logger) {
70
+ await this.logger.error('Batch agent setup failed', {
71
+ batchId,
72
+ error: error.message
73
+ });
74
+ }
75
+
76
+ return {
77
+ success: false,
78
+ batchId,
79
+ totalAgents: agents.length,
80
+ successful: 0,
81
+ failed: agents.length,
82
+ error: error.message,
83
+ timestamp: new Date().toISOString(),
84
+ duration: Date.now() - startTime
85
+ };
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Perform interactive setup for an agent
91
+ * @param {Object} agent - Agent configuration
92
+ * @param {Object} options - Setup options
93
+ * @returns {Promise<Object>} - Setup result
94
+ */
95
+ async performSetup(agent, options = {}) {
96
+ const setupId = `setup-${agent.id}-${Date.now()}`;
97
+ const startTime = Date.now();
98
+
99
+ try {
100
+ if (this.logger) {
101
+ await this.logger.info('Starting agent setup', {
102
+ setupId,
103
+ agentId: agent.id,
104
+ agentName: agent.name
105
+ });
106
+ }
107
+
108
+ // Check if agent has setup configuration
109
+ if (!agent.installation || !agent.installation.setup) {
110
+ return {
111
+ success: true,
112
+ agentId: agent.id,
113
+ setupId,
114
+ skipped: true,
115
+ message: 'No setup configuration found',
116
+ timestamp: new Date().toISOString(),
117
+ duration: Date.now() - startTime
118
+ };
119
+ }
120
+
121
+ const setupConfig = agent.installation.setup;
122
+
123
+ // Run setup commands
124
+ const results = [];
125
+ for (const command of setupConfig.commands || []) {
126
+ const result = await this.executeSetupCommand(agent.id, command, options);
127
+ results.push(result);
128
+
129
+ if (!result.success && setupConfig.type === 'interactive') {
130
+ // For interactive setup, stop on first failure
131
+ break;
132
+ }
133
+ }
134
+
135
+ // Run verification if configured
136
+ let verificationResult = null;
137
+ if (setupConfig.verification) {
138
+ verificationResult = await this.performVerification(agent, setupConfig.verification, options);
139
+ }
140
+
141
+ const allSuccessful = results.every(r => r.success) &&
142
+ (!verificationResult || verificationResult.success);
143
+
144
+ return {
145
+ success: allSuccessful,
146
+ agentId: agent.id,
147
+ setupId,
148
+ results,
149
+ verification: verificationResult,
150
+ timestamp: new Date().toISOString(),
151
+ duration: Date.now() - startTime
152
+ };
153
+
154
+ } catch (error) {
155
+ if (this.logger) {
156
+ await this.logger.error('Agent setup failed', {
157
+ setupId,
158
+ agentId: agent.id,
159
+ error: error.message
160
+ });
161
+ }
162
+
163
+ return {
164
+ success: false,
165
+ agentId: agent.id,
166
+ setupId,
167
+ error: error.message,
168
+ timestamp: new Date().toISOString(),
169
+ duration: Date.now() - startTime
170
+ };
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Execute a setup command
176
+ * @param {string} agentId - Agent ID
177
+ * @param {string} command - Command to execute
178
+ * @param {Object} options - Execution options
179
+ * @returns {Promise<Object>} - Command result
180
+ */
181
+ async executeSetupCommand(agentId, command, options = {}) {
182
+ const commandId = `cmd-${agentId}-${Date.now()}`;
183
+ const startTime = Date.now();
184
+
185
+ try {
186
+ if (this.logger) {
187
+ await this.logger.info('Executing setup command', {
188
+ commandId,
189
+ agentId,
190
+ command
191
+ });
192
+ }
193
+
194
+ const result = await this.executeCommand(command, {
195
+ timeout: options.timeout || this.timeout,
196
+ interactive: this.interactiveMode,
197
+ ...options
198
+ });
199
+
200
+ return {
201
+ success: true,
202
+ commandId,
203
+ agentId,
204
+ command,
205
+ output: result.output,
206
+ exitCode: result.exitCode,
207
+ timestamp: new Date().toISOString(),
208
+ duration: Date.now() - startTime
209
+ };
210
+
211
+ } catch (error) {
212
+ if (this.logger) {
213
+ await this.logger.error('Setup command failed', {
214
+ commandId,
215
+ agentId,
216
+ command,
217
+ error: error.message
218
+ });
219
+ }
220
+
221
+ return {
222
+ success: false,
223
+ commandId,
224
+ agentId,
225
+ command,
226
+ error: error.message,
227
+ timestamp: new Date().toISOString(),
228
+ duration: Date.now() - startTime
229
+ };
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Perform verification after setup
235
+ * @param {Object} agent - Agent configuration
236
+ * @param {Object} verificationConfig - Verification configuration
237
+ * @param {Object} options - Verification options
238
+ * @returns {Promise<Object>} - Verification result
239
+ */
240
+ async performVerification(agent, verificationConfig, options = {}) {
241
+ const verificationId = `verify-${agent.id}-${Date.now()}`;
242
+ const startTime = Date.now();
243
+
244
+ try {
245
+ if (this.logger) {
246
+ await this.logger.info('Performing setup verification', {
247
+ verificationId,
248
+ agentId: agent.id,
249
+ type: verificationConfig.type
250
+ });
251
+ }
252
+
253
+ if (verificationConfig.type === 'communication') {
254
+ return await this.performCommunicationVerification(agent, verificationConfig, options);
255
+ } else {
256
+ return await this.performStandardVerification(agent, verificationConfig, options);
257
+ }
258
+
259
+ } catch (error) {
260
+ if (this.logger) {
261
+ await this.logger.error('Setup verification failed', {
262
+ verificationId,
263
+ agentId: agent.id,
264
+ error: error.message
265
+ });
266
+ }
267
+
268
+ return {
269
+ success: false,
270
+ agentId: agent.id,
271
+ verificationId,
272
+ type: verificationConfig.type,
273
+ error: error.message,
274
+ timestamp: new Date().toISOString(),
275
+ duration: Date.now() - startTime
276
+ };
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Perform communication verification
282
+ * @param {Object} agent - Agent configuration
283
+ * @param {Object} verificationConfig - Verification configuration
284
+ * @param {Object} options - Verification options
285
+ * @returns {Promise<Object>} - Verification result
286
+ */
287
+ async performCommunicationVerification(agent, verificationConfig, options = {}) {
288
+ const { command, expectedOutput, timeout = 60000 } = verificationConfig;
289
+
290
+ try {
291
+ const result = await this.executeCommand(command, {
292
+ timeout: options.timeout || timeout,
293
+ interactive: false // Non-interactive for verification
294
+ });
295
+
296
+ // Check if output matches expected patterns
297
+ const success = this.checkExpectedOutput(result.output, expectedOutput);
298
+
299
+ return {
300
+ success,
301
+ agentId: agent.id,
302
+ type: 'communication',
303
+ command,
304
+ expectedOutput,
305
+ actualOutput: result.output,
306
+ exitCode: result.exitCode,
307
+ matchedPatterns: success ? this.extractMatchingPatterns(result.output, expectedOutput) : [],
308
+ timestamp: new Date().toISOString(),
309
+ duration: Date.now() - Date.now() // Will be updated by caller
310
+ };
311
+
312
+ } catch (error) {
313
+ return {
314
+ success: false,
315
+ agentId: agent.id,
316
+ type: 'communication',
317
+ command,
318
+ expectedOutput,
319
+ error: error.message,
320
+ timestamp: new Date().toISOString(),
321
+ duration: Date.now() - Date.now() // Will be updated by caller
322
+ };
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Perform standard verification
328
+ * @param {Object} agent - Agent configuration
329
+ * @param {Object} verificationConfig - Verification configuration
330
+ * @param {Object} options - Verification options
331
+ * @returns {Promise<Object>} - Verification result
332
+ */
333
+ async performStandardVerification(agent, verificationConfig, options = {}) {
334
+ const { command, expectedOutput, timeout = 30000 } = verificationConfig;
335
+
336
+ try {
337
+ const result = await this.executeCommand(command, {
338
+ timeout: options.timeout || timeout,
339
+ interactive: false
340
+ });
341
+
342
+ const success = this.checkExpectedOutput(result.output, expectedOutput);
343
+
344
+ return {
345
+ success,
346
+ agentId: agent.id,
347
+ type: verificationConfig.type,
348
+ command,
349
+ expectedOutput,
350
+ actualOutput: result.output,
351
+ exitCode: result.exitCode,
352
+ timestamp: new Date().toISOString(),
353
+ duration: Date.now() - Date.now() // Will be updated by caller
354
+ };
355
+
356
+ } catch (error) {
357
+ return {
358
+ success: false,
359
+ agentId: agent.id,
360
+ type: verificationConfig.type,
361
+ command,
362
+ expectedOutput,
363
+ error: error.message,
364
+ timestamp: new Date().toISOString(),
365
+ duration: Date.now() - Date.now() // Will be updated by caller
366
+ };
367
+ }
368
+ }
369
+
370
+ /**
371
+ * Execute a command with timeout
372
+ * @param {string} command - Command to execute
373
+ * @param {Object} options - Execution options
374
+ * @returns {Promise<Object>} - Command result
375
+ */
376
+ async executeCommand(command, options = {}) {
377
+ const { timeout = 30000, interactive = false } = options;
378
+
379
+ return new Promise((resolve, reject) => {
380
+ const args = command.split(' ');
381
+ const cmd = args.shift();
382
+
383
+ const child = spawn(cmd, args, {
384
+ stdio: interactive ? 'inherit' : 'pipe',
385
+ shell: true
386
+ });
387
+
388
+ let output = '';
389
+ let errorOutput = '';
390
+
391
+ if (!interactive) {
392
+ child.stdout?.on('data', (data) => {
393
+ output += data.toString();
394
+ });
395
+
396
+ child.stderr?.on('data', (data) => {
397
+ errorOutput += data.toString();
398
+ });
399
+ }
400
+
401
+ const timer = setTimeout(() => {
402
+ child.kill('SIGTERM');
403
+ reject(new Error(`Command timed out after ${timeout}ms`));
404
+ }, timeout);
405
+
406
+ child.on('close', (code) => {
407
+ clearTimeout(timer);
408
+
409
+ if (code === 0) {
410
+ resolve({
411
+ exitCode: code,
412
+ output: output.trim(),
413
+ errorOutput: errorOutput.trim()
414
+ });
415
+ } else {
416
+ reject(new Error(`Command failed with exit code ${code}: ${errorOutput.trim()}`));
417
+ }
418
+ });
419
+
420
+ child.on('error', (error) => {
421
+ clearTimeout(timer);
422
+ reject(error);
423
+ });
424
+ });
425
+ }
426
+
427
+ /**
428
+ * Check if output matches expected patterns
429
+ * @param {string} output - Actual output
430
+ * @param {string|string[]} expectedOutput - Expected output patterns
431
+ * @returns {boolean} - True if matches
432
+ */
433
+ checkExpectedOutput(output, expectedOutput) {
434
+ const patterns = Array.isArray(expectedOutput) ? expectedOutput : [expectedOutput];
435
+
436
+ return patterns.some(pattern => {
437
+ const regex = new RegExp(pattern, 'i');
438
+ return regex.test(output);
439
+ });
440
+ }
441
+
442
+ /**
443
+ * Extract matching patterns from output
444
+ * @param {string} output - Actual output
445
+ * @param {string|string[]} expectedOutput - Expected output patterns
446
+ * @returns {string[]} - Matching patterns
447
+ */
448
+ extractMatchingPatterns(output, expectedOutput) {
449
+ const patterns = Array.isArray(expectedOutput) ? expectedOutput : [expectedOutput];
450
+
451
+ return patterns.filter(pattern => {
452
+ const regex = new RegExp(pattern, 'i');
453
+ return regex.test(output);
454
+ });
455
+ }
456
+
457
+ /**
458
+ * Create default setup service instance
459
+ * @param {Object} options - Service options
460
+ * @returns {AgentSetupService} - Setup service instance
461
+ */
462
+ static createDefault(options = {}) {
463
+ return new AgentSetupService(options);
464
+ }
465
+ }
466
+
467
+ module.exports = AgentSetupService;