@appkit/llamacpp-cli 1.5.0 → 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.
- package/CHANGELOG.md +13 -0
- package/MONITORING-ACCURACY-FIX.md +199 -0
- package/PER-PROCESS-METRICS.md +190 -0
- package/README.md +57 -8
- package/dist/cli.js +9 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +12 -3
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +51 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/ps.d.ts +3 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +75 -5
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/server-show.d.ts.map +1 -1
- package/dist/commands/server-show.js +10 -3
- package/dist/commands/server-show.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +14 -2
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/history-manager.d.ts +46 -0
- package/dist/lib/history-manager.d.ts.map +1 -0
- package/dist/lib/history-manager.js +157 -0
- package/dist/lib/history-manager.js.map +1 -0
- package/dist/lib/metrics-aggregator.d.ts +2 -1
- package/dist/lib/metrics-aggregator.d.ts.map +1 -1
- package/dist/lib/metrics-aggregator.js +15 -4
- package/dist/lib/metrics-aggregator.js.map +1 -1
- package/dist/lib/system-collector.d.ts +9 -4
- package/dist/lib/system-collector.d.ts.map +1 -1
- package/dist/lib/system-collector.js +29 -28
- package/dist/lib/system-collector.js.map +1 -1
- package/dist/tui/HistoricalMonitorApp.d.ts +5 -0
- package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -0
- package/dist/tui/HistoricalMonitorApp.js +490 -0
- package/dist/tui/HistoricalMonitorApp.js.map +1 -0
- package/dist/tui/MonitorApp.d.ts.map +1 -1
- package/dist/tui/MonitorApp.js +84 -62
- package/dist/tui/MonitorApp.js.map +1 -1
- package/dist/tui/MultiServerMonitorApp.d.ts +1 -1
- package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
- package/dist/tui/MultiServerMonitorApp.js +293 -77
- package/dist/tui/MultiServerMonitorApp.js.map +1 -1
- package/dist/types/history-types.d.ts +30 -0
- package/dist/types/history-types.d.ts.map +1 -0
- package/dist/types/history-types.js +11 -0
- package/dist/types/history-types.js.map +1 -0
- package/dist/types/monitor-types.d.ts +1 -0
- package/dist/types/monitor-types.d.ts.map +1 -1
- package/dist/types/server-config.d.ts +1 -0
- package/dist/types/server-config.d.ts.map +1 -1
- package/dist/types/server-config.js.map +1 -1
- package/dist/utils/downsample-utils.d.ts +35 -0
- package/dist/utils/downsample-utils.d.ts.map +1 -0
- package/dist/utils/downsample-utils.js +107 -0
- package/dist/utils/downsample-utils.js.map +1 -0
- package/dist/utils/file-utils.d.ts +6 -0
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +38 -0
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/process-utils.d.ts +19 -1
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +79 -1
- package/dist/utils/process-utils.js.map +1 -1
- package/docs/images/.gitkeep +1 -0
- package/package.json +3 -1
- package/src/cli.ts +9 -6
- package/src/commands/create.ts +14 -4
- package/src/commands/monitor.ts +21 -1
- package/src/commands/ps.ts +88 -5
- package/src/commands/server-show.ts +10 -3
- package/src/commands/start.ts +15 -2
- package/src/lib/history-manager.ts +172 -0
- package/src/lib/metrics-aggregator.ts +18 -5
- package/src/lib/system-collector.ts +31 -28
- package/src/tui/HistoricalMonitorApp.ts +548 -0
- package/src/tui/MonitorApp.ts +89 -64
- package/src/tui/MultiServerMonitorApp.ts +348 -103
- package/src/types/history-types.ts +39 -0
- package/src/types/monitor-types.ts +1 -0
- package/src/types/server-config.ts +1 -0
- package/src/utils/downsample-utils.ts +128 -0
- package/src/utils/file-utils.ts +40 -0
- package/src/utils/process-utils.ts +85 -1
- package/test-load.sh +100 -0
- package/dist/tui/components/ErrorState.d.ts +0 -8
- package/dist/tui/components/ErrorState.d.ts.map +0 -1
- package/dist/tui/components/ErrorState.js +0 -22
- package/dist/tui/components/ErrorState.js.map +0 -1
- package/dist/tui/components/LoadingState.d.ts +0 -8
- package/dist/tui/components/LoadingState.d.ts.map +0 -1
- package/dist/tui/components/LoadingState.js +0 -21
- package/dist/tui/components/LoadingState.js.map +0 -1
package/dist/commands/monitor.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -32,6 +65,11 @@ async function monitorCommand(identifier) {
|
|
|
32
65
|
`Use: llamacpp ps\n` +
|
|
33
66
|
`Or create a new server: llamacpp server create <model>`);
|
|
34
67
|
}
|
|
68
|
+
// Update server status to reflect actual launchctl state
|
|
69
|
+
const { statusChecker } = await Promise.resolve().then(() => __importStar(require('../lib/status-checker.js')));
|
|
70
|
+
const status = await statusChecker.checkServer(server);
|
|
71
|
+
server.status = status.isRunning ? 'running' : 'stopped';
|
|
72
|
+
server.pid = status.pid || undefined;
|
|
35
73
|
// Check if server is running
|
|
36
74
|
if (server.status !== 'running') {
|
|
37
75
|
screen.destroy();
|
|
@@ -44,6 +82,11 @@ async function monitorCommand(identifier) {
|
|
|
44
82
|
else if (allServers.length === 1) {
|
|
45
83
|
// Only one server - single server mode
|
|
46
84
|
const server = allServers[0];
|
|
85
|
+
// Update server status to reflect actual launchctl state
|
|
86
|
+
const { statusChecker } = await Promise.resolve().then(() => __importStar(require('../lib/status-checker.js')));
|
|
87
|
+
const status = await statusChecker.checkServer(server);
|
|
88
|
+
server.status = status.isRunning ? 'running' : 'stopped';
|
|
89
|
+
server.pid = status.pid || undefined;
|
|
47
90
|
// Check if server is running
|
|
48
91
|
if (server.status !== 'running') {
|
|
49
92
|
screen.destroy();
|
|
@@ -55,6 +98,13 @@ async function monitorCommand(identifier) {
|
|
|
55
98
|
}
|
|
56
99
|
else {
|
|
57
100
|
// Multiple servers - multi-server mode
|
|
101
|
+
// Update all server statuses to reflect actual launchctl state
|
|
102
|
+
const { statusChecker } = await Promise.resolve().then(() => __importStar(require('../lib/status-checker.js')));
|
|
103
|
+
for (const server of allServers) {
|
|
104
|
+
const status = await statusChecker.checkServer(server);
|
|
105
|
+
server.status = status.isRunning ? 'running' : 'stopped';
|
|
106
|
+
server.pid = status.pid || undefined;
|
|
107
|
+
}
|
|
58
108
|
// Filter to only running servers for monitoring
|
|
59
109
|
const runningServers = allServers.filter(s => s.status === 'running');
|
|
60
110
|
if (runningServers.length === 0) {
|
|
@@ -65,7 +115,7 @@ async function monitorCommand(identifier) {
|
|
|
65
115
|
.map((s) => ` llamacpp server start ${s.id} # ${s.modelName}`)
|
|
66
116
|
.join('\n'));
|
|
67
117
|
}
|
|
68
|
-
// Launch multi-server TUI
|
|
118
|
+
// Launch multi-server TUI (pass all servers so we can see stopped ones too)
|
|
69
119
|
await (0, MultiServerMonitorApp_js_1.createMultiServerMonitorUI)(screen, allServers);
|
|
70
120
|
}
|
|
71
121
|
// Render the screen
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/ps.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"AAgGA,wBAAsB,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjG"}
|
package/dist/commands/ps.js
CHANGED
|
@@ -6,11 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.psCommand = psCommand;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
9
|
+
const blessed_1 = __importDefault(require("blessed"));
|
|
9
10
|
const state_manager_1 = require("../lib/state-manager");
|
|
10
11
|
const status_checker_1 = require("../lib/status-checker");
|
|
11
12
|
const format_utils_1 = require("../utils/format-utils");
|
|
12
13
|
const process_utils_1 = require("../utils/process-utils");
|
|
13
|
-
|
|
14
|
+
const MultiServerMonitorApp_js_1 = require("../tui/MultiServerMonitorApp.js");
|
|
15
|
+
async function showStaticTable() {
|
|
14
16
|
const servers = await state_manager_1.stateManager.getAllServers();
|
|
15
17
|
if (servers.length === 0) {
|
|
16
18
|
console.log(chalk_1.default.yellow('No servers configured.'));
|
|
@@ -48,12 +50,14 @@ async function psCommand() {
|
|
|
48
50
|
const uptime = server.status === 'running' && server.lastStarted
|
|
49
51
|
? (0, format_utils_1.formatUptime)(server.lastStarted)
|
|
50
52
|
: '-';
|
|
51
|
-
// Get memory usage for running servers
|
|
53
|
+
// Get memory usage for running servers (CPU + Metal GPU memory)
|
|
52
54
|
let memoryText = '-';
|
|
53
55
|
if (server.status === 'running' && server.pid) {
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
56
|
-
|
|
56
|
+
const cpuMemoryBytes = await (0, process_utils_1.getProcessMemory)(server.pid);
|
|
57
|
+
if (cpuMemoryBytes !== null) {
|
|
58
|
+
const metalMemoryBytes = server.metalMemoryMB ? server.metalMemoryMB * 1024 * 1024 : 0;
|
|
59
|
+
const totalMemoryBytes = cpuMemoryBytes + metalMemoryBytes;
|
|
60
|
+
memoryText = (0, format_utils_1.formatBytes)(totalMemoryBytes);
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
63
|
table.push([
|
|
@@ -79,4 +83,70 @@ async function psCommand() {
|
|
|
79
83
|
console.log(chalk_1.default.red('\n⚠️ Some servers have crashed. Check logs with: llamacpp server logs <id> --errors'));
|
|
80
84
|
}
|
|
81
85
|
}
|
|
86
|
+
async function psCommand(identifier, options) {
|
|
87
|
+
// If --table flag is set, show static table (backward compatibility)
|
|
88
|
+
if (options?.table) {
|
|
89
|
+
await showStaticTable();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Get all servers and update their statuses
|
|
93
|
+
const servers = await state_manager_1.stateManager.getAllServers();
|
|
94
|
+
if (servers.length === 0) {
|
|
95
|
+
console.log(chalk_1.default.yellow('No servers configured.'));
|
|
96
|
+
console.log(chalk_1.default.dim('\nCreate a server: llamacpp server create <model-filename>'));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Update all server statuses
|
|
100
|
+
const updated = await status_checker_1.statusChecker.updateAllServerStatuses();
|
|
101
|
+
// If identifier is provided, find the server and jump to detail view
|
|
102
|
+
if (identifier) {
|
|
103
|
+
const server = await findServer(identifier, updated);
|
|
104
|
+
if (!server) {
|
|
105
|
+
console.log(chalk_1.default.red(`❌ Server not found: ${identifier}`));
|
|
106
|
+
console.log(chalk_1.default.dim('\nAvailable servers:'));
|
|
107
|
+
updated.forEach((s) => {
|
|
108
|
+
console.log(chalk_1.default.dim(` - ${s.id} (port ${s.port})`));
|
|
109
|
+
});
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
// Find the server index for direct jump
|
|
113
|
+
const serverIndex = updated.findIndex(s => s.id === server.id);
|
|
114
|
+
// Launch multi-server TUI with direct jump to detail view
|
|
115
|
+
const screen = blessed_1.default.screen({
|
|
116
|
+
smartCSR: true,
|
|
117
|
+
title: 'llama.cpp Multi-Server Monitor',
|
|
118
|
+
fullUnicode: true,
|
|
119
|
+
});
|
|
120
|
+
await (0, MultiServerMonitorApp_js_1.createMultiServerMonitorUI)(screen, updated, true, serverIndex); // fromPs = true, directJumpIndex
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// No identifier - launch multi-server TUI
|
|
124
|
+
const runningServers = updated.filter((s) => s.status === 'running');
|
|
125
|
+
// Launch multi-server TUI (shows all servers, not just running ones)
|
|
126
|
+
const screen = blessed_1.default.screen({
|
|
127
|
+
smartCSR: true,
|
|
128
|
+
title: 'llama.cpp Multi-Server Monitor',
|
|
129
|
+
fullUnicode: true,
|
|
130
|
+
});
|
|
131
|
+
await (0, MultiServerMonitorApp_js_1.createMultiServerMonitorUI)(screen, updated, true); // fromPs = true
|
|
132
|
+
}
|
|
133
|
+
// Helper function to find server by identifier
|
|
134
|
+
async function findServer(identifier, servers) {
|
|
135
|
+
// Try by port
|
|
136
|
+
const port = parseInt(identifier);
|
|
137
|
+
if (!isNaN(port)) {
|
|
138
|
+
const server = servers.find(s => s.port === port);
|
|
139
|
+
if (server)
|
|
140
|
+
return server;
|
|
141
|
+
}
|
|
142
|
+
// Try by exact ID
|
|
143
|
+
const byId = servers.find(s => s.id === identifier);
|
|
144
|
+
if (byId)
|
|
145
|
+
return byId;
|
|
146
|
+
// Try by partial model name
|
|
147
|
+
const byModel = servers.find(s => s.modelName.toLowerCase().includes(identifier.toLowerCase()));
|
|
148
|
+
if (byModel)
|
|
149
|
+
return byModel;
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
82
152
|
//# sourceMappingURL=ps.js.map
|
package/dist/commands/ps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps.js","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"ps.js","sourceRoot":"","sources":["../../src/commands/ps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-show.d.ts","sourceRoot":"","sources":["../../src/commands/server-show.ts"],"names":[],"mappings":"AAMA,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"server-show.d.ts","sourceRoot":"","sources":["../../src/commands/server-show.ts"],"names":[],"mappings":"AAMA,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiIzE"}
|
|
@@ -66,9 +66,16 @@ async function serverShowCommand(identifier) {
|
|
|
66
66
|
console.log(`${chalk_1.default.bold('Uptime:')} ${uptime}`);
|
|
67
67
|
}
|
|
68
68
|
if (updatedServer.pid) {
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
71
|
-
|
|
69
|
+
const cpuMemoryBytes = await (0, process_utils_1.getProcessMemory)(updatedServer.pid);
|
|
70
|
+
if (cpuMemoryBytes !== null) {
|
|
71
|
+
const metalMemoryBytes = updatedServer.metalMemoryMB ? updatedServer.metalMemoryMB * 1024 * 1024 : 0;
|
|
72
|
+
const totalMemoryBytes = cpuMemoryBytes + metalMemoryBytes;
|
|
73
|
+
if (metalMemoryBytes > 0) {
|
|
74
|
+
console.log(`${chalk_1.default.bold('Memory:')} ${(0, format_utils_1.formatBytes)(totalMemoryBytes)} (CPU: ${(0, format_utils_1.formatBytes)(cpuMemoryBytes)}, GPU: ${(0, format_utils_1.formatBytes)(metalMemoryBytes)})`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(`${chalk_1.default.bold('Memory:')} ${(0, format_utils_1.formatBytes)(cpuMemoryBytes)} (CPU only)`);
|
|
78
|
+
}
|
|
72
79
|
}
|
|
73
80
|
}
|
|
74
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-show.js","sourceRoot":"","sources":["../../src/commands/server-show.ts"],"names":[],"mappings":";;;;;AAMA,
|
|
1
|
+
{"version":3,"file":"server-show.js","sourceRoot":"","sources":["../../src/commands/server-show.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EpE"}
|
package/dist/commands/start.js
CHANGED
|
@@ -8,6 +8,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
8
8
|
const state_manager_1 = require("../lib/state-manager");
|
|
9
9
|
const launchctl_manager_1 = require("../lib/launchctl-manager");
|
|
10
10
|
const status_checker_1 = require("../lib/status-checker");
|
|
11
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
11
12
|
async function startCommand(identifier) {
|
|
12
13
|
// Initialize state manager
|
|
13
14
|
await state_manager_1.stateManager.initialize();
|
|
@@ -52,8 +53,19 @@ async function startCommand(identifier) {
|
|
|
52
53
|
throw new Error(`Server failed to start. Check logs with: llamacpp server logs ${server.id}`);
|
|
53
54
|
}
|
|
54
55
|
// 7. Update server status
|
|
55
|
-
await status_checker_1.statusChecker.updateServerStatus(server);
|
|
56
|
-
// 8.
|
|
56
|
+
let updatedServer = await status_checker_1.statusChecker.updateServerStatus(server);
|
|
57
|
+
// 8. Parse Metal (GPU) memory allocation if not already captured
|
|
58
|
+
if (!updatedServer.metalMemoryMB) {
|
|
59
|
+
console.log(chalk_1.default.dim('Detecting Metal (GPU) memory allocation...'));
|
|
60
|
+
await new Promise(resolve => setTimeout(resolve, 8000)); // 8 second delay
|
|
61
|
+
const metalMemoryMB = await (0, file_utils_1.parseMetalMemoryFromLog)(updatedServer.stderrPath);
|
|
62
|
+
if (metalMemoryMB) {
|
|
63
|
+
updatedServer = { ...updatedServer, metalMemoryMB };
|
|
64
|
+
await state_manager_1.stateManager.saveServerConfig(updatedServer);
|
|
65
|
+
console.log(chalk_1.default.dim(`Metal memory: ${metalMemoryMB.toFixed(0)} MB`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 9. Display success
|
|
57
69
|
console.log();
|
|
58
70
|
console.log(chalk_1.default.green('✅ Server started successfully!'));
|
|
59
71
|
console.log();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ServerMetrics, SystemMetrics } from '../types/monitor-types.js';
|
|
2
|
+
import { HistorySnapshot, TimeWindow } from '../types/history-types.js';
|
|
3
|
+
export declare class HistoryManager {
|
|
4
|
+
private serverId;
|
|
5
|
+
private historyDir;
|
|
6
|
+
private historyPath;
|
|
7
|
+
private readonly MAX_AGE_MS;
|
|
8
|
+
constructor(serverId: string);
|
|
9
|
+
/**
|
|
10
|
+
* Append a new snapshot to history (with auto-pruning)
|
|
11
|
+
*/
|
|
12
|
+
appendSnapshot(serverMetrics: ServerMetrics, systemMetrics?: SystemMetrics): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Load all snapshots within specified time window
|
|
15
|
+
*/
|
|
16
|
+
loadHistory(windowHours: number): Promise<HistorySnapshot[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Load history for specific time window type
|
|
19
|
+
*/
|
|
20
|
+
loadHistoryByWindow(window: TimeWindow): Promise<HistorySnapshot[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get file path for server history
|
|
23
|
+
*/
|
|
24
|
+
getHistoryPath(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Check if history file exists
|
|
27
|
+
*/
|
|
28
|
+
hasHistory(): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Clear all history for server
|
|
31
|
+
*/
|
|
32
|
+
clearHistory(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Load full history data from file
|
|
35
|
+
*/
|
|
36
|
+
private loadHistoryData;
|
|
37
|
+
/**
|
|
38
|
+
* Prune snapshots older than maxAge
|
|
39
|
+
*/
|
|
40
|
+
private pruneOldSnapshots;
|
|
41
|
+
/**
|
|
42
|
+
* Filter snapshots by time window
|
|
43
|
+
*/
|
|
44
|
+
private filterByTimeWindow;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=history-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-manager.d.ts","sourceRoot":"","sources":["../../src/lib/history-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAe,eAAe,EAAqB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAExG,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;gBAEtC,QAAQ,EAAE,MAAM;IAM5B;;OAEG;IACG,cAAc,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDhG;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAsBlE;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAIzE;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IASpC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAcnC;;OAEG;YACW,eAAe;IAa7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAI3B"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HistoryManager = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const history_types_js_1 = require("../types/history-types.js");
|
|
8
|
+
class HistoryManager {
|
|
9
|
+
constructor(serverId) {
|
|
10
|
+
this.MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
11
|
+
this.serverId = serverId;
|
|
12
|
+
this.historyDir = (0, path_1.join)((0, os_1.homedir)(), '.llamacpp', 'history');
|
|
13
|
+
this.historyPath = (0, path_1.join)(this.historyDir, `${serverId}.json`);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Append a new snapshot to history (with auto-pruning)
|
|
17
|
+
*/
|
|
18
|
+
async appendSnapshot(serverMetrics, systemMetrics) {
|
|
19
|
+
try {
|
|
20
|
+
// Ensure history directory exists
|
|
21
|
+
await (0, promises_1.mkdir)(this.historyDir, { recursive: true });
|
|
22
|
+
// Load existing history
|
|
23
|
+
const historyData = await this.loadHistoryData();
|
|
24
|
+
// Create new snapshot
|
|
25
|
+
const snapshot = {
|
|
26
|
+
timestamp: Date.now(),
|
|
27
|
+
server: {
|
|
28
|
+
healthy: serverMetrics.healthy,
|
|
29
|
+
uptime: serverMetrics.uptime,
|
|
30
|
+
activeSlots: serverMetrics.activeSlots,
|
|
31
|
+
idleSlots: serverMetrics.idleSlots,
|
|
32
|
+
totalSlots: serverMetrics.totalSlots,
|
|
33
|
+
avgPromptSpeed: serverMetrics.avgPromptSpeed,
|
|
34
|
+
avgGenerateSpeed: serverMetrics.avgGenerateSpeed,
|
|
35
|
+
processMemory: serverMetrics.processMemory,
|
|
36
|
+
processCpuUsage: serverMetrics.processCpuUsage,
|
|
37
|
+
},
|
|
38
|
+
system: systemMetrics ? {
|
|
39
|
+
gpuUsage: systemMetrics.gpuUsage,
|
|
40
|
+
cpuUsage: systemMetrics.cpuUsage,
|
|
41
|
+
aneUsage: systemMetrics.aneUsage,
|
|
42
|
+
temperature: systemMetrics.temperature,
|
|
43
|
+
memoryUsed: systemMetrics.memoryUsed,
|
|
44
|
+
memoryTotal: systemMetrics.memoryTotal,
|
|
45
|
+
} : undefined,
|
|
46
|
+
};
|
|
47
|
+
// Append new snapshot
|
|
48
|
+
historyData.snapshots.push(snapshot);
|
|
49
|
+
// Prune old snapshots (keep only last 24h)
|
|
50
|
+
historyData.snapshots = this.pruneOldSnapshots(historyData.snapshots, this.MAX_AGE_MS);
|
|
51
|
+
// Atomic write: write to temp file in same directory, then rename
|
|
52
|
+
// This prevents read collisions during concurrent access
|
|
53
|
+
// IMPORTANT: temp file MUST be in same directory as destination for rename to work across filesystems
|
|
54
|
+
const tempPath = (0, path_1.join)(this.historyDir, `.${this.serverId}-${Date.now()}.tmp`);
|
|
55
|
+
await (0, promises_1.writeFile)(tempPath, JSON.stringify(historyData, null, 2), 'utf-8');
|
|
56
|
+
await (0, promises_1.rename)(tempPath, this.historyPath);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Silent failure - don't interrupt monitoring
|
|
60
|
+
// Don't throw - just return silently to avoid polluting console
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load all snapshots within specified time window
|
|
66
|
+
*/
|
|
67
|
+
async loadHistory(windowHours) {
|
|
68
|
+
// Retry logic for file I/O collisions during concurrent read/write
|
|
69
|
+
const maxRetries = 3;
|
|
70
|
+
let lastError = null;
|
|
71
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
72
|
+
try {
|
|
73
|
+
const historyData = await this.loadHistoryData();
|
|
74
|
+
return this.filterByTimeWindow(historyData.snapshots, windowHours);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
lastError = error;
|
|
78
|
+
// Wait briefly before retry (exponential backoff)
|
|
79
|
+
if (attempt < maxRetries - 1) {
|
|
80
|
+
await new Promise(resolve => setTimeout(resolve, 50 * Math.pow(2, attempt)));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// All retries failed - throw error so it can be handled upstream
|
|
85
|
+
throw new Error(`Failed to load history after ${maxRetries} attempts: ${lastError?.message || 'Unknown error'}`);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Load history for specific time window type
|
|
89
|
+
*/
|
|
90
|
+
async loadHistoryByWindow(window) {
|
|
91
|
+
return this.loadHistory(history_types_js_1.TIME_WINDOW_HOURS[window]);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get file path for server history
|
|
95
|
+
*/
|
|
96
|
+
getHistoryPath() {
|
|
97
|
+
return this.historyPath;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if history file exists
|
|
101
|
+
*/
|
|
102
|
+
async hasHistory() {
|
|
103
|
+
try {
|
|
104
|
+
await (0, promises_1.access)(this.historyPath);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Clear all history for server
|
|
113
|
+
*/
|
|
114
|
+
async clearHistory() {
|
|
115
|
+
const emptyHistory = {
|
|
116
|
+
serverId: this.serverId,
|
|
117
|
+
snapshots: [],
|
|
118
|
+
};
|
|
119
|
+
await (0, promises_1.mkdir)(this.historyDir, { recursive: true });
|
|
120
|
+
// Atomic write - temp file in same directory as destination
|
|
121
|
+
const tempPath = (0, path_1.join)(this.historyDir, `.${this.serverId}-${Date.now()}.tmp`);
|
|
122
|
+
await (0, promises_1.writeFile)(tempPath, JSON.stringify(emptyHistory, null, 2), 'utf-8');
|
|
123
|
+
await (0, promises_1.rename)(tempPath, this.historyPath);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Load full history data from file
|
|
127
|
+
*/
|
|
128
|
+
async loadHistoryData() {
|
|
129
|
+
try {
|
|
130
|
+
const content = await (0, promises_1.readFile)(this.historyPath, 'utf-8');
|
|
131
|
+
return JSON.parse(content);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// File doesn't exist or is corrupted, return empty history
|
|
135
|
+
return {
|
|
136
|
+
serverId: this.serverId,
|
|
137
|
+
snapshots: [],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Prune snapshots older than maxAge
|
|
143
|
+
*/
|
|
144
|
+
pruneOldSnapshots(snapshots, maxAgeMs) {
|
|
145
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
146
|
+
return snapshots.filter(s => s.timestamp >= cutoff);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Filter snapshots by time window
|
|
150
|
+
*/
|
|
151
|
+
filterByTimeWindow(snapshots, windowHours) {
|
|
152
|
+
const cutoff = Date.now() - (windowHours * 60 * 60 * 1000);
|
|
153
|
+
return snapshots.filter(s => s.timestamp >= cutoff);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.HistoryManager = HistoryManager;
|
|
157
|
+
//# sourceMappingURL=history-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-manager.js","sourceRoot":"","sources":["../../src/lib/history-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,8 +29,9 @@ export declare class MetricsAggregator {
|
|
|
29
29
|
* Aggregate all server metrics
|
|
30
30
|
* @param server - Server configuration
|
|
31
31
|
* @param processMemory - Optional pre-fetched process memory (for batch collection)
|
|
32
|
+
* @param processCpuUsage - Optional pre-fetched process CPU usage (for batch collection)
|
|
32
33
|
*/
|
|
33
|
-
collectServerMetrics(server: ServerConfig, processMemory?: number | null): Promise<ServerMetrics>;
|
|
34
|
+
collectServerMetrics(server: ServerConfig, processMemory?: number | null, processCpuUsage?: number | null): Promise<ServerMetrics>;
|
|
34
35
|
/**
|
|
35
36
|
* Collect complete monitoring data (server + system metrics)
|
|
36
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-aggregator.d.ts","sourceRoot":"","sources":["../../src/lib/metrics-aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKjF;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAoE;gBAE7E,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,MAAa;IAOxD;;OAEG;YACW,gBAAgB;IA0B9B;;OAEG;YACW,SAAS;IAKvB;;OAEG;YACW,QAAQ;IAItB;;OAEG;YACW,QAAQ;IAyDtB
|
|
1
|
+
{"version":3,"file":"metrics-aggregator.d.ts","sourceRoot":"","sources":["../../src/lib/metrics-aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAY,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKjF;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAoE;gBAE7E,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,MAAa;IAOxD;;OAEG;YACW,gBAAgB;IA0B9B;;OAEG;YACW,SAAS;IAKvB;;OAEG;YACW,QAAQ;IAItB;;OAEG;YACW,QAAQ;IAyDtB;;;;;OAKG;IACG,oBAAoB,CACxB,MAAM,EAAE,YAAY,EACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,OAAO,CAAC,aAAa,CAAC;IAmGzB;;OAEG;IACG,kBAAkB,CACtB,MAAM,EAAE,YAAY,EACpB,cAAc,GAAE,MAAa,GAC5B,OAAO,CAAC,WAAW,CAAC;CAexB"}
|
|
@@ -107,8 +107,9 @@ class MetricsAggregator {
|
|
|
107
107
|
* Aggregate all server metrics
|
|
108
108
|
* @param server - Server configuration
|
|
109
109
|
* @param processMemory - Optional pre-fetched process memory (for batch collection)
|
|
110
|
+
* @param processCpuUsage - Optional pre-fetched process CPU usage (for batch collection)
|
|
110
111
|
*/
|
|
111
|
-
async collectServerMetrics(server, processMemory) {
|
|
112
|
+
async collectServerMetrics(server, processMemory, processCpuUsage) {
|
|
112
113
|
const now = Date.now();
|
|
113
114
|
// Check basic server status first
|
|
114
115
|
const status = await status_checker_js_1.statusChecker.checkServer(server);
|
|
@@ -139,14 +140,17 @@ class MetricsAggregator {
|
|
|
139
140
|
};
|
|
140
141
|
}
|
|
141
142
|
// Fetch detailed metrics in parallel
|
|
142
|
-
// If processMemory
|
|
143
|
-
const [healthy, props, slots, fetchedMemory] = await Promise.all([
|
|
143
|
+
// If processMemory/CPU were pre-fetched (batch mode), use them; otherwise fetch individually
|
|
144
|
+
const [healthy, props, slots, fetchedMemory, fetchedCpu] = await Promise.all([
|
|
144
145
|
this.getHealth(),
|
|
145
146
|
this.getProps(),
|
|
146
147
|
this.getSlots(),
|
|
147
148
|
processMemory !== undefined
|
|
148
149
|
? Promise.resolve(processMemory)
|
|
149
150
|
: (server.pid ? (0, process_utils_js_1.getProcessMemory)(server.pid) : Promise.resolve(null)),
|
|
151
|
+
processCpuUsage !== undefined
|
|
152
|
+
? Promise.resolve(processCpuUsage)
|
|
153
|
+
: (server.pid ? (0, process_utils_js_1.getProcessCpu)(server.pid) : Promise.resolve(null)),
|
|
150
154
|
]);
|
|
151
155
|
// Calculate slot statistics
|
|
152
156
|
const activeSlots = slots.filter((s) => s.state === 'processing').length;
|
|
@@ -160,6 +164,12 @@ class MetricsAggregator {
|
|
|
160
164
|
const avgGenerateSpeed = processingSlots.length > 0
|
|
161
165
|
? processingSlots.reduce((sum, s) => sum + (s.timings?.predicted_per_second || 0), 0) / processingSlots.length
|
|
162
166
|
: undefined;
|
|
167
|
+
// Calculate total memory (CPU + Metal GPU memory if available)
|
|
168
|
+
let totalMemory = fetchedMemory ?? undefined;
|
|
169
|
+
if (totalMemory !== undefined && server.metalMemoryMB) {
|
|
170
|
+
// Add Metal memory (convert MB to bytes)
|
|
171
|
+
totalMemory += server.metalMemoryMB * 1024 * 1024;
|
|
172
|
+
}
|
|
163
173
|
return {
|
|
164
174
|
server,
|
|
165
175
|
healthy,
|
|
@@ -173,7 +183,8 @@ class MetricsAggregator {
|
|
|
173
183
|
slots,
|
|
174
184
|
avgPromptSpeed,
|
|
175
185
|
avgGenerateSpeed,
|
|
176
|
-
processMemory:
|
|
186
|
+
processMemory: totalMemory,
|
|
187
|
+
processCpuUsage: fetchedCpu ?? undefined,
|
|
177
188
|
timestamp: now,
|
|
178
189
|
stale: false,
|
|
179
190
|
};
|