@appkit/llamacpp-cli 1.11.0 → 1.12.1

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 (126) hide show
  1. package/README.md +572 -170
  2. package/dist/cli.js +99 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/admin/config.d.ts +10 -0
  5. package/dist/commands/admin/config.d.ts.map +1 -0
  6. package/dist/commands/admin/config.js +100 -0
  7. package/dist/commands/admin/config.js.map +1 -0
  8. package/dist/commands/admin/logs.d.ts +10 -0
  9. package/dist/commands/admin/logs.d.ts.map +1 -0
  10. package/dist/commands/admin/logs.js +114 -0
  11. package/dist/commands/admin/logs.js.map +1 -0
  12. package/dist/commands/admin/restart.d.ts +2 -0
  13. package/dist/commands/admin/restart.d.ts.map +1 -0
  14. package/dist/commands/admin/restart.js +29 -0
  15. package/dist/commands/admin/restart.js.map +1 -0
  16. package/dist/commands/admin/start.d.ts +2 -0
  17. package/dist/commands/admin/start.d.ts.map +1 -0
  18. package/dist/commands/admin/start.js +30 -0
  19. package/dist/commands/admin/start.js.map +1 -0
  20. package/dist/commands/admin/status.d.ts +2 -0
  21. package/dist/commands/admin/status.d.ts.map +1 -0
  22. package/dist/commands/admin/status.js +82 -0
  23. package/dist/commands/admin/status.js.map +1 -0
  24. package/dist/commands/admin/stop.d.ts +2 -0
  25. package/dist/commands/admin/stop.d.ts.map +1 -0
  26. package/dist/commands/admin/stop.js +21 -0
  27. package/dist/commands/admin/stop.js.map +1 -0
  28. package/dist/commands/logs.d.ts +1 -0
  29. package/dist/commands/logs.d.ts.map +1 -1
  30. package/dist/commands/logs.js +22 -0
  31. package/dist/commands/logs.js.map +1 -1
  32. package/dist/lib/admin-manager.d.ts +111 -0
  33. package/dist/lib/admin-manager.d.ts.map +1 -0
  34. package/dist/lib/admin-manager.js +413 -0
  35. package/dist/lib/admin-manager.js.map +1 -0
  36. package/dist/lib/admin-server.d.ts +148 -0
  37. package/dist/lib/admin-server.d.ts.map +1 -0
  38. package/dist/lib/admin-server.js +1161 -0
  39. package/dist/lib/admin-server.js.map +1 -0
  40. package/dist/lib/download-job-manager.d.ts +64 -0
  41. package/dist/lib/download-job-manager.d.ts.map +1 -0
  42. package/dist/lib/download-job-manager.js +164 -0
  43. package/dist/lib/download-job-manager.js.map +1 -0
  44. package/dist/tui/MultiServerMonitorApp.js +1 -1
  45. package/dist/types/admin-config.d.ts +19 -0
  46. package/dist/types/admin-config.d.ts.map +1 -0
  47. package/dist/types/admin-config.js +3 -0
  48. package/dist/types/admin-config.js.map +1 -0
  49. package/dist/utils/log-parser.d.ts +9 -0
  50. package/dist/utils/log-parser.d.ts.map +1 -1
  51. package/dist/utils/log-parser.js +11 -0
  52. package/dist/utils/log-parser.js.map +1 -1
  53. package/package.json +10 -2
  54. package/web/README.md +429 -0
  55. package/web/dist/assets/index-Bin89Lwr.css +1 -0
  56. package/web/dist/assets/index-CVmonw3T.js +17 -0
  57. package/web/dist/index.html +14 -0
  58. package/web/dist/vite.svg +1 -0
  59. package/.versionrc.json +0 -16
  60. package/CHANGELOG.md +0 -203
  61. package/MONITORING-ACCURACY-FIX.md +0 -199
  62. package/PER-PROCESS-METRICS.md +0 -190
  63. package/docs/images/.gitkeep +0 -1
  64. package/src/cli.ts +0 -423
  65. package/src/commands/config-global.ts +0 -38
  66. package/src/commands/config.ts +0 -323
  67. package/src/commands/create.ts +0 -183
  68. package/src/commands/delete.ts +0 -74
  69. package/src/commands/list.ts +0 -37
  70. package/src/commands/logs-all.ts +0 -251
  71. package/src/commands/logs.ts +0 -321
  72. package/src/commands/monitor.ts +0 -110
  73. package/src/commands/ps.ts +0 -84
  74. package/src/commands/pull.ts +0 -44
  75. package/src/commands/rm.ts +0 -107
  76. package/src/commands/router/config.ts +0 -116
  77. package/src/commands/router/logs.ts +0 -256
  78. package/src/commands/router/restart.ts +0 -36
  79. package/src/commands/router/start.ts +0 -60
  80. package/src/commands/router/status.ts +0 -119
  81. package/src/commands/router/stop.ts +0 -33
  82. package/src/commands/run.ts +0 -233
  83. package/src/commands/search.ts +0 -107
  84. package/src/commands/server-show.ts +0 -161
  85. package/src/commands/show.ts +0 -207
  86. package/src/commands/start.ts +0 -101
  87. package/src/commands/stop.ts +0 -39
  88. package/src/commands/tui.ts +0 -25
  89. package/src/lib/config-generator.ts +0 -130
  90. package/src/lib/history-manager.ts +0 -172
  91. package/src/lib/launchctl-manager.ts +0 -225
  92. package/src/lib/metrics-aggregator.ts +0 -257
  93. package/src/lib/model-downloader.ts +0 -328
  94. package/src/lib/model-scanner.ts +0 -157
  95. package/src/lib/model-search.ts +0 -114
  96. package/src/lib/models-dir-setup.ts +0 -46
  97. package/src/lib/port-manager.ts +0 -80
  98. package/src/lib/router-logger.ts +0 -201
  99. package/src/lib/router-manager.ts +0 -414
  100. package/src/lib/router-server.ts +0 -538
  101. package/src/lib/state-manager.ts +0 -206
  102. package/src/lib/status-checker.ts +0 -113
  103. package/src/lib/system-collector.ts +0 -315
  104. package/src/tui/ConfigApp.ts +0 -1085
  105. package/src/tui/HistoricalMonitorApp.ts +0 -587
  106. package/src/tui/ModelsApp.ts +0 -368
  107. package/src/tui/MonitorApp.ts +0 -386
  108. package/src/tui/MultiServerMonitorApp.ts +0 -1833
  109. package/src/tui/RootNavigator.ts +0 -74
  110. package/src/tui/SearchApp.ts +0 -511
  111. package/src/tui/SplashScreen.ts +0 -149
  112. package/src/types/global-config.ts +0 -26
  113. package/src/types/history-types.ts +0 -39
  114. package/src/types/model-info.ts +0 -8
  115. package/src/types/monitor-types.ts +0 -162
  116. package/src/types/router-config.ts +0 -25
  117. package/src/types/server-config.ts +0 -46
  118. package/src/utils/downsample-utils.ts +0 -128
  119. package/src/utils/file-utils.ts +0 -146
  120. package/src/utils/format-utils.ts +0 -98
  121. package/src/utils/log-parser.ts +0 -271
  122. package/src/utils/log-utils.ts +0 -178
  123. package/src/utils/process-utils.ts +0 -316
  124. package/src/utils/prompt-utils.ts +0 -47
  125. package/test-load.sh +0 -100
  126. package/tsconfig.json +0 -20
package/src/cli.ts DELETED
@@ -1,423 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { Command } from 'commander';
4
- import chalk from 'chalk';
5
- import { listCommand } from './commands/list';
6
- import { psCommand } from './commands/ps';
7
- import { createCommand } from './commands/create';
8
- import { startCommand } from './commands/start';
9
- import { runCommand } from './commands/run';
10
- import { stopCommand } from './commands/stop';
11
- import { deleteCommand } from './commands/delete';
12
- import { pullCommand } from './commands/pull';
13
- import { rmCommand } from './commands/rm';
14
- import { logsCommand } from './commands/logs';
15
- import { logsAllCommand } from './commands/logs-all';
16
- import { searchCommand } from './commands/search';
17
- import { showCommand } from './commands/show';
18
- import { serverShowCommand } from './commands/server-show';
19
- import { serverConfigCommand } from './commands/config';
20
- import { configGlobalCommand } from './commands/config-global';
21
- import { monitorCommand } from './commands/monitor';
22
- import { routerStartCommand } from './commands/router/start';
23
- import { routerStopCommand } from './commands/router/stop';
24
- import { routerStatusCommand } from './commands/router/status';
25
- import { routerRestartCommand } from './commands/router/restart';
26
- import { routerConfigCommand } from './commands/router/config';
27
- import { routerLogsCommand } from './commands/router/logs';
28
- import packageJson from '../package.json';
29
-
30
- const program = new Command();
31
-
32
- program
33
- .name('llamacpp')
34
- .description('CLI tool to manage local llama.cpp servers on macOS')
35
- .version(packageJson.version, '-v, --version', 'Output the version number')
36
- .action(async () => {
37
- // Default action: launch TUI when no command provided
38
- try {
39
- const { tuiCommand } = await import('./commands/tui');
40
- await tuiCommand();
41
- } catch (error) {
42
- console.error(chalk.red('❌ Error:'), (error as Error).message);
43
- process.exit(1);
44
- }
45
- });
46
-
47
- // List models
48
- program
49
- .command('ls')
50
- .description('List available GGUF models')
51
- .action(async () => {
52
- try {
53
- await listCommand();
54
- } catch (error) {
55
- console.error(chalk.red('❌ Error:'), (error as Error).message);
56
- process.exit(1);
57
- }
58
- });
59
-
60
- // List servers (static table)
61
- program
62
- .command('ps')
63
- .description('List all servers with status (static table)')
64
- .action(async () => {
65
- try {
66
- await psCommand();
67
- } catch (error) {
68
- console.error(chalk.red('❌ Error:'), (error as Error).message);
69
- process.exit(1);
70
- }
71
- });
72
-
73
- // View all server logs
74
- program
75
- .command('logs')
76
- .description('View log sizes for all servers (with batch operations)')
77
- .option('--clear', 'Clear current logs for all servers')
78
- .option('--clear-archived', 'Delete only archived logs for all servers')
79
- .option('--clear-all', 'Clear current + delete archived logs for all servers')
80
- .option('--rotate', 'Rotate logs for all servers with timestamps')
81
- .action(async (options) => {
82
- try {
83
- await logsAllCommand(options);
84
- } catch (error) {
85
- console.error(chalk.red('❌ Error:'), (error as Error).message);
86
- process.exit(1);
87
- }
88
- });
89
-
90
- // Search for models
91
- program
92
- .command('search')
93
- .description('Search Hugging Face for GGUF models')
94
- .argument('<query>', 'Search query (e.g., "llama 3b" or "qwen")')
95
- .option('-l, --limit <number>', 'Max results to show (default: 20)', parseInt)
96
- .option('--files [number]', 'Show available files for result number (e.g., --files 1)', (val) => {
97
- return val ? parseInt(val) : true;
98
- })
99
- .action(async (query: string, options) => {
100
- try {
101
- await searchCommand(query, options);
102
- } catch (error) {
103
- console.error(chalk.red('❌ Error:'), (error as Error).message);
104
- process.exit(1);
105
- }
106
- });
107
-
108
- // Show model details
109
- program
110
- .command('show')
111
- .description('Show details about a model or file')
112
- .argument('<identifier>', 'HuggingFace repo/file (e.g., owner/repo or owner/repo/file.gguf)')
113
- .option('-f, --file <filename>', 'Specific GGUF file to show details for')
114
- .action(async (identifier: string, options) => {
115
- try {
116
- await showCommand(identifier, options);
117
- } catch (error) {
118
- console.error(chalk.red('❌ Error:'), (error as Error).message);
119
- process.exit(1);
120
- }
121
- });
122
-
123
- // Download a model
124
- program
125
- .command('pull')
126
- .description('Download a GGUF model from Hugging Face')
127
- .argument('<identifier>', 'HuggingFace repo/file (e.g., owner/repo/file.gguf or owner/repo)')
128
- .option('-f, --file <filename>', 'Specific GGUF file (alternative to path in identifier)')
129
- .action(async (identifier: string, options) => {
130
- try {
131
- await pullCommand(identifier, options);
132
- } catch (error) {
133
- console.error(chalk.red('❌ Error:'), (error as Error).message);
134
- process.exit(1);
135
- }
136
- });
137
-
138
- // Delete a model
139
- program
140
- .command('rm')
141
- .description('Delete a model file (and any associated servers)')
142
- .argument('<model>', 'Model filename or partial name')
143
- .action(async (model: string) => {
144
- try {
145
- await rmCommand(model);
146
- } catch (error) {
147
- console.error(chalk.red('❌ Error:'), (error as Error).message);
148
- process.exit(1);
149
- }
150
- });
151
-
152
- // Global configuration
153
- program
154
- .command('config')
155
- .description('View or change global configuration')
156
- .option('--models-dir <path>', 'Set models directory path')
157
- .action(async (options) => {
158
- try {
159
- await configGlobalCommand(options);
160
- } catch (error) {
161
- console.error(chalk.red('❌ Error:'), (error as Error).message);
162
- process.exit(1);
163
- }
164
- });
165
-
166
- // Server management commands
167
- const server = program
168
- .command('server')
169
- .description('Manage llama-server instances');
170
-
171
- // Create a new server
172
- server
173
- .command('create')
174
- .description('Create and start a new llama-server instance')
175
- .argument('<model>', 'Model filename or path')
176
- .option('-p, --port <number>', 'Port number (default: auto-assign)', parseInt)
177
- .option('-h, --host <address>', 'Bind address (default: 127.0.0.1, use 0.0.0.0 for remote access)')
178
- .option('-t, --threads <number>', 'Thread count (default: auto)', parseInt)
179
- .option('-c, --ctx-size <number>', 'Context size (default: auto)', parseInt)
180
- .option('-g, --gpu-layers <number>', 'GPU layers (default: 60)', parseInt)
181
- .option('-v, --verbose', 'Enable verbose HTTP logging (detailed request/response info)')
182
- .option('-f, --flags <flags>', 'Additional llama-server flags (comma-separated, e.g., "--pooling,mean")')
183
- .action(async (model: string, options) => {
184
- try {
185
- await createCommand(model, options);
186
- } catch (error) {
187
- console.error(chalk.red('❌ Error:'), (error as Error).message);
188
- process.exit(1);
189
- }
190
- });
191
-
192
- // Show server details
193
- server
194
- .command('show')
195
- .description('Show server configuration details')
196
- .argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
197
- .action(async (identifier: string) => {
198
- try {
199
- await serverShowCommand(identifier);
200
- } catch (error) {
201
- console.error(chalk.red('❌ Error:'), (error as Error).message);
202
- process.exit(1);
203
- }
204
- });
205
-
206
- // Update server configuration
207
- server
208
- .command('config')
209
- .description('Update server configuration parameters')
210
- .argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
211
- .option('-m, --model <filename>', 'Update model (filename or path)')
212
- .option('-h, --host <address>', 'Update bind address (127.0.0.1 for localhost, 0.0.0.0 for remote access)')
213
- .option('-t, --threads <number>', 'Update thread count', parseInt)
214
- .option('-c, --ctx-size <number>', 'Update context size', parseInt)
215
- .option('-g, --gpu-layers <number>', 'Update GPU layers', parseInt)
216
- .option('-v, --verbose', 'Enable verbose logging')
217
- .option('--no-verbose', 'Disable verbose logging')
218
- .option('-f, --flags <flags>', 'Update custom llama-server flags (comma-separated, empty string to clear)')
219
- .option('-r, --restart', 'Automatically restart server if running')
220
- .action(async (identifier: string, options) => {
221
- try {
222
- await serverConfigCommand(identifier, options);
223
- } catch (error) {
224
- console.error(chalk.red('❌ Error:'), (error as Error).message);
225
- process.exit(1);
226
- }
227
- });
228
-
229
- // Start an existing server
230
- server
231
- .command('start')
232
- .description('Start an existing stopped server')
233
- .argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
234
- .action(async (identifier: string) => {
235
- try {
236
- await startCommand(identifier);
237
- } catch (error) {
238
- console.error(chalk.red('❌ Error:'), (error as Error).message);
239
- process.exit(1);
240
- }
241
- });
242
-
243
- // Run interactive chat with a model
244
- server
245
- .command('run')
246
- .description('Run an interactive chat session with a model')
247
- .argument('<model>', 'Model identifier: port (9000), server ID (llama-3-2-3b), partial name, or model filename')
248
- .option('-m, --message <text>', 'Send a single message and exit (non-interactive mode)')
249
- .action(async (model: string, options) => {
250
- try {
251
- await runCommand(model, options);
252
- } catch (error) {
253
- console.error(chalk.red('❌ Error:'), (error as Error).message);
254
- process.exit(1);
255
- }
256
- });
257
-
258
- // Stop a server
259
- server
260
- .command('stop')
261
- .description('Stop a running server')
262
- .argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
263
- .action(async (identifier: string) => {
264
- try {
265
- await stopCommand(identifier);
266
- } catch (error) {
267
- console.error(chalk.red('❌ Error:'), (error as Error).message);
268
- process.exit(1);
269
- }
270
- });
271
-
272
- // Delete a server
273
- server
274
- .command('rm')
275
- .description('Remove a server configuration and launchctl service (preserves model file)')
276
- .argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
277
- .action(async (identifier: string) => {
278
- try {
279
- await deleteCommand(identifier);
280
- } catch (error) {
281
- console.error(chalk.red('❌ Error:'), (error as Error).message);
282
- process.exit(1);
283
- }
284
- });
285
-
286
- // View logs
287
- server
288
- .command('logs')
289
- .description('View server logs (default: compact one-line per request)')
290
- .argument('<identifier>', 'Server identifier: port (9000), server ID (llama-3-2-3b), or partial model name')
291
- .option('-f, --follow', 'Follow log output in real-time')
292
- .option('-n, --lines <number>', 'Number of lines to show (default: 50)', parseInt)
293
- .option('--http', 'Show full HTTP JSON request/response logs')
294
- .option('--errors', 'Show only error messages')
295
- .option('--verbose', 'Show all messages including debug internals')
296
- .option('--filter <pattern>', 'Custom grep pattern for filtering')
297
- .option('--stdout', 'Show stdout instead of stderr (rarely needed)')
298
- .option('--clear', 'Clear (truncate) log file to zero bytes')
299
- .option('--clear-archived', 'Delete only archived logs (preserves current logs)')
300
- .option('--clear-all', 'Clear current logs AND delete all archived logs')
301
- .option('--rotate', 'Rotate log file with timestamp (preserves old logs)')
302
- .action(async (identifier: string, options) => {
303
- try {
304
- await logsCommand(identifier, options);
305
- } catch (error) {
306
- console.error(chalk.red('❌ Error:'), (error as Error).message);
307
- process.exit(1);
308
- }
309
- });
310
-
311
- // Monitor server (deprecated - redirects to TUI)
312
- server
313
- .command('monitor [identifier]')
314
- .description('Monitor server with real-time metrics TUI (deprecated: use "llamacpp" instead)')
315
- .action(async (identifier?: string) => {
316
- try {
317
- console.log(chalk.yellow('⚠️ The "monitor" command is deprecated and will be removed in a future version.'));
318
- console.log(chalk.dim(' Please use "llamacpp" instead for the same functionality.\n'));
319
- await monitorCommand(identifier);
320
- } catch (error) {
321
- console.error(chalk.red('❌ Error:'), (error as Error).message);
322
- process.exit(1);
323
- }
324
- });
325
-
326
- // Router management commands
327
- const router = program
328
- .command('router')
329
- .description('Manage the unified router endpoint');
330
-
331
- // Start router
332
- router
333
- .command('start')
334
- .description('Start the router service')
335
- .action(async () => {
336
- try {
337
- await routerStartCommand();
338
- } catch (error) {
339
- console.error(chalk.red('❌ Error:'), (error as Error).message);
340
- process.exit(1);
341
- }
342
- });
343
-
344
- // Stop router
345
- router
346
- .command('stop')
347
- .description('Stop the router service')
348
- .action(async () => {
349
- try {
350
- await routerStopCommand();
351
- } catch (error) {
352
- console.error(chalk.red('❌ Error:'), (error as Error).message);
353
- process.exit(1);
354
- }
355
- });
356
-
357
- // Show router status
358
- router
359
- .command('status')
360
- .description('Show router status and configuration')
361
- .action(async () => {
362
- try {
363
- await routerStatusCommand();
364
- } catch (error) {
365
- console.error(chalk.red('❌ Error:'), (error as Error).message);
366
- process.exit(1);
367
- }
368
- });
369
-
370
- // Restart router
371
- router
372
- .command('restart')
373
- .description('Restart the router service')
374
- .action(async () => {
375
- try {
376
- await routerRestartCommand();
377
- } catch (error) {
378
- console.error(chalk.red('❌ Error:'), (error as Error).message);
379
- process.exit(1);
380
- }
381
- });
382
-
383
- // Configure router
384
- router
385
- .command('config')
386
- .description('Update router configuration')
387
- .option('-p, --port <number>', 'Update port number', parseInt)
388
- .option('-h, --host <address>', 'Update bind address')
389
- .option('--timeout <ms>', 'Update request timeout (milliseconds)', parseInt)
390
- .option('--health-interval <ms>', 'Update health check interval (milliseconds)', parseInt)
391
- .option('-v, --verbose [boolean]', 'Enable/disable verbose logging to file (true/false)', (val) => val === 'true' || val === '1')
392
- .option('-r, --restart', 'Automatically restart router if running')
393
- .action(async (options) => {
394
- try {
395
- await routerConfigCommand(options);
396
- } catch (error) {
397
- console.error(chalk.red('❌ Error:'), (error as Error).message);
398
- process.exit(1);
399
- }
400
- });
401
-
402
- // Router logs
403
- router
404
- .command('logs')
405
- .description('View router logs')
406
- .option('-f, --follow', 'Follow logs in real-time (like tail -f)')
407
- .option('-n, --lines <number>', 'Number of lines to show (default: 50)', parseInt)
408
- .option('--stderr', 'Show system logs (stderr) instead of activity logs (stdout)')
409
- .option('-v, --verbose', 'Show verbose JSON log file (if enabled)')
410
- .option('--clear', 'Clear the log file')
411
- .option('--rotate', 'Rotate the log file with timestamp')
412
- .option('--clear-all', 'Clear all router logs (activity, system, verbose)')
413
- .action(async (options) => {
414
- try {
415
- await routerLogsCommand(options);
416
- } catch (error) {
417
- console.error(chalk.red('❌ Error:'), (error as Error).message);
418
- process.exit(1);
419
- }
420
- });
421
-
422
- // Parse arguments
423
- program.parse();
@@ -1,38 +0,0 @@
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
- }