@appkit/llamacpp-cli 1.4.1 → 1.6.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 (91) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/MONITORING-ACCURACY-FIX.md +199 -0
  3. package/PER-PROCESS-METRICS.md +190 -0
  4. package/README.md +136 -1
  5. package/dist/cli.js +21 -4
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/create.d.ts.map +1 -1
  8. package/dist/commands/create.js +12 -3
  9. package/dist/commands/create.js.map +1 -1
  10. package/dist/commands/monitor.d.ts +2 -0
  11. package/dist/commands/monitor.d.ts.map +1 -0
  12. package/dist/commands/monitor.js +126 -0
  13. package/dist/commands/monitor.js.map +1 -0
  14. package/dist/commands/ps.d.ts +3 -1
  15. package/dist/commands/ps.d.ts.map +1 -1
  16. package/dist/commands/ps.js +75 -5
  17. package/dist/commands/ps.js.map +1 -1
  18. package/dist/commands/server-show.d.ts.map +1 -1
  19. package/dist/commands/server-show.js +10 -3
  20. package/dist/commands/server-show.js.map +1 -1
  21. package/dist/commands/start.d.ts.map +1 -1
  22. package/dist/commands/start.js +14 -2
  23. package/dist/commands/start.js.map +1 -1
  24. package/dist/lib/history-manager.d.ts +46 -0
  25. package/dist/lib/history-manager.d.ts.map +1 -0
  26. package/dist/lib/history-manager.js +157 -0
  27. package/dist/lib/history-manager.js.map +1 -0
  28. package/dist/lib/metrics-aggregator.d.ts +40 -0
  29. package/dist/lib/metrics-aggregator.d.ts.map +1 -0
  30. package/dist/lib/metrics-aggregator.js +211 -0
  31. package/dist/lib/metrics-aggregator.js.map +1 -0
  32. package/dist/lib/system-collector.d.ts +80 -0
  33. package/dist/lib/system-collector.d.ts.map +1 -0
  34. package/dist/lib/system-collector.js +311 -0
  35. package/dist/lib/system-collector.js.map +1 -0
  36. package/dist/tui/HistoricalMonitorApp.d.ts +5 -0
  37. package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -0
  38. package/dist/tui/HistoricalMonitorApp.js +490 -0
  39. package/dist/tui/HistoricalMonitorApp.js.map +1 -0
  40. package/dist/tui/MonitorApp.d.ts +4 -0
  41. package/dist/tui/MonitorApp.d.ts.map +1 -0
  42. package/dist/tui/MonitorApp.js +315 -0
  43. package/dist/tui/MonitorApp.js.map +1 -0
  44. package/dist/tui/MultiServerMonitorApp.d.ts +4 -0
  45. package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -0
  46. package/dist/tui/MultiServerMonitorApp.js +712 -0
  47. package/dist/tui/MultiServerMonitorApp.js.map +1 -0
  48. package/dist/types/history-types.d.ts +30 -0
  49. package/dist/types/history-types.d.ts.map +1 -0
  50. package/dist/types/history-types.js +11 -0
  51. package/dist/types/history-types.js.map +1 -0
  52. package/dist/types/monitor-types.d.ts +123 -0
  53. package/dist/types/monitor-types.d.ts.map +1 -0
  54. package/dist/types/monitor-types.js +3 -0
  55. package/dist/types/monitor-types.js.map +1 -0
  56. package/dist/types/server-config.d.ts +1 -0
  57. package/dist/types/server-config.d.ts.map +1 -1
  58. package/dist/types/server-config.js.map +1 -1
  59. package/dist/utils/downsample-utils.d.ts +35 -0
  60. package/dist/utils/downsample-utils.d.ts.map +1 -0
  61. package/dist/utils/downsample-utils.js +107 -0
  62. package/dist/utils/downsample-utils.js.map +1 -0
  63. package/dist/utils/file-utils.d.ts +6 -0
  64. package/dist/utils/file-utils.d.ts.map +1 -1
  65. package/dist/utils/file-utils.js +38 -0
  66. package/dist/utils/file-utils.js.map +1 -1
  67. package/dist/utils/process-utils.d.ts +35 -2
  68. package/dist/utils/process-utils.d.ts.map +1 -1
  69. package/dist/utils/process-utils.js +220 -25
  70. package/dist/utils/process-utils.js.map +1 -1
  71. package/docs/images/.gitkeep +1 -0
  72. package/package.json +5 -1
  73. package/src/cli.ts +21 -4
  74. package/src/commands/create.ts +14 -4
  75. package/src/commands/monitor.ts +110 -0
  76. package/src/commands/ps.ts +88 -5
  77. package/src/commands/server-show.ts +10 -3
  78. package/src/commands/start.ts +15 -2
  79. package/src/lib/history-manager.ts +172 -0
  80. package/src/lib/metrics-aggregator.ts +257 -0
  81. package/src/lib/system-collector.ts +315 -0
  82. package/src/tui/HistoricalMonitorApp.ts +548 -0
  83. package/src/tui/MonitorApp.ts +386 -0
  84. package/src/tui/MultiServerMonitorApp.ts +792 -0
  85. package/src/types/history-types.ts +39 -0
  86. package/src/types/monitor-types.ts +162 -0
  87. package/src/types/server-config.ts +1 -0
  88. package/src/utils/downsample-utils.ts +128 -0
  89. package/src/utils/file-utils.ts +40 -0
  90. package/src/utils/process-utils.ts +243 -25
  91. package/test-load.sh +100 -0
@@ -0,0 +1,315 @@
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.createMonitorUI = createMonitorUI;
7
+ const blessed_1 = __importDefault(require("blessed"));
8
+ const metrics_aggregator_js_1 = require("../lib/metrics-aggregator.js");
9
+ const history_manager_js_1 = require("../lib/history-manager.js");
10
+ const HistoricalMonitorApp_js_1 = require("./HistoricalMonitorApp.js");
11
+ async function createMonitorUI(screen, server) {
12
+ let updateInterval = 2000;
13
+ let intervalId = null;
14
+ let consecutiveFailures = 0;
15
+ let lastGoodData = null;
16
+ const STALE_THRESHOLD = 5;
17
+ const metricsAggregator = new metrics_aggregator_js_1.MetricsAggregator(server);
18
+ const historyManager = new history_manager_js_1.HistoryManager(server.id);
19
+ // Single scrollable content box
20
+ const contentBox = blessed_1.default.box({
21
+ top: 0,
22
+ left: 0,
23
+ width: '100%',
24
+ height: '100%',
25
+ tags: true,
26
+ scrollable: true,
27
+ alwaysScroll: true,
28
+ keys: true,
29
+ vi: true,
30
+ mouse: true,
31
+ scrollbar: {
32
+ ch: '█',
33
+ style: {
34
+ fg: 'blue',
35
+ },
36
+ },
37
+ });
38
+ screen.append(contentBox);
39
+ // Helper to create progress bar
40
+ function createProgressBar(percentage, width = 30) {
41
+ const filled = Math.round((percentage / 100) * width);
42
+ const empty = width - filled;
43
+ return '[' + '█'.repeat(Math.max(0, filled)) + '░'.repeat(Math.max(0, empty)) + ']';
44
+ }
45
+ // Fetch and update display
46
+ async function fetchData() {
47
+ try {
48
+ const data = await metricsAggregator.collectMonitorData(server, updateInterval);
49
+ // Reset failure count on success
50
+ consecutiveFailures = 0;
51
+ lastGoodData = data;
52
+ // Append to history (silent failure)
53
+ // Only save history for servers that are healthy and not stale
54
+ if (!data.server.stale && data.server.healthy) {
55
+ historyManager.appendSnapshot(data.server, data.system).catch(() => {
56
+ // Don't interrupt monitoring on history write failure
57
+ });
58
+ }
59
+ const termWidth = screen.width || 80;
60
+ const divider = '─'.repeat(termWidth - 2); // Account for padding
61
+ let content = '';
62
+ // Header
63
+ content += `{bold}{blue-fg}═══ ${server.modelName} (${server.port}){/blue-fg}{/bold}\n\n`;
64
+ // Server Info
65
+ content += '{bold}Server Information{/bold}\n';
66
+ content += divider + '\n';
67
+ const statusIcon = data.server.healthy ? '{green-fg}●{/green-fg}' : '{red-fg}●{/red-fg}';
68
+ const statusText = data.server.healthy ? 'RUNNING' : 'UNHEALTHY';
69
+ content += `Status: ${statusIcon} ${statusText}\n`;
70
+ if (data.server.uptime) {
71
+ content += `Uptime: ${data.server.uptime}\n`;
72
+ }
73
+ content += `Model: ${server.modelName}\n`;
74
+ // Handle null host (legacy configs) by defaulting to 127.0.0.1
75
+ const displayHost = server.host || '127.0.0.1';
76
+ content += `Endpoint: http://${displayHost}:${server.port}\n`;
77
+ content += `Slots: ${data.server.activeSlots} active / ${data.server.totalSlots} total\n`;
78
+ content += '\n';
79
+ // Request Metrics
80
+ if (data.server.totalSlots > 0) {
81
+ content += '{bold}Request Metrics{/bold}\n';
82
+ content += divider + '\n';
83
+ content += `Active: ${data.server.activeSlots} / ${data.server.totalSlots}\n`;
84
+ content += `Idle: ${data.server.idleSlots} / ${data.server.totalSlots}\n`;
85
+ if (data.server.avgPromptSpeed !== undefined && data.server.avgPromptSpeed > 0) {
86
+ content += `Prompt: ${Math.round(data.server.avgPromptSpeed)} tokens/sec\n`;
87
+ }
88
+ if (data.server.avgGenerateSpeed !== undefined && data.server.avgGenerateSpeed > 0) {
89
+ content += `Generate: ${Math.round(data.server.avgGenerateSpeed)} tokens/sec\n`;
90
+ }
91
+ content += '\n';
92
+ }
93
+ // Active Slots Detail
94
+ if (data.server.slots.length > 0) {
95
+ const activeSlots = data.server.slots.filter(s => s.state === 'processing');
96
+ if (activeSlots.length > 0) {
97
+ content += '{bold}Active Slots{/bold}\n';
98
+ content += divider + '\n';
99
+ activeSlots.forEach((slot) => {
100
+ content += `Slot #${slot.id}: {yellow-fg}PROCESSING{/yellow-fg}`;
101
+ if (slot.timings?.predicted_per_second) {
102
+ content += ` - ${Math.round(slot.timings.predicted_per_second)} tok/s`;
103
+ }
104
+ if (slot.n_decoded !== undefined) {
105
+ content += ` - ${slot.n_decoded} tokens`;
106
+ }
107
+ content += '\n';
108
+ });
109
+ content += '\n';
110
+ }
111
+ }
112
+ // Model Resources (per-process metrics)
113
+ content += '{bold}Model Resources{/bold}\n';
114
+ content += divider + '\n';
115
+ // GPU: System-wide (can't get per-process on macOS)
116
+ if (data.system && data.system.gpuUsage !== undefined) {
117
+ const bar = createProgressBar(data.system.gpuUsage);
118
+ content += `GPU: {cyan-fg}${bar}{/cyan-fg} ${Math.round(data.system.gpuUsage)}% {gray-fg}(system){/gray-fg}`;
119
+ if (data.system.temperature !== undefined) {
120
+ content += ` - ${Math.round(data.system.temperature)}°C`;
121
+ }
122
+ content += '\n';
123
+ }
124
+ // CPU: Per-process
125
+ if (data.server.processCpuUsage !== undefined) {
126
+ const bar = createProgressBar(data.server.processCpuUsage);
127
+ content += `CPU: {cyan-fg}${bar}{/cyan-fg} ${Math.round(data.server.processCpuUsage)}%\n`;
128
+ }
129
+ // Memory: Per-process
130
+ if (data.server.processMemory !== undefined) {
131
+ const memoryGB = data.server.processMemory / (1024 ** 3);
132
+ // For progress bar, estimate against typical model sizes (e.g., 8GB max)
133
+ const estimatedMax = 8;
134
+ const memoryPercentage = Math.min((memoryGB / estimatedMax) * 100, 100);
135
+ const bar = createProgressBar(memoryPercentage);
136
+ content += `Memory: {cyan-fg}${bar}{/cyan-fg} ${memoryGB.toFixed(2)} GB\n`;
137
+ }
138
+ if (data.system && data.system.warnings && data.system.warnings.length > 0) {
139
+ content += `\n{yellow-fg}⚠ ${data.system.warnings.join(', ')}{/yellow-fg}\n`;
140
+ }
141
+ content += '\n';
142
+ // Footer
143
+ content += divider + '\n';
144
+ content += `{gray-fg}Updated: ${data.lastUpdated.toLocaleTimeString()} | `;
145
+ content += `Interval: ${updateInterval}ms | `;
146
+ content += `[H]istory [R]efresh [+/-]Speed [Q]uit{/gray-fg}`;
147
+ contentBox.setContent(content);
148
+ screen.render();
149
+ }
150
+ catch (err) {
151
+ consecutiveFailures++;
152
+ const isStale = consecutiveFailures >= STALE_THRESHOLD;
153
+ // If we have last good data and we're stale, show it with indicator
154
+ if (lastGoodData && isStale) {
155
+ const termWidth = screen.width || 80;
156
+ const divider = '─'.repeat(termWidth - 2);
157
+ let content = '';
158
+ // Header with stale warning
159
+ content += `{bold}{blue-fg}═══ ${server.modelName} (${server.port}){/blue-fg}{/bold}\n`;
160
+ content += '{bold}{yellow-fg}⚠ CONNECTION LOST - SHOWING STALE DATA{/yellow-fg}{/bold}\n\n';
161
+ // Server Info
162
+ content += '{bold}Server Information{/bold}\n';
163
+ content += divider + '\n';
164
+ const statusIcon = '{yellow-fg}●{/yellow-fg}';
165
+ const statusText = 'STALE';
166
+ content += `Status: ${statusIcon} ${statusText}\n`;
167
+ if (lastGoodData.server.uptime) {
168
+ content += `Uptime: ${lastGoodData.server.uptime}\n`;
169
+ }
170
+ content += `Model: ${server.modelName}\n`;
171
+ // Handle null host (legacy configs) by defaulting to 127.0.0.1
172
+ const displayHost = server.host || '127.0.0.1';
173
+ content += `Endpoint: http://${displayHost}:${server.port}\n`;
174
+ content += `Slots: ${lastGoodData.server.activeSlots} active / ${lastGoodData.server.totalSlots} total\n\n`;
175
+ // Request Metrics
176
+ if (lastGoodData.server.totalSlots > 0) {
177
+ content += '{bold}Request Metrics{/bold} {yellow-fg}(stale){/yellow-fg}\n';
178
+ content += divider + '\n';
179
+ content += `Active: ${lastGoodData.server.activeSlots} / ${lastGoodData.server.totalSlots}\n`;
180
+ content += `Idle: ${lastGoodData.server.idleSlots} / ${lastGoodData.server.totalSlots}\n`;
181
+ if (lastGoodData.server.avgPromptSpeed !== undefined && lastGoodData.server.avgPromptSpeed > 0) {
182
+ content += `Prompt: ${Math.round(lastGoodData.server.avgPromptSpeed)} tokens/sec\n`;
183
+ }
184
+ if (lastGoodData.server.avgGenerateSpeed !== undefined && lastGoodData.server.avgGenerateSpeed > 0) {
185
+ content += `Generate: ${Math.round(lastGoodData.server.avgGenerateSpeed)} tokens/sec\n`;
186
+ }
187
+ content += '\n';
188
+ }
189
+ // Active Slots Detail
190
+ if (lastGoodData.server.slots.length > 0) {
191
+ const activeSlots = lastGoodData.server.slots.filter(s => s.state === 'processing');
192
+ if (activeSlots.length > 0) {
193
+ content += '{bold}Active Slots{/bold} {yellow-fg}(stale){/yellow-fg}\n';
194
+ content += divider + '\n';
195
+ activeSlots.forEach((slot) => {
196
+ content += `Slot #${slot.id}: {yellow-fg}PROCESSING{/yellow-fg}`;
197
+ if (slot.timings?.predicted_per_second) {
198
+ content += ` - ${Math.round(slot.timings.predicted_per_second)} tok/s`;
199
+ }
200
+ if (slot.n_decoded !== undefined) {
201
+ content += ` - ${slot.n_decoded} tokens`;
202
+ }
203
+ content += '\n';
204
+ });
205
+ content += '\n';
206
+ }
207
+ }
208
+ // Model Resources (per-process metrics)
209
+ content += '{bold}Model Resources{/bold} {yellow-fg}(stale){/yellow-fg}\n';
210
+ content += divider + '\n';
211
+ // GPU: System-wide (can't get per-process on macOS)
212
+ if (lastGoodData.system && lastGoodData.system.gpuUsage !== undefined) {
213
+ const bar = createProgressBar(lastGoodData.system.gpuUsage);
214
+ content += `GPU: {cyan-fg}${bar}{/cyan-fg} ${Math.round(lastGoodData.system.gpuUsage)}% {gray-fg}(system){/gray-fg}`;
215
+ if (lastGoodData.system.temperature !== undefined) {
216
+ content += ` - ${Math.round(lastGoodData.system.temperature)}°C`;
217
+ }
218
+ content += '\n';
219
+ }
220
+ // CPU: Per-process
221
+ if (lastGoodData.server.processCpuUsage !== undefined) {
222
+ const bar = createProgressBar(lastGoodData.server.processCpuUsage);
223
+ content += `CPU: {cyan-fg}${bar}{/cyan-fg} ${Math.round(lastGoodData.server.processCpuUsage)}%\n`;
224
+ }
225
+ // Memory: Per-process
226
+ if (lastGoodData.server.processMemory !== undefined) {
227
+ const memoryGB = lastGoodData.server.processMemory / (1024 ** 3);
228
+ const estimatedMax = 8;
229
+ const memoryPercentage = Math.min((memoryGB / estimatedMax) * 100, 100);
230
+ const bar = createProgressBar(memoryPercentage);
231
+ content += `Memory: {cyan-fg}${bar}{/cyan-fg} ${memoryGB.toFixed(2)} GB\n`;
232
+ }
233
+ if (lastGoodData.system && lastGoodData.system.warnings && lastGoodData.system.warnings.length > 0) {
234
+ content += `\n{yellow-fg}⚠ ${lastGoodData.system.warnings.join(', ')}{/yellow-fg}\n`;
235
+ }
236
+ content += '\n';
237
+ // Footer
238
+ content += divider + '\n';
239
+ content += `{yellow-fg}Last good data: ${lastGoodData.lastUpdated.toLocaleTimeString()}{/yellow-fg}\n`;
240
+ content += `{yellow-fg}Connection failures: ${consecutiveFailures}{/yellow-fg}\n`;
241
+ content += `{gray-fg}Interval: ${updateInterval}ms | [H]istory [R]efresh [+/-]Speed [Q]uit{/gray-fg}`;
242
+ contentBox.setContent(content);
243
+ screen.render();
244
+ }
245
+ else if (!lastGoodData || consecutiveFailures < STALE_THRESHOLD) {
246
+ // Show connection error (either no last data or not stale yet)
247
+ const errorMsg = err instanceof Error ? err.message : 'Unknown error';
248
+ const retryMsg = consecutiveFailures < STALE_THRESHOLD
249
+ ? `Retrying... (${consecutiveFailures}/${STALE_THRESHOLD})`
250
+ : 'Connection lost';
251
+ contentBox.setContent('{bold}{red-fg}Connection Error{/red-fg}{/bold}\n\n' +
252
+ `{red-fg}${errorMsg}{/red-fg}\n\n` +
253
+ `{yellow-fg}${retryMsg}{/yellow-fg}\n\n` +
254
+ '{gray-fg}Press [R] to retry or [Q] to quit{/gray-fg}');
255
+ screen.render();
256
+ }
257
+ }
258
+ }
259
+ // Polling
260
+ function startPolling() {
261
+ if (intervalId)
262
+ clearInterval(intervalId);
263
+ fetchData();
264
+ intervalId = setInterval(fetchData, updateInterval);
265
+ }
266
+ // Keyboard shortcuts
267
+ screen.key(['r', 'R'], () => {
268
+ fetchData();
269
+ });
270
+ screen.key(['+', '='], () => {
271
+ updateInterval = Math.max(500, updateInterval - 500);
272
+ startPolling();
273
+ });
274
+ screen.key(['-', '_'], () => {
275
+ updateInterval = Math.min(10000, updateInterval + 500);
276
+ startPolling();
277
+ });
278
+ // Track whether we're in historical view to prevent H key conflicts
279
+ let inHistoricalView = false;
280
+ screen.key(['h', 'H'], async () => {
281
+ // Prevent entering historical view if already there
282
+ if (inHistoricalView)
283
+ return;
284
+ // Keep polling in background for live historical updates
285
+ // Remove current content box
286
+ screen.remove(contentBox);
287
+ // Mark that we're in historical view
288
+ inHistoricalView = true;
289
+ // Show historical view (polling continues in background)
290
+ await (0, HistoricalMonitorApp_js_1.createHistoricalUI)(screen, server, () => {
291
+ // Mark that we've left historical view
292
+ inHistoricalView = false;
293
+ // Re-attach content box when returning from history
294
+ screen.append(contentBox);
295
+ });
296
+ });
297
+ screen.key(['q', 'Q', 'C-c'], () => {
298
+ if (intervalId)
299
+ clearInterval(intervalId);
300
+ screen.destroy();
301
+ process.exit(0);
302
+ });
303
+ // Initial display
304
+ contentBox.setContent('{cyan-fg}⏳ Connecting to server...{/cyan-fg}');
305
+ screen.render();
306
+ startPolling();
307
+ // Cleanup
308
+ screen.on('destroy', () => {
309
+ if (intervalId)
310
+ clearInterval(intervalId);
311
+ // Note: macmon child processes will automatically die when parent exits
312
+ // since they're spawned with detached: false
313
+ });
314
+ }
315
+ //# sourceMappingURL=MonitorApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MonitorApp.js","sourceRoot":"","sources":["../../src/tui/MonitorApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import blessed from 'blessed';
2
+ import { ServerConfig } from '../types/server-config.js';
3
+ export declare function createMultiServerMonitorUI(screen: blessed.Widgets.Screen, servers: ServerConfig[], _fromPs?: boolean, directJumpIndex?: number): Promise<void>;
4
+ //# sourceMappingURL=MultiServerMonitorApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiServerMonitorApp.d.ts","sourceRoot":"","sources":["../../src/tui/MultiServerMonitorApp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAezD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAC9B,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,GAAE,OAAe,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAkwBf"}