@appkit/llamacpp-cli 1.14.1 ā 2.1.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/README.md +276 -280
- package/dist/cli.js +133 -23
- package/dist/cli.js.map +1 -1
- package/dist/commands/admin/config.d.ts +1 -1
- package/dist/commands/admin/config.js +5 -5
- package/dist/commands/admin/config.js.map +1 -1
- package/dist/commands/admin/log-config.d.ts +11 -0
- package/dist/commands/admin/log-config.d.ts.map +1 -0
- package/dist/commands/admin/log-config.js +159 -0
- package/dist/commands/admin/log-config.js.map +1 -0
- package/dist/commands/admin/logs.d.ts +2 -3
- package/dist/commands/admin/logs.d.ts.map +1 -1
- package/dist/commands/admin/logs.js +6 -48
- package/dist/commands/admin/logs.js.map +1 -1
- package/dist/commands/admin/status.d.ts.map +1 -1
- package/dist/commands/admin/status.js +1 -0
- package/dist/commands/admin/status.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 +63 -196
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts +3 -2
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +24 -97
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +7 -24
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/internal/server-wrapper.d.ts +15 -0
- package/dist/commands/internal/server-wrapper.d.ts.map +1 -0
- package/dist/commands/internal/server-wrapper.js +126 -0
- package/dist/commands/internal/server-wrapper.js.map +1 -0
- package/dist/commands/logs-all.d.ts +0 -2
- package/dist/commands/logs-all.d.ts.map +1 -1
- package/dist/commands/logs-all.js +1 -61
- package/dist/commands/logs-all.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -5
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +104 -120
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/migrate-labels.d.ts +12 -0
- package/dist/commands/migrate-labels.d.ts.map +1 -0
- package/dist/commands/migrate-labels.js +160 -0
- package/dist/commands/migrate-labels.js.map +1 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +2 -1
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/rm.d.ts.map +1 -1
- package/dist/commands/rm.js +22 -48
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/router/config.d.ts +1 -1
- package/dist/commands/router/config.js +6 -6
- package/dist/commands/router/config.js.map +1 -1
- package/dist/commands/router/logs.d.ts +2 -4
- package/dist/commands/router/logs.d.ts.map +1 -1
- package/dist/commands/router/logs.js +34 -189
- package/dist/commands/router/logs.js.map +1 -1
- package/dist/commands/router/status.d.ts.map +1 -1
- package/dist/commands/router/status.js +1 -0
- package/dist/commands/router/status.js.map +1 -1
- package/dist/commands/server-show.d.ts.map +1 -1
- package/dist/commands/server-show.js +3 -0
- package/dist/commands/server-show.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +21 -72
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +10 -26
- package/dist/commands/stop.js.map +1 -1
- package/dist/launchers/llamacpp-admin +8 -0
- package/dist/launchers/llamacpp-router +8 -0
- package/dist/launchers/llamacpp-server +8 -0
- package/dist/lib/admin-manager.d.ts +4 -0
- package/dist/lib/admin-manager.d.ts.map +1 -1
- package/dist/lib/admin-manager.js +42 -18
- package/dist/lib/admin-manager.js.map +1 -1
- package/dist/lib/admin-server.d.ts +48 -1
- package/dist/lib/admin-server.d.ts.map +1 -1
- package/dist/lib/admin-server.js +632 -238
- package/dist/lib/admin-server.js.map +1 -1
- package/dist/lib/config-generator.d.ts +1 -0
- package/dist/lib/config-generator.d.ts.map +1 -1
- package/dist/lib/config-generator.js +12 -5
- package/dist/lib/config-generator.js.map +1 -1
- package/dist/lib/keyboard-manager.d.ts +162 -0
- package/dist/lib/keyboard-manager.d.ts.map +1 -0
- package/dist/lib/keyboard-manager.js +247 -0
- package/dist/lib/keyboard-manager.js.map +1 -0
- package/dist/lib/label-migration.d.ts +65 -0
- package/dist/lib/label-migration.d.ts.map +1 -0
- package/dist/lib/label-migration.js +458 -0
- package/dist/lib/label-migration.js.map +1 -0
- package/dist/lib/launchctl-manager.d.ts +9 -0
- package/dist/lib/launchctl-manager.d.ts.map +1 -1
- package/dist/lib/launchctl-manager.js +65 -19
- package/dist/lib/launchctl-manager.js.map +1 -1
- package/dist/lib/log-management-service.d.ts +51 -0
- package/dist/lib/log-management-service.d.ts.map +1 -0
- package/dist/lib/log-management-service.js +124 -0
- package/dist/lib/log-management-service.js.map +1 -0
- package/dist/lib/log-workers.d.ts +70 -0
- package/dist/lib/log-workers.d.ts.map +1 -0
- package/dist/lib/log-workers.js +217 -0
- package/dist/lib/log-workers.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +9 -1
- package/dist/lib/model-downloader.d.ts.map +1 -1
- package/dist/lib/model-downloader.js +98 -1
- package/dist/lib/model-downloader.js.map +1 -1
- package/dist/lib/model-management-service.d.ts +60 -0
- package/dist/lib/model-management-service.d.ts.map +1 -0
- package/dist/lib/model-management-service.js +246 -0
- package/dist/lib/model-management-service.js.map +1 -0
- package/dist/lib/model-management-service.test.d.ts +2 -0
- package/dist/lib/model-management-service.test.d.ts.map +1 -0
- package/dist/lib/model-management-service.test.js.map +1 -0
- package/dist/lib/model-scanner.d.ts +15 -3
- package/dist/lib/model-scanner.d.ts.map +1 -1
- package/dist/lib/model-scanner.js +174 -17
- package/dist/lib/model-scanner.js.map +1 -1
- package/dist/lib/openapi-spec.d.ts +1335 -0
- package/dist/lib/openapi-spec.d.ts.map +1 -0
- package/dist/lib/openapi-spec.js +1017 -0
- package/dist/lib/openapi-spec.js.map +1 -0
- package/dist/lib/router-logger.d.ts +1 -1
- package/dist/lib/router-logger.d.ts.map +1 -1
- package/dist/lib/router-logger.js +13 -11
- package/dist/lib/router-logger.js.map +1 -1
- package/dist/lib/router-manager.d.ts +4 -0
- package/dist/lib/router-manager.d.ts.map +1 -1
- package/dist/lib/router-manager.js +30 -18
- package/dist/lib/router-manager.js.map +1 -1
- package/dist/lib/router-server.d.ts +4 -7
- package/dist/lib/router-server.d.ts.map +1 -1
- package/dist/lib/router-server.js +71 -182
- package/dist/lib/router-server.js.map +1 -1
- package/dist/lib/server-config-service.d.ts +51 -0
- package/dist/lib/server-config-service.d.ts.map +1 -0
- package/dist/lib/server-config-service.js +310 -0
- package/dist/lib/server-config-service.js.map +1 -0
- package/dist/lib/server-config-service.test.d.ts +2 -0
- package/dist/lib/server-config-service.test.d.ts.map +1 -0
- package/dist/lib/server-config-service.test.js.map +1 -0
- package/dist/lib/server-lifecycle-service.d.ts +172 -0
- package/dist/lib/server-lifecycle-service.d.ts.map +1 -0
- package/dist/lib/server-lifecycle-service.js +619 -0
- package/dist/lib/server-lifecycle-service.js.map +1 -0
- package/dist/lib/state-manager.d.ts +18 -1
- package/dist/lib/state-manager.d.ts.map +1 -1
- package/dist/lib/state-manager.js +51 -2
- package/dist/lib/state-manager.js.map +1 -1
- package/dist/lib/status-checker.d.ts +11 -4
- package/dist/lib/status-checker.d.ts.map +1 -1
- package/dist/lib/status-checker.js +34 -1
- package/dist/lib/status-checker.js.map +1 -1
- package/dist/lib/validation-service.d.ts +43 -0
- package/dist/lib/validation-service.d.ts.map +1 -0
- package/dist/lib/validation-service.js +112 -0
- package/dist/lib/validation-service.js.map +1 -0
- package/dist/lib/validation-service.test.d.ts +2 -0
- package/dist/lib/validation-service.test.d.ts.map +1 -0
- package/dist/lib/validation-service.test.js.map +1 -0
- package/dist/scripts/http-log-filter.sh +8 -0
- package/dist/tui/ConfigApp.d.ts.map +1 -1
- package/dist/tui/ConfigApp.js +222 -184
- package/dist/tui/ConfigApp.js.map +1 -1
- package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
- package/dist/tui/HistoricalMonitorApp.js +12 -0
- package/dist/tui/HistoricalMonitorApp.js.map +1 -1
- package/dist/tui/ModelsApp.d.ts.map +1 -1
- package/dist/tui/ModelsApp.js +93 -17
- package/dist/tui/ModelsApp.js.map +1 -1
- package/dist/tui/MonitorApp.d.ts.map +1 -1
- package/dist/tui/MonitorApp.js +1 -3
- package/dist/tui/MonitorApp.js.map +1 -1
- package/dist/tui/MultiServerMonitorApp.d.ts +3 -3
- package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
- package/dist/tui/MultiServerMonitorApp.js +724 -508
- package/dist/tui/MultiServerMonitorApp.js.map +1 -1
- package/dist/tui/RootNavigator.d.ts.map +1 -1
- package/dist/tui/RootNavigator.js +17 -1
- package/dist/tui/RootNavigator.js.map +1 -1
- package/dist/tui/RouterApp.d.ts +6 -0
- package/dist/tui/RouterApp.d.ts.map +1 -0
- package/dist/tui/RouterApp.js +928 -0
- package/dist/tui/RouterApp.js.map +1 -0
- package/dist/tui/SearchApp.d.ts.map +1 -1
- package/dist/tui/SearchApp.js +27 -6
- package/dist/tui/SearchApp.js.map +1 -1
- package/dist/tui/shared/modal-controller.d.ts +65 -0
- package/dist/tui/shared/modal-controller.d.ts.map +1 -0
- package/dist/tui/shared/modal-controller.js +625 -0
- package/dist/tui/shared/modal-controller.js.map +1 -0
- package/dist/tui/shared/overlay-utils.d.ts +7 -0
- package/dist/tui/shared/overlay-utils.d.ts.map +1 -0
- package/dist/tui/shared/overlay-utils.js +54 -0
- package/dist/tui/shared/overlay-utils.js.map +1 -0
- package/dist/types/admin-config.d.ts +15 -2
- package/dist/types/admin-config.d.ts.map +1 -1
- package/dist/types/model-info.d.ts +5 -0
- package/dist/types/model-info.d.ts.map +1 -1
- package/dist/types/router-config.d.ts +2 -2
- package/dist/types/router-config.d.ts.map +1 -1
- package/dist/types/server-config.d.ts +8 -0
- package/dist/types/server-config.d.ts.map +1 -1
- package/dist/types/server-config.js +25 -0
- package/dist/types/server-config.js.map +1 -1
- package/dist/utils/http-log-filter.d.ts +10 -0
- package/dist/utils/http-log-filter.d.ts.map +1 -0
- package/dist/utils/http-log-filter.js +84 -0
- package/dist/utils/http-log-filter.js.map +1 -0
- package/dist/utils/log-parser.d.ts.map +1 -1
- package/dist/utils/log-parser.js +7 -4
- package/dist/utils/log-parser.js.map +1 -1
- package/dist/utils/log-utils.d.ts +59 -4
- package/dist/utils/log-utils.d.ts.map +1 -1
- package/dist/utils/log-utils.js +150 -11
- package/dist/utils/log-utils.js.map +1 -1
- package/dist/utils/shard-utils.d.ts +72 -0
- package/dist/utils/shard-utils.d.ts.map +1 -0
- package/dist/utils/shard-utils.js +168 -0
- package/dist/utils/shard-utils.js.map +1 -0
- package/package.json +18 -4
- package/src/launchers/llamacpp-admin +8 -0
- package/src/launchers/llamacpp-router +8 -0
- package/src/launchers/llamacpp-server +8 -0
- package/web/dist/assets/index-Byhoy86V.css +1 -0
- package/web/dist/assets/index-HSrgvray.js +50 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-Bin89Lwr.css +0 -1
- package/web/dist/assets/index-CVmonw3T.js +0 -17
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type AllLogInfo } from '../utils/log-utils';
|
|
2
|
+
type LogType = 'server' | 'router' | 'admin';
|
|
3
|
+
type StreamType = 'stdout' | 'stderr' | 'httpLog';
|
|
4
|
+
/**
|
|
5
|
+
* Log Management Service
|
|
6
|
+
* Core business logic for managing log files across all services
|
|
7
|
+
*/
|
|
8
|
+
declare class LogManagementService {
|
|
9
|
+
/**
|
|
10
|
+
* Scan all log files and return comprehensive information
|
|
11
|
+
*/
|
|
12
|
+
scanAllLogs(): Promise<AllLogInfo>;
|
|
13
|
+
/**
|
|
14
|
+
* Rotate log files with timestamp
|
|
15
|
+
* Returns array of archived file paths
|
|
16
|
+
*/
|
|
17
|
+
rotateLogs(type: LogType, serverId: string | undefined, streams: StreamType[]): Promise<string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Clear all archived logs for a specific service
|
|
20
|
+
* @param serviceId Server ID, 'router', or 'admin'
|
|
21
|
+
*/
|
|
22
|
+
clearArchivedLogs(serviceId: string): Promise<{
|
|
23
|
+
count: number;
|
|
24
|
+
totalSize: number;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Auto-rotate log files if they exceed threshold
|
|
28
|
+
*/
|
|
29
|
+
autoRotateIfNeeded(stdoutPath: string, stderrPath: string, thresholdMB: number): Promise<{
|
|
30
|
+
rotated: boolean;
|
|
31
|
+
files: string[];
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Delete archived logs older than specified days
|
|
35
|
+
*/
|
|
36
|
+
deleteOldArchivedLogs(afterDays: number): Promise<{
|
|
37
|
+
count: number;
|
|
38
|
+
totalSize: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Helper: Get log file prefix based on type and server ID
|
|
42
|
+
*/
|
|
43
|
+
private getLogPrefix;
|
|
44
|
+
/**
|
|
45
|
+
* Helper: Get full log file path
|
|
46
|
+
*/
|
|
47
|
+
private getLogPath;
|
|
48
|
+
}
|
|
49
|
+
export declare const logManagementService: LogManagementService;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=log-management-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-management-service.d.ts","sourceRoot":"","sources":["../../src/lib/log-management-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAE5B,KAAK,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC7C,KAAK,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD;;;GAGG;AACH,cAAM,oBAAoB;IACxB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IAKxC;;;OAGG;IACG,UAAU,CACd,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,UAAU,EAAE,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBpB;;;OAGG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAClD,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAKF;;OAEG;IACG,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAIjD;;OAEG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QACtD,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAIF;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,UAAU;CAUnB;AAGD,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
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.logManagementService = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
39
|
+
const log_utils_1 = require("../utils/log-utils");
|
|
40
|
+
/**
|
|
41
|
+
* Log Management Service
|
|
42
|
+
* Core business logic for managing log files across all services
|
|
43
|
+
*/
|
|
44
|
+
class LogManagementService {
|
|
45
|
+
/**
|
|
46
|
+
* Scan all log files and return comprehensive information
|
|
47
|
+
*/
|
|
48
|
+
async scanAllLogs() {
|
|
49
|
+
return await (0, log_utils_1.getAllLogInfo)();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Rotate log files with timestamp
|
|
53
|
+
* Returns array of archived file paths
|
|
54
|
+
*/
|
|
55
|
+
async rotateLogs(type, serverId, streams) {
|
|
56
|
+
const logsDir = (0, file_utils_1.getLogsDir)();
|
|
57
|
+
const prefix = this.getLogPrefix(type, serverId);
|
|
58
|
+
const archivedFiles = [];
|
|
59
|
+
for (const stream of streams) {
|
|
60
|
+
const logPath = this.getLogPath(logsDir, prefix, stream);
|
|
61
|
+
try {
|
|
62
|
+
const archivedPath = await (0, log_utils_1.rotateLogFile)(logPath);
|
|
63
|
+
archivedFiles.push(archivedPath);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Skip empty files or missing files (error thrown by rotateLogFile)
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return archivedFiles;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Clear all archived logs for a specific service
|
|
74
|
+
* @param serviceId Server ID, 'router', or 'admin'
|
|
75
|
+
*/
|
|
76
|
+
async clearArchivedLogs(serviceId) {
|
|
77
|
+
return await (0, log_utils_1.deleteArchivedLogs)(serviceId);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Auto-rotate log files if they exceed threshold
|
|
81
|
+
*/
|
|
82
|
+
async autoRotateIfNeeded(stdoutPath, stderrPath, thresholdMB) {
|
|
83
|
+
return await (0, log_utils_1.autoRotateIfNeeded)(stdoutPath, stderrPath, thresholdMB);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Delete archived logs older than specified days
|
|
87
|
+
*/
|
|
88
|
+
async deleteOldArchivedLogs(afterDays) {
|
|
89
|
+
return await (0, log_utils_1.deleteOldArchivedLogs)(afterDays);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Helper: Get log file prefix based on type and server ID
|
|
93
|
+
*/
|
|
94
|
+
getLogPrefix(type, serverId) {
|
|
95
|
+
if (type === 'server' && serverId) {
|
|
96
|
+
return serverId;
|
|
97
|
+
}
|
|
98
|
+
else if (type === 'router') {
|
|
99
|
+
return 'router';
|
|
100
|
+
}
|
|
101
|
+
else if (type === 'admin') {
|
|
102
|
+
return 'admin';
|
|
103
|
+
}
|
|
104
|
+
throw new Error('Invalid log type or missing server ID');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Helper: Get full log file path
|
|
108
|
+
*/
|
|
109
|
+
getLogPath(logsDir, prefix, stream) {
|
|
110
|
+
if (stream === 'stdout') {
|
|
111
|
+
return path.join(logsDir, `${prefix}.stdout`);
|
|
112
|
+
}
|
|
113
|
+
else if (stream === 'stderr') {
|
|
114
|
+
return path.join(logsDir, `${prefix}.stderr`);
|
|
115
|
+
}
|
|
116
|
+
else if (stream === 'httpLog') {
|
|
117
|
+
return path.join(logsDir, `${prefix}.http`);
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Invalid stream type: ${stream}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Export singleton instance
|
|
123
|
+
exports.logManagementService = new LogManagementService();
|
|
124
|
+
//# sourceMappingURL=log-management-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-management-service.js","sourceRoot":"","sources":["../../src/lib/log-management-service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,oDAAiD;AACjD,kDAO4B;AAK5B;;;GAGG;AACH,MAAM,oBAAoB;IACxB;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,MAAM,IAAA,yBAAa,GAAE,CAAC;IAC/B,CAAC;IAGD;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,IAAa,EACb,QAA4B,EAC5B,OAAqB;QAErB,MAAM,OAAO,GAAG,IAAA,uBAAU,GAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAA,yBAAa,EAAC,OAAO,CAAC,CAAC;gBAClD,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,oEAAoE;gBACpE,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QAIvC,OAAO,MAAM,IAAA,8BAAkB,EAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAGD;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,UAAkB,EAClB,UAAkB,EAClB,WAAmB;QAEnB,OAAO,MAAM,IAAA,8BAAuB,EAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAI3C,OAAO,MAAM,IAAA,iCAA0B,EAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,IAAa,EAAE,QAA4B;QAC9D,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAe,EAAE,MAAc,EAAE,MAAkB;QACpE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;CACF;AAED,4BAA4B;AACf,QAAA,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { LogManagementConfig } from '../types/admin-config';
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Rotate Worker
|
|
4
|
+
* Automatically rotates log files exceeding size threshold
|
|
5
|
+
*/
|
|
6
|
+
export declare class AutoRotateWorker {
|
|
7
|
+
private config;
|
|
8
|
+
private intervalId?;
|
|
9
|
+
private lastRun?;
|
|
10
|
+
constructor(config: LogManagementConfig['autoRotate']);
|
|
11
|
+
/**
|
|
12
|
+
* Start the auto-rotation worker
|
|
13
|
+
*/
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Stop the auto-rotation worker
|
|
17
|
+
*/
|
|
18
|
+
stop(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Restart the worker with new configuration
|
|
21
|
+
*/
|
|
22
|
+
restart(newConfig: LogManagementConfig['autoRotate']): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Check if worker is running
|
|
25
|
+
*/
|
|
26
|
+
isRunning(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get last run timestamp
|
|
29
|
+
*/
|
|
30
|
+
getLastRun(): Date | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Run rotation check for all services
|
|
33
|
+
*/
|
|
34
|
+
private runRotationCheck;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Auto-Delete Worker
|
|
38
|
+
* Automatically deletes archived log files older than threshold
|
|
39
|
+
*/
|
|
40
|
+
export declare class AutoDeleteWorker {
|
|
41
|
+
private config;
|
|
42
|
+
private intervalId?;
|
|
43
|
+
private lastRun?;
|
|
44
|
+
constructor(config: LogManagementConfig['autoDelete']);
|
|
45
|
+
/**
|
|
46
|
+
* Start the auto-deletion worker
|
|
47
|
+
*/
|
|
48
|
+
start(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Stop the auto-deletion worker
|
|
51
|
+
*/
|
|
52
|
+
stop(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Restart the worker with new configuration
|
|
55
|
+
*/
|
|
56
|
+
restart(newConfig: LogManagementConfig['autoDelete']): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Check if worker is running
|
|
59
|
+
*/
|
|
60
|
+
isRunning(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get last run timestamp
|
|
63
|
+
*/
|
|
64
|
+
getLastRun(): Date | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Run deletion check for old archived logs
|
|
67
|
+
*/
|
|
68
|
+
private runDeletionCheck;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=log-workers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-workers.d.ts","sourceRoot":"","sources":["../../src/lib/log-workers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKjE;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAO;gBAEX,MAAM,EAAE,mBAAmB,CAAC,YAAY,CAAC;IAIrD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,IAAI,IAAI,GAAG,SAAS;IAI9B;;OAEG;YACW,gBAAgB;CA8D/B;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAO;gBAEX,MAAM,EAAE,mBAAmB,CAAC,YAAY,CAAC;IAIrD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,IAAI,IAAI,GAAG,SAAS;IAI9B;;OAEG;YACW,gBAAgB;CAmB/B"}
|
|
@@ -0,0 +1,217 @@
|
|
|
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.AutoDeleteWorker = exports.AutoRotateWorker = void 0;
|
|
37
|
+
const log_management_service_1 = require("./log-management-service");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
40
|
+
const log_utils_1 = require("../utils/log-utils");
|
|
41
|
+
/**
|
|
42
|
+
* Auto-Rotate Worker
|
|
43
|
+
* Automatically rotates log files exceeding size threshold
|
|
44
|
+
*/
|
|
45
|
+
class AutoRotateWorker {
|
|
46
|
+
constructor(config) {
|
|
47
|
+
this.config = config;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Start the auto-rotation worker
|
|
51
|
+
*/
|
|
52
|
+
async start() {
|
|
53
|
+
if (this.intervalId) {
|
|
54
|
+
console.error('[AutoRotate] Worker already running');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
console.error(`[AutoRotate] Starting worker (interval: ${this.config.intervalHours}h, threshold: ${this.config.thresholdMB}MB)`);
|
|
58
|
+
// Set up interval
|
|
59
|
+
const intervalMs = this.config.intervalHours * 60 * 60 * 1000;
|
|
60
|
+
this.intervalId = setInterval(async () => {
|
|
61
|
+
await this.runRotationCheck();
|
|
62
|
+
}, intervalMs);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Stop the auto-rotation worker
|
|
66
|
+
*/
|
|
67
|
+
async stop() {
|
|
68
|
+
if (this.intervalId) {
|
|
69
|
+
clearInterval(this.intervalId);
|
|
70
|
+
this.intervalId = undefined;
|
|
71
|
+
console.error('[AutoRotate] Worker stopped');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Restart the worker with new configuration
|
|
76
|
+
*/
|
|
77
|
+
async restart(newConfig) {
|
|
78
|
+
await this.stop();
|
|
79
|
+
this.config = newConfig;
|
|
80
|
+
await this.start();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if worker is running
|
|
84
|
+
*/
|
|
85
|
+
isRunning() {
|
|
86
|
+
return this.intervalId !== undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get last run timestamp
|
|
90
|
+
*/
|
|
91
|
+
getLastRun() {
|
|
92
|
+
return this.lastRun;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run rotation check for all services
|
|
96
|
+
*/
|
|
97
|
+
async runRotationCheck() {
|
|
98
|
+
try {
|
|
99
|
+
console.error(`[AutoRotate] Running rotation check (threshold: ${this.config.thresholdMB}MB)...`);
|
|
100
|
+
const allLogs = await log_management_service_1.logManagementService.scanAllLogs();
|
|
101
|
+
const logsDir = (0, file_utils_1.getLogsDir)();
|
|
102
|
+
let totalRotated = 0;
|
|
103
|
+
// Check server logs
|
|
104
|
+
for (const server of allLogs.servers) {
|
|
105
|
+
const stdoutPath = path.join(logsDir, `${server.serverId}.stdout`);
|
|
106
|
+
const stderrPath = path.join(logsDir, `${server.serverId}.stderr`);
|
|
107
|
+
const result = await log_management_service_1.logManagementService.autoRotateIfNeeded(stdoutPath, stderrPath, this.config.thresholdMB);
|
|
108
|
+
if (result.rotated) {
|
|
109
|
+
console.error(`[AutoRotate] Rotated ${result.files.length} log(s) for server ${server.serverId}`);
|
|
110
|
+
totalRotated += result.files.length;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Check router logs
|
|
114
|
+
const routerStdout = path.join(logsDir, 'router.stdout');
|
|
115
|
+
const routerStderr = path.join(logsDir, 'router.stderr');
|
|
116
|
+
const routerResult = await log_management_service_1.logManagementService.autoRotateIfNeeded(routerStdout, routerStderr, this.config.thresholdMB);
|
|
117
|
+
if (routerResult.rotated) {
|
|
118
|
+
console.error(`[AutoRotate] Rotated ${routerResult.files.length} log(s) for router`);
|
|
119
|
+
totalRotated += routerResult.files.length;
|
|
120
|
+
}
|
|
121
|
+
// Check admin logs
|
|
122
|
+
const adminStdout = path.join(logsDir, 'admin.stdout');
|
|
123
|
+
const adminStderr = path.join(logsDir, 'admin.stderr');
|
|
124
|
+
const adminResult = await log_management_service_1.logManagementService.autoRotateIfNeeded(adminStdout, adminStderr, this.config.thresholdMB);
|
|
125
|
+
if (adminResult.rotated) {
|
|
126
|
+
console.error(`[AutoRotate] Rotated ${adminResult.files.length} log(s) for admin`);
|
|
127
|
+
totalRotated += adminResult.files.length;
|
|
128
|
+
}
|
|
129
|
+
if (totalRotated > 0) {
|
|
130
|
+
console.error(`[AutoRotate] Rotation complete: ${totalRotated} log file(s) rotated`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.error('[AutoRotate] No logs exceeded threshold');
|
|
134
|
+
}
|
|
135
|
+
this.lastRun = new Date();
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.error(`[AutoRotate] Error during rotation check: ${error.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.AutoRotateWorker = AutoRotateWorker;
|
|
143
|
+
/**
|
|
144
|
+
* Auto-Delete Worker
|
|
145
|
+
* Automatically deletes archived log files older than threshold
|
|
146
|
+
*/
|
|
147
|
+
class AutoDeleteWorker {
|
|
148
|
+
constructor(config) {
|
|
149
|
+
this.config = config;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Start the auto-deletion worker
|
|
153
|
+
*/
|
|
154
|
+
async start() {
|
|
155
|
+
if (this.intervalId) {
|
|
156
|
+
console.error('[AutoDelete] Worker already running');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
console.error(`[AutoDelete] Starting worker (interval: ${this.config.intervalHours}h, delete after: ${this.config.afterDays} days)`);
|
|
160
|
+
// Set up interval
|
|
161
|
+
const intervalMs = this.config.intervalHours * 60 * 60 * 1000;
|
|
162
|
+
this.intervalId = setInterval(async () => {
|
|
163
|
+
await this.runDeletionCheck();
|
|
164
|
+
}, intervalMs);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Stop the auto-deletion worker
|
|
168
|
+
*/
|
|
169
|
+
async stop() {
|
|
170
|
+
if (this.intervalId) {
|
|
171
|
+
clearInterval(this.intervalId);
|
|
172
|
+
this.intervalId = undefined;
|
|
173
|
+
console.error('[AutoDelete] Worker stopped');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Restart the worker with new configuration
|
|
178
|
+
*/
|
|
179
|
+
async restart(newConfig) {
|
|
180
|
+
await this.stop();
|
|
181
|
+
this.config = newConfig;
|
|
182
|
+
await this.start();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if worker is running
|
|
186
|
+
*/
|
|
187
|
+
isRunning() {
|
|
188
|
+
return this.intervalId !== undefined;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get last run timestamp
|
|
192
|
+
*/
|
|
193
|
+
getLastRun() {
|
|
194
|
+
return this.lastRun;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Run deletion check for old archived logs
|
|
198
|
+
*/
|
|
199
|
+
async runDeletionCheck() {
|
|
200
|
+
try {
|
|
201
|
+
console.error(`[AutoDelete] Running deletion check (delete logs older than ${this.config.afterDays} days)...`);
|
|
202
|
+
const result = await log_management_service_1.logManagementService.deleteOldArchivedLogs(this.config.afterDays);
|
|
203
|
+
if (result.count > 0) {
|
|
204
|
+
console.error(`[AutoDelete] Deleted ${result.count} archived log file(s), freed ${(0, log_utils_1.formatFileSize)(result.totalSize)}`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
console.error('[AutoDelete] No old archived logs found');
|
|
208
|
+
}
|
|
209
|
+
this.lastRun = new Date();
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error(`[AutoDelete] Error during deletion check: ${error.message}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.AutoDeleteWorker = AutoDeleteWorker;
|
|
217
|
+
//# sourceMappingURL=log-workers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-workers.js","sourceRoot":"","sources":["../../src/lib/log-workers.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,9 +40,17 @@ export declare class ModelDownloader {
|
|
|
40
40
|
*/
|
|
41
41
|
private displayProgress;
|
|
42
42
|
/**
|
|
43
|
-
* Download a model from Hugging Face
|
|
43
|
+
* Download a model from Hugging Face (automatically handles sharded models)
|
|
44
44
|
*/
|
|
45
45
|
downloadModel(repoId: string, filename: string, onProgress?: (progress: DownloadProgress) => void, modelsDir?: string, options?: DownloadOptions): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Download a single-file (non-sharded) model
|
|
48
|
+
*/
|
|
49
|
+
private downloadSingleFile;
|
|
50
|
+
/**
|
|
51
|
+
* Download a sharded model (multiple files)
|
|
52
|
+
*/
|
|
53
|
+
private downloadShardedModel;
|
|
46
54
|
/**
|
|
47
55
|
* List GGUF files in a Hugging Face repository
|
|
48
56
|
* (This would require calling the HF API - simplified for now)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-downloader.d.ts","sourceRoot":"","sources":["../../src/lib/model-downloader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-downloader.d.ts","sourceRoot":"","sources":["../../src/lib/model-downloader.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAwB;gBAEnC,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC;IAKtE;;OAEG;YACW,kBAAkB;IAUhC;;;;;OAKG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IActE;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,MAAM;IAI3E;;OAEG;IACH,OAAO,CAAC,YAAY;IAgIpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,EACjD,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC;IA2BlB;;OAEG;YACW,kBAAkB;IAuFhC;;OAEG;YACW,oBAAoB;IAmGlC;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAKvD;AAMD,wBAAgB,kBAAkB,IAAI,eAAe,CAOpD;AAGD,eAAO,MAAM,eAAe,iBAAuB,CAAC"}
|
|
@@ -44,6 +44,8 @@ const path = __importStar(require("path"));
|
|
|
44
44
|
const chalk_1 = __importDefault(require("chalk"));
|
|
45
45
|
const file_utils_1 = require("../utils/file-utils");
|
|
46
46
|
const format_utils_1 = require("../utils/format-utils");
|
|
47
|
+
const shard_utils_1 = require("../utils/shard-utils");
|
|
48
|
+
const model_search_1 = require("./model-search");
|
|
47
49
|
class ModelDownloader {
|
|
48
50
|
constructor(modelsDir, getModelsDirFn) {
|
|
49
51
|
this.modelsDir = modelsDir;
|
|
@@ -219,9 +221,25 @@ class ModelDownloader {
|
|
|
219
221
|
process.stdout.write(chalk_1.default.blue(`[${bar}] ${percentFormatted}% | ${downloadedFormatted} / ${totalFormatted}`));
|
|
220
222
|
}
|
|
221
223
|
/**
|
|
222
|
-
* Download a model from Hugging Face
|
|
224
|
+
* Download a model from Hugging Face (automatically handles sharded models)
|
|
223
225
|
*/
|
|
224
226
|
async downloadModel(repoId, filename, onProgress, modelsDir, options) {
|
|
227
|
+
// Detect if this is a sharded model
|
|
228
|
+
const basename = path.basename(filename);
|
|
229
|
+
const shardInfo = (0, shard_utils_1.parseShardFilename)(basename);
|
|
230
|
+
if (shardInfo.isSharded) {
|
|
231
|
+
// Multi-file download
|
|
232
|
+
return await this.downloadShardedModel(repoId, filename, shardInfo, onProgress, modelsDir, options);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// Single-file download
|
|
236
|
+
return await this.downloadSingleFile(repoId, filename, onProgress, modelsDir, options);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Download a single-file (non-sharded) model
|
|
241
|
+
*/
|
|
242
|
+
async downloadSingleFile(repoId, filename, onProgress, modelsDir, options) {
|
|
225
243
|
const silent = options?.silent ?? false;
|
|
226
244
|
const signal = options?.signal;
|
|
227
245
|
// Use provided models directory or get from config
|
|
@@ -234,6 +252,12 @@ class ModelDownloader {
|
|
|
234
252
|
}
|
|
235
253
|
// Build download URL
|
|
236
254
|
const url = this.buildDownloadUrl(repoId, filename);
|
|
255
|
+
// Create subdirectory if filename includes path (e.g., "Q8_0/Model.gguf")
|
|
256
|
+
const subdirPath = path.dirname(filename);
|
|
257
|
+
if (subdirPath && subdirPath !== '.') {
|
|
258
|
+
const fullSubdirPath = path.join(targetDir, subdirPath);
|
|
259
|
+
await fs.promises.mkdir(fullSubdirPath, { recursive: true });
|
|
260
|
+
}
|
|
237
261
|
const destPath = path.join(targetDir, filename);
|
|
238
262
|
// Check if file already exists
|
|
239
263
|
if (fs.existsSync(destPath)) {
|
|
@@ -281,6 +305,79 @@ class ModelDownloader {
|
|
|
281
305
|
}
|
|
282
306
|
return destPath;
|
|
283
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Download a sharded model (multiple files)
|
|
310
|
+
*/
|
|
311
|
+
async downloadShardedModel(repoId, firstShardFilename, shardInfo, onProgress, modelsDir, options) {
|
|
312
|
+
const silent = options?.silent ?? false;
|
|
313
|
+
const signal = options?.signal;
|
|
314
|
+
const targetDir = modelsDir || await this.getModelsDirectory();
|
|
315
|
+
if (!silent) {
|
|
316
|
+
console.log(chalk_1.default.blue(`š¦ Downloading sharded model: ${shardInfo.baseModelName}`));
|
|
317
|
+
console.log(chalk_1.default.dim(`Repository: ${repoId}`));
|
|
318
|
+
console.log(chalk_1.default.dim(`Shards: ${shardInfo.shardCount} files`));
|
|
319
|
+
console.log(chalk_1.default.dim(`Destination: ${targetDir}`));
|
|
320
|
+
console.log();
|
|
321
|
+
}
|
|
322
|
+
// Get all files in the repository
|
|
323
|
+
const allFiles = await model_search_1.modelSearch.getModelFiles(repoId);
|
|
324
|
+
// Filter to matching shards
|
|
325
|
+
const shardFiles = allFiles
|
|
326
|
+
.filter(f => shardInfo.shardPattern.test(path.basename(f)))
|
|
327
|
+
.sort();
|
|
328
|
+
// Validate count
|
|
329
|
+
if (shardFiles.length !== shardInfo.shardCount) {
|
|
330
|
+
throw new Error(`Shard count mismatch: expected ${shardInfo.shardCount}, found ${shardFiles.length} in repository`);
|
|
331
|
+
}
|
|
332
|
+
if (!silent) {
|
|
333
|
+
console.log(chalk_1.default.cyan(`Found all ${shardFiles.length} shard files:`));
|
|
334
|
+
shardFiles.forEach((file, idx) => {
|
|
335
|
+
console.log(chalk_1.default.dim(` [${idx + 1}/${shardFiles.length}] ${path.basename(file)}`));
|
|
336
|
+
});
|
|
337
|
+
console.log();
|
|
338
|
+
}
|
|
339
|
+
// Track downloaded shards for cleanup on error
|
|
340
|
+
const downloadedPaths = [];
|
|
341
|
+
try {
|
|
342
|
+
// Download each shard sequentially
|
|
343
|
+
for (let i = 0; i < shardFiles.length; i++) {
|
|
344
|
+
const shardFile = shardFiles[i];
|
|
345
|
+
const shardBasename = path.basename(shardFile);
|
|
346
|
+
if (!silent) {
|
|
347
|
+
console.log(chalk_1.default.blue(`ā¬ļø Downloading shard ${i + 1}/${shardFiles.length}: ${shardBasename}`));
|
|
348
|
+
}
|
|
349
|
+
// Download this shard
|
|
350
|
+
const destPath = await this.downloadSingleFile(repoId, shardFile, onProgress, modelsDir, { silent: true, signal } // Suppress per-file output
|
|
351
|
+
);
|
|
352
|
+
downloadedPaths.push(destPath);
|
|
353
|
+
if (!silent) {
|
|
354
|
+
console.log(chalk_1.default.green(`ā
Shard ${i + 1}/${shardFiles.length} complete\n`));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (!silent) {
|
|
358
|
+
console.log(chalk_1.default.green.bold('š All shards downloaded successfully!'));
|
|
359
|
+
console.log(chalk_1.default.dim(` Location: ${path.dirname(downloadedPaths[0])}`));
|
|
360
|
+
console.log(chalk_1.default.dim(` Files: ${downloadedPaths.length}`));
|
|
361
|
+
}
|
|
362
|
+
// Return path to first shard (used by llama-server)
|
|
363
|
+
return downloadedPaths[0];
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
// Cleanup partial downloads
|
|
367
|
+
if (!silent) {
|
|
368
|
+
console.log(chalk_1.default.yellow('\nā ļø Download failed, cleaning up partial files...'));
|
|
369
|
+
}
|
|
370
|
+
for (const downloadedPath of downloadedPaths) {
|
|
371
|
+
try {
|
|
372
|
+
await fs.promises.unlink(downloadedPath);
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
// Ignore cleanup errors
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
throw error;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
284
381
|
/**
|
|
285
382
|
* List GGUF files in a Hugging Face repository
|
|
286
383
|
* (This would require calling the HF API - simplified for now)
|