@appkit/llamacpp-cli 1.0.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/.versionrc.json +16 -0
- package/CHANGELOG.md +10 -0
- package/README.md +474 -0
- package/bin/llamacpp +26 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +196 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +104 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +37 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +57 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +72 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +36 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/rm.d.ts +2 -0
- package/dist/commands/rm.d.ts.map +1 -0
- package/dist/commands/rm.js +134 -0
- package/dist/commands/rm.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +198 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +93 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/show.d.ts +6 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +196 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +150 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +39 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/lib/config-generator.d.ts +30 -0
- package/dist/lib/config-generator.d.ts.map +1 -0
- package/dist/lib/config-generator.js +125 -0
- package/dist/lib/config-generator.js.map +1 -0
- package/dist/lib/launchctl-manager.d.ts +55 -0
- package/dist/lib/launchctl-manager.d.ts.map +1 -0
- package/dist/lib/launchctl-manager.js +227 -0
- package/dist/lib/launchctl-manager.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +44 -0
- package/dist/lib/model-downloader.d.ts.map +1 -0
- package/dist/lib/model-downloader.js +248 -0
- package/dist/lib/model-downloader.js.map +1 -0
- package/dist/lib/model-scanner.d.ts +31 -0
- package/dist/lib/model-scanner.d.ts.map +1 -0
- package/dist/lib/model-scanner.js +145 -0
- package/dist/lib/model-scanner.js.map +1 -0
- package/dist/lib/model-search.d.ts +29 -0
- package/dist/lib/model-search.d.ts.map +1 -0
- package/dist/lib/model-search.js +131 -0
- package/dist/lib/model-search.js.map +1 -0
- package/dist/lib/port-manager.d.ts +26 -0
- package/dist/lib/port-manager.d.ts.map +1 -0
- package/dist/lib/port-manager.js +75 -0
- package/dist/lib/port-manager.js.map +1 -0
- package/dist/lib/state-manager.d.ts +59 -0
- package/dist/lib/state-manager.d.ts.map +1 -0
- package/dist/lib/state-manager.js +178 -0
- package/dist/lib/state-manager.js.map +1 -0
- package/dist/lib/status-checker.d.ts +28 -0
- package/dist/lib/status-checker.d.ts.map +1 -0
- package/dist/lib/status-checker.js +99 -0
- package/dist/lib/status-checker.js.map +1 -0
- package/dist/types/global-config.d.ts +16 -0
- package/dist/types/global-config.d.ts.map +1 -0
- package/dist/types/global-config.js +18 -0
- package/dist/types/global-config.js.map +1 -0
- package/dist/types/model-info.d.ts +9 -0
- package/dist/types/model-info.d.ts.map +1 -0
- package/dist/types/model-info.js +3 -0
- package/dist/types/model-info.js.map +1 -0
- package/dist/types/server-config.d.ts +27 -0
- package/dist/types/server-config.d.ts.map +1 -0
- package/dist/types/server-config.js +15 -0
- package/dist/types/server-config.js.map +1 -0
- package/dist/utils/file-utils.d.ts +49 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +144 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/format-utils.d.ts +29 -0
- package/dist/utils/format-utils.d.ts.map +1 -0
- package/dist/utils/format-utils.js +82 -0
- package/dist/utils/format-utils.js.map +1 -0
- package/dist/utils/process-utils.d.ts +27 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +66 -0
- package/dist/utils/process-utils.js.map +1 -0
- package/package.json +56 -0
- package/src/cli.ts +195 -0
- package/src/commands/delete.ts +74 -0
- package/src/commands/list.ts +37 -0
- package/src/commands/logs.ts +61 -0
- package/src/commands/ps.ts +79 -0
- package/src/commands/pull.ts +40 -0
- package/src/commands/rm.ts +114 -0
- package/src/commands/run.ts +209 -0
- package/src/commands/search.ts +107 -0
- package/src/commands/show.ts +207 -0
- package/src/commands/start.ts +140 -0
- package/src/commands/stop.ts +39 -0
- package/src/lib/config-generator.ts +119 -0
- package/src/lib/launchctl-manager.ts +209 -0
- package/src/lib/model-downloader.ts +259 -0
- package/src/lib/model-scanner.ts +125 -0
- package/src/lib/model-search.ts +114 -0
- package/src/lib/port-manager.ts +80 -0
- package/src/lib/state-manager.ts +177 -0
- package/src/lib/status-checker.ts +113 -0
- package/src/types/global-config.ts +26 -0
- package/src/types/model-info.ts +8 -0
- package/src/types/server-config.ts +42 -0
- package/src/utils/file-utils.ts +106 -0
- package/src/utils/format-utils.ts +80 -0
- package/src/utils/process-utils.ts +60 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchctl-manager.d.ts","sourceRoot":"","sources":["../../src/lib/launchctl-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAItD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAqD3C;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA4C7D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAY5E;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAW5E;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -0,0 +1,227 @@
|
|
|
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.launchctlManager = exports.LaunchctlManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const process_utils_1 = require("../utils/process-utils");
|
|
39
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
40
|
+
class LaunchctlManager {
|
|
41
|
+
/**
|
|
42
|
+
* Generate plist XML content for a server
|
|
43
|
+
*/
|
|
44
|
+
generatePlist(config) {
|
|
45
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
46
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
47
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
48
|
+
<plist version="1.0">
|
|
49
|
+
<dict>
|
|
50
|
+
<key>Label</key>
|
|
51
|
+
<string>${config.label}</string>
|
|
52
|
+
|
|
53
|
+
<key>ProgramArguments</key>
|
|
54
|
+
<array>
|
|
55
|
+
<string>/opt/homebrew/bin/llama-server</string>
|
|
56
|
+
<string>--model</string>
|
|
57
|
+
<string>${config.modelPath}</string>
|
|
58
|
+
<string>--port</string>
|
|
59
|
+
<string>${config.port}</string>
|
|
60
|
+
<string>--threads</string>
|
|
61
|
+
<string>${config.threads}</string>
|
|
62
|
+
<string>--ctx-size</string>
|
|
63
|
+
<string>${config.ctxSize}</string>
|
|
64
|
+
<string>--gpu-layers</string>
|
|
65
|
+
<string>${config.gpuLayers}</string>
|
|
66
|
+
<string>--embeddings</string>
|
|
67
|
+
<string>--jinja</string>
|
|
68
|
+
</array>
|
|
69
|
+
|
|
70
|
+
<key>RunAtLoad</key>
|
|
71
|
+
<false/>
|
|
72
|
+
|
|
73
|
+
<key>KeepAlive</key>
|
|
74
|
+
<dict>
|
|
75
|
+
<key>Crashed</key>
|
|
76
|
+
<true/>
|
|
77
|
+
<key>SuccessfulExit</key>
|
|
78
|
+
<false/>
|
|
79
|
+
</dict>
|
|
80
|
+
|
|
81
|
+
<key>StandardOutPath</key>
|
|
82
|
+
<string>${config.stdoutPath}</string>
|
|
83
|
+
|
|
84
|
+
<key>StandardErrorPath</key>
|
|
85
|
+
<string>${config.stderrPath}</string>
|
|
86
|
+
|
|
87
|
+
<key>WorkingDirectory</key>
|
|
88
|
+
<string>/tmp</string>
|
|
89
|
+
|
|
90
|
+
<key>ThrottleInterval</key>
|
|
91
|
+
<integer>10</integer>
|
|
92
|
+
</dict>
|
|
93
|
+
</plist>
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create and write plist file
|
|
98
|
+
*/
|
|
99
|
+
async createPlist(config) {
|
|
100
|
+
const plistContent = this.generatePlist(config);
|
|
101
|
+
await (0, file_utils_1.writeFileAtomic)(config.plistPath, plistContent);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Delete plist file
|
|
105
|
+
*/
|
|
106
|
+
async deletePlist(plistPath) {
|
|
107
|
+
if (await (0, file_utils_1.fileExists)(plistPath)) {
|
|
108
|
+
await fs.unlink(plistPath);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Load service (register with launchctl)
|
|
113
|
+
*/
|
|
114
|
+
async loadService(plistPath) {
|
|
115
|
+
await (0, process_utils_1.execCommand)(`launchctl load "${plistPath}"`);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Unload service (unregister from launchctl)
|
|
119
|
+
*/
|
|
120
|
+
async unloadService(plistPath) {
|
|
121
|
+
try {
|
|
122
|
+
await (0, process_utils_1.execCommand)(`launchctl unload "${plistPath}"`);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// Ignore errors if service is not loaded
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Start service
|
|
130
|
+
*/
|
|
131
|
+
async startService(label) {
|
|
132
|
+
await (0, process_utils_1.execCommand)(`launchctl start ${label}`);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Stop service
|
|
136
|
+
*/
|
|
137
|
+
async stopService(label) {
|
|
138
|
+
await (0, process_utils_1.execCommand)(`launchctl stop ${label}`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get service status from launchctl
|
|
142
|
+
*/
|
|
143
|
+
async getServiceStatus(label) {
|
|
144
|
+
try {
|
|
145
|
+
const { stdout } = await (0, process_utils_1.execAsync)(`launchctl list | grep ${label}`);
|
|
146
|
+
const lines = stdout.trim().split('\n');
|
|
147
|
+
for (const line of lines) {
|
|
148
|
+
const parts = line.split(/\s+/);
|
|
149
|
+
if (parts.length >= 3) {
|
|
150
|
+
const pidStr = parts[0].trim();
|
|
151
|
+
const exitCodeStr = parts[1].trim();
|
|
152
|
+
const serviceLabel = parts[2].trim();
|
|
153
|
+
// Match the exact label
|
|
154
|
+
if (serviceLabel === label) {
|
|
155
|
+
const pid = pidStr !== '-' ? parseInt(pidStr, 10) : null;
|
|
156
|
+
const exitCode = exitCodeStr !== '-' ? parseInt(exitCodeStr, 10) : null;
|
|
157
|
+
const isRunning = pid !== null;
|
|
158
|
+
return {
|
|
159
|
+
isRunning,
|
|
160
|
+
pid,
|
|
161
|
+
exitCode,
|
|
162
|
+
lastExitReason: this.interpretExitCode(exitCode),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Service not found
|
|
168
|
+
return {
|
|
169
|
+
isRunning: false,
|
|
170
|
+
pid: null,
|
|
171
|
+
exitCode: null,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
// Service not found or not loaded
|
|
176
|
+
return {
|
|
177
|
+
isRunning: false,
|
|
178
|
+
pid: null,
|
|
179
|
+
exitCode: null,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Interpret exit code to human-readable reason
|
|
185
|
+
*/
|
|
186
|
+
interpretExitCode(code) {
|
|
187
|
+
if (code === null || code === 0)
|
|
188
|
+
return undefined;
|
|
189
|
+
if (code === -9)
|
|
190
|
+
return 'Force killed (SIGKILL)';
|
|
191
|
+
if (code === -15)
|
|
192
|
+
return 'Terminated (SIGTERM)';
|
|
193
|
+
return `Exit code: ${code}`;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Wait for service to start (with timeout)
|
|
197
|
+
*/
|
|
198
|
+
async waitForServiceStart(label, timeoutMs = 5000) {
|
|
199
|
+
const startTime = Date.now();
|
|
200
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
201
|
+
const status = await this.getServiceStatus(label);
|
|
202
|
+
if (status.isRunning) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Wait for service to stop (with timeout)
|
|
211
|
+
*/
|
|
212
|
+
async waitForServiceStop(label, timeoutMs = 5000) {
|
|
213
|
+
const startTime = Date.now();
|
|
214
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
215
|
+
const status = await this.getServiceStatus(label);
|
|
216
|
+
if (!status.isRunning) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
220
|
+
}
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
exports.LaunchctlManager = LaunchctlManager;
|
|
225
|
+
// Export singleton instance
|
|
226
|
+
exports.launchctlManager = new LaunchctlManager();
|
|
227
|
+
//# sourceMappingURL=launchctl-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchctl-manager.js","sourceRoot":"","sources":["../../src/lib/launchctl-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface DownloadProgress {
|
|
2
|
+
filename: string;
|
|
3
|
+
downloaded: number;
|
|
4
|
+
total: number;
|
|
5
|
+
percentage: number;
|
|
6
|
+
speed: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ModelDownloader {
|
|
9
|
+
private modelsDir;
|
|
10
|
+
constructor(modelsDir?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Parse Hugging Face identifier
|
|
13
|
+
* Examples:
|
|
14
|
+
* "bartowski/Llama-3.2-3B-Instruct-GGUF" → { repo: "...", file: undefined }
|
|
15
|
+
* "bartowski/Llama-3.2-3B-Instruct-GGUF/file.gguf" → { repo: "...", file: "file.gguf" }
|
|
16
|
+
*/
|
|
17
|
+
parseHFIdentifier(identifier: string): {
|
|
18
|
+
repo: string;
|
|
19
|
+
file?: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Build Hugging Face download URL
|
|
23
|
+
*/
|
|
24
|
+
buildDownloadUrl(repoId: string, filename: string, branch?: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Download a file via HTTPS with progress tracking
|
|
27
|
+
*/
|
|
28
|
+
private downloadFile;
|
|
29
|
+
/**
|
|
30
|
+
* Display progress bar
|
|
31
|
+
*/
|
|
32
|
+
private displayProgress;
|
|
33
|
+
/**
|
|
34
|
+
* Download a model from Hugging Face
|
|
35
|
+
*/
|
|
36
|
+
downloadModel(repoId: string, filename: string, onProgress?: (progress: DownloadProgress) => void): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* List GGUF files in a Hugging Face repository
|
|
39
|
+
* (This would require calling the HF API - simplified for now)
|
|
40
|
+
*/
|
|
41
|
+
listGGUFFiles(repoId: string): Promise<string[]>;
|
|
42
|
+
}
|
|
43
|
+
export declare const modelDownloader: ModelDownloader;
|
|
44
|
+
//# sourceMappingURL=model-downloader.d.ts.map
|
|
@@ -0,0 +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,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAI9B;;;;;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;IA4GpB;;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,GAChD,OAAO,CAAC,MAAM,CAAC;IA2DlB;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAKvD;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.modelDownloader = exports.ModelDownloader = void 0;
|
|
40
|
+
const https = __importStar(require("https"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
45
|
+
const format_utils_1 = require("../utils/format-utils");
|
|
46
|
+
class ModelDownloader {
|
|
47
|
+
constructor(modelsDir) {
|
|
48
|
+
this.modelsDir = modelsDir || (0, file_utils_1.getModelsDir)();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse Hugging Face identifier
|
|
52
|
+
* Examples:
|
|
53
|
+
* "bartowski/Llama-3.2-3B-Instruct-GGUF" → { repo: "...", file: undefined }
|
|
54
|
+
* "bartowski/Llama-3.2-3B-Instruct-GGUF/file.gguf" → { repo: "...", file: "file.gguf" }
|
|
55
|
+
*/
|
|
56
|
+
parseHFIdentifier(identifier) {
|
|
57
|
+
const parts = identifier.split('/');
|
|
58
|
+
if (parts.length === 2) {
|
|
59
|
+
return { repo: identifier };
|
|
60
|
+
}
|
|
61
|
+
else if (parts.length === 3) {
|
|
62
|
+
return {
|
|
63
|
+
repo: `${parts[0]}/${parts[1]}`,
|
|
64
|
+
file: parts[2],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
throw new Error(`Invalid Hugging Face identifier: ${identifier}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build Hugging Face download URL
|
|
73
|
+
*/
|
|
74
|
+
buildDownloadUrl(repoId, filename, branch = 'main') {
|
|
75
|
+
return `https://huggingface.co/${repoId}/resolve/${branch}/${filename}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Download a file via HTTPS with progress tracking
|
|
79
|
+
*/
|
|
80
|
+
downloadFile(url, destPath, onProgress) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const file = fs.createWriteStream(destPath);
|
|
83
|
+
let downloadedBytes = 0;
|
|
84
|
+
let totalBytes = 0;
|
|
85
|
+
let lastUpdateTime = Date.now();
|
|
86
|
+
let lastDownloadedBytes = 0;
|
|
87
|
+
let completed = false;
|
|
88
|
+
const cleanup = (sigintHandler) => {
|
|
89
|
+
if (sigintHandler) {
|
|
90
|
+
process.removeListener('SIGINT', sigintHandler);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const handleError = (err, sigintHandler) => {
|
|
94
|
+
if (completed)
|
|
95
|
+
return;
|
|
96
|
+
completed = true;
|
|
97
|
+
cleanup(sigintHandler);
|
|
98
|
+
file.close(() => {
|
|
99
|
+
fs.unlink(destPath, () => { });
|
|
100
|
+
});
|
|
101
|
+
reject(err);
|
|
102
|
+
};
|
|
103
|
+
const sigintHandler = () => {
|
|
104
|
+
request.destroy();
|
|
105
|
+
handleError(new Error('Download interrupted by user'), sigintHandler);
|
|
106
|
+
};
|
|
107
|
+
const request = https.get(url, { agent: new https.Agent({ keepAlive: false }) }, (response) => {
|
|
108
|
+
// Handle redirects (301, 302, 307, 308)
|
|
109
|
+
if (response.statusCode === 301 || response.statusCode === 302 ||
|
|
110
|
+
response.statusCode === 307 || response.statusCode === 308) {
|
|
111
|
+
const redirectUrl = response.headers.location;
|
|
112
|
+
if (redirectUrl) {
|
|
113
|
+
cleanup(sigintHandler);
|
|
114
|
+
// Wait for file to close before starting new download
|
|
115
|
+
file.close(() => {
|
|
116
|
+
fs.unlink(destPath, () => {
|
|
117
|
+
// Start recursive download only after cleanup is complete
|
|
118
|
+
this.downloadFile(redirectUrl, destPath, onProgress)
|
|
119
|
+
.then(resolve)
|
|
120
|
+
.catch(reject);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (response.statusCode !== 200) {
|
|
127
|
+
return handleError(new Error(`HTTP ${response.statusCode}: ${response.statusMessage}`), sigintHandler);
|
|
128
|
+
}
|
|
129
|
+
totalBytes = parseInt(response.headers['content-length'] || '0', 10);
|
|
130
|
+
response.on('data', (chunk) => {
|
|
131
|
+
downloadedBytes += chunk.length;
|
|
132
|
+
// Update progress every 500ms
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
if (onProgress && now - lastUpdateTime >= 500) {
|
|
135
|
+
onProgress(downloadedBytes, totalBytes);
|
|
136
|
+
lastUpdateTime = now;
|
|
137
|
+
lastDownloadedBytes = downloadedBytes;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
response.pipe(file);
|
|
141
|
+
file.on('finish', () => {
|
|
142
|
+
if (completed)
|
|
143
|
+
return;
|
|
144
|
+
completed = true;
|
|
145
|
+
// Final progress update
|
|
146
|
+
if (onProgress) {
|
|
147
|
+
onProgress(downloadedBytes, totalBytes);
|
|
148
|
+
}
|
|
149
|
+
// Use callback to ensure close completes before resolving
|
|
150
|
+
file.close((err) => {
|
|
151
|
+
cleanup(sigintHandler);
|
|
152
|
+
if (err)
|
|
153
|
+
reject(err);
|
|
154
|
+
else
|
|
155
|
+
resolve();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
request.on('error', (err) => {
|
|
160
|
+
handleError(err, sigintHandler);
|
|
161
|
+
});
|
|
162
|
+
file.on('error', (err) => {
|
|
163
|
+
handleError(err, sigintHandler);
|
|
164
|
+
});
|
|
165
|
+
// Handle Ctrl+C gracefully
|
|
166
|
+
process.on('SIGINT', sigintHandler);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Display progress bar
|
|
171
|
+
*/
|
|
172
|
+
displayProgress(downloaded, total, filename) {
|
|
173
|
+
const percentage = total > 0 ? (downloaded / total) * 100 : 0;
|
|
174
|
+
const barLength = 40;
|
|
175
|
+
const filledLength = Math.round((barLength * downloaded) / total);
|
|
176
|
+
const bar = '█'.repeat(filledLength) + '░'.repeat(barLength - filledLength);
|
|
177
|
+
const downloadedFormatted = (0, format_utils_1.formatBytes)(downloaded);
|
|
178
|
+
const totalFormatted = (0, format_utils_1.formatBytes)(total);
|
|
179
|
+
const percentFormatted = percentage.toFixed(1);
|
|
180
|
+
// Clear line and print progress
|
|
181
|
+
process.stdout.write('\r\x1b[K');
|
|
182
|
+
process.stdout.write(chalk_1.default.blue(`[${bar}] ${percentFormatted}% | ${downloadedFormatted} / ${totalFormatted}`));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Download a model from Hugging Face
|
|
186
|
+
*/
|
|
187
|
+
async downloadModel(repoId, filename, onProgress) {
|
|
188
|
+
console.log(chalk_1.default.blue(`📥 Downloading ${filename} from Hugging Face...`));
|
|
189
|
+
console.log(chalk_1.default.dim(`Repository: ${repoId}`));
|
|
190
|
+
console.log(chalk_1.default.dim(`Destination: ${this.modelsDir}`));
|
|
191
|
+
console.log();
|
|
192
|
+
// Build download URL
|
|
193
|
+
const url = this.buildDownloadUrl(repoId, filename);
|
|
194
|
+
const destPath = path.join(this.modelsDir, filename);
|
|
195
|
+
// Check if file already exists
|
|
196
|
+
if (fs.existsSync(destPath)) {
|
|
197
|
+
console.log(chalk_1.default.yellow(`⚠️ File already exists: ${filename}`));
|
|
198
|
+
console.log(chalk_1.default.dim(' Remove it first or choose a different filename'));
|
|
199
|
+
throw new Error('File already exists');
|
|
200
|
+
}
|
|
201
|
+
// Download with progress
|
|
202
|
+
const startTime = Date.now();
|
|
203
|
+
let lastDownloaded = 0;
|
|
204
|
+
let lastTime = startTime;
|
|
205
|
+
await this.downloadFile(url, destPath, (downloaded, total) => {
|
|
206
|
+
// Calculate speed
|
|
207
|
+
const now = Date.now();
|
|
208
|
+
const timeDiff = (now - lastTime) / 1000; // seconds
|
|
209
|
+
const bytesDiff = downloaded - lastDownloaded;
|
|
210
|
+
const speed = timeDiff > 0 ? bytesDiff / timeDiff : 0;
|
|
211
|
+
// Update for next calculation
|
|
212
|
+
lastTime = now;
|
|
213
|
+
lastDownloaded = downloaded;
|
|
214
|
+
// Display progress bar
|
|
215
|
+
this.displayProgress(downloaded, total, filename);
|
|
216
|
+
// Call user progress callback if provided
|
|
217
|
+
if (onProgress) {
|
|
218
|
+
onProgress({
|
|
219
|
+
filename,
|
|
220
|
+
downloaded,
|
|
221
|
+
total,
|
|
222
|
+
percentage: total > 0 ? (downloaded / total) * 100 : 0,
|
|
223
|
+
speed: `${(0, format_utils_1.formatBytes)(speed)}/s`,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// Clear progress line and show completion
|
|
228
|
+
process.stdout.write('\r\x1b[K');
|
|
229
|
+
console.log(chalk_1.default.green('✅ Download complete!'));
|
|
230
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
231
|
+
console.log(chalk_1.default.dim(` Time: ${totalTime}s`));
|
|
232
|
+
console.log(chalk_1.default.dim(` Location: ${destPath}`));
|
|
233
|
+
return destPath;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* List GGUF files in a Hugging Face repository
|
|
237
|
+
* (This would require calling the HF API - simplified for now)
|
|
238
|
+
*/
|
|
239
|
+
async listGGUFFiles(repoId) {
|
|
240
|
+
console.log(chalk_1.default.yellow('Listing files is not yet implemented.'));
|
|
241
|
+
console.log(chalk_1.default.dim('Please specify the file with --file <filename>'));
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.ModelDownloader = ModelDownloader;
|
|
246
|
+
// Export singleton instance
|
|
247
|
+
exports.modelDownloader = new ModelDownloader();
|
|
248
|
+
//# sourceMappingURL=model-downloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/lib/model-downloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ModelInfo } from '../types/model-info';
|
|
2
|
+
export declare class ModelScanner {
|
|
3
|
+
private modelsDir;
|
|
4
|
+
constructor(modelsDir?: string);
|
|
5
|
+
/**
|
|
6
|
+
* Scan models directory for GGUF files
|
|
7
|
+
*/
|
|
8
|
+
scanModels(): Promise<ModelInfo[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Get information about a specific model file
|
|
11
|
+
*/
|
|
12
|
+
getModelInfo(filename: string): Promise<ModelInfo | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Validate that a model file exists and is readable
|
|
15
|
+
*/
|
|
16
|
+
validateModel(filename: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a model filename to full path
|
|
19
|
+
*/
|
|
20
|
+
resolveModelPath(filename: string): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the size of a model file
|
|
23
|
+
*/
|
|
24
|
+
getModelSize(filename: string): Promise<number | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Get total size of all models
|
|
27
|
+
*/
|
|
28
|
+
getTotalSize(): Promise<number>;
|
|
29
|
+
}
|
|
30
|
+
export declare const modelScanner: ModelScanner;
|
|
31
|
+
//# sourceMappingURL=model-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-scanner.d.ts","sourceRoot":"","sources":["../../src/lib/model-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,CAAC,EAAE,MAAM;IAI9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAuBxC;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA2B/D;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA0BhE;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK5D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAItC;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|