@appkit/llamacpp-cli 1.3.2 → 1.4.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 +44 -0
- package/dist/cli.js +16 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/config-global.d.ts +6 -0
- package/dist/commands/config-global.d.ts.map +1 -0
- package/dist/commands/config-global.js +38 -0
- package/dist/commands/config-global.js.map +1 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +15 -6
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/list.js +2 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +4 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/lib/model-downloader.d.ts +9 -3
- package/dist/lib/model-downloader.d.ts.map +1 -1
- package/dist/lib/model-downloader.js +34 -7
- package/dist/lib/model-downloader.js.map +1 -1
- package/dist/lib/model-scanner.d.ts +8 -2
- package/dist/lib/model-scanner.d.ts.map +1 -1
- package/dist/lib/model-scanner.js +36 -8
- package/dist/lib/model-scanner.js.map +1 -1
- package/dist/lib/models-dir-setup.d.ts +6 -0
- package/dist/lib/models-dir-setup.d.ts.map +1 -0
- package/dist/lib/models-dir-setup.js +75 -0
- package/dist/lib/models-dir-setup.js.map +1 -0
- package/dist/lib/state-manager.d.ts +8 -0
- package/dist/lib/state-manager.d.ts.map +1 -1
- package/dist/lib/state-manager.js +15 -0
- package/dist/lib/state-manager.js.map +1 -1
- package/dist/utils/file-utils.d.ts +1 -1
- package/dist/utils/file-utils.js +2 -2
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/prompt-utils.d.ts +9 -0
- package/dist/utils/prompt-utils.d.ts.map +1 -0
- package/dist/utils/prompt-utils.js +79 -0
- package/dist/utils/prompt-utils.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +16 -1
- package/src/commands/config-global.ts +38 -0
- package/src/commands/create.ts +16 -6
- package/src/commands/list.ts +2 -2
- package/src/commands/pull.ts +5 -1
- package/src/lib/model-downloader.ts +40 -8
- package/src/lib/model-scanner.ts +41 -9
- package/src/lib/models-dir-setup.ts +46 -0
- package/src/lib/state-manager.ts +17 -0
- package/src/utils/file-utils.ts +2 -2
- package/src/utils/prompt-utils.ts +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-dir-setup.d.ts","sourceRoot":"","sources":["../../src/lib/models-dir-setup.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmC7D"}
|
|
@@ -0,0 +1,75 @@
|
|
|
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.ensureModelsDirectory = ensureModelsDirectory;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const state_manager_1 = require("./state-manager");
|
|
43
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
44
|
+
const prompt_utils_1 = require("../utils/prompt-utils");
|
|
45
|
+
/**
|
|
46
|
+
* Ensure models directory exists, prompting user if needed
|
|
47
|
+
* Returns the final models directory path
|
|
48
|
+
*/
|
|
49
|
+
async function ensureModelsDirectory() {
|
|
50
|
+
const configuredPath = await state_manager_1.stateManager.getModelsDirectory();
|
|
51
|
+
// If directory exists, we're good
|
|
52
|
+
if (fs.existsSync(configuredPath)) {
|
|
53
|
+
return configuredPath;
|
|
54
|
+
}
|
|
55
|
+
// Directory doesn't exist - prompt user
|
|
56
|
+
console.log(chalk_1.default.yellow('⚠️ Models directory not found'));
|
|
57
|
+
console.log();
|
|
58
|
+
console.log(chalk_1.default.dim('The models directory is where GGUF model files are stored.'));
|
|
59
|
+
console.log(chalk_1.default.dim(`Configured path: ${configuredPath}`));
|
|
60
|
+
console.log();
|
|
61
|
+
const answer = await (0, prompt_utils_1.prompt)('Enter models directory path (press Enter to use default)', configuredPath);
|
|
62
|
+
const finalPath = (0, file_utils_1.expandHome)(answer);
|
|
63
|
+
// If user changed the path, update config
|
|
64
|
+
if (finalPath !== configuredPath) {
|
|
65
|
+
console.log(chalk_1.default.dim(`Updating configuration to: ${finalPath}`));
|
|
66
|
+
await state_manager_1.stateManager.setModelsDirectory(finalPath);
|
|
67
|
+
}
|
|
68
|
+
// Create the directory
|
|
69
|
+
console.log(chalk_1.default.dim(`Creating directory: ${finalPath}`));
|
|
70
|
+
fs.mkdirSync(finalPath, { recursive: true, mode: 0o755 });
|
|
71
|
+
console.log(chalk_1.default.green('✅ Models directory created'));
|
|
72
|
+
console.log();
|
|
73
|
+
return finalPath;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=models-dir-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-dir-setup.js","sourceRoot":"","sources":["../../src/lib/models-dir-setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,sDAmCC;AA7CD,uCAAyB;AACzB,kDAA0B;AAC1B,mDAA+C;AAC/C,oDAAiD;AACjD,wDAA+C;AAE/C;;;GAGG;AACI,KAAK,UAAU,qBAAqB;IACzC,MAAM,cAAc,GAAG,MAAM,4BAAY,CAAC,kBAAkB,EAAE,CAAC;IAE/D,kCAAkC;IAClC,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAM,EACzB,0DAA0D,EAC1D,cAAc,CACf,CAAC;IAEF,MAAM,SAAS,GAAG,IAAA,uBAAU,EAAC,MAAM,CAAC,CAAC;IAErC,0CAA0C;IAC1C,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,4BAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3D,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -58,6 +58,14 @@ export declare class StateManager {
|
|
|
58
58
|
* Get all used ports
|
|
59
59
|
*/
|
|
60
60
|
getUsedPorts(): Promise<Set<number>>;
|
|
61
|
+
/**
|
|
62
|
+
* Get the configured models directory
|
|
63
|
+
*/
|
|
64
|
+
getModelsDirectory(): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Set the models directory
|
|
67
|
+
*/
|
|
68
|
+
setModelsDirectory(directory: string): Promise<void>;
|
|
61
69
|
}
|
|
62
70
|
export declare const stateManager: StateManager;
|
|
63
71
|
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyB,MAAM,wBAAwB,CAAC;AAc7E,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;;IASjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAK/C;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQhE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASnF;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmB9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKlE;;OAEG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiBvE;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYlE;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyB,MAAM,wBAAwB,CAAC;AAc7E,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;;IASjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAK/C;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQhE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASnF;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmB9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKlE;;OAEG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiBvE;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYlE;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAK1C;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAK3C;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3D;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -182,6 +182,21 @@ class StateManager {
|
|
|
182
182
|
const servers = await this.getAllServers();
|
|
183
183
|
return new Set(servers.map((s) => s.port));
|
|
184
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Get the configured models directory
|
|
187
|
+
*/
|
|
188
|
+
async getModelsDirectory() {
|
|
189
|
+
const config = await this.loadGlobalConfig();
|
|
190
|
+
return config.modelsDirectory;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Set the models directory
|
|
194
|
+
*/
|
|
195
|
+
async setModelsDirectory(directory) {
|
|
196
|
+
const config = await this.loadGlobalConfig();
|
|
197
|
+
config.modelsDirectory = directory;
|
|
198
|
+
await this.saveGlobalConfig(config);
|
|
199
|
+
}
|
|
185
200
|
}
|
|
186
201
|
exports.StateManager = StateManager;
|
|
187
202
|
// Export singleton instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ export declare function getLogsDir(): string;
|
|
|
35
35
|
*/
|
|
36
36
|
export declare function getGlobalConfigPath(): string;
|
|
37
37
|
/**
|
|
38
|
-
* Get the models directory (
|
|
38
|
+
* Get the default models directory (~/.llamacpp/models)
|
|
39
39
|
*/
|
|
40
40
|
export declare function getModelsDir(): string;
|
|
41
41
|
/**
|
package/dist/utils/file-utils.js
CHANGED
|
@@ -121,10 +121,10 @@ function getGlobalConfigPath() {
|
|
|
121
121
|
return path.join(getConfigDir(), 'config.json');
|
|
122
122
|
}
|
|
123
123
|
/**
|
|
124
|
-
* Get the models directory (
|
|
124
|
+
* Get the default models directory (~/.llamacpp/models)
|
|
125
125
|
*/
|
|
126
126
|
function getModelsDir() {
|
|
127
|
-
return path.join(
|
|
127
|
+
return path.join(getConfigDir(), 'models');
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
130
|
* Get the LaunchAgents directory
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8BASC;AAKD,0CAIC;AAKD,0CAGC;AAKD,4BAGC;AAKD,gCAOC;AAKD,oCAEC;AAKD,sCAEC;AAKD,gCAEC;AAKD,kDAEC;AAKD,oCAEC;AAKD,gDAEC;AAKD,gCAKC;AAzGD,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AAEzB;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2CAA2C;QAC3C,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAS;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAI,QAAgB;IAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt user for input
|
|
3
|
+
*/
|
|
4
|
+
export declare function prompt(question: string, defaultValue?: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Prompt user for yes/no confirmation
|
|
7
|
+
*/
|
|
8
|
+
export declare function confirm(question: string, defaultYes?: boolean): Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=prompt-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-utils.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB7E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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.prompt = prompt;
|
|
37
|
+
exports.confirm = confirm;
|
|
38
|
+
const readline = __importStar(require("readline"));
|
|
39
|
+
/**
|
|
40
|
+
* Prompt user for input
|
|
41
|
+
*/
|
|
42
|
+
function prompt(question, defaultValue) {
|
|
43
|
+
const rl = readline.createInterface({
|
|
44
|
+
input: process.stdin,
|
|
45
|
+
output: process.stdout,
|
|
46
|
+
});
|
|
47
|
+
return new Promise((resolve) => {
|
|
48
|
+
const promptText = defaultValue
|
|
49
|
+
? `${question} [${defaultValue}]: `
|
|
50
|
+
: `${question}: `;
|
|
51
|
+
rl.question(promptText, (answer) => {
|
|
52
|
+
rl.close();
|
|
53
|
+
resolve(answer.trim() || defaultValue || '');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Prompt user for yes/no confirmation
|
|
59
|
+
*/
|
|
60
|
+
function confirm(question, defaultYes = true) {
|
|
61
|
+
const rl = readline.createInterface({
|
|
62
|
+
input: process.stdin,
|
|
63
|
+
output: process.stdout,
|
|
64
|
+
});
|
|
65
|
+
const suffix = defaultYes ? '[Y/n]' : '[y/N]';
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
rl.question(`${question} ${suffix}: `, (answer) => {
|
|
68
|
+
rl.close();
|
|
69
|
+
const input = answer.trim().toLowerCase();
|
|
70
|
+
if (input === '') {
|
|
71
|
+
resolve(defaultYes);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
resolve(input === 'y' || input === 'yes');
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=prompt-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-utils.js","sourceRoot":"","sources":["../../src/utils/prompt-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAgBC;AAKD,0BAoBC;AA9CD,mDAAqC;AAErC;;GAEG;AACH,SAAgB,MAAM,CAAC,QAAgB,EAAE,YAAqB;IAC5D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,UAAU,GAAG,YAAY;YAC7B,CAAC,CAAC,GAAG,QAAQ,KAAK,YAAY,KAAK;YACnC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC;QAEpB,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;YACjC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,OAAO,CAAC,QAAgB,EAAE,UAAU,GAAG,IAAI;IACzD,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAChD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE1C,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { searchCommand } from './commands/search';
|
|
|
16
16
|
import { showCommand } from './commands/show';
|
|
17
17
|
import { serverShowCommand } from './commands/server-show';
|
|
18
18
|
import { serverConfigCommand } from './commands/config';
|
|
19
|
+
import { configGlobalCommand } from './commands/config-global';
|
|
19
20
|
import packageJson from '../package.json';
|
|
20
21
|
|
|
21
22
|
const program = new Command();
|
|
@@ -28,7 +29,7 @@ program
|
|
|
28
29
|
// List models
|
|
29
30
|
program
|
|
30
31
|
.command('ls')
|
|
31
|
-
.description('List available GGUF models
|
|
32
|
+
.description('List available GGUF models')
|
|
32
33
|
.action(async () => {
|
|
33
34
|
try {
|
|
34
35
|
await listCommand();
|
|
@@ -113,6 +114,20 @@ program
|
|
|
113
114
|
}
|
|
114
115
|
});
|
|
115
116
|
|
|
117
|
+
// Global configuration
|
|
118
|
+
program
|
|
119
|
+
.command('config')
|
|
120
|
+
.description('View or change global configuration')
|
|
121
|
+
.option('--models-dir <path>', 'Set models directory path')
|
|
122
|
+
.action(async (options) => {
|
|
123
|
+
try {
|
|
124
|
+
await configGlobalCommand(options);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error(chalk.red('❌ Error:'), (error as Error).message);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
116
131
|
// Server management commands
|
|
117
132
|
const server = program
|
|
118
133
|
.command('server')
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { stateManager } from '../lib/state-manager';
|
|
3
|
+
import { expandHome } from '../utils/file-utils';
|
|
4
|
+
|
|
5
|
+
interface ConfigOptions {
|
|
6
|
+
modelsDir?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function configGlobalCommand(options: ConfigOptions): Promise<void> {
|
|
10
|
+
// If no options provided, show current config
|
|
11
|
+
if (!options.modelsDir) {
|
|
12
|
+
const config = await stateManager.loadGlobalConfig();
|
|
13
|
+
|
|
14
|
+
console.log(chalk.blue('⚙️ Global Configuration\n'));
|
|
15
|
+
console.log(chalk.bold('Models Directory:'));
|
|
16
|
+
console.log(` ${config.modelsDirectory}`);
|
|
17
|
+
console.log();
|
|
18
|
+
console.log(chalk.bold('Defaults:'));
|
|
19
|
+
console.log(` Port: ${config.defaultPort}`);
|
|
20
|
+
console.log(` Threads: ${config.defaults.threads}`);
|
|
21
|
+
console.log(` Context: ${config.defaults.ctxSize}`);
|
|
22
|
+
console.log(` GPU Layers: ${config.defaults.gpuLayers}`);
|
|
23
|
+
console.log();
|
|
24
|
+
console.log(chalk.dim('Change models directory: llamacpp config --models-dir <path>'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Update models directory
|
|
29
|
+
if (options.modelsDir) {
|
|
30
|
+
const newPath = expandHome(options.modelsDir);
|
|
31
|
+
await stateManager.setModelsDirectory(newPath);
|
|
32
|
+
console.log(chalk.green('✅ Models directory updated'));
|
|
33
|
+
console.log(chalk.dim(` New path: ${newPath}`));
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.dim('Note: This does not move existing models. Use:'));
|
|
36
|
+
console.log(chalk.dim(` mv ~/.llamacpp/models/* ${newPath}/`));
|
|
37
|
+
}
|
|
38
|
+
}
|
package/src/commands/create.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
3
4
|
import { modelScanner } from '../lib/model-scanner';
|
|
4
5
|
import { stateManager } from '../lib/state-manager';
|
|
5
6
|
import { configGenerator, ServerOptions } from '../lib/config-generator';
|
|
@@ -9,6 +10,7 @@ import { statusChecker } from '../lib/status-checker';
|
|
|
9
10
|
import { commandExists } from '../utils/process-utils';
|
|
10
11
|
import { formatBytes } from '../utils/format-utils';
|
|
11
12
|
import { ensureDir } from '../utils/file-utils';
|
|
13
|
+
import { ensureModelsDirectory } from '../lib/models-dir-setup';
|
|
12
14
|
|
|
13
15
|
interface CreateOptions {
|
|
14
16
|
port?: number;
|
|
@@ -29,27 +31,35 @@ export async function createCommand(model: string, options: CreateOptions): Prom
|
|
|
29
31
|
throw new Error('llama-server not found. Install with: brew install llama.cpp');
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
// 2.
|
|
34
|
+
// 2. Ensure models directory exists if model is not an absolute path
|
|
35
|
+
if (!path.isAbsolute(model)) {
|
|
36
|
+
const modelsDir = await stateManager.getModelsDirectory();
|
|
37
|
+
if (!fs.existsSync(modelsDir)) {
|
|
38
|
+
await ensureModelsDirectory();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 3. Resolve model path
|
|
33
43
|
const modelPath = await modelScanner.resolveModelPath(model);
|
|
34
44
|
if (!modelPath) {
|
|
35
|
-
throw new Error(`Model not found: ${model}\n\nRun: llamacpp
|
|
45
|
+
throw new Error(`Model not found: ${model}\n\nRun: llamacpp ls`);
|
|
36
46
|
}
|
|
37
47
|
|
|
38
48
|
const modelName = path.basename(modelPath);
|
|
39
49
|
|
|
40
|
-
//
|
|
50
|
+
// 4. Check if server already exists for this model
|
|
41
51
|
const existingServer = await stateManager.serverExistsForModel(modelPath);
|
|
42
52
|
if (existingServer) {
|
|
43
53
|
throw new Error(`Server already exists for ${modelName}\n\nUse: llamacpp server start ${modelName}`);
|
|
44
54
|
}
|
|
45
55
|
|
|
46
|
-
//
|
|
56
|
+
// 5. Get model size
|
|
47
57
|
const modelSize = await modelScanner.getModelSize(modelName);
|
|
48
58
|
if (!modelSize) {
|
|
49
59
|
throw new Error(`Failed to read model file: ${modelPath}`);
|
|
50
60
|
}
|
|
51
61
|
|
|
52
|
-
//
|
|
62
|
+
// 6. Determine port
|
|
53
63
|
let port: number;
|
|
54
64
|
if (options.port) {
|
|
55
65
|
portManager.validatePort(options.port);
|
|
@@ -62,7 +72,7 @@ export async function createCommand(model: string, options: CreateOptions): Prom
|
|
|
62
72
|
port = await portManager.findAvailablePort();
|
|
63
73
|
}
|
|
64
74
|
|
|
65
|
-
//
|
|
75
|
+
// 7. Generate server configuration
|
|
66
76
|
console.log(chalk.blue(`🚀 Creating server for ${modelName}\n`));
|
|
67
77
|
|
|
68
78
|
// Parse custom flags if provided
|
package/src/commands/list.ts
CHANGED
|
@@ -2,10 +2,10 @@ import chalk from 'chalk';
|
|
|
2
2
|
import Table from 'cli-table3';
|
|
3
3
|
import { modelScanner } from '../lib/model-scanner';
|
|
4
4
|
import { formatBytes, formatDateShort } from '../utils/format-utils';
|
|
5
|
-
import {
|
|
5
|
+
import { stateManager } from '../lib/state-manager';
|
|
6
6
|
|
|
7
7
|
export async function listCommand(): Promise<void> {
|
|
8
|
-
const modelsDir =
|
|
8
|
+
const modelsDir = await stateManager.getModelsDirectory();
|
|
9
9
|
console.log(chalk.blue(`📦 Available models in ${modelsDir}\n`));
|
|
10
10
|
|
|
11
11
|
const models = await modelScanner.scanModels();
|
package/src/commands/pull.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { modelDownloader } from '../lib/model-downloader';
|
|
3
|
+
import { ensureModelsDirectory } from '../lib/models-dir-setup';
|
|
3
4
|
|
|
4
5
|
interface PullOptions {
|
|
5
6
|
file?: string;
|
|
@@ -25,9 +26,12 @@ export async function pullCommand(identifier: string, options: PullOptions): Pro
|
|
|
25
26
|
filename += '.gguf';
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
// Ensure models directory exists (prompts user if needed)
|
|
30
|
+
const modelsDir = await ensureModelsDirectory();
|
|
31
|
+
|
|
28
32
|
// Download the model
|
|
29
33
|
try {
|
|
30
|
-
const modelPath = await modelDownloader.downloadModel(parsed.repo, filename);
|
|
34
|
+
const modelPath = await modelDownloader.downloadModel(parsed.repo, filename, undefined, modelsDir);
|
|
31
35
|
|
|
32
36
|
console.log();
|
|
33
37
|
console.log(chalk.dim(`Create server: llamacpp server create ${filename}`));
|
|
@@ -14,10 +14,25 @@ export interface DownloadProgress {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export class ModelDownloader {
|
|
17
|
-
private modelsDir
|
|
17
|
+
private modelsDir?: string;
|
|
18
|
+
private getModelsDirFn?: () => Promise<string>;
|
|
18
19
|
|
|
19
|
-
constructor(modelsDir?: string) {
|
|
20
|
-
this.modelsDir = modelsDir
|
|
20
|
+
constructor(modelsDir?: string, getModelsDirFn?: () => Promise<string>) {
|
|
21
|
+
this.modelsDir = modelsDir;
|
|
22
|
+
this.getModelsDirFn = getModelsDirFn;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get the models directory (either configured or default)
|
|
27
|
+
*/
|
|
28
|
+
private async getModelsDirectory(): Promise<string> {
|
|
29
|
+
if (this.modelsDir) {
|
|
30
|
+
return this.modelsDir;
|
|
31
|
+
}
|
|
32
|
+
if (this.getModelsDirFn) {
|
|
33
|
+
return await this.getModelsDirFn();
|
|
34
|
+
}
|
|
35
|
+
return getModelsDir();
|
|
21
36
|
}
|
|
22
37
|
|
|
23
38
|
/**
|
|
@@ -184,16 +199,20 @@ export class ModelDownloader {
|
|
|
184
199
|
async downloadModel(
|
|
185
200
|
repoId: string,
|
|
186
201
|
filename: string,
|
|
187
|
-
onProgress?: (progress: DownloadProgress) => void
|
|
202
|
+
onProgress?: (progress: DownloadProgress) => void,
|
|
203
|
+
modelsDir?: string
|
|
188
204
|
): Promise<string> {
|
|
205
|
+
// Use provided models directory or get from config
|
|
206
|
+
const targetDir = modelsDir || await this.getModelsDirectory();
|
|
207
|
+
|
|
189
208
|
console.log(chalk.blue(`📥 Downloading ${filename} from Hugging Face...`));
|
|
190
209
|
console.log(chalk.dim(`Repository: ${repoId}`));
|
|
191
|
-
console.log(chalk.dim(`Destination: ${
|
|
210
|
+
console.log(chalk.dim(`Destination: ${targetDir}`));
|
|
192
211
|
console.log();
|
|
193
212
|
|
|
194
213
|
// Build download URL
|
|
195
214
|
const url = this.buildDownloadUrl(repoId, filename);
|
|
196
|
-
const destPath = path.join(
|
|
215
|
+
const destPath = path.join(targetDir, filename);
|
|
197
216
|
|
|
198
217
|
// Check if file already exists
|
|
199
218
|
if (fs.existsSync(destPath)) {
|
|
@@ -255,5 +274,18 @@ export class ModelDownloader {
|
|
|
255
274
|
}
|
|
256
275
|
}
|
|
257
276
|
|
|
258
|
-
//
|
|
259
|
-
|
|
277
|
+
// Create singleton that uses configured models directory
|
|
278
|
+
// Use lazy import to avoid circular dependency
|
|
279
|
+
let _modelDownloader: ModelDownloader | null = null;
|
|
280
|
+
|
|
281
|
+
export function getModelDownloader(): ModelDownloader {
|
|
282
|
+
if (!_modelDownloader) {
|
|
283
|
+
// Import stateManager dynamically to avoid circular dependency
|
|
284
|
+
const { stateManager } = require('./state-manager');
|
|
285
|
+
_modelDownloader = new ModelDownloader(undefined, () => stateManager.getModelsDirectory());
|
|
286
|
+
}
|
|
287
|
+
return _modelDownloader;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Export singleton instance for backward compatibility
|
|
291
|
+
export const modelDownloader = getModelDownloader();
|
package/src/lib/model-scanner.ts
CHANGED
|
@@ -5,18 +5,34 @@ import { getModelsDir } from '../utils/file-utils';
|
|
|
5
5
|
import { formatBytes } from '../utils/format-utils';
|
|
6
6
|
|
|
7
7
|
export class ModelScanner {
|
|
8
|
-
private modelsDir
|
|
8
|
+
private modelsDir?: string;
|
|
9
|
+
private getModelsDirFn?: () => Promise<string>;
|
|
9
10
|
|
|
10
|
-
constructor(modelsDir?: string) {
|
|
11
|
-
this.modelsDir = modelsDir
|
|
11
|
+
constructor(modelsDir?: string, getModelsDirFn?: () => Promise<string>) {
|
|
12
|
+
this.modelsDir = modelsDir;
|
|
13
|
+
this.getModelsDirFn = getModelsDirFn;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get the models directory (either configured or default)
|
|
18
|
+
*/
|
|
19
|
+
private async getModelsDirectory(): Promise<string> {
|
|
20
|
+
if (this.modelsDir) {
|
|
21
|
+
return this.modelsDir;
|
|
22
|
+
}
|
|
23
|
+
if (this.getModelsDirFn) {
|
|
24
|
+
return await this.getModelsDirFn();
|
|
25
|
+
}
|
|
26
|
+
return getModelsDir();
|
|
12
27
|
}
|
|
13
28
|
|
|
14
29
|
/**
|
|
15
30
|
* Scan models directory for GGUF files
|
|
16
31
|
*/
|
|
17
32
|
async scanModels(): Promise<ModelInfo[]> {
|
|
33
|
+
const modelsDir = await this.getModelsDirectory();
|
|
18
34
|
try {
|
|
19
|
-
const files = await fs.readdir(
|
|
35
|
+
const files = await fs.readdir(modelsDir);
|
|
20
36
|
const ggufFiles = files.filter((f) => f.toLowerCase().endsWith('.gguf'));
|
|
21
37
|
|
|
22
38
|
const models: ModelInfo[] = [];
|
|
@@ -41,7 +57,8 @@ export class ModelScanner {
|
|
|
41
57
|
* Get information about a specific model file
|
|
42
58
|
*/
|
|
43
59
|
async getModelInfo(filename: string): Promise<ModelInfo | null> {
|
|
44
|
-
const
|
|
60
|
+
const modelsDir = await this.getModelsDirectory();
|
|
61
|
+
const modelPath = path.join(modelsDir, filename);
|
|
45
62
|
|
|
46
63
|
try {
|
|
47
64
|
const stats = await fs.stat(modelPath);
|
|
@@ -84,8 +101,10 @@ export class ModelScanner {
|
|
|
84
101
|
return filename;
|
|
85
102
|
}
|
|
86
103
|
|
|
104
|
+
const modelsDir = await this.getModelsDirectory();
|
|
105
|
+
|
|
87
106
|
// Try in models directory
|
|
88
|
-
const modelPath = path.join(
|
|
107
|
+
const modelPath = path.join(modelsDir, filename);
|
|
89
108
|
const modelInfo = await this.getModelInfo(filename);
|
|
90
109
|
|
|
91
110
|
if (modelInfo && modelInfo.exists) {
|
|
@@ -97,7 +116,7 @@ export class ModelScanner {
|
|
|
97
116
|
const withExtension = `${filename}.gguf`;
|
|
98
117
|
const modelInfoWithExt = await this.getModelInfo(withExtension);
|
|
99
118
|
if (modelInfoWithExt && modelInfoWithExt.exists) {
|
|
100
|
-
return path.join(
|
|
119
|
+
return path.join(modelsDir, withExtension);
|
|
101
120
|
}
|
|
102
121
|
}
|
|
103
122
|
|
|
@@ -121,5 +140,18 @@ export class ModelScanner {
|
|
|
121
140
|
}
|
|
122
141
|
}
|
|
123
142
|
|
|
124
|
-
//
|
|
125
|
-
|
|
143
|
+
// Create singleton that uses configured models directory
|
|
144
|
+
// Use lazy import to avoid circular dependency
|
|
145
|
+
let _modelScanner: ModelScanner | null = null;
|
|
146
|
+
|
|
147
|
+
export function getModelScanner(): ModelScanner {
|
|
148
|
+
if (!_modelScanner) {
|
|
149
|
+
// Import stateManager dynamically to avoid circular dependency
|
|
150
|
+
const { stateManager } = require('./state-manager');
|
|
151
|
+
_modelScanner = new ModelScanner(undefined, () => stateManager.getModelsDirectory());
|
|
152
|
+
}
|
|
153
|
+
return _modelScanner;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Export singleton instance for backward compatibility
|
|
157
|
+
export const modelScanner = getModelScanner();
|