@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.
Files changed (230) hide show
  1. package/README.md +276 -280
  2. package/dist/cli.js +133 -23
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/admin/config.d.ts +1 -1
  5. package/dist/commands/admin/config.js +5 -5
  6. package/dist/commands/admin/config.js.map +1 -1
  7. package/dist/commands/admin/log-config.d.ts +11 -0
  8. package/dist/commands/admin/log-config.d.ts.map +1 -0
  9. package/dist/commands/admin/log-config.js +159 -0
  10. package/dist/commands/admin/log-config.js.map +1 -0
  11. package/dist/commands/admin/logs.d.ts +2 -3
  12. package/dist/commands/admin/logs.d.ts.map +1 -1
  13. package/dist/commands/admin/logs.js +6 -48
  14. package/dist/commands/admin/logs.js.map +1 -1
  15. package/dist/commands/admin/status.d.ts.map +1 -1
  16. package/dist/commands/admin/status.js +1 -0
  17. package/dist/commands/admin/status.js.map +1 -1
  18. package/dist/commands/config.d.ts +1 -0
  19. package/dist/commands/config.d.ts.map +1 -1
  20. package/dist/commands/config.js +63 -196
  21. package/dist/commands/config.js.map +1 -1
  22. package/dist/commands/create.d.ts +3 -2
  23. package/dist/commands/create.d.ts.map +1 -1
  24. package/dist/commands/create.js +24 -97
  25. package/dist/commands/create.js.map +1 -1
  26. package/dist/commands/delete.d.ts.map +1 -1
  27. package/dist/commands/delete.js +7 -24
  28. package/dist/commands/delete.js.map +1 -1
  29. package/dist/commands/internal/server-wrapper.d.ts +15 -0
  30. package/dist/commands/internal/server-wrapper.d.ts.map +1 -0
  31. package/dist/commands/internal/server-wrapper.js +126 -0
  32. package/dist/commands/internal/server-wrapper.js.map +1 -0
  33. package/dist/commands/logs-all.d.ts +0 -2
  34. package/dist/commands/logs-all.d.ts.map +1 -1
  35. package/dist/commands/logs-all.js +1 -61
  36. package/dist/commands/logs-all.js.map +1 -1
  37. package/dist/commands/logs.d.ts +2 -5
  38. package/dist/commands/logs.d.ts.map +1 -1
  39. package/dist/commands/logs.js +104 -120
  40. package/dist/commands/logs.js.map +1 -1
  41. package/dist/commands/migrate-labels.d.ts +12 -0
  42. package/dist/commands/migrate-labels.d.ts.map +1 -0
  43. package/dist/commands/migrate-labels.js +160 -0
  44. package/dist/commands/migrate-labels.js.map +1 -0
  45. package/dist/commands/ps.d.ts.map +1 -1
  46. package/dist/commands/ps.js +2 -1
  47. package/dist/commands/ps.js.map +1 -1
  48. package/dist/commands/rm.d.ts.map +1 -1
  49. package/dist/commands/rm.js +22 -48
  50. package/dist/commands/rm.js.map +1 -1
  51. package/dist/commands/router/config.d.ts +1 -1
  52. package/dist/commands/router/config.js +6 -6
  53. package/dist/commands/router/config.js.map +1 -1
  54. package/dist/commands/router/logs.d.ts +2 -4
  55. package/dist/commands/router/logs.d.ts.map +1 -1
  56. package/dist/commands/router/logs.js +34 -189
  57. package/dist/commands/router/logs.js.map +1 -1
  58. package/dist/commands/router/status.d.ts.map +1 -1
  59. package/dist/commands/router/status.js +1 -0
  60. package/dist/commands/router/status.js.map +1 -1
  61. package/dist/commands/server-show.d.ts.map +1 -1
  62. package/dist/commands/server-show.js +3 -0
  63. package/dist/commands/server-show.js.map +1 -1
  64. package/dist/commands/start.d.ts.map +1 -1
  65. package/dist/commands/start.js +21 -72
  66. package/dist/commands/start.js.map +1 -1
  67. package/dist/commands/stop.d.ts.map +1 -1
  68. package/dist/commands/stop.js +10 -26
  69. package/dist/commands/stop.js.map +1 -1
  70. package/dist/launchers/llamacpp-admin +8 -0
  71. package/dist/launchers/llamacpp-router +8 -0
  72. package/dist/launchers/llamacpp-server +8 -0
  73. package/dist/lib/admin-manager.d.ts +4 -0
  74. package/dist/lib/admin-manager.d.ts.map +1 -1
  75. package/dist/lib/admin-manager.js +42 -18
  76. package/dist/lib/admin-manager.js.map +1 -1
  77. package/dist/lib/admin-server.d.ts +48 -1
  78. package/dist/lib/admin-server.d.ts.map +1 -1
  79. package/dist/lib/admin-server.js +632 -238
  80. package/dist/lib/admin-server.js.map +1 -1
  81. package/dist/lib/config-generator.d.ts +1 -0
  82. package/dist/lib/config-generator.d.ts.map +1 -1
  83. package/dist/lib/config-generator.js +12 -5
  84. package/dist/lib/config-generator.js.map +1 -1
  85. package/dist/lib/keyboard-manager.d.ts +162 -0
  86. package/dist/lib/keyboard-manager.d.ts.map +1 -0
  87. package/dist/lib/keyboard-manager.js +247 -0
  88. package/dist/lib/keyboard-manager.js.map +1 -0
  89. package/dist/lib/label-migration.d.ts +65 -0
  90. package/dist/lib/label-migration.d.ts.map +1 -0
  91. package/dist/lib/label-migration.js +458 -0
  92. package/dist/lib/label-migration.js.map +1 -0
  93. package/dist/lib/launchctl-manager.d.ts +9 -0
  94. package/dist/lib/launchctl-manager.d.ts.map +1 -1
  95. package/dist/lib/launchctl-manager.js +65 -19
  96. package/dist/lib/launchctl-manager.js.map +1 -1
  97. package/dist/lib/log-management-service.d.ts +51 -0
  98. package/dist/lib/log-management-service.d.ts.map +1 -0
  99. package/dist/lib/log-management-service.js +124 -0
  100. package/dist/lib/log-management-service.js.map +1 -0
  101. package/dist/lib/log-workers.d.ts +70 -0
  102. package/dist/lib/log-workers.d.ts.map +1 -0
  103. package/dist/lib/log-workers.js +217 -0
  104. package/dist/lib/log-workers.js.map +1 -0
  105. package/dist/lib/model-downloader.d.ts +9 -1
  106. package/dist/lib/model-downloader.d.ts.map +1 -1
  107. package/dist/lib/model-downloader.js +98 -1
  108. package/dist/lib/model-downloader.js.map +1 -1
  109. package/dist/lib/model-management-service.d.ts +60 -0
  110. package/dist/lib/model-management-service.d.ts.map +1 -0
  111. package/dist/lib/model-management-service.js +246 -0
  112. package/dist/lib/model-management-service.js.map +1 -0
  113. package/dist/lib/model-management-service.test.d.ts +2 -0
  114. package/dist/lib/model-management-service.test.d.ts.map +1 -0
  115. package/dist/lib/model-management-service.test.js.map +1 -0
  116. package/dist/lib/model-scanner.d.ts +15 -3
  117. package/dist/lib/model-scanner.d.ts.map +1 -1
  118. package/dist/lib/model-scanner.js +174 -17
  119. package/dist/lib/model-scanner.js.map +1 -1
  120. package/dist/lib/openapi-spec.d.ts +1335 -0
  121. package/dist/lib/openapi-spec.d.ts.map +1 -0
  122. package/dist/lib/openapi-spec.js +1017 -0
  123. package/dist/lib/openapi-spec.js.map +1 -0
  124. package/dist/lib/router-logger.d.ts +1 -1
  125. package/dist/lib/router-logger.d.ts.map +1 -1
  126. package/dist/lib/router-logger.js +13 -11
  127. package/dist/lib/router-logger.js.map +1 -1
  128. package/dist/lib/router-manager.d.ts +4 -0
  129. package/dist/lib/router-manager.d.ts.map +1 -1
  130. package/dist/lib/router-manager.js +30 -18
  131. package/dist/lib/router-manager.js.map +1 -1
  132. package/dist/lib/router-server.d.ts +4 -7
  133. package/dist/lib/router-server.d.ts.map +1 -1
  134. package/dist/lib/router-server.js +71 -182
  135. package/dist/lib/router-server.js.map +1 -1
  136. package/dist/lib/server-config-service.d.ts +51 -0
  137. package/dist/lib/server-config-service.d.ts.map +1 -0
  138. package/dist/lib/server-config-service.js +310 -0
  139. package/dist/lib/server-config-service.js.map +1 -0
  140. package/dist/lib/server-config-service.test.d.ts +2 -0
  141. package/dist/lib/server-config-service.test.d.ts.map +1 -0
  142. package/dist/lib/server-config-service.test.js.map +1 -0
  143. package/dist/lib/server-lifecycle-service.d.ts +172 -0
  144. package/dist/lib/server-lifecycle-service.d.ts.map +1 -0
  145. package/dist/lib/server-lifecycle-service.js +619 -0
  146. package/dist/lib/server-lifecycle-service.js.map +1 -0
  147. package/dist/lib/state-manager.d.ts +18 -1
  148. package/dist/lib/state-manager.d.ts.map +1 -1
  149. package/dist/lib/state-manager.js +51 -2
  150. package/dist/lib/state-manager.js.map +1 -1
  151. package/dist/lib/status-checker.d.ts +11 -4
  152. package/dist/lib/status-checker.d.ts.map +1 -1
  153. package/dist/lib/status-checker.js +34 -1
  154. package/dist/lib/status-checker.js.map +1 -1
  155. package/dist/lib/validation-service.d.ts +43 -0
  156. package/dist/lib/validation-service.d.ts.map +1 -0
  157. package/dist/lib/validation-service.js +112 -0
  158. package/dist/lib/validation-service.js.map +1 -0
  159. package/dist/lib/validation-service.test.d.ts +2 -0
  160. package/dist/lib/validation-service.test.d.ts.map +1 -0
  161. package/dist/lib/validation-service.test.js.map +1 -0
  162. package/dist/scripts/http-log-filter.sh +8 -0
  163. package/dist/tui/ConfigApp.d.ts.map +1 -1
  164. package/dist/tui/ConfigApp.js +222 -184
  165. package/dist/tui/ConfigApp.js.map +1 -1
  166. package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
  167. package/dist/tui/HistoricalMonitorApp.js +12 -0
  168. package/dist/tui/HistoricalMonitorApp.js.map +1 -1
  169. package/dist/tui/ModelsApp.d.ts.map +1 -1
  170. package/dist/tui/ModelsApp.js +93 -17
  171. package/dist/tui/ModelsApp.js.map +1 -1
  172. package/dist/tui/MonitorApp.d.ts.map +1 -1
  173. package/dist/tui/MonitorApp.js +1 -3
  174. package/dist/tui/MonitorApp.js.map +1 -1
  175. package/dist/tui/MultiServerMonitorApp.d.ts +3 -3
  176. package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
  177. package/dist/tui/MultiServerMonitorApp.js +724 -508
  178. package/dist/tui/MultiServerMonitorApp.js.map +1 -1
  179. package/dist/tui/RootNavigator.d.ts.map +1 -1
  180. package/dist/tui/RootNavigator.js +17 -1
  181. package/dist/tui/RootNavigator.js.map +1 -1
  182. package/dist/tui/RouterApp.d.ts +6 -0
  183. package/dist/tui/RouterApp.d.ts.map +1 -0
  184. package/dist/tui/RouterApp.js +928 -0
  185. package/dist/tui/RouterApp.js.map +1 -0
  186. package/dist/tui/SearchApp.d.ts.map +1 -1
  187. package/dist/tui/SearchApp.js +27 -6
  188. package/dist/tui/SearchApp.js.map +1 -1
  189. package/dist/tui/shared/modal-controller.d.ts +65 -0
  190. package/dist/tui/shared/modal-controller.d.ts.map +1 -0
  191. package/dist/tui/shared/modal-controller.js +625 -0
  192. package/dist/tui/shared/modal-controller.js.map +1 -0
  193. package/dist/tui/shared/overlay-utils.d.ts +7 -0
  194. package/dist/tui/shared/overlay-utils.d.ts.map +1 -0
  195. package/dist/tui/shared/overlay-utils.js +54 -0
  196. package/dist/tui/shared/overlay-utils.js.map +1 -0
  197. package/dist/types/admin-config.d.ts +15 -2
  198. package/dist/types/admin-config.d.ts.map +1 -1
  199. package/dist/types/model-info.d.ts +5 -0
  200. package/dist/types/model-info.d.ts.map +1 -1
  201. package/dist/types/router-config.d.ts +2 -2
  202. package/dist/types/router-config.d.ts.map +1 -1
  203. package/dist/types/server-config.d.ts +8 -0
  204. package/dist/types/server-config.d.ts.map +1 -1
  205. package/dist/types/server-config.js +25 -0
  206. package/dist/types/server-config.js.map +1 -1
  207. package/dist/utils/http-log-filter.d.ts +10 -0
  208. package/dist/utils/http-log-filter.d.ts.map +1 -0
  209. package/dist/utils/http-log-filter.js +84 -0
  210. package/dist/utils/http-log-filter.js.map +1 -0
  211. package/dist/utils/log-parser.d.ts.map +1 -1
  212. package/dist/utils/log-parser.js +7 -4
  213. package/dist/utils/log-parser.js.map +1 -1
  214. package/dist/utils/log-utils.d.ts +59 -4
  215. package/dist/utils/log-utils.d.ts.map +1 -1
  216. package/dist/utils/log-utils.js +150 -11
  217. package/dist/utils/log-utils.js.map +1 -1
  218. package/dist/utils/shard-utils.d.ts +72 -0
  219. package/dist/utils/shard-utils.d.ts.map +1 -0
  220. package/dist/utils/shard-utils.js +168 -0
  221. package/dist/utils/shard-utils.js.map +1 -0
  222. package/package.json +18 -4
  223. package/src/launchers/llamacpp-admin +8 -0
  224. package/src/launchers/llamacpp-router +8 -0
  225. package/src/launchers/llamacpp-server +8 -0
  226. package/web/dist/assets/index-Byhoy86V.css +1 -0
  227. package/web/dist/assets/index-HSrgvray.js +50 -0
  228. package/web/dist/index.html +2 -2
  229. package/web/dist/assets/index-Bin89Lwr.css +0 -1
  230. 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":"AAOA,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;IAyElB;;;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"}
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)