@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.
- package/.versionrc.json +16 -0
- package/CHANGELOG.md +10 -0
- package/README.md +474 -0
- package/bin/llamacpp +26 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +196 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +104 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +37 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +57 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +72 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +36 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/rm.d.ts +2 -0
- package/dist/commands/rm.d.ts.map +1 -0
- package/dist/commands/rm.js +134 -0
- package/dist/commands/rm.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +198 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +93 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/show.d.ts +6 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +196 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/start.d.ts +9 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +150 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +39 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/lib/config-generator.d.ts +30 -0
- package/dist/lib/config-generator.d.ts.map +1 -0
- package/dist/lib/config-generator.js +125 -0
- package/dist/lib/config-generator.js.map +1 -0
- package/dist/lib/launchctl-manager.d.ts +55 -0
- package/dist/lib/launchctl-manager.d.ts.map +1 -0
- package/dist/lib/launchctl-manager.js +227 -0
- package/dist/lib/launchctl-manager.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +44 -0
- package/dist/lib/model-downloader.d.ts.map +1 -0
- package/dist/lib/model-downloader.js +248 -0
- package/dist/lib/model-downloader.js.map +1 -0
- package/dist/lib/model-scanner.d.ts +31 -0
- package/dist/lib/model-scanner.d.ts.map +1 -0
- package/dist/lib/model-scanner.js +145 -0
- package/dist/lib/model-scanner.js.map +1 -0
- package/dist/lib/model-search.d.ts +29 -0
- package/dist/lib/model-search.d.ts.map +1 -0
- package/dist/lib/model-search.js +131 -0
- package/dist/lib/model-search.js.map +1 -0
- package/dist/lib/port-manager.d.ts +26 -0
- package/dist/lib/port-manager.d.ts.map +1 -0
- package/dist/lib/port-manager.js +75 -0
- package/dist/lib/port-manager.js.map +1 -0
- package/dist/lib/state-manager.d.ts +59 -0
- package/dist/lib/state-manager.d.ts.map +1 -0
- package/dist/lib/state-manager.js +178 -0
- package/dist/lib/state-manager.js.map +1 -0
- package/dist/lib/status-checker.d.ts +28 -0
- package/dist/lib/status-checker.d.ts.map +1 -0
- package/dist/lib/status-checker.js +99 -0
- package/dist/lib/status-checker.js.map +1 -0
- package/dist/types/global-config.d.ts +16 -0
- package/dist/types/global-config.d.ts.map +1 -0
- package/dist/types/global-config.js +18 -0
- package/dist/types/global-config.js.map +1 -0
- package/dist/types/model-info.d.ts +9 -0
- package/dist/types/model-info.d.ts.map +1 -0
- package/dist/types/model-info.js +3 -0
- package/dist/types/model-info.js.map +1 -0
- package/dist/types/server-config.d.ts +27 -0
- package/dist/types/server-config.d.ts.map +1 -0
- package/dist/types/server-config.js +15 -0
- package/dist/types/server-config.js.map +1 -0
- package/dist/utils/file-utils.d.ts +49 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +144 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/format-utils.d.ts +29 -0
- package/dist/utils/format-utils.d.ts.map +1 -0
- package/dist/utils/format-utils.js +82 -0
- package/dist/utils/format-utils.js.map +1 -0
- package/dist/utils/process-utils.d.ts +27 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +66 -0
- package/dist/utils/process-utils.js.map +1 -0
- package/package.json +56 -0
- package/src/cli.ts +195 -0
- package/src/commands/delete.ts +74 -0
- package/src/commands/list.ts +37 -0
- package/src/commands/logs.ts +61 -0
- package/src/commands/ps.ts +79 -0
- package/src/commands/pull.ts +40 -0
- package/src/commands/rm.ts +114 -0
- package/src/commands/run.ts +209 -0
- package/src/commands/search.ts +107 -0
- package/src/commands/show.ts +207 -0
- package/src/commands/start.ts +140 -0
- package/src/commands/stop.ts +39 -0
- package/src/lib/config-generator.ts +119 -0
- package/src/lib/launchctl-manager.ts +209 -0
- package/src/lib/model-downloader.ts +259 -0
- package/src/lib/model-scanner.ts +125 -0
- package/src/lib/model-search.ts +114 -0
- package/src/lib/port-manager.ts +80 -0
- package/src/lib/state-manager.ts +177 -0
- package/src/lib/status-checker.ts +113 -0
- package/src/types/global-config.ts +26 -0
- package/src/types/model-info.ts +8 -0
- package/src/types/server-config.ts +42 -0
- package/src/utils/file-utils.ts +106 -0
- package/src/utils/format-utils.ts +80 -0
- package/src/utils/process-utils.ts +60 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|