polyv-live-cli 1.1.4 → 1.1.5

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 (244) hide show
  1. package/dist/commands/index.d.ts +1 -0
  2. package/dist/commands/index.d.ts.map +1 -1
  3. package/dist/commands/index.js +3 -1
  4. package/dist/commands/index.js.map +1 -1
  5. package/dist/commands/monitor.commands.d.ts +12 -0
  6. package/dist/commands/monitor.commands.d.ts.map +1 -0
  7. package/dist/commands/monitor.commands.js +75 -0
  8. package/dist/commands/monitor.commands.js.map +1 -0
  9. package/dist/components/alert.panel.d.ts +98 -0
  10. package/dist/components/alert.panel.d.ts.map +1 -0
  11. package/dist/components/alert.panel.js +1000 -0
  12. package/dist/components/alert.panel.js.map +1 -0
  13. package/dist/components/base.component.d.ts +61 -0
  14. package/dist/components/base.component.d.ts.map +1 -0
  15. package/dist/components/base.component.js +346 -0
  16. package/dist/components/base.component.js.map +1 -0
  17. package/dist/components/batch-operations.dialog.d.ts +58 -0
  18. package/dist/components/batch-operations.dialog.d.ts.map +1 -0
  19. package/dist/components/batch-operations.dialog.js +340 -0
  20. package/dist/components/batch-operations.dialog.js.map +1 -0
  21. package/dist/components/channel-details.popup.d.ts +55 -0
  22. package/dist/components/channel-details.popup.d.ts.map +1 -0
  23. package/dist/components/channel-details.popup.js +416 -0
  24. package/dist/components/channel-details.popup.js.map +1 -0
  25. package/dist/components/channel-status.panel.d.ts +129 -0
  26. package/dist/components/channel-status.panel.d.ts.map +1 -0
  27. package/dist/components/channel-status.panel.js +858 -0
  28. package/dist/components/channel-status.panel.js.map +1 -0
  29. package/dist/components/component-registry.d.ts +36 -0
  30. package/dist/components/component-registry.d.ts.map +1 -0
  31. package/dist/components/component-registry.js +119 -0
  32. package/dist/components/component-registry.js.map +1 -0
  33. package/dist/components/context-menu-factory.d.ts +13 -0
  34. package/dist/components/context-menu-factory.d.ts.map +1 -0
  35. package/dist/components/context-menu-factory.js +341 -0
  36. package/dist/components/context-menu-factory.js.map +1 -0
  37. package/dist/components/context-menu.d.ts +54 -0
  38. package/dist/components/context-menu.d.ts.map +1 -0
  39. package/dist/components/context-menu.js +235 -0
  40. package/dist/components/context-menu.js.map +1 -0
  41. package/dist/components/grid-manager.d.ts +52 -0
  42. package/dist/components/grid-manager.d.ts.map +1 -0
  43. package/dist/components/grid-manager.js +404 -0
  44. package/dist/components/grid-manager.js.map +1 -0
  45. package/dist/components/help-panel.d.ts +34 -0
  46. package/dist/components/help-panel.d.ts.map +1 -0
  47. package/dist/components/help-panel.js +249 -0
  48. package/dist/components/help-panel.js.map +1 -0
  49. package/dist/components/index.d.ts +20 -0
  50. package/dist/components/index.d.ts.map +1 -0
  51. package/dist/components/index.js +43 -0
  52. package/dist/components/index.js.map +1 -0
  53. package/dist/components/interaction-manager.d.ts +47 -0
  54. package/dist/components/interaction-manager.d.ts.map +1 -0
  55. package/dist/components/interaction-manager.js +597 -0
  56. package/dist/components/interaction-manager.js.map +1 -0
  57. package/dist/components/layout-manager.d.ts +76 -0
  58. package/dist/components/layout-manager.d.ts.map +1 -0
  59. package/dist/components/layout-manager.js +538 -0
  60. package/dist/components/layout-manager.js.map +1 -0
  61. package/dist/components/monitoring-dashboard.d.ts +85 -0
  62. package/dist/components/monitoring-dashboard.d.ts.map +1 -0
  63. package/dist/components/monitoring-dashboard.js +908 -0
  64. package/dist/components/monitoring-dashboard.js.map +1 -0
  65. package/dist/components/search-panel.d.ts +80 -0
  66. package/dist/components/search-panel.d.ts.map +1 -0
  67. package/dist/components/search-panel.js +585 -0
  68. package/dist/components/search-panel.js.map +1 -0
  69. package/dist/components/status-bar.d.ts +77 -0
  70. package/dist/components/status-bar.d.ts.map +1 -0
  71. package/dist/components/status-bar.js +482 -0
  72. package/dist/components/status-bar.js.map +1 -0
  73. package/dist/components/status.component.d.ts +16 -0
  74. package/dist/components/status.component.d.ts.map +1 -0
  75. package/dist/components/status.component.js +79 -0
  76. package/dist/components/status.component.js.map +1 -0
  77. package/dist/components/stream-metrics.panel.d.ts +86 -0
  78. package/dist/components/stream-metrics.panel.d.ts.map +1 -0
  79. package/dist/components/stream-metrics.panel.js +395 -0
  80. package/dist/components/stream-metrics.panel.js.map +1 -0
  81. package/dist/components/system-resource.panel.d.ts +78 -0
  82. package/dist/components/system-resource.panel.d.ts.map +1 -0
  83. package/dist/components/system-resource.panel.js +642 -0
  84. package/dist/components/system-resource.panel.js.map +1 -0
  85. package/dist/components/tooltip.d.ts +35 -0
  86. package/dist/components/tooltip.d.ts.map +1 -0
  87. package/dist/components/tooltip.js +156 -0
  88. package/dist/components/tooltip.js.map +1 -0
  89. package/dist/config/config-io.d.ts +63 -0
  90. package/dist/config/config-io.d.ts.map +1 -0
  91. package/dist/config/config-io.js +352 -0
  92. package/dist/config/config-io.js.map +1 -0
  93. package/dist/config/config-manager.d.ts +51 -0
  94. package/dist/config/config-manager.d.ts.map +1 -0
  95. package/dist/config/config-manager.js +404 -0
  96. package/dist/config/config-manager.js.map +1 -0
  97. package/dist/config/config-validator.d.ts +27 -0
  98. package/dist/config/config-validator.d.ts.map +1 -0
  99. package/dist/config/config-validator.js +421 -0
  100. package/dist/config/config-validator.js.map +1 -0
  101. package/dist/config/custom-theme-builder.d.ts +88 -0
  102. package/dist/config/custom-theme-builder.d.ts.map +1 -0
  103. package/dist/config/custom-theme-builder.js +458 -0
  104. package/dist/config/custom-theme-builder.js.map +1 -0
  105. package/dist/config/layout-manager.d.ts +60 -0
  106. package/dist/config/layout-manager.d.ts.map +1 -0
  107. package/dist/config/layout-manager.js +595 -0
  108. package/dist/config/layout-manager.js.map +1 -0
  109. package/dist/config/monitoring.d.ts +27 -0
  110. package/dist/config/monitoring.d.ts.map +1 -0
  111. package/dist/config/monitoring.js +276 -0
  112. package/dist/config/monitoring.js.map +1 -0
  113. package/dist/config/theme-manager.d.ts +53 -0
  114. package/dist/config/theme-manager.d.ts.map +1 -0
  115. package/dist/config/theme-manager.js +490 -0
  116. package/dist/config/theme-manager.js.map +1 -0
  117. package/dist/handlers/monitor.handler.d.ts +28 -0
  118. package/dist/handlers/monitor.handler.d.ts.map +1 -0
  119. package/dist/handlers/monitor.handler.js +457 -0
  120. package/dist/handlers/monitor.handler.js.map +1 -0
  121. package/dist/index.d.ts +2 -1
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +8 -3
  124. package/dist/index.js.map +1 -1
  125. package/dist/performance/adaptive-polling.d.ts +69 -0
  126. package/dist/performance/adaptive-polling.d.ts.map +1 -0
  127. package/dist/performance/adaptive-polling.js +313 -0
  128. package/dist/performance/adaptive-polling.js.map +1 -0
  129. package/dist/performance/api-analytics.d.ts +137 -0
  130. package/dist/performance/api-analytics.d.ts.map +1 -0
  131. package/dist/performance/api-analytics.js +351 -0
  132. package/dist/performance/api-analytics.js.map +1 -0
  133. package/dist/performance/api-optimizer.d.ts +66 -0
  134. package/dist/performance/api-optimizer.d.ts.map +1 -0
  135. package/dist/performance/api-optimizer.js +368 -0
  136. package/dist/performance/api-optimizer.js.map +1 -0
  137. package/dist/performance/batch-request-manager.d.ts +89 -0
  138. package/dist/performance/batch-request-manager.d.ts.map +1 -0
  139. package/dist/performance/batch-request-manager.js +351 -0
  140. package/dist/performance/batch-request-manager.js.map +1 -0
  141. package/dist/performance/change-detector.d.ts +75 -0
  142. package/dist/performance/change-detector.d.ts.map +1 -0
  143. package/dist/performance/change-detector.js +392 -0
  144. package/dist/performance/change-detector.js.map +1 -0
  145. package/dist/performance/connection-pool-manager.d.ts +99 -0
  146. package/dist/performance/connection-pool-manager.d.ts.map +1 -0
  147. package/dist/performance/connection-pool-manager.js +474 -0
  148. package/dist/performance/connection-pool-manager.js.map +1 -0
  149. package/dist/performance/error-recovery-manager.d.ts +134 -0
  150. package/dist/performance/error-recovery-manager.d.ts.map +1 -0
  151. package/dist/performance/error-recovery-manager.js +673 -0
  152. package/dist/performance/error-recovery-manager.js.map +1 -0
  153. package/dist/performance/fallback-manager.d.ts +123 -0
  154. package/dist/performance/fallback-manager.d.ts.map +1 -0
  155. package/dist/performance/fallback-manager.js +524 -0
  156. package/dist/performance/fallback-manager.js.map +1 -0
  157. package/dist/performance/index.d.ts +13 -0
  158. package/dist/performance/index.d.ts.map +1 -0
  159. package/dist/performance/index.js +28 -0
  160. package/dist/performance/index.js.map +1 -0
  161. package/dist/performance/memory-manager.d.ts +97 -0
  162. package/dist/performance/memory-manager.d.ts.map +1 -0
  163. package/dist/performance/memory-manager.js +417 -0
  164. package/dist/performance/memory-manager.js.map +1 -0
  165. package/dist/performance/performance-monitor.d.ts +149 -0
  166. package/dist/performance/performance-monitor.d.ts.map +1 -0
  167. package/dist/performance/performance-monitor.js +513 -0
  168. package/dist/performance/performance-monitor.js.map +1 -0
  169. package/dist/performance/performance-optimizer.d.ts +110 -0
  170. package/dist/performance/performance-optimizer.d.ts.map +1 -0
  171. package/dist/performance/performance-optimizer.js +476 -0
  172. package/dist/performance/performance-optimizer.js.map +1 -0
  173. package/dist/performance/render-optimizer.d.ts +95 -0
  174. package/dist/performance/render-optimizer.d.ts.map +1 -0
  175. package/dist/performance/render-optimizer.js +408 -0
  176. package/dist/performance/render-optimizer.js.map +1 -0
  177. package/dist/services/index.d.ts +1 -0
  178. package/dist/services/index.d.ts.map +1 -1
  179. package/dist/services/index.js +3 -1
  180. package/dist/services/index.js.map +1 -1
  181. package/dist/services/system-resource.service.d.ts +168 -0
  182. package/dist/services/system-resource.service.d.ts.map +1 -0
  183. package/dist/services/system-resource.service.js +544 -0
  184. package/dist/services/system-resource.service.js.map +1 -0
  185. package/dist/types/alert.d.ts +147 -0
  186. package/dist/types/alert.d.ts.map +1 -0
  187. package/dist/types/alert.js +3 -0
  188. package/dist/types/alert.js.map +1 -0
  189. package/dist/types/index.d.ts +3 -0
  190. package/dist/types/index.d.ts.map +1 -1
  191. package/dist/types/index.js +2 -0
  192. package/dist/types/index.js.map +1 -1
  193. package/dist/types/interaction.d.ts +147 -0
  194. package/dist/types/interaction.d.ts.map +1 -0
  195. package/dist/types/interaction.js +3 -0
  196. package/dist/types/interaction.js.map +1 -0
  197. package/dist/types/monitoring.d.ts +233 -0
  198. package/dist/types/monitoring.d.ts.map +1 -0
  199. package/dist/types/monitoring.js +35 -0
  200. package/dist/types/monitoring.js.map +1 -0
  201. package/dist/utils/alert-history-manager.d.ts +72 -0
  202. package/dist/utils/alert-history-manager.d.ts.map +1 -0
  203. package/dist/utils/alert-history-manager.js +492 -0
  204. package/dist/utils/alert-history-manager.js.map +1 -0
  205. package/dist/utils/alert-manager.d.ts +75 -0
  206. package/dist/utils/alert-manager.d.ts.map +1 -0
  207. package/dist/utils/alert-manager.js +348 -0
  208. package/dist/utils/alert-manager.js.map +1 -0
  209. package/dist/utils/alert-rule-manager.d.ts +51 -0
  210. package/dist/utils/alert-rule-manager.d.ts.map +1 -0
  211. package/dist/utils/alert-rule-manager.js +515 -0
  212. package/dist/utils/alert-rule-manager.js.map +1 -0
  213. package/dist/utils/data-manager.d.ts +53 -0
  214. package/dist/utils/data-manager.d.ts.map +1 -0
  215. package/dist/utils/data-manager.js +228 -0
  216. package/dist/utils/data-manager.js.map +1 -0
  217. package/dist/utils/formatter.d.ts +5 -0
  218. package/dist/utils/formatter.d.ts.map +1 -1
  219. package/dist/utils/formatter.js +19 -0
  220. package/dist/utils/formatter.js.map +1 -1
  221. package/dist/utils/index.d.ts +6 -0
  222. package/dist/utils/index.d.ts.map +1 -1
  223. package/dist/utils/index.js +6 -0
  224. package/dist/utils/index.js.map +1 -1
  225. package/dist/utils/keyboard-handler.d.ts +32 -0
  226. package/dist/utils/keyboard-handler.d.ts.map +1 -0
  227. package/dist/utils/keyboard-handler.js +193 -0
  228. package/dist/utils/keyboard-handler.js.map +1 -0
  229. package/dist/utils/mouse-handler.d.ts +61 -0
  230. package/dist/utils/mouse-handler.d.ts.map +1 -0
  231. package/dist/utils/mouse-handler.js +192 -0
  232. package/dist/utils/mouse-handler.js.map +1 -0
  233. package/dist/utils/stream-verification.d.ts.map +1 -1
  234. package/dist/utils/stream-verification.js +2 -13
  235. package/dist/utils/stream-verification.js.map +1 -1
  236. package/dist/utils/terminal.d.ts +24 -0
  237. package/dist/utils/terminal.d.ts.map +1 -0
  238. package/dist/utils/terminal.js +148 -0
  239. package/dist/utils/terminal.js.map +1 -0
  240. package/dist/utils/time-series.processor.d.ts +65 -0
  241. package/dist/utils/time-series.processor.d.ts.map +1 -0
  242. package/dist/utils/time-series.processor.js +263 -0
  243. package/dist/utils/time-series.processor.js.map +1 -0
  244. package/package.json +28 -4
@@ -0,0 +1,673 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorRecoveryManager = void 0;
4
+ const events_1 = require("events");
5
+ class ErrorRecoveryManager extends events_1.EventEmitter {
6
+ constructor(config = {}) {
7
+ super();
8
+ this.errorHistory = [];
9
+ this.errorPatterns = new Map();
10
+ this.recoveryStrategies = new Map();
11
+ this.errorIdCounter = 0;
12
+ this.patternIdCounter = 0;
13
+ this.isRunning = false;
14
+ this.criticalErrorCount = 0;
15
+ this.fallbackModeActive = false;
16
+ this.config = {
17
+ enableAutoRecovery: true,
18
+ maxRetryAttempts: 3,
19
+ baseRetryDelay: 1000,
20
+ retryDelayMultiplier: 2,
21
+ maxRetryDelay: 30000,
22
+ errorHistorySize: 1000,
23
+ criticalErrorThreshold: 5,
24
+ recoveryTimeout: 30000,
25
+ enableErrorLogging: true,
26
+ enableUserNotifications: true,
27
+ fallbackModeTimeout: 300000,
28
+ ...config,
29
+ };
30
+ this.initializeRecoveryStrategies();
31
+ this.initializeErrorPatterns();
32
+ this.setupEventHandlers();
33
+ }
34
+ start() {
35
+ if (this.isRunning) {
36
+ return;
37
+ }
38
+ this.isRunning = true;
39
+ this.criticalErrorCount = 0;
40
+ this.fallbackModeActive = false;
41
+ this.emit('recoveryManagerStarted', {
42
+ timestamp: Date.now(),
43
+ config: this.config,
44
+ });
45
+ }
46
+ stop() {
47
+ if (!this.isRunning) {
48
+ return;
49
+ }
50
+ this.isRunning = false;
51
+ if (this.fallbackModeTimer) {
52
+ clearTimeout(this.fallbackModeTimer);
53
+ delete this.fallbackModeTimer;
54
+ }
55
+ const finalStats = this.getStatistics();
56
+ this.emit('recoveryManagerStopped', {
57
+ timestamp: Date.now(),
58
+ finalStats,
59
+ });
60
+ }
61
+ async reportError(error, context) {
62
+ const errorRecord = this.createErrorRecord(error, context);
63
+ const existingError = this.findExistingError(errorRecord);
64
+ if (existingError) {
65
+ existingError.occurrenceCount++;
66
+ existingError.lastOccurrence = Date.now();
67
+ this.updateErrorPattern(existingError);
68
+ }
69
+ else {
70
+ this.errorHistory.push(errorRecord);
71
+ this.learnErrorPattern(errorRecord);
72
+ }
73
+ if (this.errorHistory.length > this.config.errorHistorySize) {
74
+ this.errorHistory = this.errorHistory.slice(-this.config.errorHistorySize);
75
+ }
76
+ if (this.config.enableErrorLogging) {
77
+ this.logError(errorRecord);
78
+ }
79
+ this.emit('errorReported', {
80
+ error: errorRecord,
81
+ timestamp: Date.now(),
82
+ });
83
+ if (this.config.enableAutoRecovery && this.isRunning) {
84
+ await this.attemptRecovery(errorRecord);
85
+ }
86
+ if (errorRecord.severity === 'critical') {
87
+ this.criticalErrorCount++;
88
+ if (this.criticalErrorCount >= this.config.criticalErrorThreshold) {
89
+ this.activateFallbackMode();
90
+ }
91
+ }
92
+ }
93
+ async attemptRecovery(errorRecord) {
94
+ if (errorRecord.recoveryAttempts >= errorRecord.maxRetries) {
95
+ return {
96
+ success: false,
97
+ strategy: 'escalate',
98
+ recoveryTime: 0,
99
+ error: errorRecord,
100
+ details: 'Maximum retry attempts exceeded',
101
+ };
102
+ }
103
+ const startTime = Date.now();
104
+ errorRecord.recoveryAttempts++;
105
+ try {
106
+ const strategy = this.determineRecoveryStrategy(errorRecord);
107
+ const recoveryFunction = this.recoveryStrategies.get(strategy);
108
+ if (!recoveryFunction) {
109
+ throw new Error(`Unknown recovery strategy: ${strategy}`);
110
+ }
111
+ const result = await Promise.race([
112
+ recoveryFunction(errorRecord),
113
+ this.createTimeoutPromise(this.config.recoveryTimeout),
114
+ ]);
115
+ if (result.success) {
116
+ errorRecord.recovered = true;
117
+ errorRecord.recoveryStrategy = strategy;
118
+ errorRecord.recoveryTime = Date.now() - startTime;
119
+ this.emit('errorRecovered', {
120
+ error: errorRecord,
121
+ result,
122
+ timestamp: Date.now(),
123
+ });
124
+ }
125
+ else {
126
+ this.emit('recoveryFailed', {
127
+ error: errorRecord,
128
+ result,
129
+ timestamp: Date.now(),
130
+ });
131
+ }
132
+ return result;
133
+ }
134
+ catch (recoveryError) {
135
+ const result = {
136
+ success: false,
137
+ strategy: 'escalate',
138
+ recoveryTime: Date.now() - startTime,
139
+ error: errorRecord,
140
+ details: 'Recovery attempt failed',
141
+ newError: recoveryError instanceof Error ? recoveryError : new Error('Unknown recovery error'),
142
+ };
143
+ this.emit('recoveryFailed', {
144
+ error: errorRecord,
145
+ result,
146
+ timestamp: Date.now(),
147
+ });
148
+ return result;
149
+ }
150
+ }
151
+ getStatistics() {
152
+ const totalErrors = this.errorHistory.length;
153
+ const errorsByType = {
154
+ network: 0,
155
+ api: 0,
156
+ render: 0,
157
+ memory: 0,
158
+ configuration: 0,
159
+ validation: 0,
160
+ timeout: 0,
161
+ permission: 0,
162
+ unknown: 0,
163
+ };
164
+ const errorsBySeverity = {
165
+ low: 0,
166
+ medium: 0,
167
+ high: 0,
168
+ critical: 0,
169
+ };
170
+ const errorsByComponent = {};
171
+ let totalRecoveryTime = 0;
172
+ let recoveredErrors = 0;
173
+ let recentErrors = 0;
174
+ const oneHourAgo = Date.now() - 3600000;
175
+ for (const error of this.errorHistory) {
176
+ errorsByType[error.type]++;
177
+ errorsBySeverity[error.severity]++;
178
+ const component = error.context.component;
179
+ errorsByComponent[component] = (errorsByComponent[component] || 0) + 1;
180
+ if (error.recovered && error.recoveryTime) {
181
+ totalRecoveryTime += error.recoveryTime;
182
+ recoveredErrors++;
183
+ }
184
+ if (error.lastOccurrence > oneHourAgo) {
185
+ recentErrors++;
186
+ }
187
+ }
188
+ const recoverySuccessRate = totalErrors > 0 ? recoveredErrors / totalErrors : 0;
189
+ const averageRecoveryTime = recoveredErrors > 0 ? totalRecoveryTime / recoveredErrors : 0;
190
+ return {
191
+ totalErrors,
192
+ errorsByType,
193
+ errorsBySeverity,
194
+ errorsByComponent,
195
+ recoverySuccessRate,
196
+ averageRecoveryTime,
197
+ commonPatterns: Array.from(this.errorPatterns.values())
198
+ .sort((a, b) => b.occurrences - a.occurrences)
199
+ .slice(0, 10),
200
+ trends: {
201
+ errorRate: recentErrors / Math.max(1, totalErrors),
202
+ recoveryRate: recoverySuccessRate,
203
+ criticalErrors: errorsBySeverity.critical,
204
+ recentErrors,
205
+ },
206
+ };
207
+ }
208
+ getErrorHistory(timeRange) {
209
+ if (!timeRange) {
210
+ return [...this.errorHistory];
211
+ }
212
+ return this.errorHistory.filter(error => error.lastOccurrence >= timeRange.start && error.lastOccurrence <= timeRange.end);
213
+ }
214
+ getUserErrorMessage(errorRecord) {
215
+ const severity = this.mapSeverityToUser(errorRecord.severity);
216
+ const recoverable = this.isErrorRecoverable(errorRecord);
217
+ const recoveryStatus = this.getRecoveryStatus(errorRecord);
218
+ return {
219
+ id: errorRecord.id,
220
+ title: this.generateUserFriendlyTitle(errorRecord),
221
+ description: this.generateUserFriendlyDescription(errorRecord),
222
+ suggestedActions: this.generateUserActions(errorRecord),
223
+ severity,
224
+ recoverable,
225
+ recoveryStatus,
226
+ };
227
+ }
228
+ clearErrorHistory() {
229
+ const clearedCount = this.errorHistory.length;
230
+ this.errorHistory = [];
231
+ this.errorPatterns.clear();
232
+ this.criticalErrorCount = 0;
233
+ this.emit('errorHistoryCleared', {
234
+ clearedCount,
235
+ timestamp: Date.now(),
236
+ });
237
+ }
238
+ updateConfig(newConfig) {
239
+ this.config = { ...this.config, ...newConfig };
240
+ this.emit('configUpdated', {
241
+ config: this.config,
242
+ timestamp: Date.now(),
243
+ });
244
+ }
245
+ registerRecoveryStrategy(name, strategy) {
246
+ this.recoveryStrategies.set(name, strategy);
247
+ this.emit('recoveryStrategyRegistered', {
248
+ name,
249
+ timestamp: Date.now(),
250
+ });
251
+ }
252
+ activateFallbackMode() {
253
+ if (this.fallbackModeActive) {
254
+ return;
255
+ }
256
+ this.fallbackModeActive = true;
257
+ this.emit('fallbackModeActivated', {
258
+ reason: 'Critical error threshold exceeded',
259
+ timestamp: Date.now(),
260
+ });
261
+ this.fallbackModeTimer = setTimeout(() => {
262
+ this.deactivateFallbackMode();
263
+ }, this.config.fallbackModeTimeout);
264
+ }
265
+ deactivateFallbackMode() {
266
+ if (!this.fallbackModeActive) {
267
+ return;
268
+ }
269
+ this.fallbackModeActive = false;
270
+ this.criticalErrorCount = 0;
271
+ if (this.fallbackModeTimer) {
272
+ clearTimeout(this.fallbackModeTimer);
273
+ delete this.fallbackModeTimer;
274
+ }
275
+ this.emit('fallbackModeDeactivated', {
276
+ timestamp: Date.now(),
277
+ });
278
+ }
279
+ isFallbackModeActive() {
280
+ return this.fallbackModeActive;
281
+ }
282
+ createErrorRecord(error, context) {
283
+ const errorType = this.classifyError(error);
284
+ const severity = this.determineSeverity(error, errorType);
285
+ const maxRetries = this.getMaxRetries(errorType, severity);
286
+ return {
287
+ id: `error_${++this.errorIdCounter}`,
288
+ type: errorType,
289
+ severity,
290
+ message: error.message,
291
+ context: {
292
+ ...context,
293
+ timestamp: Date.now(),
294
+ },
295
+ recoveryAttempts: 0,
296
+ maxRetries,
297
+ recovered: false,
298
+ firstOccurrence: Date.now(),
299
+ lastOccurrence: Date.now(),
300
+ occurrenceCount: 1,
301
+ ...(error.stack && { stack: error.stack }),
302
+ };
303
+ }
304
+ classifyError(error) {
305
+ const message = error.message.toLowerCase();
306
+ const name = error.name.toLowerCase();
307
+ if (message.includes('network') || message.includes('fetch') || message.includes('connection')) {
308
+ return 'network';
309
+ }
310
+ if (message.includes('api') || message.includes('request') || message.includes('response')) {
311
+ return 'api';
312
+ }
313
+ if (message.includes('render') || message.includes('display') || message.includes('ui')) {
314
+ return 'render';
315
+ }
316
+ if (message.includes('memory') || name.includes('memory')) {
317
+ return 'memory';
318
+ }
319
+ if (message.includes('config') || message.includes('setting')) {
320
+ return 'configuration';
321
+ }
322
+ if (message.includes('validation') || message.includes('invalid')) {
323
+ return 'validation';
324
+ }
325
+ if (message.includes('timeout') || name.includes('timeout')) {
326
+ return 'timeout';
327
+ }
328
+ if (message.includes('permission') || message.includes('unauthorized')) {
329
+ return 'permission';
330
+ }
331
+ return 'unknown';
332
+ }
333
+ determineSeverity(error, errorType) {
334
+ const message = error.message.toLowerCase();
335
+ if (message.includes('critical') || message.includes('fatal') || errorType === 'memory') {
336
+ return 'critical';
337
+ }
338
+ if (message.includes('error') || errorType === 'api' || errorType === 'network') {
339
+ return 'high';
340
+ }
341
+ if (message.includes('warning') || errorType === 'render' || errorType === 'timeout') {
342
+ return 'medium';
343
+ }
344
+ return 'low';
345
+ }
346
+ getMaxRetries(errorType, severity) {
347
+ const baseRetries = this.config.maxRetryAttempts;
348
+ if (severity === 'critical') {
349
+ return Math.max(baseRetries + 2, 5);
350
+ }
351
+ if (severity === 'high') {
352
+ return baseRetries + 1;
353
+ }
354
+ if (errorType === 'network' || errorType === 'api') {
355
+ return baseRetries + 1;
356
+ }
357
+ return baseRetries;
358
+ }
359
+ findExistingError(newError) {
360
+ const recentThreshold = Date.now() - 300000;
361
+ return this.errorHistory.find(existing => existing.type === newError.type &&
362
+ existing.context.component === newError.context.component &&
363
+ existing.context.operation === newError.context.operation &&
364
+ existing.message === newError.message &&
365
+ existing.lastOccurrence > recentThreshold) || null;
366
+ }
367
+ learnErrorPattern(errorRecord) {
368
+ const patternId = `${errorRecord.type}_${errorRecord.context.component}`;
369
+ let pattern = this.errorPatterns.get(patternId);
370
+ if (!pattern) {
371
+ pattern = {
372
+ id: `pattern_${++this.patternIdCounter}`,
373
+ description: `${errorRecord.type} errors in ${errorRecord.context.component}`,
374
+ errorType: errorRecord.type,
375
+ componentPattern: errorRecord.context.component,
376
+ messagePattern: new RegExp(errorRecord.message.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'),
377
+ recoveryStrategy: this.determineRecoveryStrategy(errorRecord),
378
+ confidence: 0.1,
379
+ occurrences: 0,
380
+ lastSeen: Date.now(),
381
+ };
382
+ this.errorPatterns.set(patternId, pattern);
383
+ }
384
+ pattern.occurrences++;
385
+ pattern.lastSeen = Date.now();
386
+ pattern.confidence = Math.min(pattern.confidence + 0.1, 1.0);
387
+ }
388
+ updateErrorPattern(errorRecord) {
389
+ const patternId = `${errorRecord.type}_${errorRecord.context.component}`;
390
+ const pattern = this.errorPatterns.get(patternId);
391
+ if (pattern) {
392
+ pattern.occurrences++;
393
+ pattern.lastSeen = Date.now();
394
+ pattern.confidence = Math.min(pattern.confidence + 0.05, 1.0);
395
+ }
396
+ }
397
+ determineRecoveryStrategy(errorRecord) {
398
+ const patternId = `${errorRecord.type}_${errorRecord.context.component}`;
399
+ const pattern = this.errorPatterns.get(patternId);
400
+ if (pattern && pattern.confidence > 0.7) {
401
+ return pattern.recoveryStrategy;
402
+ }
403
+ switch (errorRecord.type) {
404
+ case 'network':
405
+ case 'api':
406
+ case 'timeout':
407
+ return 'retry';
408
+ case 'render':
409
+ return 'reset';
410
+ case 'memory':
411
+ return 'fallback';
412
+ case 'configuration':
413
+ return 'reset';
414
+ case 'validation':
415
+ return 'ignore';
416
+ case 'permission':
417
+ return 'escalate';
418
+ default:
419
+ return 'retry';
420
+ }
421
+ }
422
+ initializeRecoveryStrategies() {
423
+ this.recoveryStrategies.set('retry', async (error) => {
424
+ const delay = Math.min(this.config.baseRetryDelay * Math.pow(this.config.retryDelayMultiplier, error.recoveryAttempts - 1), this.config.maxRetryDelay);
425
+ await new Promise(resolve => setTimeout(resolve, delay));
426
+ return {
427
+ success: true,
428
+ strategy: 'retry',
429
+ recoveryTime: delay,
430
+ error,
431
+ details: `Retry after ${delay}ms delay`,
432
+ };
433
+ });
434
+ this.recoveryStrategies.set('fallback', async (error) => {
435
+ this.activateFallbackMode();
436
+ return {
437
+ success: true,
438
+ strategy: 'fallback',
439
+ recoveryTime: 0,
440
+ error,
441
+ details: 'Activated fallback mode',
442
+ };
443
+ });
444
+ this.recoveryStrategies.set('reset', async (error) => {
445
+ this.emit('resetRequested', {
446
+ component: error.context.component,
447
+ operation: error.context.operation,
448
+ timestamp: Date.now(),
449
+ });
450
+ return {
451
+ success: true,
452
+ strategy: 'reset',
453
+ recoveryTime: 0,
454
+ error,
455
+ details: 'Reset requested',
456
+ };
457
+ });
458
+ this.recoveryStrategies.set('ignore', async (error) => {
459
+ return {
460
+ success: true,
461
+ strategy: 'ignore',
462
+ recoveryTime: 0,
463
+ error,
464
+ details: 'Error ignored',
465
+ };
466
+ });
467
+ this.recoveryStrategies.set('escalate', async (error) => {
468
+ this.emit('errorEscalated', {
469
+ error,
470
+ timestamp: Date.now(),
471
+ });
472
+ return {
473
+ success: false,
474
+ strategy: 'escalate',
475
+ recoveryTime: 0,
476
+ error,
477
+ details: 'Error escalated',
478
+ };
479
+ });
480
+ this.recoveryStrategies.set('restart', async (error) => {
481
+ this.emit('restartRequested', {
482
+ component: error.context.component,
483
+ reason: error.message,
484
+ timestamp: Date.now(),
485
+ });
486
+ return {
487
+ success: true,
488
+ strategy: 'restart',
489
+ recoveryTime: 0,
490
+ error,
491
+ details: 'Restart requested',
492
+ };
493
+ });
494
+ }
495
+ initializeErrorPatterns() {
496
+ this.errorPatterns.set('network_common', {
497
+ id: 'network_common',
498
+ description: 'Common network errors',
499
+ errorType: 'network',
500
+ componentPattern: '*',
501
+ messagePattern: /(network|connection|fetch|timeout)/i,
502
+ recoveryStrategy: 'retry',
503
+ confidence: 0.8,
504
+ occurrences: 0,
505
+ lastSeen: Date.now(),
506
+ });
507
+ this.errorPatterns.set('api_common', {
508
+ id: 'api_common',
509
+ description: 'Common API errors',
510
+ errorType: 'api',
511
+ componentPattern: '*',
512
+ messagePattern: /(api|request|response|http)/i,
513
+ recoveryStrategy: 'retry',
514
+ confidence: 0.8,
515
+ occurrences: 0,
516
+ lastSeen: Date.now(),
517
+ });
518
+ }
519
+ createTimeoutPromise(timeout) {
520
+ return new Promise((_, reject) => {
521
+ setTimeout(() => {
522
+ reject(new Error(`Recovery timeout after ${timeout}ms`));
523
+ }, timeout);
524
+ });
525
+ }
526
+ logError(errorRecord) {
527
+ const logMessage = `[${errorRecord.severity.toUpperCase()}] ${errorRecord.type} error in ${errorRecord.context.component}: ${errorRecord.message}`;
528
+ if (errorRecord.severity === 'critical') {
529
+ console.error(logMessage);
530
+ }
531
+ else if (errorRecord.severity === 'high') {
532
+ console.warn(logMessage);
533
+ }
534
+ else {
535
+ console.log(logMessage);
536
+ }
537
+ }
538
+ mapSeverityToUser(severity) {
539
+ switch (severity) {
540
+ case 'low':
541
+ return 'info';
542
+ case 'medium':
543
+ return 'warning';
544
+ case 'high':
545
+ case 'critical':
546
+ return 'error';
547
+ default:
548
+ return 'info';
549
+ }
550
+ }
551
+ isErrorRecoverable(errorRecord) {
552
+ return errorRecord.recoveryAttempts < errorRecord.maxRetries;
553
+ }
554
+ getRecoveryStatus(errorRecord) {
555
+ if (errorRecord.recovered) {
556
+ return 'completed';
557
+ }
558
+ if (errorRecord.recoveryAttempts >= errorRecord.maxRetries) {
559
+ return 'failed';
560
+ }
561
+ if (errorRecord.recoveryAttempts > 0) {
562
+ return 'in-progress';
563
+ }
564
+ return 'pending';
565
+ }
566
+ generateUserFriendlyTitle(errorRecord) {
567
+ switch (errorRecord.type) {
568
+ case 'network':
569
+ return 'Network Connection Issue';
570
+ case 'api':
571
+ return 'Service Communication Error';
572
+ case 'render':
573
+ return 'Display Update Problem';
574
+ case 'memory':
575
+ return 'Memory Usage Issue';
576
+ case 'configuration':
577
+ return 'Configuration Problem';
578
+ case 'validation':
579
+ return 'Data Validation Error';
580
+ case 'timeout':
581
+ return 'Operation Timeout';
582
+ case 'permission':
583
+ return 'Permission Denied';
584
+ default:
585
+ return 'Unexpected Error';
586
+ }
587
+ }
588
+ generateUserFriendlyDescription(errorRecord) {
589
+ const component = errorRecord.context.component;
590
+ const operation = errorRecord.context.operation;
591
+ switch (errorRecord.type) {
592
+ case 'network':
593
+ return `Unable to connect to the monitoring service. This may be due to network connectivity issues or service unavailability.`;
594
+ case 'api':
595
+ return `Failed to communicate with the monitoring API while ${operation} in ${component}. The service may be temporarily unavailable.`;
596
+ case 'render':
597
+ return `There was a problem updating the display for ${component}. Some information may not be showing correctly.`;
598
+ case 'memory':
599
+ return `The application is using more memory than expected. Performance may be affected.`;
600
+ case 'configuration':
601
+ return `There's an issue with the configuration settings for ${component}. Please check your settings.`;
602
+ case 'validation':
603
+ return `The data received from the service doesn't match expected format. This may be temporary.`;
604
+ case 'timeout':
605
+ return `The operation ${operation} in ${component} took too long to complete and was cancelled.`;
606
+ case 'permission':
607
+ return `Access denied while trying to ${operation} in ${component}. Please check your permissions.`;
608
+ default:
609
+ return `An unexpected error occurred in ${component} while ${operation}. The system will attempt to recover automatically.`;
610
+ }
611
+ }
612
+ generateUserActions(errorRecord) {
613
+ const actions = [];
614
+ switch (errorRecord.type) {
615
+ case 'network':
616
+ actions.push('Check your internet connection');
617
+ actions.push('Try refreshing the application');
618
+ actions.push('Wait a moment and try again');
619
+ break;
620
+ case 'api':
621
+ actions.push('Wait a moment and try again');
622
+ actions.push('Check service status');
623
+ actions.push('Verify your API credentials');
624
+ break;
625
+ case 'render':
626
+ actions.push('Refresh the display');
627
+ actions.push('Restart the application if problems persist');
628
+ break;
629
+ case 'memory':
630
+ actions.push('Close unnecessary applications');
631
+ actions.push('Restart the monitoring tool');
632
+ break;
633
+ case 'configuration':
634
+ actions.push('Check your configuration settings');
635
+ actions.push('Reset to default settings if needed');
636
+ break;
637
+ case 'validation':
638
+ actions.push('Wait for the next update');
639
+ actions.push('Contact support if problems persist');
640
+ break;
641
+ case 'timeout':
642
+ actions.push('Try the operation again');
643
+ actions.push('Check your network connection');
644
+ break;
645
+ case 'permission':
646
+ actions.push('Contact your administrator');
647
+ actions.push('Check your access permissions');
648
+ break;
649
+ default:
650
+ actions.push('Wait for automatic recovery');
651
+ actions.push('Restart the application if problems persist');
652
+ break;
653
+ }
654
+ return actions;
655
+ }
656
+ setupEventHandlers() {
657
+ process.on('uncaughtException', (error) => {
658
+ this.reportError(error, {
659
+ component: 'process',
660
+ operation: 'global',
661
+ });
662
+ });
663
+ process.on('unhandledRejection', (reason) => {
664
+ const error = reason instanceof Error ? reason : new Error(String(reason));
665
+ this.reportError(error, {
666
+ component: 'process',
667
+ operation: 'promise',
668
+ });
669
+ });
670
+ }
671
+ }
672
+ exports.ErrorRecoveryManager = ErrorRecoveryManager;
673
+ //# sourceMappingURL=error-recovery-manager.js.map