@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.
Files changed (50) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/cli.js +16 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/config-global.d.ts +6 -0
  5. package/dist/commands/config-global.d.ts.map +1 -0
  6. package/dist/commands/config-global.js +38 -0
  7. package/dist/commands/config-global.js.map +1 -0
  8. package/dist/commands/create.d.ts.map +1 -1
  9. package/dist/commands/create.js +15 -6
  10. package/dist/commands/create.js.map +1 -1
  11. package/dist/commands/list.js +2 -2
  12. package/dist/commands/list.js.map +1 -1
  13. package/dist/commands/pull.d.ts.map +1 -1
  14. package/dist/commands/pull.js +4 -1
  15. package/dist/commands/pull.js.map +1 -1
  16. package/dist/lib/model-downloader.d.ts +9 -3
  17. package/dist/lib/model-downloader.d.ts.map +1 -1
  18. package/dist/lib/model-downloader.js +34 -7
  19. package/dist/lib/model-downloader.js.map +1 -1
  20. package/dist/lib/model-scanner.d.ts +8 -2
  21. package/dist/lib/model-scanner.d.ts.map +1 -1
  22. package/dist/lib/model-scanner.js +36 -8
  23. package/dist/lib/model-scanner.js.map +1 -1
  24. package/dist/lib/models-dir-setup.d.ts +6 -0
  25. package/dist/lib/models-dir-setup.d.ts.map +1 -0
  26. package/dist/lib/models-dir-setup.js +75 -0
  27. package/dist/lib/models-dir-setup.js.map +1 -0
  28. package/dist/lib/state-manager.d.ts +8 -0
  29. package/dist/lib/state-manager.d.ts.map +1 -1
  30. package/dist/lib/state-manager.js +15 -0
  31. package/dist/lib/state-manager.js.map +1 -1
  32. package/dist/utils/file-utils.d.ts +1 -1
  33. package/dist/utils/file-utils.js +2 -2
  34. package/dist/utils/file-utils.js.map +1 -1
  35. package/dist/utils/prompt-utils.d.ts +9 -0
  36. package/dist/utils/prompt-utils.d.ts.map +1 -0
  37. package/dist/utils/prompt-utils.js +79 -0
  38. package/dist/utils/prompt-utils.js.map +1 -0
  39. package/package.json +1 -1
  40. package/src/cli.ts +16 -1
  41. package/src/commands/config-global.ts +38 -0
  42. package/src/commands/create.ts +16 -6
  43. package/src/commands/list.ts +2 -2
  44. package/src/commands/pull.ts +5 -1
  45. package/src/lib/model-downloader.ts +40 -8
  46. package/src/lib/model-scanner.ts +41 -9
  47. package/src/lib/models-dir-setup.ts +46 -0
  48. package/src/lib/state-manager.ts +17 -0
  49. package/src/utils/file-utils.ts +2 -2
  50. package/src/utils/prompt-utils.ts +47 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Ensure models directory exists, prompting user if needed
3
+ * Returns the final models directory path
4
+ */
5
+ export declare function ensureModelsDirectory(): Promise<string>;
6
+ //# sourceMappingURL=models-dir-setup.d.ts.map
@@ -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;CAI3C;AAGD,eAAO,MAAM,YAAY,cAAqB,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 (~/models)
38
+ * Get the default models directory (~/.llamacpp/models)
39
39
  */
40
40
  export declare function getModelsDir(): string;
41
41
  /**
@@ -121,10 +121,10 @@ function getGlobalConfigPath() {
121
121
  return path.join(getConfigDir(), 'config.json');
122
122
  }
123
123
  /**
124
- * Get the models directory (~/models)
124
+ * Get the default models directory (~/.llamacpp/models)
125
125
  */
126
126
  function getModelsDir() {
127
- return path.join(os.homedir(), 'models');
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,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
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,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appkit/llamacpp-cli",
3
- "version": "1.3.2",
3
+ "version": "1.4.0",
4
4
  "description": "CLI tool to manage local llama.cpp servers on macOS",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
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 in ~/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
+ }
@@ -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. Resolve model path
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 list`);
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
- // 3. Check if server already exists for this model
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
- // 4. Get model size
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
- // 5. Determine port
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
- // 6. Generate server configuration
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
@@ -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 { getModelsDir } from '../utils/file-utils';
5
+ import { stateManager } from '../lib/state-manager';
6
6
 
7
7
  export async function listCommand(): Promise<void> {
8
- const modelsDir = getModelsDir();
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();
@@ -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: string;
17
+ private modelsDir?: string;
18
+ private getModelsDirFn?: () => Promise<string>;
18
19
 
19
- constructor(modelsDir?: string) {
20
- this.modelsDir = modelsDir || getModelsDir();
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: ${this.modelsDir}`));
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(this.modelsDir, filename);
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
- // Export singleton instance
259
- export const modelDownloader = new ModelDownloader();
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();
@@ -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: string;
8
+ private modelsDir?: string;
9
+ private getModelsDirFn?: () => Promise<string>;
9
10
 
10
- constructor(modelsDir?: string) {
11
- this.modelsDir = modelsDir || getModelsDir();
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(this.modelsDir);
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 modelPath = path.join(this.modelsDir, filename);
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(this.modelsDir, filename);
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(this.modelsDir, withExtension);
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
- // Export singleton instance
125
- export const modelScanner = new ModelScanner();
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();