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.
- package/README.md +240 -0
- package/package.json +10 -2
- package/src/agents/Agent.js +300 -0
- package/src/agents/AgentAdditionService.js +311 -0
- package/src/agents/AgentCheckService.js +690 -0
- package/src/agents/AgentInstallationService.js +140 -0
- package/src/agents/AgentSetupService.js +467 -0
- package/src/agents/AgentStatus.js +183 -0
- package/src/agents/AgentVerificationService.js +634 -0
- package/src/agents/ConfigurationSchemaValidator.js +543 -0
- package/src/agents/EnvironmentConfigurationManager.js +602 -0
- package/src/agents/InstallationErrorHandler.js +372 -0
- package/src/agents/InstallationLog.js +363 -0
- package/src/agents/InstallationMethod.js +510 -0
- package/src/agents/InstallationOrchestrator.js +352 -0
- package/src/agents/InstallationProgressReporter.js +372 -0
- package/src/agents/InstallationRetryManager.js +322 -0
- package/src/agents/InstallationType.js +254 -0
- package/src/agents/OperationTypes.js +310 -0
- package/src/agents/PerformanceMetricsCollector.js +493 -0
- package/src/agents/SecurityValidationService.js +534 -0
- package/src/agents/VerificationTest.js +354 -0
- package/src/agents/VerificationType.js +226 -0
- package/src/agents/WindowsPermissionHandler.js +518 -0
- package/src/agents/config/AgentConfigManager.js +393 -0
- package/src/agents/config/AgentDefaultsRegistry.js +373 -0
- package/src/agents/config/ConfigValidator.js +281 -0
- package/src/agents/discovery/AgentDiscoveryService.js +707 -0
- package/src/agents/logging/AgentLogger.js +511 -0
- package/src/agents/status/AgentStatusManager.js +481 -0
- package/src/agents/storage/FileManager.js +454 -0
- package/src/agents/verification/AgentCommunicationTester.js +474 -0
- package/src/agents/verification/BaseVerifier.js +430 -0
- package/src/agents/verification/CommandVerifier.js +480 -0
- package/src/agents/verification/FileOperationVerifier.js +453 -0
- package/src/agents/verification/ResultAnalyzer.js +707 -0
- package/src/agents/verification/TestRequirementManager.js +495 -0
- package/src/agents/verification/VerificationRunner.js +433 -0
- package/src/agents/windows/BaseWindowsInstaller.js +441 -0
- package/src/agents/windows/ChocolateyInstaller.js +509 -0
- package/src/agents/windows/DirectInstaller.js +443 -0
- package/src/agents/windows/InstallerFactory.js +391 -0
- package/src/agents/windows/NpmInstaller.js +505 -0
- package/src/agents/windows/PowerShellInstaller.js +458 -0
- package/src/agents/windows/WinGetInstaller.js +390 -0
- package/src/analysis/analysis-reporter.js +132 -0
- package/src/analysis/boundary-detector.js +712 -0
- package/src/analysis/categorizer.js +340 -0
- package/src/analysis/codebase-scanner.js +384 -0
- package/src/analysis/line-counter.js +513 -0
- package/src/analysis/priority-calculator.js +679 -0
- package/src/analysis/report/analysis-report.js +250 -0
- package/src/analysis/report/package-analyzer.js +278 -0
- package/src/analysis/report/recommendation-generator.js +382 -0
- package/src/analysis/report/statistics-generator.js +515 -0
- package/src/analysis/reports/analysis-report-model.js +101 -0
- package/src/analysis/reports/recommendation-generator.js +283 -0
- package/src/analysis/reports/report-generators.js +191 -0
- package/src/analysis/reports/statistics-calculator.js +231 -0
- package/src/analysis/reports/trend-analyzer.js +219 -0
- package/src/analysis/strategy-generator.js +814 -0
- package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
- package/src/config/refactoring-config.js +307 -0
- package/src/health-tracking/json-storage.js +38 -2
- package/src/ide-integration/applescript-manager-core.js +233 -0
- package/src/ide-integration/applescript-manager.cjs +357 -28
- package/src/ide-integration/applescript-manager.js +89 -3599
- package/src/ide-integration/cdp-manager.js +306 -0
- package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
- package/src/ide-integration/continuation-handler.js +337 -0
- package/src/ide-integration/ide-status-checker.js +292 -0
- package/src/ide-integration/macos-ide-manager.js +627 -0
- package/src/ide-integration/macos-text-sender.js +528 -0
- package/src/ide-integration/response-reader.js +548 -0
- package/src/ide-integration/windows-automation-manager.js +121 -0
- package/src/ide-integration/windows-ide-manager.js +373 -0
- package/src/index.cjs +25 -3
- package/src/index.js +15 -1
- package/src/llm/direct-llm-manager.cjs +90 -2
- package/src/models/compliance-report.js +538 -0
- package/src/models/file-analysis.js +681 -0
- package/src/models/refactoring-plan.js +770 -0
- package/src/monitoring/alert-system.js +834 -0
- package/src/monitoring/compliance-progress-tracker.js +437 -0
- package/src/monitoring/continuous-scan-notifications.js +661 -0
- package/src/monitoring/continuous-scanner.js +279 -0
- package/src/monitoring/file-monitor/file-analyzer.js +262 -0
- package/src/monitoring/file-monitor/file-monitor.js +237 -0
- package/src/monitoring/file-monitor/watcher.js +194 -0
- package/src/monitoring/file-monitor.js +17 -0
- package/src/monitoring/notification-manager.js +437 -0
- package/src/monitoring/scanner-core.js +368 -0
- package/src/monitoring/scanner-events.js +214 -0
- package/src/monitoring/violation-notification-system.js +515 -0
- package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
- package/src/refactoring/boundaries/extraction-result.js +285 -0
- package/src/refactoring/boundaries/extraction-strategies.js +392 -0
- package/src/refactoring/boundaries/module-boundary.js +209 -0
- package/src/refactoring/boundary/boundary-detector.js +741 -0
- package/src/refactoring/boundary/boundary-types.js +405 -0
- package/src/refactoring/boundary/extraction-strategies.js +554 -0
- package/src/refactoring/boundary-extraction-result.js +77 -0
- package/src/refactoring/boundary-extraction-strategies.js +330 -0
- package/src/refactoring/boundary-extractor.js +384 -0
- package/src/refactoring/boundary-types.js +46 -0
- package/src/refactoring/circular/circular-dependency.js +88 -0
- package/src/refactoring/circular/cycle-detection.js +147 -0
- package/src/refactoring/circular/dependency-node.js +82 -0
- package/src/refactoring/circular/dependency-result.js +107 -0
- package/src/refactoring/circular/dependency-types.js +58 -0
- package/src/refactoring/circular/graph-builder.js +213 -0
- package/src/refactoring/circular/resolution-strategy.js +72 -0
- package/src/refactoring/circular/strategy-generator.js +229 -0
- package/src/refactoring/circular-dependency-resolver-original.js +809 -0
- package/src/refactoring/circular-dependency-resolver.js +200 -0
- package/src/refactoring/code-mover.js +761 -0
- package/src/refactoring/file-splitter.js +696 -0
- package/src/refactoring/functionality-validator.js +816 -0
- package/src/refactoring/import-manager.js +774 -0
- package/src/refactoring/module-boundary.js +107 -0
- package/src/refactoring/refactoring-executor.js +672 -0
- package/src/refactoring/refactoring-rollback.js +614 -0
- package/src/refactoring/test-validator.js +631 -0
- package/src/requirement-management/default-requirement-manager.js +321 -0
- package/src/requirement-management/requirement-file-parser.js +159 -0
- package/src/requirement-management/requirement-sequencer.js +221 -0
- package/src/rui/commands/AgentCommandParser.js +600 -0
- package/src/rui/commands/AgentCommands.js +487 -0
- package/src/rui/commands/AgentResponseFormatter.js +832 -0
- package/src/scripts/verify-full-compliance.js +269 -0
- package/src/sync/sync-engine-core.js +1 -0
- package/src/sync/sync-engine-remote-handlers.js +135 -0
- package/src/task-generation/automated-task-generator.js +351 -0
- package/src/task-generation/prioritizer.js +287 -0
- package/src/task-generation/task-list-updater.js +215 -0
- package/src/task-generation/task-management-integration.js +480 -0
- package/src/task-generation/task-manager-integration.js +270 -0
- package/src/task-generation/violation-task-generator.js +474 -0
- package/src/task-management/continuous-scan-integration.js +342 -0
- package/src/timeout-management/index.js +12 -3
- package/src/timeout-management/response-time-tracker.js +167 -0
- package/src/timeout-management/timeout-calculator.js +159 -0
- package/src/timeout-management/timeout-config-manager.js +172 -0
- package/src/utils/ast-analyzer.js +417 -0
- package/src/utils/current-requirement-manager.js +276 -0
- package/src/utils/current-requirement-operations.js +472 -0
- package/src/utils/dependency-mapper.js +456 -0
- package/src/utils/download-with-progress.js +4 -2
- package/src/utils/electron-update-checker.js +4 -1
- package/src/utils/file-size-analyzer.js +272 -0
- package/src/utils/import-updater.js +280 -0
- package/src/utils/refactoring-tools.js +512 -0
- package/src/utils/report-generator.js +569 -0
- package/src/utils/reports/report-analysis.js +218 -0
- package/src/utils/reports/report-types.js +55 -0
- package/src/utils/reports/summary-generators.js +102 -0
- package/src/utils/requirement-file-management.js +157 -0
- package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
- package/src/utils/requirement-helpers/requirement-mover.js +414 -0
- package/src/utils/requirement-helpers/requirement-parser.js +326 -0
- package/src/utils/requirement-helpers/requirement-status.js +320 -0
- package/src/utils/requirement-helpers-new.js +55 -0
- package/src/utils/requirement-helpers-refactored.js +367 -0
- package/src/utils/requirement-helpers.js +291 -1191
- package/src/utils/requirement-movement-operations.js +450 -0
- package/src/utils/requirement-movement.js +312 -0
- package/src/utils/requirement-parsing-helpers.js +56 -0
- package/src/utils/requirement-statistics.js +200 -0
- package/src/utils/requirement-text-utils.js +58 -0
- package/src/utils/rollback/rollback-handlers.js +125 -0
- package/src/utils/rollback/rollback-operation.js +63 -0
- package/src/utils/rollback/rollback-recorder.js +166 -0
- package/src/utils/rollback/rollback-state-manager.js +175 -0
- package/src/utils/rollback/rollback-types.js +33 -0
- package/src/utils/rollback/rollback-utils.js +110 -0
- package/src/utils/rollback-manager-original.js +569 -0
- package/src/utils/rollback-manager.js +202 -0
- package/src/utils/smoke-test-cli.js +362 -0
- package/src/utils/smoke-test-gui.js +351 -0
- package/src/utils/smoke-test-orchestrator.js +321 -0
- package/src/utils/smoke-test-runner.js +60 -0
- package/src/utils/smoke-test-web.js +347 -0
- package/src/utils/specification-helpers.js +39 -13
- package/src/utils/specification-migration.js +97 -0
- package/src/utils/test-runner.js +579 -0
- package/src/utils/validation-framework.js +518 -0
- package/src/validation/compliance-analyzer.js +197 -0
- package/src/validation/compliance-report-generator.js +343 -0
- package/src/validation/compliance-reporter.js +711 -0
- package/src/validation/compliance-rules.js +127 -0
- package/src/validation/constitution-validator-new.js +196 -0
- package/src/validation/constitution-validator.js +17 -0
- package/src/validation/file-validators.js +170 -0
- package/src/validation/line-limit/file-analyzer.js +201 -0
- package/src/validation/line-limit/line-limit-validator.js +208 -0
- package/src/validation/line-limit/validation-result.js +144 -0
- package/src/validation/line-limit-core.js +225 -0
- package/src/validation/line-limit-reporter.js +134 -0
- package/src/validation/line-limit-result.js +125 -0
- package/src/validation/line-limit-validator.js +41 -0
- package/src/validation/metrics-calculator.js +660 -0
- 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;
|