@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.
Files changed (136) hide show
  1. package/.versionrc.json +16 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +474 -0
  4. package/bin/llamacpp +26 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +196 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/delete.d.ts +2 -0
  10. package/dist/commands/delete.d.ts.map +1 -0
  11. package/dist/commands/delete.js +104 -0
  12. package/dist/commands/delete.js.map +1 -0
  13. package/dist/commands/list.d.ts +2 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +37 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/logs.d.ts +8 -0
  18. package/dist/commands/logs.d.ts.map +1 -0
  19. package/dist/commands/logs.js +57 -0
  20. package/dist/commands/logs.js.map +1 -0
  21. package/dist/commands/ps.d.ts +2 -0
  22. package/dist/commands/ps.d.ts.map +1 -0
  23. package/dist/commands/ps.js +72 -0
  24. package/dist/commands/ps.js.map +1 -0
  25. package/dist/commands/pull.d.ts +6 -0
  26. package/dist/commands/pull.d.ts.map +1 -0
  27. package/dist/commands/pull.js +36 -0
  28. package/dist/commands/pull.js.map +1 -0
  29. package/dist/commands/rm.d.ts +2 -0
  30. package/dist/commands/rm.d.ts.map +1 -0
  31. package/dist/commands/rm.js +134 -0
  32. package/dist/commands/rm.js.map +1 -0
  33. package/dist/commands/run.d.ts +2 -0
  34. package/dist/commands/run.d.ts.map +1 -0
  35. package/dist/commands/run.js +198 -0
  36. package/dist/commands/run.js.map +1 -0
  37. package/dist/commands/search.d.ts +7 -0
  38. package/dist/commands/search.d.ts.map +1 -0
  39. package/dist/commands/search.js +93 -0
  40. package/dist/commands/search.js.map +1 -0
  41. package/dist/commands/show.d.ts +6 -0
  42. package/dist/commands/show.d.ts.map +1 -0
  43. package/dist/commands/show.js +196 -0
  44. package/dist/commands/show.js.map +1 -0
  45. package/dist/commands/start.d.ts +9 -0
  46. package/dist/commands/start.d.ts.map +1 -0
  47. package/dist/commands/start.js +150 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/stop.d.ts +2 -0
  50. package/dist/commands/stop.d.ts.map +1 -0
  51. package/dist/commands/stop.js +39 -0
  52. package/dist/commands/stop.js.map +1 -0
  53. package/dist/lib/config-generator.d.ts +30 -0
  54. package/dist/lib/config-generator.d.ts.map +1 -0
  55. package/dist/lib/config-generator.js +125 -0
  56. package/dist/lib/config-generator.js.map +1 -0
  57. package/dist/lib/launchctl-manager.d.ts +55 -0
  58. package/dist/lib/launchctl-manager.d.ts.map +1 -0
  59. package/dist/lib/launchctl-manager.js +227 -0
  60. package/dist/lib/launchctl-manager.js.map +1 -0
  61. package/dist/lib/model-downloader.d.ts +44 -0
  62. package/dist/lib/model-downloader.d.ts.map +1 -0
  63. package/dist/lib/model-downloader.js +248 -0
  64. package/dist/lib/model-downloader.js.map +1 -0
  65. package/dist/lib/model-scanner.d.ts +31 -0
  66. package/dist/lib/model-scanner.d.ts.map +1 -0
  67. package/dist/lib/model-scanner.js +145 -0
  68. package/dist/lib/model-scanner.js.map +1 -0
  69. package/dist/lib/model-search.d.ts +29 -0
  70. package/dist/lib/model-search.d.ts.map +1 -0
  71. package/dist/lib/model-search.js +131 -0
  72. package/dist/lib/model-search.js.map +1 -0
  73. package/dist/lib/port-manager.d.ts +26 -0
  74. package/dist/lib/port-manager.d.ts.map +1 -0
  75. package/dist/lib/port-manager.js +75 -0
  76. package/dist/lib/port-manager.js.map +1 -0
  77. package/dist/lib/state-manager.d.ts +59 -0
  78. package/dist/lib/state-manager.d.ts.map +1 -0
  79. package/dist/lib/state-manager.js +178 -0
  80. package/dist/lib/state-manager.js.map +1 -0
  81. package/dist/lib/status-checker.d.ts +28 -0
  82. package/dist/lib/status-checker.d.ts.map +1 -0
  83. package/dist/lib/status-checker.js +99 -0
  84. package/dist/lib/status-checker.js.map +1 -0
  85. package/dist/types/global-config.d.ts +16 -0
  86. package/dist/types/global-config.d.ts.map +1 -0
  87. package/dist/types/global-config.js +18 -0
  88. package/dist/types/global-config.js.map +1 -0
  89. package/dist/types/model-info.d.ts +9 -0
  90. package/dist/types/model-info.d.ts.map +1 -0
  91. package/dist/types/model-info.js +3 -0
  92. package/dist/types/model-info.js.map +1 -0
  93. package/dist/types/server-config.d.ts +27 -0
  94. package/dist/types/server-config.d.ts.map +1 -0
  95. package/dist/types/server-config.js +15 -0
  96. package/dist/types/server-config.js.map +1 -0
  97. package/dist/utils/file-utils.d.ts +49 -0
  98. package/dist/utils/file-utils.d.ts.map +1 -0
  99. package/dist/utils/file-utils.js +144 -0
  100. package/dist/utils/file-utils.js.map +1 -0
  101. package/dist/utils/format-utils.d.ts +29 -0
  102. package/dist/utils/format-utils.d.ts.map +1 -0
  103. package/dist/utils/format-utils.js +82 -0
  104. package/dist/utils/format-utils.js.map +1 -0
  105. package/dist/utils/process-utils.d.ts +27 -0
  106. package/dist/utils/process-utils.d.ts.map +1 -0
  107. package/dist/utils/process-utils.js +66 -0
  108. package/dist/utils/process-utils.js.map +1 -0
  109. package/package.json +56 -0
  110. package/src/cli.ts +195 -0
  111. package/src/commands/delete.ts +74 -0
  112. package/src/commands/list.ts +37 -0
  113. package/src/commands/logs.ts +61 -0
  114. package/src/commands/ps.ts +79 -0
  115. package/src/commands/pull.ts +40 -0
  116. package/src/commands/rm.ts +114 -0
  117. package/src/commands/run.ts +209 -0
  118. package/src/commands/search.ts +107 -0
  119. package/src/commands/show.ts +207 -0
  120. package/src/commands/start.ts +140 -0
  121. package/src/commands/stop.ts +39 -0
  122. package/src/lib/config-generator.ts +119 -0
  123. package/src/lib/launchctl-manager.ts +209 -0
  124. package/src/lib/model-downloader.ts +259 -0
  125. package/src/lib/model-scanner.ts +125 -0
  126. package/src/lib/model-search.ts +114 -0
  127. package/src/lib/port-manager.ts +80 -0
  128. package/src/lib/state-manager.ts +177 -0
  129. package/src/lib/status-checker.ts +113 -0
  130. package/src/types/global-config.ts +26 -0
  131. package/src/types/model-info.ts +8 -0
  132. package/src/types/server-config.ts +42 -0
  133. package/src/utils/file-utils.ts +106 -0
  134. package/src/utils/format-utils.ts +80 -0
  135. package/src/utils/process-utils.ts +60 -0
  136. 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"}