@appkit/llamacpp-cli 1.4.1 → 1.5.0

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 (49) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +87 -1
  3. package/dist/cli.js +14 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/monitor.d.ts +2 -0
  6. package/dist/commands/monitor.d.ts.map +1 -0
  7. package/dist/commands/monitor.js +76 -0
  8. package/dist/commands/monitor.js.map +1 -0
  9. package/dist/lib/metrics-aggregator.d.ts +39 -0
  10. package/dist/lib/metrics-aggregator.d.ts.map +1 -0
  11. package/dist/lib/metrics-aggregator.js +200 -0
  12. package/dist/lib/metrics-aggregator.js.map +1 -0
  13. package/dist/lib/system-collector.d.ts +75 -0
  14. package/dist/lib/system-collector.d.ts.map +1 -0
  15. package/dist/lib/system-collector.js +310 -0
  16. package/dist/lib/system-collector.js.map +1 -0
  17. package/dist/tui/MonitorApp.d.ts +4 -0
  18. package/dist/tui/MonitorApp.d.ts.map +1 -0
  19. package/dist/tui/MonitorApp.js +293 -0
  20. package/dist/tui/MonitorApp.js.map +1 -0
  21. package/dist/tui/MultiServerMonitorApp.d.ts +4 -0
  22. package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -0
  23. package/dist/tui/MultiServerMonitorApp.js +496 -0
  24. package/dist/tui/MultiServerMonitorApp.js.map +1 -0
  25. package/dist/tui/components/ErrorState.d.ts +8 -0
  26. package/dist/tui/components/ErrorState.d.ts.map +1 -0
  27. package/dist/tui/components/ErrorState.js +22 -0
  28. package/dist/tui/components/ErrorState.js.map +1 -0
  29. package/dist/tui/components/LoadingState.d.ts +8 -0
  30. package/dist/tui/components/LoadingState.d.ts.map +1 -0
  31. package/dist/tui/components/LoadingState.js +21 -0
  32. package/dist/tui/components/LoadingState.js.map +1 -0
  33. package/dist/types/monitor-types.d.ts +122 -0
  34. package/dist/types/monitor-types.d.ts.map +1 -0
  35. package/dist/types/monitor-types.js +3 -0
  36. package/dist/types/monitor-types.js.map +1 -0
  37. package/dist/utils/process-utils.d.ts +16 -1
  38. package/dist/utils/process-utils.d.ts.map +1 -1
  39. package/dist/utils/process-utils.js +144 -27
  40. package/dist/utils/process-utils.js.map +1 -1
  41. package/package.json +3 -1
  42. package/src/cli.ts +14 -0
  43. package/src/commands/monitor.ts +90 -0
  44. package/src/lib/metrics-aggregator.ts +244 -0
  45. package/src/lib/system-collector.ts +312 -0
  46. package/src/tui/MonitorApp.ts +361 -0
  47. package/src/tui/MultiServerMonitorApp.ts +547 -0
  48. package/src/types/monitor-types.ts +161 -0
  49. package/src/utils/process-utils.ts +160 -26
@@ -0,0 +1,496 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createMultiServerMonitorUI = createMultiServerMonitorUI;
40
+ const blessed_1 = __importDefault(require("blessed"));
41
+ const metrics_aggregator_js_1 = require("../lib/metrics-aggregator.js");
42
+ const system_collector_js_1 = require("../lib/system-collector.js");
43
+ async function createMultiServerMonitorUI(screen, servers) {
44
+ let updateInterval = 2000;
45
+ let intervalId = null;
46
+ let viewMode = 'list';
47
+ let selectedServerIndex = 0;
48
+ let isLoading = false;
49
+ let lastSystemMetrics = null;
50
+ // Spinner animation
51
+ const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
52
+ let spinnerFrameIndex = 0;
53
+ let spinnerIntervalId = null;
54
+ const systemCollector = new system_collector_js_1.SystemCollector();
55
+ const aggregators = new Map();
56
+ const serverDataMap = new Map();
57
+ // Initialize aggregators for each server
58
+ for (const server of servers) {
59
+ aggregators.set(server.id, new metrics_aggregator_js_1.MetricsAggregator(server));
60
+ serverDataMap.set(server.id, {
61
+ server,
62
+ data: null,
63
+ error: null,
64
+ });
65
+ }
66
+ // Single scrollable content box
67
+ const contentBox = blessed_1.default.box({
68
+ top: 0,
69
+ left: 0,
70
+ width: '100%',
71
+ height: '100%',
72
+ tags: true,
73
+ scrollable: true,
74
+ alwaysScroll: true,
75
+ keys: true,
76
+ vi: true,
77
+ mouse: true,
78
+ scrollbar: {
79
+ ch: '█',
80
+ style: {
81
+ fg: 'blue',
82
+ },
83
+ },
84
+ });
85
+ screen.append(contentBox);
86
+ // Helper to create progress bar
87
+ function createProgressBar(percentage, width = 30) {
88
+ const filled = Math.round((percentage / 100) * width);
89
+ const empty = width - filled;
90
+ return '[' + '█'.repeat(Math.max(0, filled)) + '░'.repeat(Math.max(0, empty)) + ']';
91
+ }
92
+ // Render system resources section
93
+ function renderSystemResources(systemMetrics) {
94
+ let content = '';
95
+ content += '{bold}System Resources{/bold}\n';
96
+ const termWidth = screen.width || 80;
97
+ const divider = '─'.repeat(termWidth - 2);
98
+ content += divider + '\n';
99
+ if (systemMetrics) {
100
+ if (systemMetrics.gpuUsage !== undefined) {
101
+ const bar = createProgressBar(systemMetrics.gpuUsage);
102
+ content += `GPU: {cyan-fg}${bar}{/cyan-fg} ${Math.round(systemMetrics.gpuUsage)}%`;
103
+ if (systemMetrics.temperature !== undefined) {
104
+ content += ` - ${Math.round(systemMetrics.temperature)}°C`;
105
+ }
106
+ content += '\n';
107
+ }
108
+ if (systemMetrics.cpuUsage !== undefined) {
109
+ const bar = createProgressBar(systemMetrics.cpuUsage);
110
+ content += `CPU: {cyan-fg}${bar}{/cyan-fg} ${Math.round(systemMetrics.cpuUsage)}%\n`;
111
+ }
112
+ if (systemMetrics.aneUsage !== undefined && systemMetrics.aneUsage > 1) {
113
+ const bar = createProgressBar(systemMetrics.aneUsage);
114
+ content += `ANE: {cyan-fg}${bar}{/cyan-fg} ${Math.round(systemMetrics.aneUsage)}%\n`;
115
+ }
116
+ if (systemMetrics.memoryTotal > 0) {
117
+ const memoryUsedGB = systemMetrics.memoryUsed / (1024 ** 3);
118
+ const memoryTotalGB = systemMetrics.memoryTotal / (1024 ** 3);
119
+ const memoryPercentage = (systemMetrics.memoryUsed / systemMetrics.memoryTotal) * 100;
120
+ const bar = createProgressBar(memoryPercentage);
121
+ content += `Memory: {cyan-fg}${bar}{/cyan-fg} ${Math.round(memoryPercentage)}% `;
122
+ content += `(${memoryUsedGB.toFixed(1)} / ${memoryTotalGB.toFixed(1)} GB)\n`;
123
+ }
124
+ if (systemMetrics.warnings && systemMetrics.warnings.length > 0) {
125
+ content += `\n{yellow-fg}⚠ ${systemMetrics.warnings.join(', ')}{/yellow-fg}\n`;
126
+ }
127
+ }
128
+ else {
129
+ content += '{gray-fg}Collecting system metrics...{/gray-fg}\n';
130
+ }
131
+ return content;
132
+ }
133
+ // Show loading spinner
134
+ function showLoading() {
135
+ if (isLoading)
136
+ return; // Already loading
137
+ isLoading = true;
138
+ spinnerFrameIndex = 0;
139
+ // Start spinner animation (80ms per frame = smooth rotation)
140
+ spinnerIntervalId = setInterval(() => {
141
+ spinnerFrameIndex = (spinnerFrameIndex + 1) % spinnerFrames.length;
142
+ // Re-render current view with updated spinner frame
143
+ let content = '';
144
+ if (viewMode === 'list') {
145
+ content = renderListView(lastSystemMetrics);
146
+ }
147
+ else {
148
+ content = renderDetailView(lastSystemMetrics);
149
+ }
150
+ contentBox.setContent(content);
151
+ screen.render();
152
+ }, 80);
153
+ // Immediate first render
154
+ let content = '';
155
+ if (viewMode === 'list') {
156
+ content = renderListView(lastSystemMetrics);
157
+ }
158
+ else {
159
+ content = renderDetailView(lastSystemMetrics);
160
+ }
161
+ contentBox.setContent(content);
162
+ screen.render();
163
+ }
164
+ // Hide loading spinner
165
+ function hideLoading() {
166
+ isLoading = false;
167
+ if (spinnerIntervalId) {
168
+ clearInterval(spinnerIntervalId);
169
+ spinnerIntervalId = null;
170
+ }
171
+ }
172
+ // Render list view
173
+ function renderListView(systemMetrics) {
174
+ const termWidth = screen.width || 80;
175
+ const divider = '─'.repeat(termWidth - 2);
176
+ let content = '';
177
+ // Header
178
+ content += '{bold}{blue-fg}═══ llama.cpp Multi-Server Monitor ═══{/blue-fg}{/bold}\n';
179
+ // Status line with optional spinner
180
+ const statusPlainText = 'Press 1-9 for details | [F] Filter | [Q] Quit';
181
+ const spinnerChar = isLoading ? spinnerFrames[spinnerFrameIndex] : '';
182
+ const spinnerText = spinnerChar ? ` {cyan-fg}${spinnerChar}{/cyan-fg}` : '';
183
+ content += `{gray-fg}${statusPlainText}${spinnerText}{/gray-fg}\n\n`;
184
+ // System resources
185
+ content += renderSystemResources(systemMetrics);
186
+ content += '\n';
187
+ // Server list header
188
+ const runningCount = servers.filter(s => s.status === 'running').length;
189
+ const stoppedCount = servers.filter(s => s.status !== 'running').length;
190
+ content += `{bold}Servers (${runningCount} running, ${stoppedCount} stopped){/bold}\n`;
191
+ content += '{gray-fg}Press number for details{/gray-fg}\n';
192
+ content += divider + '\n';
193
+ // Table header
194
+ content += '{bold}# │ Server ID │ Port │ Status │ Slots │ tok/s │ Memory{/bold}\n';
195
+ content += divider + '\n';
196
+ // Server rows
197
+ servers.forEach((server, index) => {
198
+ const serverData = serverDataMap.get(server.id);
199
+ const num = index + 1;
200
+ // Server ID (truncate if needed)
201
+ const serverId = server.id.padEnd(16).substring(0, 16);
202
+ // Port
203
+ const port = server.port.toString().padStart(4);
204
+ // Status
205
+ let status = '';
206
+ if (serverData?.data) {
207
+ if (serverData.data.server.healthy) {
208
+ status = '{green-fg}● RUN{/green-fg} ';
209
+ }
210
+ else {
211
+ status = '{red-fg}● ERR{/red-fg} ';
212
+ }
213
+ }
214
+ else if (server.status === 'running') {
215
+ status = '{yellow-fg}● ...{/yellow-fg} ';
216
+ }
217
+ else {
218
+ status = '{gray-fg}○ STOP{/gray-fg}';
219
+ }
220
+ // Slots
221
+ let slots = '- ';
222
+ if (serverData?.data?.server) {
223
+ const active = serverData.data.server.activeSlots;
224
+ const total = serverData.data.server.totalSlots;
225
+ slots = `${active}/${total}`.padStart(5);
226
+ }
227
+ // tok/s
228
+ let tokensPerSec = '- ';
229
+ if (serverData?.data?.server.avgGenerateSpeed !== undefined &&
230
+ serverData.data.server.avgGenerateSpeed > 0) {
231
+ tokensPerSec = Math.round(serverData.data.server.avgGenerateSpeed).toString().padStart(6);
232
+ }
233
+ // Memory (actual process memory from top command)
234
+ let memory = '- ';
235
+ if (serverData?.data?.server.processMemory) {
236
+ const bytes = serverData.data.server.processMemory;
237
+ // Format as GB/MB depending on size
238
+ if (bytes >= 1024 * 1024 * 1024) {
239
+ const gb = (bytes / (1024 * 1024 * 1024)).toFixed(1);
240
+ memory = `${gb} GB`.padStart(7);
241
+ }
242
+ else {
243
+ const mb = Math.round(bytes / (1024 * 1024));
244
+ memory = `${mb} MB`.padStart(7);
245
+ }
246
+ }
247
+ content += `${num} │ ${serverId} │ ${port} │ ${status} │ ${slots} │ ${tokensPerSec} │ ${memory}\n`;
248
+ });
249
+ // Footer
250
+ content += '\n' + divider + '\n';
251
+ content += `{gray-fg}Updated: ${new Date().toLocaleTimeString()} | `;
252
+ content += `Interval: ${updateInterval}ms | [R]efresh [+/-]Speed{/gray-fg}`;
253
+ return content;
254
+ }
255
+ // Render detail view for selected server
256
+ function renderDetailView(systemMetrics) {
257
+ const server = servers[selectedServerIndex];
258
+ const serverData = serverDataMap.get(server.id);
259
+ const termWidth = screen.width || 80;
260
+ const divider = '─'.repeat(termWidth - 2);
261
+ let content = '';
262
+ // Header
263
+ content += `{bold}{blue-fg}═══ Server #${selectedServerIndex + 1}: ${server.id} (${server.port}) ═══{/blue-fg}{/bold}\n`;
264
+ // Status line with optional spinner
265
+ const statusPlainText = '[ESC] Back to list | [Q] Quit';
266
+ const spinnerChar = isLoading ? spinnerFrames[spinnerFrameIndex] : '';
267
+ const spinnerText = spinnerChar ? ` {cyan-fg}${spinnerChar}{/cyan-fg}` : '';
268
+ content += `{gray-fg}${statusPlainText}${spinnerText}{/gray-fg}\n\n`;
269
+ // System resources
270
+ content += renderSystemResources(systemMetrics);
271
+ content += '\n';
272
+ if (!serverData?.data) {
273
+ content += '{yellow-fg}Loading server data...{/yellow-fg}\n';
274
+ return content;
275
+ }
276
+ const data = serverData.data;
277
+ // Server Information
278
+ content += '{bold}Server Information{/bold}\n';
279
+ content += divider + '\n';
280
+ const statusIcon = data.server.healthy ? '{green-fg}●{/green-fg}' : '{red-fg}●{/red-fg}';
281
+ const statusText = data.server.healthy ? 'RUNNING' : 'UNHEALTHY';
282
+ content += `Status: ${statusIcon} ${statusText}`;
283
+ if (data.server.uptime) {
284
+ content += ` Uptime: ${data.server.uptime}`;
285
+ }
286
+ content += '\n';
287
+ content += `Model: ${server.modelName}`;
288
+ if (data.server.contextSize) {
289
+ content += ` Context: ${data.server.contextSize} tokens`;
290
+ }
291
+ content += '\n';
292
+ // Handle null host (legacy configs) by defaulting to 127.0.0.1
293
+ const displayHost = server.host || '127.0.0.1';
294
+ content += `Endpoint: http://${displayHost}:${server.port}`;
295
+ // Add actual process memory (if available)
296
+ if (data.server.processMemory) {
297
+ const bytes = data.server.processMemory;
298
+ let memStr;
299
+ if (bytes >= 1024 * 1024 * 1024) {
300
+ memStr = `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
301
+ }
302
+ else {
303
+ memStr = `${Math.round(bytes / (1024 * 1024))} MB`;
304
+ }
305
+ content += ` Memory: ${memStr}\n`;
306
+ }
307
+ else {
308
+ content += '\n';
309
+ }
310
+ content += `Slots: ${data.server.activeSlots} active / ${data.server.totalSlots} total\n`;
311
+ content += '\n';
312
+ // Request Metrics
313
+ if (data.server.totalSlots > 0) {
314
+ content += '{bold}Request Metrics{/bold}\n';
315
+ content += divider + '\n';
316
+ content += `Active: ${data.server.activeSlots} / ${data.server.totalSlots}\n`;
317
+ content += `Idle: ${data.server.idleSlots} / ${data.server.totalSlots}\n`;
318
+ if (data.server.avgPromptSpeed !== undefined && data.server.avgPromptSpeed > 0) {
319
+ content += `Prompt: ${Math.round(data.server.avgPromptSpeed)} tokens/sec\n`;
320
+ }
321
+ if (data.server.avgGenerateSpeed !== undefined && data.server.avgGenerateSpeed > 0) {
322
+ content += `Generate: ${Math.round(data.server.avgGenerateSpeed)} tokens/sec\n`;
323
+ }
324
+ content += '\n';
325
+ }
326
+ // Active Slots Detail
327
+ if (data.server.slots.length > 0) {
328
+ const activeSlots = data.server.slots.filter(s => s.state === 'processing');
329
+ if (activeSlots.length > 0) {
330
+ content += '{bold}Active Slots{/bold}\n';
331
+ content += divider + '\n';
332
+ activeSlots.forEach((slot) => {
333
+ content += `Slot #${slot.id}: {yellow-fg}PROCESSING{/yellow-fg}`;
334
+ if (slot.timings?.predicted_per_second) {
335
+ content += ` - ${Math.round(slot.timings.predicted_per_second)} tok/s`;
336
+ }
337
+ if (slot.n_decoded !== undefined) {
338
+ content += ` - ${slot.n_decoded}`;
339
+ if (slot.n_ctx) {
340
+ content += ` / ${slot.n_ctx}`;
341
+ }
342
+ content += ' tokens';
343
+ }
344
+ content += '\n';
345
+ });
346
+ content += '\n';
347
+ }
348
+ }
349
+ // Footer
350
+ content += divider + '\n';
351
+ content += `{gray-fg}Updated: ${data.lastUpdated.toLocaleTimeString()} | `;
352
+ content += `Interval: ${updateInterval}ms | [R]efresh [+/-]Speed{/gray-fg}`;
353
+ return content;
354
+ }
355
+ // Fetch and update display
356
+ async function fetchData() {
357
+ try {
358
+ // Collect system metrics ONCE for all servers (not per-server)
359
+ // This prevents spawning multiple macmon processes
360
+ const systemMetricsPromise = systemCollector.collectSystemMetrics();
361
+ // Batch collect process memory for ALL servers in one top call
362
+ // This prevents spawning multiple top processes (5x speedup)
363
+ const { getBatchProcessMemory } = await Promise.resolve().then(() => __importStar(require('../utils/process-utils.js')));
364
+ const pids = servers.filter(s => s.pid).map(s => s.pid);
365
+ const memoryMapPromise = pids.length > 0
366
+ ? getBatchProcessMemory(pids)
367
+ : Promise.resolve(new Map());
368
+ // Wait for memory batch to complete
369
+ const memoryMap = await memoryMapPromise;
370
+ // Collect server metrics only (NOT system metrics) for each server
371
+ const promises = servers.map(async (server) => {
372
+ const aggregator = aggregators.get(server.id);
373
+ try {
374
+ // Use collectServerMetrics instead of collectMonitorData
375
+ // to avoid spawning macmon per server
376
+ // Pass pre-fetched memory to avoid spawning top per server
377
+ const serverMetrics = await aggregator.collectServerMetrics(server, server.pid ? memoryMap.get(server.pid) ?? null : null);
378
+ // Build MonitorData manually with shared system metrics
379
+ const data = {
380
+ server: serverMetrics,
381
+ system: undefined, // Will be set after system metrics resolve
382
+ lastUpdated: new Date(),
383
+ updateInterval,
384
+ consecutiveFailures: 0,
385
+ };
386
+ serverDataMap.set(server.id, {
387
+ server,
388
+ data,
389
+ error: null,
390
+ });
391
+ }
392
+ catch (err) {
393
+ serverDataMap.set(server.id, {
394
+ server,
395
+ data: null,
396
+ error: err instanceof Error ? err.message : 'Unknown error',
397
+ });
398
+ }
399
+ });
400
+ // Wait for both system metrics and server metrics to complete
401
+ const systemMetrics = await systemMetricsPromise;
402
+ await Promise.all(promises);
403
+ // Store system metrics for loading state
404
+ lastSystemMetrics = systemMetrics;
405
+ // Update all server data with shared system metrics
406
+ for (const serverData of serverDataMap.values()) {
407
+ if (serverData.data) {
408
+ serverData.data.system = systemMetrics;
409
+ }
410
+ }
411
+ // Render once with complete data
412
+ let content = '';
413
+ if (viewMode === 'list') {
414
+ content = renderListView(systemMetrics);
415
+ }
416
+ else {
417
+ content = renderDetailView(systemMetrics);
418
+ }
419
+ contentBox.setContent(content);
420
+ screen.render();
421
+ // Clear loading state
422
+ hideLoading();
423
+ }
424
+ catch (err) {
425
+ const errorMsg = err instanceof Error ? err.message : 'Unknown error';
426
+ contentBox.setContent('{bold}{red-fg}Error{/red-fg}{/bold}\n\n' +
427
+ `{red-fg}${errorMsg}{/red-fg}\n\n` +
428
+ '{gray-fg}Press [R] to retry or [Q] to quit{/gray-fg}');
429
+ screen.render();
430
+ // Clear loading state on error too
431
+ isLoading = false;
432
+ }
433
+ }
434
+ // Polling
435
+ function startPolling() {
436
+ if (intervalId)
437
+ clearInterval(intervalId);
438
+ fetchData();
439
+ intervalId = setInterval(fetchData, updateInterval);
440
+ }
441
+ // Keyboard shortcuts - List view
442
+ screen.key(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (ch) => {
443
+ const index = parseInt(ch, 10) - 1;
444
+ if (index >= 0 && index < servers.length) {
445
+ showLoading();
446
+ selectedServerIndex = index;
447
+ viewMode = 'detail';
448
+ fetchData();
449
+ }
450
+ });
451
+ // Keyboard shortcuts - Detail view
452
+ screen.key(['escape'], () => {
453
+ if (viewMode === 'detail') {
454
+ showLoading();
455
+ viewMode = 'list';
456
+ fetchData();
457
+ }
458
+ });
459
+ // Keyboard shortcuts - Common
460
+ screen.key(['r', 'R'], () => {
461
+ showLoading();
462
+ fetchData();
463
+ });
464
+ screen.key(['+', '='], () => {
465
+ updateInterval = Math.max(500, updateInterval - 500);
466
+ startPolling();
467
+ });
468
+ screen.key(['-', '_'], () => {
469
+ updateInterval = Math.min(10000, updateInterval + 500);
470
+ startPolling();
471
+ });
472
+ screen.key(['q', 'Q', 'C-c'], () => {
473
+ showLoading();
474
+ if (intervalId)
475
+ clearInterval(intervalId);
476
+ if (spinnerIntervalId)
477
+ clearInterval(spinnerIntervalId);
478
+ // Small delay to show the loading state before exit
479
+ setTimeout(() => {
480
+ screen.destroy();
481
+ process.exit(0);
482
+ }, 100);
483
+ });
484
+ // Initial display
485
+ contentBox.setContent('{cyan-fg}⏳ Connecting to servers...{/cyan-fg}');
486
+ screen.render();
487
+ startPolling();
488
+ // Cleanup
489
+ screen.on('destroy', () => {
490
+ if (intervalId)
491
+ clearInterval(intervalId);
492
+ // Note: macmon child processes will automatically die when parent exits
493
+ // since they're spawned with detached: false
494
+ });
495
+ }
496
+ //# sourceMappingURL=MultiServerMonitorApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiServerMonitorApp.js","sourceRoot":"","sources":["../../src/tui/MultiServerMonitorApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface ErrorStateProps {
3
+ error: string;
4
+ onRetry: () => void;
5
+ }
6
+ export declare function ErrorState({ error, onRetry }: ErrorStateProps): React.JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=ErrorState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorState.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ErrorState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,eAAe,qBAsB7D"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ErrorState = ErrorState;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ink_1 = require("ink");
9
+ function ErrorState({ error, onRetry }) {
10
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", padding: 2, borderStyle: "round", borderColor: "red" },
11
+ react_1.default.createElement(ink_1.Box, null,
12
+ react_1.default.createElement(ink_1.Text, { bold: true, color: "red" }, "\u26A0\uFE0F Connection Error")),
13
+ react_1.default.createElement(ink_1.Box, { marginTop: 1 },
14
+ react_1.default.createElement(ink_1.Text, null, error)),
15
+ react_1.default.createElement(ink_1.Box, { marginTop: 2 },
16
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, "Press "),
17
+ react_1.default.createElement(ink_1.Text, { bold: true }, "[R]"),
18
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, " to retry or "),
19
+ react_1.default.createElement(ink_1.Text, { bold: true }, "[Q]"),
20
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, " to quit"))));
21
+ }
22
+ //# sourceMappingURL=ErrorState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorState.js","sourceRoot":"","sources":["../../../src/tui/components/ErrorState.tsx"],"names":[],"mappings":";;;;;AAQA,gCAsBC;AA9BD,kDAA0B;AAC1B,6BAAgC;AAOhC,SAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAmB;IAC5D,OAAO,CACL,8BAAC,SAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,KAAK;QAC3E,8BAAC,SAAG;YACF,8BAAC,UAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,qCAEf,CACH;QAEN,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;YACf,8BAAC,UAAI,QAAE,KAAK,CAAQ,CAChB;QAEN,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;YACf,8BAAC,UAAI,IAAC,QAAQ,mBAAc;YAC5B,8BAAC,UAAI,IAAC,IAAI,gBAAW;YACrB,8BAAC,UAAI,IAAC,QAAQ,0BAAqB;YACnC,8BAAC,UAAI,IAAC,IAAI,gBAAW;YACrB,8BAAC,UAAI,IAAC,QAAQ,qBAAgB,CAC1B,CACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ interface LoadingStateProps {
3
+ message?: string;
4
+ progress?: number;
5
+ }
6
+ export declare function LoadingState({ message, progress }: LoadingStateProps): React.JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=LoadingState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingState.d.ts","sourceRoot":"","sources":["../../../src/tui/components/LoadingState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAsB,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAanF"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LoadingState = LoadingState;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ink_1 = require("ink");
9
+ function LoadingState({ message = 'Loading...', progress }) {
10
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", padding: 2 },
11
+ react_1.default.createElement(ink_1.Box, null,
12
+ react_1.default.createElement(ink_1.Text, { color: "cyan" },
13
+ "\u23F3 ",
14
+ message)),
15
+ progress !== undefined && (react_1.default.createElement(ink_1.Box, { marginTop: 1 },
16
+ react_1.default.createElement(ink_1.Text, { dimColor: true },
17
+ "Progress: ",
18
+ Math.round(progress),
19
+ "%")))));
20
+ }
21
+ //# sourceMappingURL=LoadingState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingState.js","sourceRoot":"","sources":["../../../src/tui/components/LoadingState.tsx"],"names":[],"mappings":";;;;;AAQA,oCAaC;AArBD,kDAA0B;AAC1B,6BAAgC;AAOhC,SAAgB,YAAY,CAAC,EAAE,OAAO,GAAG,YAAY,EAAE,QAAQ,EAAqB;IAClF,OAAO,CACL,8BAAC,SAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC;QACpC,8BAAC,SAAG;YACF,8BAAC,UAAI,IAAC,KAAK,EAAC,MAAM;;gBAAI,OAAO,CAAQ,CACjC;QACL,QAAQ,KAAK,SAAS,IAAI,CACzB,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;YACf,8BAAC,UAAI,IAAC,QAAQ;;gBAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAAS,CACnD,CACP,CACG,CACP,CAAC;AACJ,CAAC"}