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,1000 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AlertPanel = void 0;
37
+ const blessed = __importStar(require("blessed"));
38
+ const base_component_1 = require("./base.component");
39
+ let screen = null;
40
+ const getScreen = () => {
41
+ if (!screen) {
42
+ try {
43
+ screen = blessed.screen({
44
+ smartCSR: true,
45
+ dockBorders: true,
46
+ });
47
+ }
48
+ catch (error) {
49
+ screen = {
50
+ render: () => { },
51
+ destroy: () => { },
52
+ };
53
+ }
54
+ }
55
+ return screen;
56
+ };
57
+ class AlertPanel extends base_component_1.BaseComponent {
58
+ constructor(config, eventBus) {
59
+ super(config, eventBus);
60
+ this.alerts = [];
61
+ this.filteredAlerts = [];
62
+ this.selectedAlertIndex = 0;
63
+ this.currentFilter = {};
64
+ this.showDetailsPane = false;
65
+ this.showFilterPane = false;
66
+ this.showStatisticsPane = false;
67
+ this.levelIcons = {
68
+ info: 'ⓘ',
69
+ warning: '⚠',
70
+ error: '✗',
71
+ critical: '🔴'
72
+ };
73
+ this.typeIcons = {
74
+ system: '⚙',
75
+ stream: '📹',
76
+ channel: '📺',
77
+ network: '🌐'
78
+ };
79
+ this.panelConfig = {
80
+ maxDisplayItems: 50,
81
+ autoScroll: true,
82
+ showTimestamps: true,
83
+ showSources: true,
84
+ showIds: false,
85
+ timeFormat: 'relative',
86
+ colorCoding: true,
87
+ compactMode: false,
88
+ ...config.config['panelConfig']
89
+ };
90
+ this.setupAlertEventListeners();
91
+ }
92
+ setupAlertEventListeners() {
93
+ this.subscribe('alert:new', this.handleNewAlert.bind(this));
94
+ this.subscribe('alert:acknowledged', this.handleAlertAcknowledged.bind(this));
95
+ this.subscribe('alert:resolved', this.handleAlertResolved.bind(this));
96
+ this.subscribe('alert:updated', this.handleAlertUpdated.bind(this));
97
+ this.subscribe('alert:filter', this.handleFilterChanged.bind(this));
98
+ this.subscribe('alert:clear', this.handleClearAlerts.bind(this));
99
+ }
100
+ createWidget() {
101
+ try {
102
+ this.widget = blessed.box({
103
+ parent: getScreen(),
104
+ top: this.config.position.y || 0,
105
+ left: this.config.position.x || 0,
106
+ width: this.config.position.width || '100%',
107
+ height: this.config.position.height || '100%',
108
+ label: ' Alert Center ',
109
+ border: { type: 'line' },
110
+ style: {
111
+ border: { fg: 'blue' },
112
+ label: { fg: 'white' },
113
+ },
114
+ keys: true,
115
+ mouse: true,
116
+ scrollable: true,
117
+ });
118
+ this.container = this.widget;
119
+ this.createAlertList();
120
+ this.createDetailsBox();
121
+ this.createFilterBox();
122
+ this.createStatisticsBox();
123
+ this.createActionBar();
124
+ this.actionBar.setContent(this.generateActionBarContent());
125
+ this.updateLayout();
126
+ this.bindKeyboardEvents();
127
+ this.bindMouseEvents();
128
+ }
129
+ catch (error) {
130
+ this.handleError(error instanceof Error ? error : new Error('Widget creation failed'));
131
+ }
132
+ }
133
+ createAlertList() {
134
+ this.alertList = blessed.list({
135
+ parent: this.container,
136
+ top: 1,
137
+ left: 0,
138
+ width: this.showDetailsPane ? '60%' : '100%',
139
+ height: this.showFilterPane || this.showStatisticsPane ? '70%' : '85%',
140
+ label: ' Alerts ',
141
+ border: { type: 'line' },
142
+ style: {
143
+ border: { fg: 'cyan' },
144
+ selected: { bg: 'blue', fg: 'white' },
145
+ item: { fg: 'white' },
146
+ },
147
+ keys: true,
148
+ mouse: true,
149
+ scrollable: true,
150
+ alwaysScroll: true,
151
+ scrollbar: {
152
+ ch: ' ',
153
+ track: {
154
+ bg: 'gray',
155
+ },
156
+ style: {
157
+ inverse: true,
158
+ },
159
+ },
160
+ });
161
+ }
162
+ createDetailsBox() {
163
+ this.detailsBox = blessed.box({
164
+ parent: this.container,
165
+ top: 1,
166
+ left: '60%',
167
+ width: '40%',
168
+ height: this.showFilterPane || this.showStatisticsPane ? '70%' : '85%',
169
+ label: ' Alert Details ',
170
+ border: { type: 'line' },
171
+ style: {
172
+ border: { fg: 'green' },
173
+ label: { fg: 'white' },
174
+ },
175
+ hidden: !this.showDetailsPane,
176
+ scrollable: true,
177
+ alwaysScroll: true,
178
+ keys: true,
179
+ mouse: true,
180
+ });
181
+ }
182
+ createFilterBox() {
183
+ this.filterBox = blessed.box({
184
+ parent: this.container,
185
+ top: '71%',
186
+ left: 0,
187
+ width: this.showDetailsPane ? '60%' : '100%',
188
+ height: '14%',
189
+ label: ' Filter & Search ',
190
+ border: { type: 'line' },
191
+ style: {
192
+ border: { fg: 'yellow' },
193
+ label: { fg: 'white' },
194
+ },
195
+ hidden: !this.showFilterPane,
196
+ scrollable: true,
197
+ content: this.generateFilterContent(),
198
+ });
199
+ }
200
+ createStatisticsBox() {
201
+ this.statisticsBox = blessed.box({
202
+ parent: this.container,
203
+ top: '71%',
204
+ left: this.showDetailsPane ? '60%' : (this.showFilterPane ? '0%' : '0%'),
205
+ width: this.showDetailsPane ? '40%' : '100%',
206
+ height: '14%',
207
+ label: ' Alert Statistics ',
208
+ border: { type: 'line' },
209
+ style: {
210
+ border: { fg: 'magenta' },
211
+ label: { fg: 'white' },
212
+ },
213
+ hidden: !this.showStatisticsPane,
214
+ content: 'Loading statistics...',
215
+ });
216
+ }
217
+ createActionBar() {
218
+ this.actionBar = blessed.box({
219
+ parent: this.container,
220
+ top: '86%',
221
+ left: 0,
222
+ width: '100%',
223
+ height: '14%',
224
+ label: ' Actions ',
225
+ border: { type: 'line' },
226
+ style: {
227
+ border: { fg: 'white' },
228
+ label: { fg: 'white' },
229
+ },
230
+ content: this.generateActionBarContent(),
231
+ });
232
+ }
233
+ updateLayout() {
234
+ if (!this.alertList || !this.detailsBox || !this.filterBox || !this.statisticsBox)
235
+ return;
236
+ this.alertList.width = this.showDetailsPane ? '60%' : '100%';
237
+ this.alertList.height = (this.showFilterPane || this.showStatisticsPane) ? '70%' : '85%';
238
+ this.detailsBox.hidden = !this.showDetailsPane;
239
+ this.detailsBox.height = (this.showFilterPane || this.showStatisticsPane) ? '70%' : '85%';
240
+ this.filterBox.hidden = !this.showFilterPane;
241
+ this.filterBox.width = this.showDetailsPane ? '60%' : '100%';
242
+ this.statisticsBox.hidden = !this.showStatisticsPane;
243
+ if (this.showStatisticsPane) {
244
+ if (this.showDetailsPane) {
245
+ this.statisticsBox.left = '60%';
246
+ this.statisticsBox.width = '40%';
247
+ }
248
+ else if (this.showFilterPane) {
249
+ this.statisticsBox.left = '0%';
250
+ this.statisticsBox.top = '71%';
251
+ this.statisticsBox.width = '100%';
252
+ }
253
+ else {
254
+ this.statisticsBox.left = '0%';
255
+ this.statisticsBox.width = '100%';
256
+ }
257
+ }
258
+ }
259
+ bindKeyboardEvents() {
260
+ if (!this.alertList)
261
+ return;
262
+ this.alertList.on('select', (_item, index) => {
263
+ this.selectedAlertIndex = index;
264
+ this.updateDetailsPane();
265
+ });
266
+ this.alertList.key(['up', 'k'], () => {
267
+ this.alertList.up(1);
268
+ this.selectedAlertIndex = Math.max(0, this.selectedAlertIndex - 1);
269
+ this.updateDetailsPane();
270
+ });
271
+ this.alertList.key(['down', 'j'], () => {
272
+ this.alertList.down(1);
273
+ this.selectedAlertIndex = Math.min(this.filteredAlerts.length - 1, this.selectedAlertIndex + 1);
274
+ this.updateDetailsPane();
275
+ });
276
+ }
277
+ bindMouseEvents() {
278
+ if (!this.alertList)
279
+ return;
280
+ this.alertList.on('click', () => {
281
+ this.updateDetailsPane();
282
+ });
283
+ }
284
+ handleCustomKeyboard(event) {
285
+ switch (event.key) {
286
+ case 'a':
287
+ this.acknowledgeSelectedAlert();
288
+ return true;
289
+ case 'r':
290
+ this.resolveSelectedAlert();
291
+ return true;
292
+ case 'i':
293
+ this.ignoreSelectedAlert();
294
+ return true;
295
+ case 'n':
296
+ this.addNotesToSelected();
297
+ return true;
298
+ case 'A':
299
+ this.acknowledgeAllFiltered();
300
+ return true;
301
+ case 'S':
302
+ this.resolveAllFiltered();
303
+ return true;
304
+ case 'd':
305
+ this.toggleDetailsPane();
306
+ return true;
307
+ case 'f':
308
+ this.toggleFilterPane();
309
+ return true;
310
+ case 's':
311
+ this.toggleStatisticsPane();
312
+ return true;
313
+ case 'c':
314
+ this.clearAllAlerts();
315
+ return true;
316
+ case 'x':
317
+ this.deleteSelectedAlert();
318
+ return true;
319
+ case 'R':
320
+ this.refreshAlerts();
321
+ return true;
322
+ case '1':
323
+ case '2':
324
+ case '3':
325
+ case '4':
326
+ case '5':
327
+ this.jumpToAlert(parseInt(event.key) - 1);
328
+ return true;
329
+ default:
330
+ return false;
331
+ }
332
+ }
333
+ generateActionBarContent() {
334
+ return [
335
+ '{bold}Alert Actions:{/bold}',
336
+ '[a]ck [r]esolve [i]gnore [n]otes [d]etails [f]ilter',
337
+ '[A]ck All [S]olve All [c]lear [x]delete [R]efresh',
338
+ '1-5: Jump to alert [s]tats [Esc]Close',
339
+ ].join('\n');
340
+ }
341
+ generateFilterContent() {
342
+ const activeFilters = [];
343
+ if (this.currentFilter.levels?.length) {
344
+ activeFilters.push(`Levels: ${this.currentFilter.levels.join(', ')}`);
345
+ }
346
+ if (this.currentFilter.types?.length) {
347
+ activeFilters.push(`Types: ${this.currentFilter.types.join(', ')}`);
348
+ }
349
+ if (this.currentFilter.statuses?.length) {
350
+ activeFilters.push(`Status: ${this.currentFilter.statuses.join(', ')}`);
351
+ }
352
+ if (this.currentFilter.searchText) {
353
+ activeFilters.push(`Search: "${this.currentFilter.searchText}"`);
354
+ }
355
+ return activeFilters.length > 0
356
+ ? `Active Filters:\n${activeFilters.join('\n')}`
357
+ : 'No active filters';
358
+ }
359
+ formatAlertForList(alert, index) {
360
+ const icon = this.levelIcons[alert.level];
361
+ const typeIcon = this.typeIcons[alert.type];
362
+ const timestamp = this.formatTimestamp(alert.timestamp);
363
+ const ackStatus = alert.acknowledged ? '✓' : ' ';
364
+ if (this.panelConfig.compactMode) {
365
+ return `${icon} ${alert.title} (${alert.source})`;
366
+ }
367
+ const parts = [];
368
+ if (this.panelConfig.showIds) {
369
+ parts.push(`[${index + 1}]`);
370
+ }
371
+ parts.push(`${icon}${typeIcon}`);
372
+ parts.push(ackStatus);
373
+ if (this.panelConfig.showTimestamps) {
374
+ parts.push(`[${timestamp}]`);
375
+ }
376
+ parts.push(alert.title);
377
+ if (this.panelConfig.showSources) {
378
+ parts.push(`(${alert.source})`);
379
+ }
380
+ return parts.join(' ');
381
+ }
382
+ formatTimestamp(timestamp) {
383
+ const date = new Date(timestamp);
384
+ if (this.panelConfig.timeFormat === 'relative') {
385
+ const now = Date.now();
386
+ const diff = now - timestamp;
387
+ if (diff < 60000) {
388
+ return `${Math.floor(diff / 1000)}s ago`;
389
+ }
390
+ else if (diff < 3600000) {
391
+ return `${Math.floor(diff / 60000)}m ago`;
392
+ }
393
+ else if (diff < 86400000) {
394
+ return `${Math.floor(diff / 3600000)}h ago`;
395
+ }
396
+ else {
397
+ return `${Math.floor(diff / 86400000)}d ago`;
398
+ }
399
+ }
400
+ else {
401
+ return date.toLocaleTimeString();
402
+ }
403
+ }
404
+ updateAlertList() {
405
+ if (!this.alertList)
406
+ return;
407
+ const items = this.filteredAlerts.map((alert, index) => this.formatAlertForList(alert, index));
408
+ this.alertList.setItems(items);
409
+ if (this.panelConfig.autoScroll && items.length > 0) {
410
+ this.alertList.select(items.length - 1);
411
+ this.selectedAlertIndex = items.length - 1;
412
+ }
413
+ const totalCount = this.alerts.length;
414
+ const filteredCount = this.filteredAlerts.length;
415
+ const label = totalCount === filteredCount
416
+ ? ` Alerts (${totalCount}) `
417
+ : ` Alerts (${filteredCount}/${totalCount}) `;
418
+ this.alertList.setLabel(label);
419
+ }
420
+ updateDetailsPane() {
421
+ if (!this.detailsBox || !this.showDetailsPane)
422
+ return;
423
+ const selectedAlert = this.filteredAlerts[this.selectedAlertIndex];
424
+ if (!selectedAlert) {
425
+ this.detailsBox.setContent('No alert selected');
426
+ return;
427
+ }
428
+ const content = this.formatAlertDetails(selectedAlert);
429
+ this.detailsBox.setContent(content);
430
+ }
431
+ formatAlertDetails(alert) {
432
+ const lines = [];
433
+ lines.push(`{bold}Alert Details{/bold}`);
434
+ lines.push('');
435
+ lines.push(`ID: ${alert.id}`);
436
+ lines.push(`Level: ${this.levelIcons[alert.level]} ${alert.level.toUpperCase()}`);
437
+ lines.push(`Type: ${this.typeIcons[alert.type]} ${alert.type.toUpperCase()}`);
438
+ lines.push(`Status: ${alert.status.toUpperCase()}`);
439
+ lines.push('');
440
+ lines.push(`{bold}Title:{/bold} ${alert.title}`);
441
+ lines.push('');
442
+ lines.push(`{bold}Message:{/bold}`);
443
+ lines.push(alert.message);
444
+ lines.push('');
445
+ lines.push(`{bold}Source:{/bold} ${alert.source}`);
446
+ if (alert.channelId) {
447
+ lines.push(`{bold}Channel:{/bold} ${alert.channelId}`);
448
+ }
449
+ lines.push('');
450
+ lines.push(`{bold}Created:{/bold} ${new Date(alert.timestamp).toLocaleString()}`);
451
+ if (alert.acknowledged) {
452
+ lines.push(`{bold}Acknowledged:{/bold} ${alert.acknowledgedAt ? new Date(alert.acknowledgedAt).toLocaleString() : 'Yes'}`);
453
+ if (alert.acknowledgedBy) {
454
+ lines.push(`{bold}Acknowledged By:{/bold} ${alert.acknowledgedBy}`);
455
+ }
456
+ }
457
+ if (alert.resolvedAt) {
458
+ lines.push(`{bold}Resolved:{/bold} ${new Date(alert.resolvedAt).toLocaleString()}`);
459
+ }
460
+ if (alert.notes) {
461
+ lines.push('');
462
+ lines.push(`{bold}Notes:{/bold}`);
463
+ lines.push(alert.notes);
464
+ }
465
+ if (alert.metadata && Object.keys(alert.metadata).length > 0) {
466
+ lines.push('');
467
+ lines.push(`{bold}Metadata:{/bold}`);
468
+ Object.entries(alert.metadata).forEach(([key, value]) => {
469
+ lines.push(` ${key}: ${JSON.stringify(value)}`);
470
+ });
471
+ }
472
+ return lines.join('\n');
473
+ }
474
+ applyFilter() {
475
+ this.filteredAlerts = this.alerts.filter(alert => {
476
+ if (this.currentFilter.levels?.length && !this.currentFilter.levels.includes(alert.level)) {
477
+ return false;
478
+ }
479
+ if (this.currentFilter.types?.length && !this.currentFilter.types.includes(alert.type)) {
480
+ return false;
481
+ }
482
+ if (this.currentFilter.statuses?.length && !this.currentFilter.statuses.includes(alert.status)) {
483
+ return false;
484
+ }
485
+ if (this.currentFilter.sources?.length && !this.currentFilter.sources.includes(alert.source)) {
486
+ return false;
487
+ }
488
+ if (this.currentFilter.channelIds?.length && !this.currentFilter.channelIds.includes(alert.channelId || '')) {
489
+ return false;
490
+ }
491
+ if (this.currentFilter.timeRange) {
492
+ if (alert.timestamp < this.currentFilter.timeRange.start ||
493
+ alert.timestamp > this.currentFilter.timeRange.end) {
494
+ return false;
495
+ }
496
+ }
497
+ if (this.currentFilter.searchText) {
498
+ const searchText = this.currentFilter.searchText.toLowerCase();
499
+ return alert.title.toLowerCase().includes(searchText) ||
500
+ alert.message.toLowerCase().includes(searchText) ||
501
+ alert.source.toLowerCase().includes(searchText);
502
+ }
503
+ if (this.currentFilter.acknowledgedOnly && !alert.acknowledged) {
504
+ return false;
505
+ }
506
+ if (this.currentFilter.unacknowledgedOnly && alert.acknowledged) {
507
+ return false;
508
+ }
509
+ return true;
510
+ });
511
+ if (this.currentGrouping) {
512
+ this.applyGrouping();
513
+ }
514
+ this.filteredAlerts.sort((a, b) => b.timestamp - a.timestamp);
515
+ }
516
+ applyGrouping() {
517
+ if (!this.currentGrouping)
518
+ return;
519
+ const groups = new Map();
520
+ this.filteredAlerts.forEach(alert => {
521
+ const groupKey = alert[this.currentGrouping.field];
522
+ if (!groups.has(groupKey)) {
523
+ groups.set(groupKey, []);
524
+ }
525
+ groups.get(groupKey).push(alert);
526
+ });
527
+ this.filteredAlerts = [];
528
+ Array.from(groups.entries()).forEach(([, groupAlerts]) => {
529
+ groupAlerts.sort((a, b) => {
530
+ const aVal = a[this.currentGrouping.field];
531
+ const bVal = b[this.currentGrouping.field];
532
+ if (aVal === undefined && bVal === undefined)
533
+ return 0;
534
+ if (aVal === undefined)
535
+ return 1;
536
+ if (bVal === undefined)
537
+ return -1;
538
+ return this.currentGrouping.sortOrder === 'asc' ?
539
+ (aVal < bVal ? -1 : 1) : (aVal > bVal ? -1 : 1);
540
+ });
541
+ const limitedGroup = this.currentGrouping.maxPerGroup
542
+ ? groupAlerts.slice(0, this.currentGrouping.maxPerGroup)
543
+ : groupAlerts;
544
+ this.filteredAlerts.push(...limitedGroup);
545
+ });
546
+ }
547
+ toggleDetailsPane() {
548
+ this.showDetailsPane = !this.showDetailsPane;
549
+ this.updateLayout();
550
+ this.updateDetailsPane();
551
+ this.throttledRender();
552
+ }
553
+ toggleFilterPane() {
554
+ this.showFilterPane = !this.showFilterPane;
555
+ this.updateLayout();
556
+ if (this.filterBox) {
557
+ this.filterBox.setContent(this.generateFilterContent());
558
+ }
559
+ this.throttledRender();
560
+ }
561
+ toggleStatisticsPane() {
562
+ this.showStatisticsPane = !this.showStatisticsPane;
563
+ this.updateLayout();
564
+ this.updateStatistics();
565
+ this.throttledRender();
566
+ }
567
+ updateStatistics() {
568
+ if (!this.statisticsBox || !this.showStatisticsPane)
569
+ return;
570
+ const stats = this.calculateStatistics();
571
+ const content = this.formatStatistics(stats);
572
+ this.statisticsBox.setContent(content);
573
+ }
574
+ calculateStatistics() {
575
+ const stats = {
576
+ total: this.alerts.length,
577
+ byLevel: { info: 0, warning: 0, error: 0, critical: 0 },
578
+ byType: { system: 0, stream: 0, channel: 0, network: 0 },
579
+ byStatus: { active: 0, acknowledged: 0, resolved: 0, ignored: 0 },
580
+ bySource: {},
581
+ last24Hours: 0,
582
+ mostFrequentType: 'system',
583
+ };
584
+ const now = Date.now();
585
+ const last24Hours = now - (24 * 60 * 60 * 1000);
586
+ const ackTimes = [];
587
+ const resolveTimes = [];
588
+ this.alerts.forEach(alert => {
589
+ stats.byLevel[alert.level]++;
590
+ stats.byType[alert.type]++;
591
+ stats.byStatus[alert.status]++;
592
+ stats.bySource[alert.source] = (stats.bySource[alert.source] || 0) + 1;
593
+ if (alert.timestamp >= last24Hours) {
594
+ stats.last24Hours++;
595
+ }
596
+ if (alert.acknowledged && alert.acknowledgedAt) {
597
+ ackTimes.push(alert.acknowledgedAt - alert.timestamp);
598
+ }
599
+ if (alert.resolvedAt) {
600
+ resolveTimes.push(alert.resolvedAt - alert.timestamp);
601
+ }
602
+ });
603
+ const typeEntries = Object.entries(stats.byType);
604
+ stats.mostFrequentType = typeEntries.reduce((a, b) => a[1] > b[1] ? a : b)[0];
605
+ if (ackTimes.length > 0) {
606
+ stats.avgTimeToAck = ackTimes.reduce((a, b) => a + b, 0) / ackTimes.length;
607
+ }
608
+ if (resolveTimes.length > 0) {
609
+ stats.avgTimeToResolve = resolveTimes.reduce((a, b) => a + b, 0) / resolveTimes.length;
610
+ }
611
+ return stats;
612
+ }
613
+ formatStatistics(stats) {
614
+ const lines = [];
615
+ lines.push(`{bold}Alert Statistics{/bold}`);
616
+ lines.push('');
617
+ lines.push(`Total Alerts: ${stats.total}`);
618
+ lines.push(`Last 24h: ${stats.last24Hours}`);
619
+ lines.push('');
620
+ lines.push(`{bold}By Level:{/bold}`);
621
+ Object.entries(stats.byLevel).forEach(([level, count]) => {
622
+ if (count > 0) {
623
+ const icon = this.levelIcons[level];
624
+ lines.push(` ${icon} ${level}: ${count}`);
625
+ }
626
+ });
627
+ lines.push('');
628
+ lines.push(`{bold}By Type:{/bold}`);
629
+ Object.entries(stats.byType).forEach(([type, count]) => {
630
+ if (count > 0) {
631
+ const icon = this.typeIcons[type];
632
+ lines.push(` ${icon} ${type}: ${count}`);
633
+ }
634
+ });
635
+ lines.push('');
636
+ lines.push(`{bold}By Status:{/bold}`);
637
+ Object.entries(stats.byStatus).forEach(([status, count]) => {
638
+ if (count > 0) {
639
+ lines.push(` ${status}: ${count}`);
640
+ }
641
+ });
642
+ if (stats.avgTimeToAck) {
643
+ lines.push('');
644
+ lines.push(`Avg Ack Time: ${Math.round(stats.avgTimeToAck / 1000)}s`);
645
+ }
646
+ if (stats.avgTimeToResolve) {
647
+ lines.push(`Avg Resolve Time: ${Math.round(stats.avgTimeToResolve / 60000)}m`);
648
+ }
649
+ return lines.join('\n');
650
+ }
651
+ acknowledgeSelectedAlert() {
652
+ const alert = this.filteredAlerts[this.selectedAlertIndex];
653
+ if (!alert || alert.acknowledged)
654
+ return;
655
+ this.acknowledgeAlert(alert.id);
656
+ }
657
+ ignoreSelectedAlert() {
658
+ const alert = this.filteredAlerts[this.selectedAlertIndex];
659
+ if (!alert)
660
+ return;
661
+ this.ignoreAlert(alert.id);
662
+ }
663
+ addNotesToSelected() {
664
+ const alert = this.filteredAlerts[this.selectedAlertIndex];
665
+ if (!alert)
666
+ return;
667
+ this.emit('alert:request-notes', { alertId: alert.id, alert });
668
+ }
669
+ jumpToAlert(index) {
670
+ if (index >= 0 && index < this.filteredAlerts.length) {
671
+ this.selectAlert(index);
672
+ }
673
+ }
674
+ resolveSelectedAlert() {
675
+ const alert = this.filteredAlerts[this.selectedAlertIndex];
676
+ if (!alert)
677
+ return;
678
+ this.resolveAlert(alert.id);
679
+ }
680
+ deleteSelectedAlert() {
681
+ const alert = this.filteredAlerts[this.selectedAlertIndex];
682
+ if (!alert)
683
+ return;
684
+ this.deleteAlert(alert.id);
685
+ }
686
+ clearAllAlerts() {
687
+ this.alerts = [];
688
+ this.applyFilter();
689
+ this.updateAlertList();
690
+ this.updateDetailsPane();
691
+ this.updateStatistics();
692
+ this.throttledRender();
693
+ this.emit('alert:cleared', { timestamp: Date.now() });
694
+ }
695
+ refreshAlerts() {
696
+ this.emit('alert:refresh', { timestamp: Date.now() });
697
+ }
698
+ addAlert(alert) {
699
+ this.alerts.unshift(alert);
700
+ if (this.alerts.length > this.panelConfig.maxDisplayItems) {
701
+ this.alerts = this.alerts.slice(0, this.panelConfig.maxDisplayItems);
702
+ }
703
+ this.applyFilter();
704
+ this.updateAlertList();
705
+ this.updateDetailsPane();
706
+ this.updateStatistics();
707
+ this.throttledRender();
708
+ }
709
+ deleteAlert(alertId) {
710
+ const index = this.alerts.findIndex(a => a.id === alertId);
711
+ if (index === -1)
712
+ return false;
713
+ this.alerts.splice(index, 1);
714
+ this.applyFilter();
715
+ this.updateAlertList();
716
+ this.updateDetailsPane();
717
+ this.updateStatistics();
718
+ this.throttledRender();
719
+ this.emit('alert:deleted', { alertId, timestamp: Date.now() });
720
+ return true;
721
+ }
722
+ setFilter(filter) {
723
+ this.currentFilter = { ...filter };
724
+ this.applyFilter();
725
+ this.updateAlertList();
726
+ this.updateDetailsPane();
727
+ this.updateStatistics();
728
+ if (this.filterBox) {
729
+ this.filterBox.setContent(this.generateFilterContent());
730
+ }
731
+ this.throttledRender();
732
+ }
733
+ setGrouping(grouping) {
734
+ this.currentGrouping = grouping;
735
+ this.applyFilter();
736
+ this.updateAlertList();
737
+ this.updateDetailsPane();
738
+ this.throttledRender();
739
+ }
740
+ getAlerts() {
741
+ return [...this.alerts];
742
+ }
743
+ getFilteredAlerts() {
744
+ return [...this.filteredAlerts];
745
+ }
746
+ getStatistics() {
747
+ return this.calculateStatistics();
748
+ }
749
+ acknowledgeCurrentAlert(user) {
750
+ const alert = this.getSelectedAlert();
751
+ if (!alert)
752
+ return false;
753
+ return this.acknowledgeAlert(alert.id, user);
754
+ }
755
+ acknowledgeAlert(alertId, user) {
756
+ return this.acknowledgeAlertInternal(alertId, user, true);
757
+ }
758
+ resolveCurrentAlert(user) {
759
+ const alert = this.getSelectedAlert();
760
+ if (!alert)
761
+ return false;
762
+ return this.resolveAlert(alert.id, user);
763
+ }
764
+ resolveAlert(alertId, user) {
765
+ return this.resolveAlertInternal(alertId, user, true);
766
+ }
767
+ ignoreCurrentAlert(user) {
768
+ const alert = this.getSelectedAlert();
769
+ if (!alert)
770
+ return false;
771
+ return this.ignoreAlert(alert.id, user);
772
+ }
773
+ ignoreAlert(alertId, user) {
774
+ const alert = this.alerts.find(a => a.id === alertId);
775
+ if (!alert)
776
+ return false;
777
+ alert.status = 'ignored';
778
+ alert.acknowledgedAt = Date.now();
779
+ if (user) {
780
+ alert.acknowledgedBy = user;
781
+ }
782
+ this.applyFilter();
783
+ this.updateAlertList();
784
+ this.updateDetailsPane();
785
+ this.updateStatistics();
786
+ this.throttledRender();
787
+ this.emit('alert:ignored', { alertId, alert, user });
788
+ return true;
789
+ }
790
+ acknowledgeBatch(alertIds, user) {
791
+ const result = { success: [], failed: [] };
792
+ alertIds.forEach(alertId => {
793
+ if (this.acknowledgeAlertInternal(alertId, user, false)) {
794
+ result.success.push(alertId);
795
+ }
796
+ else {
797
+ result.failed.push(alertId);
798
+ }
799
+ });
800
+ this.applyFilter();
801
+ this.updateAlertList();
802
+ this.updateDetailsPane();
803
+ this.updateStatistics();
804
+ this.throttledRender();
805
+ this.emit('alert:batch-acknowledged', { success: result.success, failed: result.failed, user });
806
+ return result;
807
+ }
808
+ resolveBatch(alertIds, user) {
809
+ const result = { success: [], failed: [] };
810
+ alertIds.forEach(alertId => {
811
+ if (this.resolveAlertInternal(alertId, user, false)) {
812
+ result.success.push(alertId);
813
+ }
814
+ else {
815
+ result.failed.push(alertId);
816
+ }
817
+ });
818
+ this.applyFilter();
819
+ this.updateAlertList();
820
+ this.updateDetailsPane();
821
+ this.updateStatistics();
822
+ this.throttledRender();
823
+ this.emit('alert:batch-resolved', { success: result.success, failed: result.failed, user });
824
+ return result;
825
+ }
826
+ acknowledgeAllFiltered(user) {
827
+ const alertIds = this.filteredAlerts
828
+ .filter(alert => !alert.acknowledged)
829
+ .map(alert => alert.id);
830
+ const result = this.acknowledgeBatch(alertIds, user);
831
+ return result.success.length;
832
+ }
833
+ resolveAllFiltered(user) {
834
+ const alertIds = this.filteredAlerts
835
+ .filter(alert => alert.status === 'active' || alert.status === 'acknowledged')
836
+ .map(alert => alert.id);
837
+ const result = this.resolveBatch(alertIds, user);
838
+ return result.success.length;
839
+ }
840
+ addAlertNotes(alertId, notes, user) {
841
+ const alert = this.alerts.find(a => a.id === alertId);
842
+ if (!alert)
843
+ return false;
844
+ const timestamp = new Date().toISOString();
845
+ const noteEntry = user ? `[${timestamp}] ${user}: ${notes}` : `[${timestamp}] ${notes}`;
846
+ if (alert.notes) {
847
+ alert.notes += '\n' + noteEntry;
848
+ }
849
+ else {
850
+ alert.notes = noteEntry;
851
+ }
852
+ this.updateDetailsPane();
853
+ this.throttledRender();
854
+ this.emit('alert:notes-added', { alertId, alert, notes, user });
855
+ return true;
856
+ }
857
+ getSelectedAlert() {
858
+ if (this.selectedAlertIndex >= 0 && this.selectedAlertIndex < this.filteredAlerts.length) {
859
+ return this.filteredAlerts[this.selectedAlertIndex] || null;
860
+ }
861
+ return null;
862
+ }
863
+ selectAlert(index) {
864
+ if (index >= 0 && index < this.filteredAlerts.length) {
865
+ this.selectedAlertIndex = index;
866
+ if (this.alertList) {
867
+ this.alertList.select(index);
868
+ }
869
+ this.updateDetailsPane();
870
+ this.throttledRender();
871
+ return true;
872
+ }
873
+ return false;
874
+ }
875
+ selectAlertById(alertId) {
876
+ const index = this.filteredAlerts.findIndex(alert => alert.id === alertId);
877
+ if (index !== -1) {
878
+ return this.selectAlert(index);
879
+ }
880
+ return false;
881
+ }
882
+ acknowledgeAlertInternal(alertId, user, shouldUpdate = true) {
883
+ const alert = this.alerts.find(a => a.id === alertId);
884
+ if (!alert || alert.acknowledged)
885
+ return false;
886
+ alert.acknowledged = true;
887
+ alert.acknowledgedAt = Date.now();
888
+ if (user) {
889
+ alert.acknowledgedBy = user;
890
+ }
891
+ if (alert.status === 'active') {
892
+ alert.status = 'acknowledged';
893
+ }
894
+ if (shouldUpdate) {
895
+ this.applyFilter();
896
+ this.updateAlertList();
897
+ this.updateDetailsPane();
898
+ this.updateStatistics();
899
+ this.throttledRender();
900
+ this.emit('alert:acknowledged', { alertId, alert, user });
901
+ }
902
+ return true;
903
+ }
904
+ resolveAlertInternal(alertId, user, shouldUpdate = true) {
905
+ const alert = this.alerts.find(a => a.id === alertId);
906
+ if (!alert || alert.status === 'resolved')
907
+ return false;
908
+ alert.status = 'resolved';
909
+ alert.resolvedAt = Date.now();
910
+ if (!alert.acknowledged) {
911
+ alert.acknowledged = true;
912
+ alert.acknowledgedAt = Date.now();
913
+ if (user) {
914
+ alert.acknowledgedBy = user;
915
+ }
916
+ }
917
+ if (shouldUpdate) {
918
+ this.applyFilter();
919
+ this.updateAlertList();
920
+ this.updateDetailsPane();
921
+ this.updateStatistics();
922
+ this.throttledRender();
923
+ this.emit('alert:resolved', { alertId, alert, user });
924
+ }
925
+ return true;
926
+ }
927
+ handleNewAlert(data) {
928
+ this.addAlert(data.alert);
929
+ }
930
+ handleAlertAcknowledged(data) {
931
+ this.acknowledgeAlertInternal(data.alertId, data.user, false);
932
+ }
933
+ handleAlertResolved(data) {
934
+ this.resolveAlertInternal(data.alertId, undefined, false);
935
+ }
936
+ handleAlertUpdated(data) {
937
+ const index = this.alerts.findIndex(a => a.id === data.alert.id);
938
+ if (index !== -1) {
939
+ this.alerts[index] = data.alert;
940
+ this.applyFilter();
941
+ this.updateAlertList();
942
+ this.updateDetailsPane();
943
+ this.updateStatistics();
944
+ this.throttledRender();
945
+ }
946
+ }
947
+ handleFilterChanged(data) {
948
+ this.setFilter(data.filter);
949
+ }
950
+ handleClearAlerts() {
951
+ this.clearAllAlerts();
952
+ }
953
+ render() {
954
+ if (this.isDestroyed)
955
+ return;
956
+ try {
957
+ this.updateAlertList();
958
+ this.updateDetailsPane();
959
+ this.updateStatistics();
960
+ const currentScreen = getScreen();
961
+ if (currentScreen && currentScreen.render) {
962
+ currentScreen.render();
963
+ }
964
+ }
965
+ catch (error) {
966
+ this.handleError(error instanceof Error ? error : new Error('Render failed'));
967
+ }
968
+ }
969
+ update(data) {
970
+ if (this.isDestroyed)
971
+ return;
972
+ try {
973
+ if (data === null || data === undefined) {
974
+ return;
975
+ }
976
+ if (data.alerts && Array.isArray(data.alerts)) {
977
+ this.alerts = data.alerts;
978
+ this.applyFilter();
979
+ }
980
+ if (data.filter && typeof data.filter === 'object') {
981
+ this.setFilter(data.filter);
982
+ }
983
+ if (data.grouping) {
984
+ this.setGrouping(data.grouping);
985
+ }
986
+ this.updateState({ data, lastUpdate: new Date() });
987
+ this.throttledRender();
988
+ }
989
+ catch (error) {
990
+ this.handleError(error instanceof Error ? error : new Error('Update failed'));
991
+ }
992
+ }
993
+ destroy() {
994
+ this.alerts = [];
995
+ this.filteredAlerts = [];
996
+ super.destroy();
997
+ }
998
+ }
999
+ exports.AlertPanel = AlertPanel;
1000
+ //# sourceMappingURL=alert.panel.js.map