@appkit/llamacpp-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.versionrc.json +16 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +474 -0
  4. package/bin/llamacpp +26 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +196 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/delete.d.ts +2 -0
  10. package/dist/commands/delete.d.ts.map +1 -0
  11. package/dist/commands/delete.js +104 -0
  12. package/dist/commands/delete.js.map +1 -0
  13. package/dist/commands/list.d.ts +2 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +37 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/logs.d.ts +8 -0
  18. package/dist/commands/logs.d.ts.map +1 -0
  19. package/dist/commands/logs.js +57 -0
  20. package/dist/commands/logs.js.map +1 -0
  21. package/dist/commands/ps.d.ts +2 -0
  22. package/dist/commands/ps.d.ts.map +1 -0
  23. package/dist/commands/ps.js +72 -0
  24. package/dist/commands/ps.js.map +1 -0
  25. package/dist/commands/pull.d.ts +6 -0
  26. package/dist/commands/pull.d.ts.map +1 -0
  27. package/dist/commands/pull.js +36 -0
  28. package/dist/commands/pull.js.map +1 -0
  29. package/dist/commands/rm.d.ts +2 -0
  30. package/dist/commands/rm.d.ts.map +1 -0
  31. package/dist/commands/rm.js +134 -0
  32. package/dist/commands/rm.js.map +1 -0
  33. package/dist/commands/run.d.ts +2 -0
  34. package/dist/commands/run.d.ts.map +1 -0
  35. package/dist/commands/run.js +198 -0
  36. package/dist/commands/run.js.map +1 -0
  37. package/dist/commands/search.d.ts +7 -0
  38. package/dist/commands/search.d.ts.map +1 -0
  39. package/dist/commands/search.js +93 -0
  40. package/dist/commands/search.js.map +1 -0
  41. package/dist/commands/show.d.ts +6 -0
  42. package/dist/commands/show.d.ts.map +1 -0
  43. package/dist/commands/show.js +196 -0
  44. package/dist/commands/show.js.map +1 -0
  45. package/dist/commands/start.d.ts +9 -0
  46. package/dist/commands/start.d.ts.map +1 -0
  47. package/dist/commands/start.js +150 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/stop.d.ts +2 -0
  50. package/dist/commands/stop.d.ts.map +1 -0
  51. package/dist/commands/stop.js +39 -0
  52. package/dist/commands/stop.js.map +1 -0
  53. package/dist/lib/config-generator.d.ts +30 -0
  54. package/dist/lib/config-generator.d.ts.map +1 -0
  55. package/dist/lib/config-generator.js +125 -0
  56. package/dist/lib/config-generator.js.map +1 -0
  57. package/dist/lib/launchctl-manager.d.ts +55 -0
  58. package/dist/lib/launchctl-manager.d.ts.map +1 -0
  59. package/dist/lib/launchctl-manager.js +227 -0
  60. package/dist/lib/launchctl-manager.js.map +1 -0
  61. package/dist/lib/model-downloader.d.ts +44 -0
  62. package/dist/lib/model-downloader.d.ts.map +1 -0
  63. package/dist/lib/model-downloader.js +248 -0
  64. package/dist/lib/model-downloader.js.map +1 -0
  65. package/dist/lib/model-scanner.d.ts +31 -0
  66. package/dist/lib/model-scanner.d.ts.map +1 -0
  67. package/dist/lib/model-scanner.js +145 -0
  68. package/dist/lib/model-scanner.js.map +1 -0
  69. package/dist/lib/model-search.d.ts +29 -0
  70. package/dist/lib/model-search.d.ts.map +1 -0
  71. package/dist/lib/model-search.js +131 -0
  72. package/dist/lib/model-search.js.map +1 -0
  73. package/dist/lib/port-manager.d.ts +26 -0
  74. package/dist/lib/port-manager.d.ts.map +1 -0
  75. package/dist/lib/port-manager.js +75 -0
  76. package/dist/lib/port-manager.js.map +1 -0
  77. package/dist/lib/state-manager.d.ts +59 -0
  78. package/dist/lib/state-manager.d.ts.map +1 -0
  79. package/dist/lib/state-manager.js +178 -0
  80. package/dist/lib/state-manager.js.map +1 -0
  81. package/dist/lib/status-checker.d.ts +28 -0
  82. package/dist/lib/status-checker.d.ts.map +1 -0
  83. package/dist/lib/status-checker.js +99 -0
  84. package/dist/lib/status-checker.js.map +1 -0
  85. package/dist/types/global-config.d.ts +16 -0
  86. package/dist/types/global-config.d.ts.map +1 -0
  87. package/dist/types/global-config.js +18 -0
  88. package/dist/types/global-config.js.map +1 -0
  89. package/dist/types/model-info.d.ts +9 -0
  90. package/dist/types/model-info.d.ts.map +1 -0
  91. package/dist/types/model-info.js +3 -0
  92. package/dist/types/model-info.js.map +1 -0
  93. package/dist/types/server-config.d.ts +27 -0
  94. package/dist/types/server-config.d.ts.map +1 -0
  95. package/dist/types/server-config.js +15 -0
  96. package/dist/types/server-config.js.map +1 -0
  97. package/dist/utils/file-utils.d.ts +49 -0
  98. package/dist/utils/file-utils.d.ts.map +1 -0
  99. package/dist/utils/file-utils.js +144 -0
  100. package/dist/utils/file-utils.js.map +1 -0
  101. package/dist/utils/format-utils.d.ts +29 -0
  102. package/dist/utils/format-utils.d.ts.map +1 -0
  103. package/dist/utils/format-utils.js +82 -0
  104. package/dist/utils/format-utils.js.map +1 -0
  105. package/dist/utils/process-utils.d.ts +27 -0
  106. package/dist/utils/process-utils.d.ts.map +1 -0
  107. package/dist/utils/process-utils.js +66 -0
  108. package/dist/utils/process-utils.js.map +1 -0
  109. package/package.json +56 -0
  110. package/src/cli.ts +195 -0
  111. package/src/commands/delete.ts +74 -0
  112. package/src/commands/list.ts +37 -0
  113. package/src/commands/logs.ts +61 -0
  114. package/src/commands/ps.ts +79 -0
  115. package/src/commands/pull.ts +40 -0
  116. package/src/commands/rm.ts +114 -0
  117. package/src/commands/run.ts +209 -0
  118. package/src/commands/search.ts +107 -0
  119. package/src/commands/show.ts +207 -0
  120. package/src/commands/start.ts +140 -0
  121. package/src/commands/stop.ts +39 -0
  122. package/src/lib/config-generator.ts +119 -0
  123. package/src/lib/launchctl-manager.ts +209 -0
  124. package/src/lib/model-downloader.ts +259 -0
  125. package/src/lib/model-scanner.ts +125 -0
  126. package/src/lib/model-search.ts +114 -0
  127. package/src/lib/port-manager.ts +80 -0
  128. package/src/lib/state-manager.ts +177 -0
  129. package/src/lib/status-checker.ts +113 -0
  130. package/src/types/global-config.ts +26 -0
  131. package/src/types/model-info.ts +8 -0
  132. package/src/types/server-config.ts +42 -0
  133. package/src/utils/file-utils.ts +106 -0
  134. package/src/utils/format-utils.ts +80 -0
  135. package/src/utils/process-utils.ts +60 -0
  136. package/tsconfig.json +20 -0
@@ -0,0 +1,196 @@
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.showCommand = showCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const cli_table3_1 = __importDefault(require("cli-table3"));
42
+ const model_downloader_1 = require("../lib/model-downloader");
43
+ const format_utils_1 = require("../utils/format-utils");
44
+ const https = __importStar(require("https"));
45
+ async function showCommand(identifier, options) {
46
+ // Parse identifier
47
+ const parsed = model_downloader_1.modelDownloader.parseHFIdentifier(identifier);
48
+ const filename = options.file || parsed.file;
49
+ console.log(chalk_1.default.blue('📋 Fetching model information...\n'));
50
+ try {
51
+ // Get model details
52
+ const modelDetails = await getModelDetails(parsed.repo);
53
+ // Display model information
54
+ displayModelInfo(modelDetails);
55
+ // If specific file requested, show file details
56
+ if (filename) {
57
+ console.log(chalk_1.default.blue('\n📄 File Details:\n'));
58
+ await displayFileInfo(parsed.repo, filename);
59
+ }
60
+ else {
61
+ // Show all GGUF files
62
+ console.log(chalk_1.default.blue('\n📦 Available GGUF Files:\n'));
63
+ await displayAllFiles(parsed.repo);
64
+ }
65
+ }
66
+ catch (error) {
67
+ throw new Error(`Failed to fetch model details: ${error.message}`);
68
+ }
69
+ }
70
+ async function getModelDetails(modelId) {
71
+ return new Promise((resolve, reject) => {
72
+ const url = `https://huggingface.co/api/models/${modelId}`;
73
+ https.get(url, (response) => {
74
+ let data = '';
75
+ response.on('data', (chunk) => {
76
+ data += chunk;
77
+ });
78
+ response.on('end', () => {
79
+ try {
80
+ const json = JSON.parse(data);
81
+ const parts = modelId.split('/');
82
+ resolve({
83
+ modelId,
84
+ author: parts[0] || '',
85
+ modelName: parts.slice(1).join('/') || '',
86
+ downloads: json.downloads || 0,
87
+ likes: json.likes || 0,
88
+ lastModified: json.lastModified || '',
89
+ tags: json.tags || [],
90
+ library: json.library_name,
91
+ license: json.cardData?.license,
92
+ });
93
+ }
94
+ catch (error) {
95
+ reject(new Error(`Failed to parse model data: ${error.message}`));
96
+ }
97
+ });
98
+ }).on('error', (error) => {
99
+ reject(error);
100
+ });
101
+ });
102
+ }
103
+ function displayModelInfo(details) {
104
+ console.log(chalk_1.default.bold('Model Information:'));
105
+ console.log(chalk_1.default.dim('─'.repeat(60)));
106
+ console.log(`${chalk_1.default.bold('ID:')} ${details.modelId}`);
107
+ console.log(`${chalk_1.default.bold('Author:')} ${details.author}`);
108
+ console.log(`${chalk_1.default.bold('Downloads:')} ${details.downloads.toLocaleString()}`);
109
+ console.log(`${chalk_1.default.bold('Likes:')} ${details.likes.toLocaleString()}`);
110
+ console.log(`${chalk_1.default.bold('Last Updated:')} ${new Date(details.lastModified).toLocaleDateString()}`);
111
+ if (details.license) {
112
+ console.log(`${chalk_1.default.bold('License:')} ${details.license}`);
113
+ }
114
+ if (details.tags.length > 0) {
115
+ const relevantTags = details.tags
116
+ .filter(tag => !tag.startsWith('arxiv:') && !tag.startsWith('dataset:'))
117
+ .slice(0, 5);
118
+ if (relevantTags.length > 0) {
119
+ console.log(`${chalk_1.default.bold('Tags:')} ${relevantTags.join(', ')}`);
120
+ }
121
+ }
122
+ }
123
+ async function displayFileInfo(modelId, filename) {
124
+ const files = await getModelFiles(modelId);
125
+ const file = files.find(f => f.filename === filename);
126
+ if (!file) {
127
+ console.log(chalk_1.default.yellow(`⚠️ File not found: ${filename}`));
128
+ console.log(chalk_1.default.dim('\nAvailable files:'));
129
+ files.forEach(f => console.log(chalk_1.default.dim(` - ${f.filename}`)));
130
+ return;
131
+ }
132
+ const size = file.lfs?.size || file.size || 0;
133
+ console.log(`${chalk_1.default.bold('Filename:')} ${file.filename}`);
134
+ console.log(`${chalk_1.default.bold('Size:')} ${(0, format_utils_1.formatBytes)(size)}`);
135
+ if (file.lfs) {
136
+ console.log(`${chalk_1.default.bold('SHA256:')} ${file.lfs.oid.substring(0, 16)}...`);
137
+ }
138
+ console.log(chalk_1.default.dim('\nTo download:'));
139
+ console.log(chalk_1.default.dim(` llamacpp pull ${modelId}/${filename}`));
140
+ }
141
+ async function displayAllFiles(modelId) {
142
+ const files = await getModelFiles(modelId);
143
+ const ggufFiles = files.filter(f => f.filename.toLowerCase().endsWith('.gguf'));
144
+ if (ggufFiles.length === 0) {
145
+ console.log(chalk_1.default.yellow('No GGUF files found in this model.'));
146
+ return;
147
+ }
148
+ const table = new cli_table3_1.default({
149
+ head: ['FILENAME', 'SIZE'],
150
+ colWidths: [55, 12],
151
+ });
152
+ for (const file of ggufFiles) {
153
+ // LFS files store size in the lfs object, regular files in size field
154
+ const size = (file.lfs && typeof file.lfs.size === 'number') ? file.lfs.size : file.size;
155
+ table.push([
156
+ file.filename,
157
+ size > 0 ? (0, format_utils_1.formatBytes)(size) : chalk_1.default.dim('Unknown'),
158
+ ]);
159
+ }
160
+ console.log(table.toString());
161
+ const totalSize = ggufFiles.reduce((sum, f) => {
162
+ const size = (f.lfs && typeof f.lfs.size === 'number') ? f.lfs.size : f.size;
163
+ return sum + size;
164
+ }, 0);
165
+ console.log(chalk_1.default.dim(`\nTotal: ${ggufFiles.length} files (${(0, format_utils_1.formatBytes)(totalSize)})`));
166
+ console.log(chalk_1.default.dim('\nTo download a specific file:'));
167
+ console.log(chalk_1.default.dim(` llamacpp pull ${modelId}/<filename>`));
168
+ }
169
+ async function getModelFiles(modelId) {
170
+ return new Promise((resolve, reject) => {
171
+ const url = `https://huggingface.co/api/models/${modelId}`;
172
+ https.get(url, (response) => {
173
+ let data = '';
174
+ response.on('data', (chunk) => {
175
+ data += chunk;
176
+ });
177
+ response.on('end', () => {
178
+ try {
179
+ const json = JSON.parse(data);
180
+ const files = (json.siblings || []).map((file) => ({
181
+ filename: file.rfilename,
182
+ size: file.size || 0,
183
+ lfs: file.lfs,
184
+ }));
185
+ resolve(files);
186
+ }
187
+ catch (error) {
188
+ reject(new Error(`Failed to parse file data: ${error.message}`));
189
+ }
190
+ });
191
+ }).on('error', (error) => {
192
+ reject(error);
193
+ });
194
+ });
195
+ }
196
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface StartOptions {
2
+ port?: number;
3
+ threads?: number;
4
+ ctxSize?: number;
5
+ gpuLayers?: number;
6
+ }
7
+ export declare function startCommand(model: string, options: StartOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAYA,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHtF"}
@@ -0,0 +1,150 @@
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.startCommand = startCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const path = __importStar(require("path"));
42
+ const model_scanner_1 = require("../lib/model-scanner");
43
+ const state_manager_1 = require("../lib/state-manager");
44
+ const config_generator_1 = require("../lib/config-generator");
45
+ const port_manager_1 = require("../lib/port-manager");
46
+ const launchctl_manager_1 = require("../lib/launchctl-manager");
47
+ const status_checker_1 = require("../lib/status-checker");
48
+ const process_utils_1 = require("../utils/process-utils");
49
+ const format_utils_1 = require("../utils/format-utils");
50
+ const file_utils_1 = require("../utils/file-utils");
51
+ async function startCommand(model, options) {
52
+ // Initialize state manager
53
+ await state_manager_1.stateManager.initialize();
54
+ // 1. Check if llama-server exists
55
+ if (!(await (0, process_utils_1.commandExists)('llama-server'))) {
56
+ throw new Error('llama-server not found. Install with: brew install llama.cpp');
57
+ }
58
+ // 2. Resolve model path
59
+ const modelPath = await model_scanner_1.modelScanner.resolveModelPath(model);
60
+ if (!modelPath) {
61
+ throw new Error(`Model not found: ${model}\n\nRun: llamacpp list`);
62
+ }
63
+ const modelName = path.basename(modelPath);
64
+ // 3. Check if server already exists for this model
65
+ const existingServer = await state_manager_1.stateManager.serverExistsForModel(modelPath);
66
+ if (existingServer) {
67
+ throw new Error(`Server already exists for ${modelName}\n\nUse: llamacpp ps`);
68
+ }
69
+ // 4. Get model size
70
+ const modelSize = await model_scanner_1.modelScanner.getModelSize(modelName);
71
+ if (!modelSize) {
72
+ throw new Error(`Failed to read model file: ${modelPath}`);
73
+ }
74
+ // 5. Determine port
75
+ let port;
76
+ if (options.port) {
77
+ port_manager_1.portManager.validatePort(options.port);
78
+ const available = await port_manager_1.portManager.isPortAvailable(options.port);
79
+ if (!available) {
80
+ throw new Error(`Port ${options.port} is already in use`);
81
+ }
82
+ port = options.port;
83
+ }
84
+ else {
85
+ port = await port_manager_1.portManager.findAvailablePort();
86
+ }
87
+ // 6. Generate server configuration
88
+ console.log(chalk_1.default.blue(`🚀 Starting server for ${modelName}\n`));
89
+ const serverOptions = {
90
+ port: options.port,
91
+ threads: options.threads,
92
+ ctxSize: options.ctxSize,
93
+ gpuLayers: options.gpuLayers,
94
+ };
95
+ const config = await config_generator_1.configGenerator.generateConfig(modelPath, modelName, modelSize, port, serverOptions);
96
+ // Display configuration
97
+ console.log(chalk_1.default.dim(`Model: ${modelPath}`));
98
+ console.log(chalk_1.default.dim(`Size: ${(0, format_utils_1.formatBytes)(modelSize)}`));
99
+ console.log(chalk_1.default.dim(`Port: ${config.port}${options.port ? '' : ' (auto-assigned)'}`));
100
+ console.log(chalk_1.default.dim(`Threads: ${config.threads}`));
101
+ console.log(chalk_1.default.dim(`Context Size: ${config.ctxSize}`));
102
+ console.log(chalk_1.default.dim(`GPU Layers: ${config.gpuLayers}`));
103
+ console.log();
104
+ // 7. Ensure log directory exists
105
+ await (0, file_utils_1.ensureDir)(path.dirname(config.stdoutPath));
106
+ // 8. Create plist file
107
+ console.log(chalk_1.default.dim('Creating launchctl service...'));
108
+ await launchctl_manager_1.launchctlManager.createPlist(config);
109
+ // 9. Load service
110
+ try {
111
+ await launchctl_manager_1.launchctlManager.loadService(config.plistPath);
112
+ }
113
+ catch (error) {
114
+ // Clean up plist if load fails
115
+ await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
116
+ throw new Error(`Failed to load service: ${error.message}`);
117
+ }
118
+ // 10. Start service
119
+ try {
120
+ await launchctl_manager_1.launchctlManager.startService(config.label);
121
+ }
122
+ catch (error) {
123
+ // Clean up if start fails
124
+ await launchctl_manager_1.launchctlManager.unloadService(config.plistPath);
125
+ await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
126
+ throw new Error(`Failed to start service: ${error.message}`);
127
+ }
128
+ // 11. Wait for startup
129
+ console.log(chalk_1.default.dim('Waiting for server to start...'));
130
+ const started = await launchctl_manager_1.launchctlManager.waitForServiceStart(config.label, 5000);
131
+ if (!started) {
132
+ // Clean up if startup fails
133
+ await launchctl_manager_1.launchctlManager.stopService(config.label);
134
+ await launchctl_manager_1.launchctlManager.unloadService(config.plistPath);
135
+ await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
136
+ throw new Error('Server failed to start. Check logs with: llamacpp logs --errors');
137
+ }
138
+ // 12. Update config with running status
139
+ const updatedConfig = await status_checker_1.statusChecker.updateServerStatus(config);
140
+ // 13. Save server config
141
+ await state_manager_1.stateManager.saveServerConfig(updatedConfig);
142
+ // 14. Display success message
143
+ console.log();
144
+ console.log(chalk_1.default.green('✅ Server started successfully!'));
145
+ console.log();
146
+ console.log(chalk_1.default.dim(`Connect: http://localhost:${config.port}`));
147
+ console.log(chalk_1.default.dim(`View logs: llamacpp logs ${config.id}`));
148
+ console.log(chalk_1.default.dim(`Stop: llamacpp stop ${config.id}`));
149
+ }
150
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function stopCommand(identifier: string): Promise<void>;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCnE"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.stopCommand = stopCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const state_manager_1 = require("../lib/state-manager");
9
+ const launchctl_manager_1 = require("../lib/launchctl-manager");
10
+ const status_checker_1 = require("../lib/status-checker");
11
+ async function stopCommand(identifier) {
12
+ // Find server
13
+ const server = await state_manager_1.stateManager.findServer(identifier);
14
+ if (!server) {
15
+ throw new Error(`Server not found: ${identifier}\n\nUse: llamacpp ps`);
16
+ }
17
+ // Check if already stopped
18
+ if (server.status === 'stopped') {
19
+ console.log(chalk_1.default.yellow(`⚠️ Server ${server.modelName} is already stopped`));
20
+ return;
21
+ }
22
+ console.log(chalk_1.default.blue(`⏹️ Stopping ${server.modelName} (port ${server.port})...`));
23
+ // Stop the service
24
+ try {
25
+ await launchctl_manager_1.launchctlManager.stopService(server.label);
26
+ }
27
+ catch (error) {
28
+ throw new Error(`Failed to stop service: ${error.message}`);
29
+ }
30
+ // Wait for clean shutdown
31
+ const stopped = await launchctl_manager_1.launchctlManager.waitForServiceStop(server.label, 5000);
32
+ if (!stopped) {
33
+ console.log(chalk_1.default.yellow('⚠️ Server did not stop cleanly (timeout)'));
34
+ }
35
+ // Update server status
36
+ await status_checker_1.statusChecker.updateServerStatus(server);
37
+ console.log(chalk_1.default.green('✅ Server stopped'));
38
+ }
39
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";;;;;AAKA,kCAiCC;AAtCD,kDAA0B;AAC1B,wDAAoD;AACpD,gEAA4D;AAC5D,0DAAsD;AAE/C,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,sBAAsB,CAAC,CAAC;IACzE,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IAErF,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2BAA4B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,MAAM,oCAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,uBAAuB;IACvB,MAAM,8BAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { ServerConfig } from '../types/server-config';
2
+ export interface ServerOptions {
3
+ port?: number;
4
+ threads?: number;
5
+ ctxSize?: number;
6
+ gpuLayers?: number;
7
+ embeddings?: boolean;
8
+ jinja?: boolean;
9
+ }
10
+ export interface SmartDefaults {
11
+ threads: number;
12
+ ctxSize: number;
13
+ gpuLayers: number;
14
+ }
15
+ export declare class ConfigGenerator {
16
+ /**
17
+ * Calculate smart defaults based on model size
18
+ */
19
+ calculateSmartDefaults(modelSizeBytes: number): SmartDefaults;
20
+ /**
21
+ * Generate server configuration
22
+ */
23
+ generateConfig(modelPath: string, modelName: string, modelSize: number, port: number, options?: ServerOptions): Promise<ServerConfig>;
24
+ /**
25
+ * Merge global defaults with user options
26
+ */
27
+ mergeWithGlobalDefaults(options?: ServerOptions): Promise<Partial<ServerOptions>>;
28
+ }
29
+ export declare const configGenerator: ConfigGenerator;
30
+ //# sourceMappingURL=config-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/lib/config-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAqB,MAAM,wBAAwB,CAAC;AAIzE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B;;OAEG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa;IAyB7D;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC;IA0CxB;;OAEG;IACG,uBAAuB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;CAWxF;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
@@ -0,0 +1,125 @@
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.configGenerator = exports.ConfigGenerator = void 0;
37
+ const os = __importStar(require("os"));
38
+ const path = __importStar(require("path"));
39
+ const server_config_1 = require("../types/server-config");
40
+ const file_utils_1 = require("../utils/file-utils");
41
+ const state_manager_1 = require("./state-manager");
42
+ class ConfigGenerator {
43
+ /**
44
+ * Calculate smart defaults based on model size
45
+ */
46
+ calculateSmartDefaults(modelSizeBytes) {
47
+ const sizeGB = modelSizeBytes / (1024 ** 3);
48
+ // Context size based on model size
49
+ let ctxSize;
50
+ if (sizeGB < 1) {
51
+ ctxSize = 2048; // < 1GB: small context
52
+ }
53
+ else if (sizeGB < 3) {
54
+ ctxSize = 4096; // 1-3GB: medium
55
+ }
56
+ else if (sizeGB < 6) {
57
+ ctxSize = 8192; // 3-6GB: large
58
+ }
59
+ else {
60
+ ctxSize = 16384; // 6GB+: very large
61
+ }
62
+ // GPU layers - always max for Metal (macOS)
63
+ const gpuLayers = 60; // llama.cpp auto-detects optimal value
64
+ // Threads - use half of available cores (better performance)
65
+ const cpuCount = os.cpus().length;
66
+ const threads = Math.max(4, Math.floor(cpuCount / 2));
67
+ return { threads, ctxSize, gpuLayers };
68
+ }
69
+ /**
70
+ * Generate server configuration
71
+ */
72
+ async generateConfig(modelPath, modelName, modelSize, port, options) {
73
+ // Calculate smart defaults
74
+ const smartDefaults = this.calculateSmartDefaults(modelSize);
75
+ // Apply user overrides
76
+ const threads = options?.threads ?? smartDefaults.threads;
77
+ const ctxSize = options?.ctxSize ?? smartDefaults.ctxSize;
78
+ const gpuLayers = options?.gpuLayers ?? smartDefaults.gpuLayers;
79
+ const embeddings = options?.embeddings ?? true;
80
+ const jinja = options?.jinja ?? true;
81
+ // Generate server ID
82
+ const id = (0, server_config_1.sanitizeModelName)(modelName);
83
+ // Generate paths
84
+ const label = `com.llama.${id}`;
85
+ const plistPath = path.join((0, file_utils_1.getLaunchAgentsDir)(), `${label}.plist`);
86
+ const logsDir = (0, file_utils_1.getLogsDir)();
87
+ const stdoutPath = path.join(logsDir, `${id}.stdout`);
88
+ const stderrPath = path.join(logsDir, `${id}.stderr`);
89
+ const config = {
90
+ id,
91
+ modelPath,
92
+ modelName,
93
+ port,
94
+ threads,
95
+ ctxSize,
96
+ gpuLayers,
97
+ embeddings,
98
+ jinja,
99
+ status: 'stopped',
100
+ createdAt: new Date().toISOString(),
101
+ plistPath,
102
+ label,
103
+ stdoutPath,
104
+ stderrPath,
105
+ };
106
+ return config;
107
+ }
108
+ /**
109
+ * Merge global defaults with user options
110
+ */
111
+ async mergeWithGlobalDefaults(options) {
112
+ const globalConfig = await state_manager_1.stateManager.loadGlobalConfig();
113
+ return {
114
+ threads: options?.threads ?? globalConfig.defaults.threads,
115
+ ctxSize: options?.ctxSize ?? globalConfig.defaults.ctxSize,
116
+ gpuLayers: options?.gpuLayers ?? globalConfig.defaults.gpuLayers,
117
+ embeddings: options?.embeddings ?? true,
118
+ jinja: options?.jinja ?? true,
119
+ };
120
+ }
121
+ }
122
+ exports.ConfigGenerator = ConfigGenerator;
123
+ // Export singleton instance
124
+ exports.configGenerator = new ConfigGenerator();
125
+ //# sourceMappingURL=config-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/lib/config-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { ServerConfig } from '../types/server-config';
2
+ export interface ServiceStatus {
3
+ isRunning: boolean;
4
+ pid: number | null;
5
+ exitCode: number | null;
6
+ lastExitReason?: string;
7
+ }
8
+ export declare class LaunchctlManager {
9
+ /**
10
+ * Generate plist XML content for a server
11
+ */
12
+ generatePlist(config: ServerConfig): string;
13
+ /**
14
+ * Create and write plist file
15
+ */
16
+ createPlist(config: ServerConfig): Promise<void>;
17
+ /**
18
+ * Delete plist file
19
+ */
20
+ deletePlist(plistPath: string): Promise<void>;
21
+ /**
22
+ * Load service (register with launchctl)
23
+ */
24
+ loadService(plistPath: string): Promise<void>;
25
+ /**
26
+ * Unload service (unregister from launchctl)
27
+ */
28
+ unloadService(plistPath: string): Promise<void>;
29
+ /**
30
+ * Start service
31
+ */
32
+ startService(label: string): Promise<void>;
33
+ /**
34
+ * Stop service
35
+ */
36
+ stopService(label: string): Promise<void>;
37
+ /**
38
+ * Get service status from launchctl
39
+ */
40
+ getServiceStatus(label: string): Promise<ServiceStatus>;
41
+ /**
42
+ * Interpret exit code to human-readable reason
43
+ */
44
+ private interpretExitCode;
45
+ /**
46
+ * Wait for service to start (with timeout)
47
+ */
48
+ waitForServiceStart(label: string, timeoutMs?: number): Promise<boolean>;
49
+ /**
50
+ * Wait for service to stop (with timeout)
51
+ */
52
+ waitForServiceStop(label: string, timeoutMs?: number): Promise<boolean>;
53
+ }
54
+ export declare const launchctlManager: LaunchctlManager;
55
+ //# sourceMappingURL=launchctl-manager.d.ts.map