@appkit/llamacpp-cli 1.9.0 → 1.10.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 +16 -0
- package/README.md +171 -42
- package/dist/cli.js +75 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/completion.d.ts +9 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +83 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/monitor.js +1 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/ps.d.ts +1 -3
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +36 -115
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/router/config.d.ts +1 -0
- package/dist/commands/router/config.d.ts.map +1 -1
- package/dist/commands/router/config.js +7 -2
- package/dist/commands/router/config.js.map +1 -1
- package/dist/commands/router/logs.d.ts +12 -0
- package/dist/commands/router/logs.d.ts.map +1 -0
- package/dist/commands/router/logs.js +238 -0
- package/dist/commands/router/logs.js.map +1 -0
- package/dist/commands/tui.d.ts +2 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +27 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/lib/completion.d.ts +5 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +195 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +5 -1
- package/dist/lib/model-downloader.d.ts.map +1 -1
- package/dist/lib/model-downloader.js +53 -20
- package/dist/lib/model-downloader.js.map +1 -1
- package/dist/lib/router-logger.d.ts +61 -0
- package/dist/lib/router-logger.d.ts.map +1 -0
- package/dist/lib/router-logger.js +200 -0
- package/dist/lib/router-logger.js.map +1 -0
- package/dist/lib/router-manager.d.ts.map +1 -1
- package/dist/lib/router-manager.js +1 -0
- package/dist/lib/router-manager.js.map +1 -1
- package/dist/lib/router-server.d.ts +9 -0
- package/dist/lib/router-server.d.ts.map +1 -1
- package/dist/lib/router-server.js +169 -57
- package/dist/lib/router-server.js.map +1 -1
- package/dist/tui/ConfigApp.d.ts +7 -0
- package/dist/tui/ConfigApp.d.ts.map +1 -0
- package/dist/tui/ConfigApp.js +1002 -0
- package/dist/tui/ConfigApp.js.map +1 -0
- package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
- package/dist/tui/HistoricalMonitorApp.js +85 -49
- package/dist/tui/HistoricalMonitorApp.js.map +1 -1
- package/dist/tui/ModelsApp.d.ts +7 -0
- package/dist/tui/ModelsApp.d.ts.map +1 -0
- package/dist/tui/ModelsApp.js +362 -0
- package/dist/tui/ModelsApp.js.map +1 -0
- package/dist/tui/MultiServerMonitorApp.d.ts +6 -1
- package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
- package/dist/tui/MultiServerMonitorApp.js +1038 -122
- package/dist/tui/MultiServerMonitorApp.js.map +1 -1
- package/dist/tui/RootNavigator.d.ts +7 -0
- package/dist/tui/RootNavigator.d.ts.map +1 -0
- package/dist/tui/RootNavigator.js +55 -0
- package/dist/tui/RootNavigator.js.map +1 -0
- package/dist/tui/SearchApp.d.ts +6 -0
- package/dist/tui/SearchApp.d.ts.map +1 -0
- package/dist/tui/SearchApp.js +451 -0
- package/dist/tui/SearchApp.js.map +1 -0
- package/dist/tui/SplashScreen.d.ts +16 -0
- package/dist/tui/SplashScreen.d.ts.map +1 -0
- package/dist/tui/SplashScreen.js +129 -0
- package/dist/tui/SplashScreen.js.map +1 -0
- package/dist/types/router-config.d.ts +1 -0
- package/dist/types/router-config.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +41 -10
- package/src/commands/monitor.ts +1 -1
- package/src/commands/ps.ts +44 -133
- package/src/commands/router/config.ts +9 -2
- package/src/commands/router/logs.ts +256 -0
- package/src/commands/tui.ts +25 -0
- package/src/lib/model-downloader.ts +57 -20
- package/src/lib/router-logger.ts +201 -0
- package/src/lib/router-manager.ts +1 -0
- package/src/lib/router-server.ts +193 -62
- package/src/tui/ConfigApp.ts +1085 -0
- package/src/tui/HistoricalMonitorApp.ts +88 -49
- package/src/tui/ModelsApp.ts +368 -0
- package/src/tui/MultiServerMonitorApp.ts +1163 -122
- package/src/tui/RootNavigator.ts +74 -0
- package/src/tui/SearchApp.ts +511 -0
- package/src/tui/SplashScreen.ts +149 -0
- package/src/types/router-config.ts +1 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupCompletion = setupCompletion;
|
|
7
|
+
const tabtab_1 = __importDefault(require("tabtab"));
|
|
8
|
+
const state_manager_1 = require("./state-manager");
|
|
9
|
+
const model_scanner_1 = require("./model-scanner");
|
|
10
|
+
const promises_1 = require("fs/promises");
|
|
11
|
+
const os_1 = require("os");
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
/**
|
|
14
|
+
* Get global config for models directory
|
|
15
|
+
*/
|
|
16
|
+
async function getModelsDir() {
|
|
17
|
+
const configPath = path_1.default.join((0, os_1.homedir)(), '.llamacpp', 'config.json');
|
|
18
|
+
try {
|
|
19
|
+
const content = await (0, promises_1.readFile)(configPath, 'utf-8');
|
|
20
|
+
const config = JSON.parse(content);
|
|
21
|
+
return config.modelsDirectory;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return path_1.default.join((0, os_1.homedir)(), 'models');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get all server IDs
|
|
29
|
+
*/
|
|
30
|
+
async function getServerIds() {
|
|
31
|
+
try {
|
|
32
|
+
const stateManager = new state_manager_1.StateManager();
|
|
33
|
+
const servers = await stateManager.getAllServers();
|
|
34
|
+
return servers.map(s => s.id);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get all model filenames
|
|
42
|
+
*/
|
|
43
|
+
async function getModelFiles() {
|
|
44
|
+
try {
|
|
45
|
+
const modelsDir = await getModelsDir();
|
|
46
|
+
const scanner = new model_scanner_1.ModelScanner(modelsDir);
|
|
47
|
+
const models = await scanner.scanModels();
|
|
48
|
+
return models.map(m => m.filename);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Setup completion handlers
|
|
56
|
+
*/
|
|
57
|
+
function setupCompletion() {
|
|
58
|
+
const env = tabtab_1.default.parseEnv(process.env);
|
|
59
|
+
if (!env.complete) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Handle completion based on what's being completed
|
|
63
|
+
getCompletions(env)
|
|
64
|
+
.then((completions) => tabtab_1.default.log(completions))
|
|
65
|
+
.catch((err) => {
|
|
66
|
+
console.error('Completion error:', err);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get completions based on current input
|
|
72
|
+
*/
|
|
73
|
+
async function getCompletions(data) {
|
|
74
|
+
const words = data.line.split(' ').filter(Boolean);
|
|
75
|
+
const prev = data.prev || '';
|
|
76
|
+
const partial = data.lastPartial || '';
|
|
77
|
+
// Top-level commands (after "llamacpp")
|
|
78
|
+
if (words.length <= 1 || (words.length === 2 && !data.line.endsWith(' '))) {
|
|
79
|
+
return ['ls', 'ps', 'logs', 'search', 'show', 'pull', 'rm', 'config', 'server', 'router', 'completion'];
|
|
80
|
+
}
|
|
81
|
+
const mainCommand = words[1];
|
|
82
|
+
// Handle "server" subcommands
|
|
83
|
+
if (mainCommand === 'server') {
|
|
84
|
+
if (words.length === 2 || (words.length === 3 && !data.line.endsWith(' '))) {
|
|
85
|
+
return ['create', 'show', 'config', 'start', 'run', 'stop', 'rm', 'logs', 'monitor'];
|
|
86
|
+
}
|
|
87
|
+
const subCommand = words[2];
|
|
88
|
+
// Server commands that need server identifiers
|
|
89
|
+
if (['show', 'config', 'start', 'stop', 'rm', 'logs'].includes(subCommand)) {
|
|
90
|
+
// If we're completing the identifier (3rd word) or flags come after
|
|
91
|
+
if (words.length === 3 || (words.length === 4 && !data.line.endsWith(' '))) {
|
|
92
|
+
return await getServerIds();
|
|
93
|
+
}
|
|
94
|
+
// After identifier, show available flags
|
|
95
|
+
if (words.length >= 4 && prev.startsWith('-')) {
|
|
96
|
+
return getServerCommandFlags(subCommand);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// "server run" needs server ID or model file
|
|
100
|
+
if (subCommand === 'run') {
|
|
101
|
+
if (words.length === 3 || (words.length === 4 && !data.line.endsWith(' '))) {
|
|
102
|
+
const servers = await getServerIds();
|
|
103
|
+
const models = await getModelFiles();
|
|
104
|
+
return [...servers, ...models];
|
|
105
|
+
}
|
|
106
|
+
// Show flags after identifier
|
|
107
|
+
if (words.length >= 4 && prev.startsWith('-')) {
|
|
108
|
+
return ['-m', '--message'];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// "server create" needs model file
|
|
112
|
+
if (subCommand === 'create') {
|
|
113
|
+
if (words.length === 3 || (words.length === 4 && !data.line.endsWith(' '))) {
|
|
114
|
+
return await getModelFiles();
|
|
115
|
+
}
|
|
116
|
+
// Show flags after model
|
|
117
|
+
if (words.length >= 4 && prev.startsWith('-')) {
|
|
118
|
+
return ['-p', '--port', '-h', '--host', '-t', '--threads', '-c', '--ctx-size', '-g', '--gpu-layers', '-v', '--verbose', '-f', '--flags'];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Handle "router" subcommands
|
|
123
|
+
if (mainCommand === 'router') {
|
|
124
|
+
if (words.length === 2 || (words.length === 3 && !data.line.endsWith(' '))) {
|
|
125
|
+
return ['start', 'stop', 'status', 'restart', 'config'];
|
|
126
|
+
}
|
|
127
|
+
const subCommand = words[2];
|
|
128
|
+
// "router config" flags
|
|
129
|
+
if (subCommand === 'config' && words.length >= 3 && prev.startsWith('-')) {
|
|
130
|
+
return ['-p', '--port', '-h', '--host', '--timeout', '--health-interval', '-r', '--restart'];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Handle "ps" command (can take optional identifier)
|
|
134
|
+
if (mainCommand === 'ps') {
|
|
135
|
+
if (words.length === 2 || (words.length === 3 && !data.line.endsWith(' '))) {
|
|
136
|
+
const servers = await getServerIds();
|
|
137
|
+
return ['--table', ...servers];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Handle "logs" command flags
|
|
141
|
+
if (mainCommand === 'logs' && prev.startsWith('-')) {
|
|
142
|
+
return ['--clear', '--clear-archived', '--clear-all', '--rotate'];
|
|
143
|
+
}
|
|
144
|
+
// Handle "rm" command (delete model) - needs model file
|
|
145
|
+
if (mainCommand === 'rm') {
|
|
146
|
+
if (words.length === 2 || (words.length === 3 && !data.line.endsWith(' '))) {
|
|
147
|
+
return await getModelFiles();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Handle "search" command
|
|
151
|
+
if (mainCommand === 'search' && words.length >= 3 && prev.startsWith('-')) {
|
|
152
|
+
return ['-l', '--limit', '--files'];
|
|
153
|
+
}
|
|
154
|
+
// Handle "show" command - needs identifier
|
|
155
|
+
if (mainCommand === 'show') {
|
|
156
|
+
if (words.length === 2 || (words.length === 3 && !data.line.endsWith(' '))) {
|
|
157
|
+
// Show is for HuggingFace repos, so we can't complete dynamically
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
if (prev.startsWith('-')) {
|
|
161
|
+
return ['-f', '--file'];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Handle "pull" command - needs identifier
|
|
165
|
+
if (mainCommand === 'pull') {
|
|
166
|
+
if (words.length >= 3 && prev.startsWith('-')) {
|
|
167
|
+
return ['-f', '--file'];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Handle "config" command (global config)
|
|
171
|
+
if (mainCommand === 'config' && prev.startsWith('-')) {
|
|
172
|
+
return ['--models-dir'];
|
|
173
|
+
}
|
|
174
|
+
// Handle "completion" subcommands
|
|
175
|
+
if (mainCommand === 'completion') {
|
|
176
|
+
if (words.length === 2 || (words.length === 3 && !data.line.endsWith(' '))) {
|
|
177
|
+
return ['install', 'uninstall'];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get flags for server subcommands
|
|
184
|
+
*/
|
|
185
|
+
function getServerCommandFlags(subCommand) {
|
|
186
|
+
switch (subCommand) {
|
|
187
|
+
case 'config':
|
|
188
|
+
return ['-m', '--model', '-h', '--host', '-t', '--threads', '-c', '--ctx-size', '-g', '--gpu-layers', '-v', '--verbose', '--no-verbose', '-f', '--flags', '-r', '--restart'];
|
|
189
|
+
case 'logs':
|
|
190
|
+
return ['-f', '--follow', '-n', '--lines', '--http', '--errors', '--verbose', '--filter', '--stdout', '--clear', '--clear-archived', '--clear-all', '--rotate'];
|
|
191
|
+
default:
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/lib/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ export interface DownloadProgress {
|
|
|
5
5
|
percentage: number;
|
|
6
6
|
speed: string;
|
|
7
7
|
}
|
|
8
|
+
export interface DownloadOptions {
|
|
9
|
+
silent?: boolean;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
}
|
|
8
12
|
export declare class ModelDownloader {
|
|
9
13
|
private modelsDir?;
|
|
10
14
|
private getModelsDirFn?;
|
|
@@ -38,7 +42,7 @@ export declare class ModelDownloader {
|
|
|
38
42
|
/**
|
|
39
43
|
* Download a model from Hugging Face
|
|
40
44
|
*/
|
|
41
|
-
downloadModel(repoId: string, filename: string, onProgress?: (progress: DownloadProgress) => void, modelsDir?: string): Promise<string>;
|
|
45
|
+
downloadModel(repoId: string, filename: string, onProgress?: (progress: DownloadProgress) => void, modelsDir?: string, options?: DownloadOptions): Promise<string>;
|
|
42
46
|
/**
|
|
43
47
|
* List GGUF files in a Hugging Face repository
|
|
44
48
|
* (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,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;
|
|
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"}
|
|
@@ -91,7 +91,7 @@ class ModelDownloader {
|
|
|
91
91
|
/**
|
|
92
92
|
* Download a file via HTTPS with progress tracking
|
|
93
93
|
*/
|
|
94
|
-
downloadFile(url, destPath, onProgress) {
|
|
94
|
+
downloadFile(url, destPath, onProgress, signal) {
|
|
95
95
|
return new Promise((resolve, reject) => {
|
|
96
96
|
const file = fs.createWriteStream(destPath);
|
|
97
97
|
let downloadedBytes = 0;
|
|
@@ -99,6 +99,7 @@ class ModelDownloader {
|
|
|
99
99
|
let lastUpdateTime = Date.now();
|
|
100
100
|
let lastDownloadedBytes = 0;
|
|
101
101
|
let completed = false;
|
|
102
|
+
let request = null;
|
|
102
103
|
const cleanup = (sigintHandler) => {
|
|
103
104
|
if (sigintHandler) {
|
|
104
105
|
process.removeListener('SIGINT', sigintHandler);
|
|
@@ -115,21 +116,37 @@ class ModelDownloader {
|
|
|
115
116
|
reject(err);
|
|
116
117
|
};
|
|
117
118
|
const sigintHandler = () => {
|
|
118
|
-
request
|
|
119
|
+
if (request)
|
|
120
|
+
request.destroy();
|
|
119
121
|
handleError(new Error('Download interrupted by user'), sigintHandler);
|
|
120
122
|
};
|
|
121
|
-
|
|
123
|
+
// Handle abort signal
|
|
124
|
+
const abortHandler = () => {
|
|
125
|
+
if (request)
|
|
126
|
+
request.destroy();
|
|
127
|
+
handleError(new Error('Download cancelled'), sigintHandler);
|
|
128
|
+
};
|
|
129
|
+
if (signal) {
|
|
130
|
+
if (signal.aborted) {
|
|
131
|
+
handleError(new Error('Download cancelled'), sigintHandler);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
135
|
+
}
|
|
136
|
+
request = https.get(url, { agent: new https.Agent({ keepAlive: false }) }, (response) => {
|
|
122
137
|
// Handle redirects (301, 302, 307, 308)
|
|
123
138
|
if (response.statusCode === 301 || response.statusCode === 302 ||
|
|
124
139
|
response.statusCode === 307 || response.statusCode === 308) {
|
|
125
140
|
const redirectUrl = response.headers.location;
|
|
126
141
|
if (redirectUrl) {
|
|
127
142
|
cleanup(sigintHandler);
|
|
143
|
+
if (signal)
|
|
144
|
+
signal.removeEventListener('abort', abortHandler);
|
|
128
145
|
// Wait for file to close before starting new download
|
|
129
146
|
file.close(() => {
|
|
130
147
|
fs.unlink(destPath, () => {
|
|
131
148
|
// Start recursive download only after cleanup is complete
|
|
132
|
-
this.downloadFile(redirectUrl, destPath, onProgress)
|
|
149
|
+
this.downloadFile(redirectUrl, destPath, onProgress, signal)
|
|
133
150
|
.then(resolve)
|
|
134
151
|
.catch(reject);
|
|
135
152
|
});
|
|
@@ -163,6 +180,8 @@ class ModelDownloader {
|
|
|
163
180
|
// Use callback to ensure close completes before resolving
|
|
164
181
|
file.close((err) => {
|
|
165
182
|
cleanup(sigintHandler);
|
|
183
|
+
if (signal)
|
|
184
|
+
signal.removeEventListener('abort', abortHandler);
|
|
166
185
|
if (err)
|
|
167
186
|
reject(err);
|
|
168
187
|
else
|
|
@@ -171,9 +190,13 @@ class ModelDownloader {
|
|
|
171
190
|
});
|
|
172
191
|
});
|
|
173
192
|
request.on('error', (err) => {
|
|
193
|
+
if (signal)
|
|
194
|
+
signal.removeEventListener('abort', abortHandler);
|
|
174
195
|
handleError(err, sigintHandler);
|
|
175
196
|
});
|
|
176
197
|
file.on('error', (err) => {
|
|
198
|
+
if (signal)
|
|
199
|
+
signal.removeEventListener('abort', abortHandler);
|
|
177
200
|
handleError(err, sigintHandler);
|
|
178
201
|
});
|
|
179
202
|
// Handle Ctrl+C gracefully
|
|
@@ -198,20 +221,26 @@ class ModelDownloader {
|
|
|
198
221
|
/**
|
|
199
222
|
* Download a model from Hugging Face
|
|
200
223
|
*/
|
|
201
|
-
async downloadModel(repoId, filename, onProgress, modelsDir) {
|
|
224
|
+
async downloadModel(repoId, filename, onProgress, modelsDir, options) {
|
|
225
|
+
const silent = options?.silent ?? false;
|
|
226
|
+
const signal = options?.signal;
|
|
202
227
|
// Use provided models directory or get from config
|
|
203
228
|
const targetDir = modelsDir || await this.getModelsDirectory();
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
229
|
+
if (!silent) {
|
|
230
|
+
console.log(chalk_1.default.blue(`📥 Downloading ${filename} from Hugging Face...`));
|
|
231
|
+
console.log(chalk_1.default.dim(`Repository: ${repoId}`));
|
|
232
|
+
console.log(chalk_1.default.dim(`Destination: ${targetDir}`));
|
|
233
|
+
console.log();
|
|
234
|
+
}
|
|
208
235
|
// Build download URL
|
|
209
236
|
const url = this.buildDownloadUrl(repoId, filename);
|
|
210
237
|
const destPath = path.join(targetDir, filename);
|
|
211
238
|
// Check if file already exists
|
|
212
239
|
if (fs.existsSync(destPath)) {
|
|
213
|
-
|
|
214
|
-
|
|
240
|
+
if (!silent) {
|
|
241
|
+
console.log(chalk_1.default.yellow(`⚠️ File already exists: ${filename}`));
|
|
242
|
+
console.log(chalk_1.default.dim(' Remove it first or choose a different filename'));
|
|
243
|
+
}
|
|
215
244
|
throw new Error('File already exists');
|
|
216
245
|
}
|
|
217
246
|
// Download with progress
|
|
@@ -227,8 +256,10 @@ class ModelDownloader {
|
|
|
227
256
|
// Update for next calculation
|
|
228
257
|
lastTime = now;
|
|
229
258
|
lastDownloaded = downloaded;
|
|
230
|
-
// Display progress bar
|
|
231
|
-
|
|
259
|
+
// Display progress bar (only if not silent)
|
|
260
|
+
if (!silent) {
|
|
261
|
+
this.displayProgress(downloaded, total, filename);
|
|
262
|
+
}
|
|
232
263
|
// Call user progress callback if provided
|
|
233
264
|
if (onProgress) {
|
|
234
265
|
onProgress({
|
|
@@ -239,13 +270,15 @@ class ModelDownloader {
|
|
|
239
270
|
speed: `${(0, format_utils_1.formatBytes)(speed)}/s`,
|
|
240
271
|
});
|
|
241
272
|
}
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
273
|
+
}, signal);
|
|
274
|
+
if (!silent) {
|
|
275
|
+
// Clear progress line and show completion
|
|
276
|
+
process.stdout.write('\r\x1b[K');
|
|
277
|
+
console.log(chalk_1.default.green('✅ Download complete!'));
|
|
278
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
279
|
+
console.log(chalk_1.default.dim(` Time: ${totalTime}s`));
|
|
280
|
+
console.log(chalk_1.default.dim(` Location: ${destPath}`));
|
|
281
|
+
}
|
|
249
282
|
return destPath;
|
|
250
283
|
}
|
|
251
284
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/lib/model-downloader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/lib/model-downloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface RouterLogEntry {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
model: string;
|
|
4
|
+
endpoint: string;
|
|
5
|
+
method: string;
|
|
6
|
+
status: 'success' | 'error';
|
|
7
|
+
statusCode: number;
|
|
8
|
+
durationMs: number;
|
|
9
|
+
error?: string;
|
|
10
|
+
backend?: string;
|
|
11
|
+
prompt?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class RouterLogger {
|
|
14
|
+
private logFilePath;
|
|
15
|
+
private verbose;
|
|
16
|
+
constructor(verbose?: boolean);
|
|
17
|
+
/**
|
|
18
|
+
* Log a request with timing and outcome
|
|
19
|
+
*/
|
|
20
|
+
logRequest(entry: RouterLogEntry): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Format log entry for human reading (console output)
|
|
23
|
+
*/
|
|
24
|
+
private formatHumanReadable;
|
|
25
|
+
/**
|
|
26
|
+
* Format log entry for LLM parsing (verbose JSON format)
|
|
27
|
+
*/
|
|
28
|
+
static formatForLLM(entry: RouterLogEntry): string;
|
|
29
|
+
/**
|
|
30
|
+
* Read log file and return all entries (for verbose mode)
|
|
31
|
+
*/
|
|
32
|
+
readLogs(limit?: number): Promise<RouterLogEntry[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Clear the log file
|
|
35
|
+
*/
|
|
36
|
+
clearLogs(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get log file size
|
|
39
|
+
*/
|
|
40
|
+
getLogFileSize(): Promise<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Rotate log file if it exceeds threshold
|
|
43
|
+
*/
|
|
44
|
+
rotateIfNeeded(thresholdMB?: number): Promise<boolean>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Utility class for tracking request timing
|
|
48
|
+
*/
|
|
49
|
+
export declare class RequestTimer {
|
|
50
|
+
private startTime;
|
|
51
|
+
constructor();
|
|
52
|
+
/**
|
|
53
|
+
* Get elapsed time in milliseconds
|
|
54
|
+
*/
|
|
55
|
+
elapsed(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Get current ISO timestamp
|
|
58
|
+
*/
|
|
59
|
+
static now(): string;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=router-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-logger.d.ts","sourceRoot":"","sources":["../../src/lib/router-logger.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,OAAe;IAKpC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM;IAIlD;;OAEG;IACG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BzD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC;;OAEG;IACG,cAAc,CAAC,WAAW,GAAE,MAAY,GAAG,OAAO,CAAC,OAAO,CAAC;CA6BlE;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;;IAM1B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,MAAM;CAGrB"}
|