@appkit/llamacpp-cli 1.6.0 → 1.8.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 +7 -0
- package/README.md +71 -1
- package/dist/cli.js +24 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +182 -13
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +0 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.js +12 -10
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/logs-all.d.ts +9 -0
- package/dist/commands/logs-all.d.ts.map +1 -0
- package/dist/commands/logs-all.js +209 -0
- package/dist/commands/logs-all.js.map +1 -0
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +108 -2
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/rm.d.ts.map +1 -1
- package/dist/commands/rm.js +5 -12
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/server-show.d.ts.map +1 -1
- package/dist/commands/server-show.js +20 -0
- package/dist/commands/server-show.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +22 -7
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.js +3 -3
- package/dist/commands/stop.js.map +1 -1
- package/dist/utils/log-utils.d.ts +43 -0
- package/dist/utils/log-utils.d.ts.map +1 -0
- package/dist/utils/log-utils.js +190 -0
- package/dist/utils/log-utils.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +24 -1
- package/src/commands/config.ts +161 -15
- package/src/commands/create.ts +0 -1
- package/src/commands/delete.ts +10 -10
- package/src/commands/logs-all.ts +251 -0
- package/src/commands/logs.ts +138 -2
- package/src/commands/rm.ts +5 -12
- package/src/commands/server-show.ts +25 -0
- package/src/commands/start.ts +22 -7
- package/src/commands/stop.ts +3 -3
- package/src/utils/log-utils.ts +178 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-show.js","sourceRoot":"","sources":["../../src/commands/server-show.ts"],"names":[],"mappings":";;;;;
|
|
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":"AAOA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FpE"}
|
package/dist/commands/start.js
CHANGED
|
@@ -9,6 +9,7 @@ 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
11
|
const file_utils_1 = require("../utils/file-utils");
|
|
12
|
+
const log_utils_1 = require("../utils/log-utils");
|
|
12
13
|
async function startCommand(identifier) {
|
|
13
14
|
// Initialize state manager
|
|
14
15
|
await state_manager_1.stateManager.initialize();
|
|
@@ -25,36 +26,50 @@ async function startCommand(identifier) {
|
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
28
|
console.log(chalk_1.default.blue(`▶️ Starting ${server.modelName} (port ${server.port})...`));
|
|
28
|
-
// 3.
|
|
29
|
+
// 3. Auto-rotate logs if they exceed 100MB
|
|
30
|
+
try {
|
|
31
|
+
const result = await (0, log_utils_1.autoRotateIfNeeded)(server.stdoutPath, server.stderrPath, 100);
|
|
32
|
+
if (result.rotated) {
|
|
33
|
+
console.log(chalk_1.default.dim('Auto-rotated large log files:'));
|
|
34
|
+
for (const file of result.files) {
|
|
35
|
+
console.log(chalk_1.default.dim(` → ${file}`));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
// Non-fatal, just warn
|
|
41
|
+
console.log(chalk_1.default.yellow(`⚠️ Failed to rotate logs: ${error.message}`));
|
|
42
|
+
}
|
|
43
|
+
// 4. Ensure plist exists (recreate if missing)
|
|
29
44
|
try {
|
|
30
45
|
await launchctl_manager_1.launchctlManager.createPlist(server);
|
|
31
46
|
}
|
|
32
47
|
catch (error) {
|
|
33
48
|
// May already exist, that's okay
|
|
34
49
|
}
|
|
35
|
-
//
|
|
50
|
+
// 5. Load service if needed
|
|
36
51
|
try {
|
|
37
52
|
await launchctl_manager_1.launchctlManager.loadService(server.plistPath);
|
|
38
53
|
}
|
|
39
54
|
catch (error) {
|
|
40
55
|
// May already be loaded, that's okay
|
|
41
56
|
}
|
|
42
|
-
//
|
|
57
|
+
// 6. Start the service
|
|
43
58
|
try {
|
|
44
59
|
await launchctl_manager_1.launchctlManager.startService(server.label);
|
|
45
60
|
}
|
|
46
61
|
catch (error) {
|
|
47
62
|
throw new Error(`Failed to start service: ${error.message}`);
|
|
48
63
|
}
|
|
49
|
-
//
|
|
64
|
+
// 7. Wait for startup
|
|
50
65
|
console.log(chalk_1.default.dim('Waiting for server to start...'));
|
|
51
66
|
const started = await launchctl_manager_1.launchctlManager.waitForServiceStart(server.label, 5000);
|
|
52
67
|
if (!started) {
|
|
53
68
|
throw new Error(`Server failed to start. Check logs with: llamacpp server logs ${server.id}`);
|
|
54
69
|
}
|
|
55
|
-
//
|
|
70
|
+
// 8. Update server status
|
|
56
71
|
let updatedServer = await status_checker_1.statusChecker.updateServerStatus(server);
|
|
57
|
-
//
|
|
72
|
+
// 9. Parse Metal (GPU) memory allocation if not already captured
|
|
58
73
|
if (!updatedServer.metalMemoryMB) {
|
|
59
74
|
console.log(chalk_1.default.dim('Detecting Metal (GPU) memory allocation...'));
|
|
60
75
|
await new Promise(resolve => setTimeout(resolve, 8000)); // 8 second delay
|
|
@@ -65,7 +80,7 @@ async function startCommand(identifier) {
|
|
|
65
80
|
console.log(chalk_1.default.dim(`Metal memory: ${metalMemoryMB.toFixed(0)} MB`));
|
|
66
81
|
}
|
|
67
82
|
}
|
|
68
|
-
//
|
|
83
|
+
// 10. Display success
|
|
69
84
|
console.log();
|
|
70
85
|
console.log(chalk_1.default.green('✅ Server started successfully!'));
|
|
71
86
|
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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"}
|
package/dist/commands/stop.js
CHANGED
|
@@ -20,12 +20,12 @@ async function stopCommand(identifier) {
|
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
console.log(chalk_1.default.blue(`⏹️ Stopping ${server.modelName} (port ${server.port})...`));
|
|
23
|
-
//
|
|
23
|
+
// Unload the service (removes from launchd management - won't auto-restart)
|
|
24
24
|
try {
|
|
25
|
-
await launchctl_manager_1.launchctlManager.
|
|
25
|
+
await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
|
|
26
26
|
}
|
|
27
27
|
catch (error) {
|
|
28
|
-
throw new Error(`Failed to
|
|
28
|
+
throw new Error(`Failed to unload service: ${error.message}`);
|
|
29
29
|
}
|
|
30
30
|
// Wait for clean shutdown
|
|
31
31
|
const stopped = await launchctl_manager_1.launchctlManager.waitForServiceStop(server.label, 5000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";;;;;AAKA,kCAiCC;AAtCD,kDAA0B;AAC1B,wDAAoD;AACpD,gEAA4D;AAC5D,0DAAsD;AAE/C,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,sBAAsB,CAAC,CAAC;IACzE,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IAErF,
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";;;;;AAKA,kCAiCC;AAtCD,kDAA0B;AAC1B,wDAAoD;AACpD,gEAA4D;AAC5D,0DAAsD;AAE/C,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,sBAAsB,CAAC,CAAC;IACzE,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IAErF,4EAA4E;IAC5E,IAAI,CAAC;QACH,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA8B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,oCAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,uBAAuB;IACvB,MAAM,8BAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the size of a file in bytes
|
|
3
|
+
*/
|
|
4
|
+
export declare function getFileSize(filePath: string): Promise<number>;
|
|
5
|
+
/**
|
|
6
|
+
* Format bytes to human-readable size
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatFileSize(bytes: number): string;
|
|
9
|
+
/**
|
|
10
|
+
* Rotate a log file with timestamp
|
|
11
|
+
* Renames current log to <name>.YYYY-MM-DD-HH-MM-SS.<ext>
|
|
12
|
+
* Returns the new archived filename
|
|
13
|
+
*/
|
|
14
|
+
export declare function rotateLogFile(logPath: string): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Clear (truncate) a log file to zero bytes
|
|
17
|
+
*/
|
|
18
|
+
export declare function clearLogFile(logPath: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Auto-rotate log files if they exceed threshold
|
|
21
|
+
* Returns true if rotation occurred, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
export declare function autoRotateIfNeeded(stdoutPath: string, stderrPath: string, thresholdMB?: number): Promise<{
|
|
24
|
+
rotated: boolean;
|
|
25
|
+
files: string[];
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Get information about archived log files for a server
|
|
29
|
+
* Returns count and total size of timestamped archived logs
|
|
30
|
+
*/
|
|
31
|
+
export declare function getArchivedLogInfo(serverId: string): Promise<{
|
|
32
|
+
count: number;
|
|
33
|
+
totalSize: number;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete all archived log files for a server
|
|
37
|
+
* Returns count and total size of deleted files
|
|
38
|
+
*/
|
|
39
|
+
export declare function deleteArchivedLogs(serverId: string): Promise<{
|
|
40
|
+
count: number;
|
|
41
|
+
totalSize: number;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=log-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-utils.d.ts","sourceRoot":"","sources":["../../src/utils/log-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BpE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAY,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0BhD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAwBD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAyBD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
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.getFileSize = getFileSize;
|
|
37
|
+
exports.formatFileSize = formatFileSize;
|
|
38
|
+
exports.rotateLogFile = rotateLogFile;
|
|
39
|
+
exports.clearLogFile = clearLogFile;
|
|
40
|
+
exports.autoRotateIfNeeded = autoRotateIfNeeded;
|
|
41
|
+
exports.getArchivedLogInfo = getArchivedLogInfo;
|
|
42
|
+
exports.deleteArchivedLogs = deleteArchivedLogs;
|
|
43
|
+
const fs = __importStar(require("fs/promises"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const file_utils_1 = require("./file-utils");
|
|
46
|
+
/**
|
|
47
|
+
* Get the size of a file in bytes
|
|
48
|
+
*/
|
|
49
|
+
async function getFileSize(filePath) {
|
|
50
|
+
try {
|
|
51
|
+
const stats = await fs.stat(filePath);
|
|
52
|
+
return stats.size;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format bytes to human-readable size
|
|
60
|
+
*/
|
|
61
|
+
function formatFileSize(bytes) {
|
|
62
|
+
if (bytes === 0)
|
|
63
|
+
return '0 B';
|
|
64
|
+
const k = 1024;
|
|
65
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
66
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
67
|
+
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Rotate a log file with timestamp
|
|
71
|
+
* Renames current log to <name>.YYYY-MM-DD-HH-MM-SS.<ext>
|
|
72
|
+
* Returns the new archived filename
|
|
73
|
+
*/
|
|
74
|
+
async function rotateLogFile(logPath) {
|
|
75
|
+
if (!(await (0, file_utils_1.fileExists)(logPath))) {
|
|
76
|
+
throw new Error(`Log file does not exist: ${logPath}`);
|
|
77
|
+
}
|
|
78
|
+
// Get file size before rotation
|
|
79
|
+
const size = await getFileSize(logPath);
|
|
80
|
+
if (size === 0) {
|
|
81
|
+
throw new Error('Log file is empty, nothing to rotate');
|
|
82
|
+
}
|
|
83
|
+
// Generate timestamp
|
|
84
|
+
const timestamp = new Date()
|
|
85
|
+
.toISOString()
|
|
86
|
+
.replace(/T/, '-')
|
|
87
|
+
.replace(/:/g, '-')
|
|
88
|
+
.replace(/\..+/, '');
|
|
89
|
+
// Parse path components
|
|
90
|
+
const dir = path.dirname(logPath);
|
|
91
|
+
const ext = path.extname(logPath);
|
|
92
|
+
const basename = path.basename(logPath, ext);
|
|
93
|
+
// New archived filename
|
|
94
|
+
const archivedPath = path.join(dir, `${basename}.${timestamp}${ext}`);
|
|
95
|
+
// Rename current log to archived version
|
|
96
|
+
await fs.rename(logPath, archivedPath);
|
|
97
|
+
return archivedPath;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Clear (truncate) a log file to zero bytes
|
|
101
|
+
*/
|
|
102
|
+
async function clearLogFile(logPath) {
|
|
103
|
+
if (!(await (0, file_utils_1.fileExists)(logPath))) {
|
|
104
|
+
throw new Error(`Log file does not exist: ${logPath}`);
|
|
105
|
+
}
|
|
106
|
+
// Truncate file to 0 bytes
|
|
107
|
+
await fs.truncate(logPath, 0);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Auto-rotate log files if they exceed threshold
|
|
111
|
+
* Returns true if rotation occurred, false otherwise
|
|
112
|
+
*/
|
|
113
|
+
async function autoRotateIfNeeded(stdoutPath, stderrPath, thresholdMB = 100) {
|
|
114
|
+
const thresholdBytes = thresholdMB * 1024 * 1024;
|
|
115
|
+
const rotatedFiles = [];
|
|
116
|
+
// Check stdout
|
|
117
|
+
if (await (0, file_utils_1.fileExists)(stdoutPath)) {
|
|
118
|
+
const stdoutSize = await getFileSize(stdoutPath);
|
|
119
|
+
if (stdoutSize > thresholdBytes) {
|
|
120
|
+
const archived = await rotateLogFile(stdoutPath);
|
|
121
|
+
rotatedFiles.push(archived);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check stderr
|
|
125
|
+
if (await (0, file_utils_1.fileExists)(stderrPath)) {
|
|
126
|
+
const stderrSize = await getFileSize(stderrPath);
|
|
127
|
+
if (stderrSize > thresholdBytes) {
|
|
128
|
+
const archived = await rotateLogFile(stderrPath);
|
|
129
|
+
rotatedFiles.push(archived);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
rotated: rotatedFiles.length > 0,
|
|
134
|
+
files: rotatedFiles,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get information about archived log files for a server
|
|
139
|
+
* Returns count and total size of timestamped archived logs
|
|
140
|
+
*/
|
|
141
|
+
async function getArchivedLogInfo(serverId) {
|
|
142
|
+
const logsDir = (0, file_utils_1.getLogsDir)();
|
|
143
|
+
let count = 0;
|
|
144
|
+
let totalSize = 0;
|
|
145
|
+
try {
|
|
146
|
+
const files = await fs.readdir(logsDir);
|
|
147
|
+
// Pattern matches: server-id.YYYY-MM-DD-HH-MM-SS.{stdout,stderr}
|
|
148
|
+
const pattern = new RegExp(`^${serverId}\\.(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2})\\.(stdout|stderr)$`);
|
|
149
|
+
for (const file of files) {
|
|
150
|
+
if (pattern.test(file)) {
|
|
151
|
+
count++;
|
|
152
|
+
const filePath = path.join(logsDir, file);
|
|
153
|
+
totalSize += await getFileSize(filePath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Directory doesn't exist or can't be read
|
|
159
|
+
return { count: 0, totalSize: 0 };
|
|
160
|
+
}
|
|
161
|
+
return { count, totalSize };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Delete all archived log files for a server
|
|
165
|
+
* Returns count and total size of deleted files
|
|
166
|
+
*/
|
|
167
|
+
async function deleteArchivedLogs(serverId) {
|
|
168
|
+
const logsDir = (0, file_utils_1.getLogsDir)();
|
|
169
|
+
let count = 0;
|
|
170
|
+
let totalSize = 0;
|
|
171
|
+
try {
|
|
172
|
+
const files = await fs.readdir(logsDir);
|
|
173
|
+
// Pattern matches: server-id.YYYY-MM-DD-HH-MM-SS.{stdout,stderr}
|
|
174
|
+
const pattern = new RegExp(`^${serverId}\\.(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2})\\.(stdout|stderr)$`);
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
if (pattern.test(file)) {
|
|
177
|
+
const filePath = path.join(logsDir, file);
|
|
178
|
+
const size = await getFileSize(filePath);
|
|
179
|
+
await fs.unlink(filePath);
|
|
180
|
+
count++;
|
|
181
|
+
totalSize += size;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
throw new Error(`Failed to delete archived logs: ${error.message}`);
|
|
187
|
+
}
|
|
188
|
+
return { count, totalSize };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=log-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-utils.js","sourceRoot":"","sources":["../../src/utils/log-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { deleteCommand } from './commands/delete';
|
|
|
12
12
|
import { pullCommand } from './commands/pull';
|
|
13
13
|
import { rmCommand } from './commands/rm';
|
|
14
14
|
import { logsCommand } from './commands/logs';
|
|
15
|
+
import { logsAllCommand } from './commands/logs-all';
|
|
15
16
|
import { searchCommand } from './commands/search';
|
|
16
17
|
import { showCommand } from './commands/show';
|
|
17
18
|
import { serverShowCommand } from './commands/server-show';
|
|
@@ -25,7 +26,7 @@ const program = new Command();
|
|
|
25
26
|
program
|
|
26
27
|
.name('llamacpp')
|
|
27
28
|
.description('CLI tool to manage local llama.cpp servers on macOS')
|
|
28
|
-
.version(packageJson.version);
|
|
29
|
+
.version(packageJson.version, '-v, --version', 'Output the version number');
|
|
29
30
|
|
|
30
31
|
// List models
|
|
31
32
|
program
|
|
@@ -54,6 +55,23 @@ program
|
|
|
54
55
|
}
|
|
55
56
|
});
|
|
56
57
|
|
|
58
|
+
// View all server logs
|
|
59
|
+
program
|
|
60
|
+
.command('logs')
|
|
61
|
+
.description('View log sizes for all servers (with batch operations)')
|
|
62
|
+
.option('--clear', 'Clear current logs for all servers')
|
|
63
|
+
.option('--clear-archived', 'Delete only archived logs for all servers')
|
|
64
|
+
.option('--clear-all', 'Clear current + delete archived logs for all servers')
|
|
65
|
+
.option('--rotate', 'Rotate logs for all servers with timestamps')
|
|
66
|
+
.action(async (options) => {
|
|
67
|
+
try {
|
|
68
|
+
await logsAllCommand(options);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error(chalk.red('❌ Error:'), (error as Error).message);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
57
75
|
// Search for models
|
|
58
76
|
program
|
|
59
77
|
.command('search')
|
|
@@ -175,6 +193,7 @@ server
|
|
|
175
193
|
.command('config')
|
|
176
194
|
.description('Update server configuration parameters')
|
|
177
195
|
.argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
|
|
196
|
+
.option('-m, --model <filename>', 'Update model (filename or path)')
|
|
178
197
|
.option('-h, --host <address>', 'Update bind address (127.0.0.1 for localhost, 0.0.0.0 for remote access)')
|
|
179
198
|
.option('-t, --threads <number>', 'Update thread count', parseInt)
|
|
180
199
|
.option('-c, --ctx-size <number>', 'Update context size', parseInt)
|
|
@@ -261,6 +280,10 @@ server
|
|
|
261
280
|
.option('--verbose', 'Show all messages including debug internals')
|
|
262
281
|
.option('--filter <pattern>', 'Custom grep pattern for filtering')
|
|
263
282
|
.option('--stdout', 'Show stdout instead of stderr (rarely needed)')
|
|
283
|
+
.option('--clear', 'Clear (truncate) log file to zero bytes')
|
|
284
|
+
.option('--clear-archived', 'Delete only archived logs (preserves current logs)')
|
|
285
|
+
.option('--clear-all', 'Clear current logs AND delete all archived logs')
|
|
286
|
+
.option('--rotate', 'Rotate log file with timestamp (preserves old logs)')
|
|
264
287
|
.action(async (identifier: string, options) => {
|
|
265
288
|
try {
|
|
266
289
|
await logsCommand(identifier, options);
|