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.
- 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,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Status Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages agent status transitions and persistence.
|
|
5
|
+
* Follows constitutional requirements: <555 lines, test-first approach.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { AgentStatus } = require('../AgentStatus');
|
|
9
|
+
const { isValidTransition } = require('../AgentStatus');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Agent status manager class
|
|
13
|
+
*/
|
|
14
|
+
class AgentStatusManager {
|
|
15
|
+
/**
|
|
16
|
+
* Create status manager instance
|
|
17
|
+
* @param {Object} config - Manager configuration
|
|
18
|
+
*/
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.configManager = config.configManager || null;
|
|
21
|
+
this.logger = config.logger || null;
|
|
22
|
+
this.fileManager = config.fileManager || null;
|
|
23
|
+
this.statusHistory = new Map(); // agentId -> array of status changes
|
|
24
|
+
this.maxHistorySize = config.maxHistorySize || 100;
|
|
25
|
+
this.autoSave = config.autoSave !== false; // Default to auto-save
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Update agent status with validation
|
|
30
|
+
* @param {string} agentId - Agent identifier
|
|
31
|
+
* @param {string} newStatus - New status
|
|
32
|
+
* @param {string} message - Status message
|
|
33
|
+
* @returns {Promise<Object>} - Status update result
|
|
34
|
+
*/
|
|
35
|
+
async updateAgentStatus(agentId, newStatus, message = '') {
|
|
36
|
+
try {
|
|
37
|
+
// Get current status
|
|
38
|
+
const currentStatus = await this.getCurrentStatus(agentId);
|
|
39
|
+
|
|
40
|
+
// Validate transition
|
|
41
|
+
if (currentStatus && !isValidTransition(currentStatus, newStatus)) {
|
|
42
|
+
const error = new Error(`Invalid status transition: ${currentStatus} -> ${newStatus}`);
|
|
43
|
+
|
|
44
|
+
if (this.logger) {
|
|
45
|
+
await this.logger.warn('Invalid status transition attempted', {
|
|
46
|
+
agentId,
|
|
47
|
+
currentStatus,
|
|
48
|
+
newStatus,
|
|
49
|
+
message: error.message
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Create status change record
|
|
57
|
+
const statusChange = {
|
|
58
|
+
agentId,
|
|
59
|
+
oldStatus: currentStatus,
|
|
60
|
+
newStatus,
|
|
61
|
+
message,
|
|
62
|
+
timestamp: new Date().toISOString(),
|
|
63
|
+
source: 'status_manager'
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Add to history
|
|
67
|
+
this.addToHistory(agentId, statusChange);
|
|
68
|
+
|
|
69
|
+
// Update persistent storage
|
|
70
|
+
if (this.configManager) {
|
|
71
|
+
await this.configManager.updateAgentStatus(agentId, newStatus, message);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Log status change
|
|
75
|
+
await this.logStatusChange(statusChange);
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
agentId,
|
|
80
|
+
oldStatus: currentStatus,
|
|
81
|
+
newStatus,
|
|
82
|
+
message,
|
|
83
|
+
timestamp: statusChange.timestamp
|
|
84
|
+
};
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (this.logger) {
|
|
87
|
+
await this.logger.error('Status update failed', {
|
|
88
|
+
agentId,
|
|
89
|
+
newStatus,
|
|
90
|
+
error: error.message
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
agentId,
|
|
97
|
+
newStatus,
|
|
98
|
+
error: error.message,
|
|
99
|
+
timestamp: new Date().toISOString()
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get current agent status
|
|
106
|
+
* @param {string} agentId - Agent identifier
|
|
107
|
+
* @returns {Promise<string|null>} - Current status
|
|
108
|
+
*/
|
|
109
|
+
async getCurrentStatus(agentId) {
|
|
110
|
+
try {
|
|
111
|
+
if (this.configManager) {
|
|
112
|
+
const status = await this.configManager.getAgentStatus(agentId);
|
|
113
|
+
return status ? status.status : null;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
} catch (error) {
|
|
117
|
+
if (this.logger) {
|
|
118
|
+
await this.logger.error('Failed to get current status', {
|
|
119
|
+
agentId,
|
|
120
|
+
error: error.message
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Get agent status history
|
|
129
|
+
* @param {string} agentId - Agent identifier
|
|
130
|
+
* @param {number} limit - Maximum number of entries to return
|
|
131
|
+
* @returns {Array<Object>} - Status history
|
|
132
|
+
*/
|
|
133
|
+
getStatusHistory(agentId, limit = 50) {
|
|
134
|
+
const history = this.statusHistory.get(agentId) || [];
|
|
135
|
+
return history.slice(-limit); // Return most recent entries
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get status history for all agents
|
|
140
|
+
* @param {number} limit - Maximum entries per agent
|
|
141
|
+
* @returns {Object} - All agents' history
|
|
142
|
+
*/
|
|
143
|
+
getAllStatusHistory(limit = 50) {
|
|
144
|
+
const allHistory = {};
|
|
145
|
+
|
|
146
|
+
for (const [agentId, history] of this.statusHistory) {
|
|
147
|
+
allHistory[agentId] = history.slice(-limit);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return allHistory;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Add status change to history
|
|
155
|
+
* @param {string} agentId - Agent identifier
|
|
156
|
+
* @param {Object} statusChange - Status change record
|
|
157
|
+
*/
|
|
158
|
+
addToHistory(agentId, statusChange) {
|
|
159
|
+
if (!this.statusHistory.has(agentId)) {
|
|
160
|
+
this.statusHistory.set(agentId, []);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const history = this.statusHistory.get(agentId);
|
|
164
|
+
history.push(statusChange);
|
|
165
|
+
|
|
166
|
+
// Limit history size
|
|
167
|
+
if (history.length > this.maxHistorySize) {
|
|
168
|
+
this.statusHistory.set(agentId, history.slice(-this.maxHistorySize));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Auto-save if enabled
|
|
172
|
+
if (this.autoSave) {
|
|
173
|
+
this.saveHistoryToStorage(agentId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Save status history to persistent storage
|
|
179
|
+
* @param {string} agentId - Agent identifier
|
|
180
|
+
*/
|
|
181
|
+
async saveHistoryToStorage(agentId) {
|
|
182
|
+
if (!this.fileManager) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const history = this.getStatusHistory(agentId);
|
|
188
|
+
const historyData = {
|
|
189
|
+
agentId,
|
|
190
|
+
history,
|
|
191
|
+
lastUpdated: new Date().toISOString()
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
await this.fileManager.writeLog('status-history', historyData);
|
|
195
|
+
} catch (error) {
|
|
196
|
+
if (this.logger) {
|
|
197
|
+
await this.logger.error('Failed to save status history', {
|
|
198
|
+
agentId,
|
|
199
|
+
error: error.message
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Log status change
|
|
207
|
+
* @param {Object} statusChange - Status change record
|
|
208
|
+
*/
|
|
209
|
+
async logStatusChange(statusChange) {
|
|
210
|
+
if (this.fileManager) {
|
|
211
|
+
await this.fileManager.writeLog('status-change', {
|
|
212
|
+
agentId: statusChange.agentId,
|
|
213
|
+
oldStatus: statusChange.oldStatus,
|
|
214
|
+
newStatus: statusChange.newStatus,
|
|
215
|
+
message: statusChange.message,
|
|
216
|
+
timestamp: statusChange.timestamp,
|
|
217
|
+
source: statusChange.source
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get agents by status
|
|
224
|
+
* @param {string} status - Status to filter by
|
|
225
|
+
* @param {Array<string>} agentIds - Specific agent IDs to check (optional)
|
|
226
|
+
* @returns {Promise<Object>} - Agents with specified status
|
|
227
|
+
*/
|
|
228
|
+
async getAgentsByStatus(status, agentIds = null) {
|
|
229
|
+
try {
|
|
230
|
+
const agents = agentIds
|
|
231
|
+
? await this.getSpecificAgents(agentIds)
|
|
232
|
+
: await this.configManager.getAllAgents();
|
|
233
|
+
|
|
234
|
+
const filteredAgents = agents.filter(agent => {
|
|
235
|
+
const agentStatus = agent.status || AgentStatus.NOT_INSTALLED;
|
|
236
|
+
return agentStatus === status;
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
status,
|
|
241
|
+
agents: filteredAgents,
|
|
242
|
+
count: filteredAgents.length
|
|
243
|
+
};
|
|
244
|
+
} catch (error) {
|
|
245
|
+
if (this.logger) {
|
|
246
|
+
await this.logger.error('Failed to get agents by status', {
|
|
247
|
+
status,
|
|
248
|
+
agentIds,
|
|
249
|
+
error: error.message
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
status,
|
|
255
|
+
agents: [],
|
|
256
|
+
count: 0,
|
|
257
|
+
error: error.message
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Get specific agents by IDs
|
|
264
|
+
* @param {Array<string>} agentIds - Agent IDs
|
|
265
|
+
* @returns {Promise<Array>} - Agent objects
|
|
266
|
+
*/
|
|
267
|
+
async getSpecificAgents(agentIds) {
|
|
268
|
+
const agents = [];
|
|
269
|
+
|
|
270
|
+
for (const agentId of agentIds) {
|
|
271
|
+
const agent = this.configManager.getAgent(agentId);
|
|
272
|
+
if (agent) {
|
|
273
|
+
agents.push(agent);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return agents;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Get status statistics
|
|
282
|
+
* @param {Array<string>} agentIds - Specific agent IDs (optional)
|
|
283
|
+
* @returns {Promise<Object>} - Status statistics
|
|
284
|
+
*/
|
|
285
|
+
async getStatusStatistics(agentIds = null) {
|
|
286
|
+
try {
|
|
287
|
+
const agents = agentIds
|
|
288
|
+
? await this.getSpecificAgents(agentIds)
|
|
289
|
+
: await this.configManager.getAllAgents();
|
|
290
|
+
|
|
291
|
+
const stats = {
|
|
292
|
+
totalAgents: agents.length,
|
|
293
|
+
notInstalled: 0,
|
|
294
|
+
installing: 0,
|
|
295
|
+
installed: 0,
|
|
296
|
+
verifying: 0,
|
|
297
|
+
verified: 0,
|
|
298
|
+
error: 0,
|
|
299
|
+
rateLimited: 0,
|
|
300
|
+
disabled: 0,
|
|
301
|
+
lastUpdated: null
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
let latestUpdate = null;
|
|
305
|
+
|
|
306
|
+
for (const agent of agents) {
|
|
307
|
+
const status = agent.status || AgentStatus.NOT_INSTALLED;
|
|
308
|
+
|
|
309
|
+
switch (status) {
|
|
310
|
+
case AgentStatus.NOT_INSTALLED:
|
|
311
|
+
stats.notInstalled++;
|
|
312
|
+
break;
|
|
313
|
+
case AgentStatus.INSTALLING:
|
|
314
|
+
stats.installing++;
|
|
315
|
+
break;
|
|
316
|
+
case AgentStatus.INSTALLED:
|
|
317
|
+
stats.installed++;
|
|
318
|
+
break;
|
|
319
|
+
case AgentStatus.VERIFYING:
|
|
320
|
+
stats.verifying++;
|
|
321
|
+
break;
|
|
322
|
+
case AgentStatus.VERIFIED:
|
|
323
|
+
stats.verified++;
|
|
324
|
+
break;
|
|
325
|
+
case AgentStatus.ERROR:
|
|
326
|
+
stats.error++;
|
|
327
|
+
break;
|
|
328
|
+
case AgentStatus.RATE_LIMITED:
|
|
329
|
+
stats.rateLimited++;
|
|
330
|
+
break;
|
|
331
|
+
case AgentStatus.DISABLED:
|
|
332
|
+
stats.disabled++;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Track latest update
|
|
337
|
+
if (agent.lastChecked) {
|
|
338
|
+
const updateDate = new Date(agent.lastChecked);
|
|
339
|
+
if (!latestUpdate || updateDate > latestUpdate) {
|
|
340
|
+
latestUpdate = agent.lastChecked;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
stats.lastUpdated = latestUpdate ? latestUpdate.toISOString() : null;
|
|
346
|
+
|
|
347
|
+
return stats;
|
|
348
|
+
} catch (error) {
|
|
349
|
+
if (this.logger) {
|
|
350
|
+
await this.logger.error('Failed to get status statistics', {
|
|
351
|
+
agentIds,
|
|
352
|
+
error: error.message
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return {
|
|
357
|
+
totalAgents: 0,
|
|
358
|
+
notInstalled: 0,
|
|
359
|
+
installing: 0,
|
|
360
|
+
installed: 0,
|
|
361
|
+
verifying: 0,
|
|
362
|
+
verified: 0,
|
|
363
|
+
error: 0,
|
|
364
|
+
rateLimited: 0,
|
|
365
|
+
disabled: 0,
|
|
366
|
+
lastUpdated: null,
|
|
367
|
+
error: error.message
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Reset agent status
|
|
374
|
+
* @param {string} agentId - Agent identifier
|
|
375
|
+
* @param {string} message - Reset message
|
|
376
|
+
* @returns {Promise<Object>} - Reset result
|
|
377
|
+
*/
|
|
378
|
+
async resetAgentStatus(agentId, message = 'Status reset') {
|
|
379
|
+
try {
|
|
380
|
+
// Clear history
|
|
381
|
+
this.statusHistory.delete(agentId);
|
|
382
|
+
|
|
383
|
+
// Reset to NOT_INSTALLED status
|
|
384
|
+
return await this.updateAgentStatus(agentId, AgentStatus.NOT_INSTALLED, message);
|
|
385
|
+
} catch (error) {
|
|
386
|
+
if (this.logger) {
|
|
387
|
+
await this.logger.error('Failed to reset agent status', {
|
|
388
|
+
agentId,
|
|
389
|
+
error: error.message
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return {
|
|
394
|
+
success: false,
|
|
395
|
+
agentId,
|
|
396
|
+
error: error.message,
|
|
397
|
+
timestamp: new Date().toISOString()
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Bulk update agent statuses
|
|
404
|
+
* @param {Array<Object>} updates - Array of status updates
|
|
405
|
+
* @returns {Promise<Object>} - Bulk update result
|
|
406
|
+
*/
|
|
407
|
+
async bulkUpdateStatuses(updates) {
|
|
408
|
+
const results = {
|
|
409
|
+
totalUpdates: updates.length,
|
|
410
|
+
successful: 0,
|
|
411
|
+
failed: 0,
|
|
412
|
+
results: {}
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
for (const update of updates) {
|
|
416
|
+
try {
|
|
417
|
+
const result = await this.updateAgentStatus(update.agentId, update.newStatus, update.message);
|
|
418
|
+
results.results[update.agentId] = result;
|
|
419
|
+
|
|
420
|
+
if (result.success) {
|
|
421
|
+
results.successful++;
|
|
422
|
+
} else {
|
|
423
|
+
results.failed++;
|
|
424
|
+
}
|
|
425
|
+
} catch (error) {
|
|
426
|
+
results.results[update.agentId] = {
|
|
427
|
+
success: false,
|
|
428
|
+
agentId: update.agentId,
|
|
429
|
+
error: error.message,
|
|
430
|
+
timestamp: new Date().toISOString()
|
|
431
|
+
};
|
|
432
|
+
results.failed++;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
return results;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Get status manager information
|
|
441
|
+
* @returns {Object} - Manager info
|
|
442
|
+
*/
|
|
443
|
+
getManagerInfo() {
|
|
444
|
+
return {
|
|
445
|
+
maxHistorySize: this.maxHistorySize,
|
|
446
|
+
autoSave: this.autoSave,
|
|
447
|
+
trackedAgents: this.statusHistory.size,
|
|
448
|
+
totalHistoryEntries: Array.from(this.statusHistory.values())
|
|
449
|
+
.reduce((total, history) => total + history.length, 0),
|
|
450
|
+
supportedStatuses: Object.values(AgentStatus),
|
|
451
|
+
features: [
|
|
452
|
+
'status transition validation',
|
|
453
|
+
'status history tracking',
|
|
454
|
+
'bulk status updates',
|
|
455
|
+
'status statistics',
|
|
456
|
+
'persistent storage',
|
|
457
|
+
'logging integration'
|
|
458
|
+
],
|
|
459
|
+
limitations: [
|
|
460
|
+
'depends on config manager',
|
|
461
|
+
'memory usage with large history',
|
|
462
|
+
'storage dependency'
|
|
463
|
+
]
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Create status manager with default configuration
|
|
469
|
+
* @param {Object} config - Configuration overrides
|
|
470
|
+
* @returns {AgentStatusManager} - Manager instance
|
|
471
|
+
*/
|
|
472
|
+
static createDefault(config = {}) {
|
|
473
|
+
return new AgentStatusManager({
|
|
474
|
+
maxHistorySize: 100,
|
|
475
|
+
autoSave: true,
|
|
476
|
+
...config
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
module.exports = AgentStatusManager;
|