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,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;