@appkit/llamacpp-cli 1.11.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +356 -3
- package/dist/cli.js +99 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/admin/config.d.ts +10 -0
- package/dist/commands/admin/config.d.ts.map +1 -0
- package/dist/commands/admin/config.js +100 -0
- package/dist/commands/admin/config.js.map +1 -0
- package/dist/commands/admin/logs.d.ts +10 -0
- package/dist/commands/admin/logs.d.ts.map +1 -0
- package/dist/commands/admin/logs.js +114 -0
- package/dist/commands/admin/logs.js.map +1 -0
- package/dist/commands/admin/restart.d.ts +2 -0
- package/dist/commands/admin/restart.d.ts.map +1 -0
- package/dist/commands/admin/restart.js +29 -0
- package/dist/commands/admin/restart.js.map +1 -0
- package/dist/commands/admin/start.d.ts +2 -0
- package/dist/commands/admin/start.d.ts.map +1 -0
- package/dist/commands/admin/start.js +30 -0
- package/dist/commands/admin/start.js.map +1 -0
- package/dist/commands/admin/status.d.ts +2 -0
- package/dist/commands/admin/status.d.ts.map +1 -0
- package/dist/commands/admin/status.js +82 -0
- package/dist/commands/admin/status.js.map +1 -0
- package/dist/commands/admin/stop.d.ts +2 -0
- package/dist/commands/admin/stop.d.ts.map +1 -0
- package/dist/commands/admin/stop.js +21 -0
- package/dist/commands/admin/stop.js.map +1 -0
- package/dist/commands/logs.d.ts +1 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +22 -0
- package/dist/commands/logs.js.map +1 -1
- package/dist/lib/admin-manager.d.ts +111 -0
- package/dist/lib/admin-manager.d.ts.map +1 -0
- package/dist/lib/admin-manager.js +413 -0
- package/dist/lib/admin-manager.js.map +1 -0
- package/dist/lib/admin-server.d.ts +148 -0
- package/dist/lib/admin-server.d.ts.map +1 -0
- package/dist/lib/admin-server.js +1161 -0
- package/dist/lib/admin-server.js.map +1 -0
- package/dist/lib/download-job-manager.d.ts +64 -0
- package/dist/lib/download-job-manager.d.ts.map +1 -0
- package/dist/lib/download-job-manager.js +164 -0
- package/dist/lib/download-job-manager.js.map +1 -0
- package/dist/tui/MultiServerMonitorApp.js +1 -1
- package/dist/types/admin-config.d.ts +19 -0
- package/dist/types/admin-config.d.ts.map +1 -0
- package/dist/types/admin-config.js +3 -0
- package/dist/types/admin-config.js.map +1 -0
- package/dist/utils/log-parser.d.ts +9 -0
- package/dist/utils/log-parser.d.ts.map +1 -1
- package/dist/utils/log-parser.js +11 -0
- package/dist/utils/log-parser.js.map +1 -1
- package/docs/images/web-ui-servers.png +0 -0
- package/package.json +1 -1
- package/src/cli.ts +100 -0
- package/src/commands/admin/config.ts +121 -0
- package/src/commands/admin/logs.ts +91 -0
- package/src/commands/admin/restart.ts +26 -0
- package/src/commands/admin/start.ts +27 -0
- package/src/commands/admin/status.ts +84 -0
- package/src/commands/admin/stop.ts +16 -0
- package/src/commands/logs.ts +24 -0
- package/src/lib/admin-manager.ts +435 -0
- package/src/lib/admin-server.ts +1243 -0
- package/src/lib/download-job-manager.ts +213 -0
- package/src/tui/MultiServerMonitorApp.ts +1 -1
- package/src/types/admin-config.ts +25 -0
- package/src/utils/log-parser.ts +13 -0
- package/web/README.md +429 -0
- package/web/eslint.config.js +23 -0
- package/web/index.html +13 -0
- package/web/llamacpp-web-dist.tar.gz +0 -0
- package/web/package-lock.json +4017 -0
- package/web/package.json +38 -0
- package/web/postcss.config.js +6 -0
- package/web/public/vite.svg +1 -0
- package/web/src/App.css +42 -0
- package/web/src/App.tsx +86 -0
- package/web/src/assets/react.svg +1 -0
- package/web/src/components/ApiKeyPrompt.tsx +71 -0
- package/web/src/components/CreateServerModal.tsx +372 -0
- package/web/src/components/DownloadProgress.tsx +123 -0
- package/web/src/components/Nav.tsx +89 -0
- package/web/src/components/RouterConfigModal.tsx +240 -0
- package/web/src/components/SearchModal.tsx +306 -0
- package/web/src/components/ServerConfigModal.tsx +291 -0
- package/web/src/hooks/useApi.ts +259 -0
- package/web/src/index.css +42 -0
- package/web/src/lib/api.ts +226 -0
- package/web/src/main.tsx +10 -0
- package/web/src/pages/Dashboard.tsx +103 -0
- package/web/src/pages/Models.tsx +258 -0
- package/web/src/pages/Router.tsx +270 -0
- package/web/src/pages/RouterLogs.tsx +201 -0
- package/web/src/pages/ServerLogs.tsx +553 -0
- package/web/src/pages/Servers.tsx +358 -0
- package/web/src/types/api.ts +140 -0
- package/web/tailwind.config.js +31 -0
- package/web/tsconfig.app.json +28 -0
- package/web/tsconfig.json +7 -0
- package/web/tsconfig.node.json +26 -0
- package/web/vite.config.ts +25 -0
- package/MONITORING-ACCURACY-FIX.md +0 -199
- package/PER-PROCESS-METRICS.md +0 -190
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { AdminConfig } from '../types/admin-config';
|
|
2
|
+
export interface AdminServiceStatus {
|
|
3
|
+
isRunning: boolean;
|
|
4
|
+
pid: number | null;
|
|
5
|
+
exitCode: number | null;
|
|
6
|
+
lastExitReason?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class AdminManager {
|
|
9
|
+
private configDir;
|
|
10
|
+
private logsDir;
|
|
11
|
+
private configPath;
|
|
12
|
+
private launchAgentsDir;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Initialize admin directories
|
|
16
|
+
*/
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a secure random API key
|
|
20
|
+
*/
|
|
21
|
+
generateApiKey(): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get default admin configuration
|
|
24
|
+
*/
|
|
25
|
+
getDefaultConfig(): AdminConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Load admin configuration
|
|
28
|
+
*/
|
|
29
|
+
loadConfig(): Promise<AdminConfig | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Save admin configuration
|
|
32
|
+
*/
|
|
33
|
+
saveConfig(config: AdminConfig): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Update admin configuration with partial changes
|
|
36
|
+
*/
|
|
37
|
+
updateConfig(updates: Partial<AdminConfig>): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete admin configuration
|
|
40
|
+
*/
|
|
41
|
+
deleteConfig(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Regenerate API key
|
|
44
|
+
*/
|
|
45
|
+
regenerateApiKey(): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Generate plist XML content for the admin service
|
|
48
|
+
*/
|
|
49
|
+
generatePlist(config: AdminConfig): string;
|
|
50
|
+
/**
|
|
51
|
+
* Create and write plist file
|
|
52
|
+
*/
|
|
53
|
+
createPlist(config: AdminConfig): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Delete plist file
|
|
56
|
+
*/
|
|
57
|
+
deletePlist(config: AdminConfig): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Load service (register with launchctl)
|
|
60
|
+
*/
|
|
61
|
+
loadService(plistPath: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Unload service (unregister from launchctl)
|
|
64
|
+
*/
|
|
65
|
+
unloadService(plistPath: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Start service
|
|
68
|
+
*/
|
|
69
|
+
startService(label: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Stop service
|
|
72
|
+
*/
|
|
73
|
+
stopService(label: string): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get service status from launchctl
|
|
76
|
+
*/
|
|
77
|
+
getServiceStatus(label: string): Promise<AdminServiceStatus>;
|
|
78
|
+
/**
|
|
79
|
+
* Interpret exit code to human-readable reason
|
|
80
|
+
*/
|
|
81
|
+
private interpretExitCode;
|
|
82
|
+
/**
|
|
83
|
+
* Wait for service to start (with timeout)
|
|
84
|
+
*/
|
|
85
|
+
waitForServiceStart(label: string, timeoutMs?: number): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* Wait for service to stop (with timeout)
|
|
88
|
+
*/
|
|
89
|
+
waitForServiceStop(label: string, timeoutMs?: number): Promise<boolean>;
|
|
90
|
+
/**
|
|
91
|
+
* Start admin service
|
|
92
|
+
*/
|
|
93
|
+
start(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Stop admin service
|
|
96
|
+
*/
|
|
97
|
+
stop(): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Restart admin service
|
|
100
|
+
*/
|
|
101
|
+
restart(): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Get admin status
|
|
104
|
+
*/
|
|
105
|
+
getStatus(): Promise<{
|
|
106
|
+
config: AdminConfig;
|
|
107
|
+
status: AdminServiceStatus;
|
|
108
|
+
} | null>;
|
|
109
|
+
}
|
|
110
|
+
export declare const adminManager: AdminManager;
|
|
111
|
+
//# sourceMappingURL=admin-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-manager.d.ts","sourceRoot":"","sources":["../../src/lib/admin-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAapD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;;IAShC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,gBAAgB,IAAI,WAAW;IAiB/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO/C;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAkE1C;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyClE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAY5E;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3E;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,GAAG,IAAI,CAAC;CASvF;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,413 @@
|
|
|
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.adminManager = exports.AdminManager = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs/promises"));
|
|
39
|
+
const crypto = __importStar(require("crypto"));
|
|
40
|
+
const process_utils_1 = require("../utils/process-utils");
|
|
41
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
42
|
+
class AdminManager {
|
|
43
|
+
constructor() {
|
|
44
|
+
this.configDir = (0, file_utils_1.getConfigDir)();
|
|
45
|
+
this.logsDir = (0, file_utils_1.getLogsDir)();
|
|
46
|
+
this.configPath = path.join(this.configDir, 'admin.json');
|
|
47
|
+
this.launchAgentsDir = (0, file_utils_1.getLaunchAgentsDir)();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Initialize admin directories
|
|
51
|
+
*/
|
|
52
|
+
async initialize() {
|
|
53
|
+
await (0, file_utils_1.ensureDir)(this.configDir);
|
|
54
|
+
await (0, file_utils_1.ensureDir)(this.logsDir);
|
|
55
|
+
await (0, file_utils_1.ensureDir)(this.launchAgentsDir);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generate a secure random API key
|
|
59
|
+
*/
|
|
60
|
+
generateApiKey() {
|
|
61
|
+
return crypto.randomBytes(32).toString('hex');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get default admin configuration
|
|
65
|
+
*/
|
|
66
|
+
getDefaultConfig() {
|
|
67
|
+
return {
|
|
68
|
+
id: 'admin',
|
|
69
|
+
port: 9200,
|
|
70
|
+
host: '127.0.0.1',
|
|
71
|
+
apiKey: this.generateApiKey(),
|
|
72
|
+
label: 'com.llama.admin',
|
|
73
|
+
plistPath: path.join(this.launchAgentsDir, 'com.llama.admin.plist'),
|
|
74
|
+
stdoutPath: path.join(this.logsDir, 'admin.stdout'),
|
|
75
|
+
stderrPath: path.join(this.logsDir, 'admin.stderr'),
|
|
76
|
+
requestTimeout: 30000,
|
|
77
|
+
verbose: false,
|
|
78
|
+
status: 'stopped',
|
|
79
|
+
createdAt: new Date().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load admin configuration
|
|
84
|
+
*/
|
|
85
|
+
async loadConfig() {
|
|
86
|
+
if (!(await (0, file_utils_1.fileExists)(this.configPath))) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return await (0, file_utils_1.readJson)(this.configPath);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Save admin configuration
|
|
93
|
+
*/
|
|
94
|
+
async saveConfig(config) {
|
|
95
|
+
await (0, file_utils_1.writeJsonAtomic)(this.configPath, config);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Update admin configuration with partial changes
|
|
99
|
+
*/
|
|
100
|
+
async updateConfig(updates) {
|
|
101
|
+
const existingConfig = await this.loadConfig();
|
|
102
|
+
if (!existingConfig) {
|
|
103
|
+
throw new Error('Admin configuration not found');
|
|
104
|
+
}
|
|
105
|
+
const updatedConfig = { ...existingConfig, ...updates };
|
|
106
|
+
await this.saveConfig(updatedConfig);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Delete admin configuration
|
|
110
|
+
*/
|
|
111
|
+
async deleteConfig() {
|
|
112
|
+
if (await (0, file_utils_1.fileExists)(this.configPath)) {
|
|
113
|
+
await fs.unlink(this.configPath);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Regenerate API key
|
|
118
|
+
*/
|
|
119
|
+
async regenerateApiKey() {
|
|
120
|
+
const config = await this.loadConfig();
|
|
121
|
+
if (!config) {
|
|
122
|
+
throw new Error('Admin configuration not found');
|
|
123
|
+
}
|
|
124
|
+
const newApiKey = this.generateApiKey();
|
|
125
|
+
await this.updateConfig({ apiKey: newApiKey });
|
|
126
|
+
return newApiKey;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate plist XML content for the admin service
|
|
130
|
+
*/
|
|
131
|
+
generatePlist(config) {
|
|
132
|
+
// Find the compiled admin-server.js file
|
|
133
|
+
// In dev mode (tsx), __dirname is src/lib/
|
|
134
|
+
// In production, __dirname is dist/lib/
|
|
135
|
+
// Always use the compiled dist version for launchctl
|
|
136
|
+
let adminServerPath;
|
|
137
|
+
if (__dirname.includes('/src/')) {
|
|
138
|
+
// Dev mode - point to dist/lib/admin-server.js
|
|
139
|
+
const projectRoot = path.resolve(__dirname, '../..');
|
|
140
|
+
adminServerPath = path.join(projectRoot, 'dist/lib/admin-server.js');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Production mode - already in dist/lib/
|
|
144
|
+
adminServerPath = path.join(__dirname, 'admin-server.js');
|
|
145
|
+
}
|
|
146
|
+
// Use the current Node.js executable path (resolves symlinks)
|
|
147
|
+
const nodePath = process.execPath;
|
|
148
|
+
const args = [
|
|
149
|
+
nodePath,
|
|
150
|
+
adminServerPath,
|
|
151
|
+
'--config', this.configPath,
|
|
152
|
+
];
|
|
153
|
+
const argsXml = args.map(arg => ` <string>${arg}</string>`).join('\n');
|
|
154
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
155
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
156
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
157
|
+
<plist version="1.0">
|
|
158
|
+
<dict>
|
|
159
|
+
<key>Label</key>
|
|
160
|
+
<string>${config.label}</string>
|
|
161
|
+
|
|
162
|
+
<key>ProgramArguments</key>
|
|
163
|
+
<array>
|
|
164
|
+
${argsXml}
|
|
165
|
+
</array>
|
|
166
|
+
|
|
167
|
+
<key>RunAtLoad</key>
|
|
168
|
+
<false/>
|
|
169
|
+
|
|
170
|
+
<key>KeepAlive</key>
|
|
171
|
+
<dict>
|
|
172
|
+
<key>Crashed</key>
|
|
173
|
+
<true/>
|
|
174
|
+
<key>SuccessfulExit</key>
|
|
175
|
+
<false/>
|
|
176
|
+
</dict>
|
|
177
|
+
|
|
178
|
+
<key>StandardOutPath</key>
|
|
179
|
+
<string>${config.stdoutPath}</string>
|
|
180
|
+
|
|
181
|
+
<key>StandardErrorPath</key>
|
|
182
|
+
<string>${config.stderrPath}</string>
|
|
183
|
+
|
|
184
|
+
<key>WorkingDirectory</key>
|
|
185
|
+
<string>/tmp</string>
|
|
186
|
+
|
|
187
|
+
<key>ThrottleInterval</key>
|
|
188
|
+
<integer>10</integer>
|
|
189
|
+
</dict>
|
|
190
|
+
</plist>
|
|
191
|
+
`;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Create and write plist file
|
|
195
|
+
*/
|
|
196
|
+
async createPlist(config) {
|
|
197
|
+
const plistContent = this.generatePlist(config);
|
|
198
|
+
await (0, file_utils_1.writeFileAtomic)(config.plistPath, plistContent);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Delete plist file
|
|
202
|
+
*/
|
|
203
|
+
async deletePlist(config) {
|
|
204
|
+
if (await (0, file_utils_1.fileExists)(config.plistPath)) {
|
|
205
|
+
await fs.unlink(config.plistPath);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Load service (register with launchctl)
|
|
210
|
+
*/
|
|
211
|
+
async loadService(plistPath) {
|
|
212
|
+
await (0, process_utils_1.execCommand)(`launchctl load "${plistPath}"`);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Unload service (unregister from launchctl)
|
|
216
|
+
*/
|
|
217
|
+
async unloadService(plistPath) {
|
|
218
|
+
try {
|
|
219
|
+
await (0, process_utils_1.execCommand)(`launchctl unload "${plistPath}"`);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
// Ignore errors if service is not loaded
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Start service
|
|
227
|
+
*/
|
|
228
|
+
async startService(label) {
|
|
229
|
+
await (0, process_utils_1.execCommand)(`launchctl start ${label}`);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Stop service
|
|
233
|
+
*/
|
|
234
|
+
async stopService(label) {
|
|
235
|
+
await (0, process_utils_1.execCommand)(`launchctl stop ${label}`);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get service status from launchctl
|
|
239
|
+
*/
|
|
240
|
+
async getServiceStatus(label) {
|
|
241
|
+
try {
|
|
242
|
+
const { stdout } = await (0, process_utils_1.execAsync)(`launchctl list | grep ${label}`);
|
|
243
|
+
const lines = stdout.trim().split('\n');
|
|
244
|
+
for (const line of lines) {
|
|
245
|
+
const parts = line.split(/\s+/);
|
|
246
|
+
if (parts.length >= 3) {
|
|
247
|
+
const pidStr = parts[0].trim();
|
|
248
|
+
const exitCodeStr = parts[1].trim();
|
|
249
|
+
const serviceLabel = parts[2].trim();
|
|
250
|
+
if (serviceLabel === label) {
|
|
251
|
+
const pid = pidStr !== '-' ? parseInt(pidStr, 10) : null;
|
|
252
|
+
const exitCode = exitCodeStr !== '-' ? parseInt(exitCodeStr, 10) : null;
|
|
253
|
+
const isRunning = pid !== null;
|
|
254
|
+
return {
|
|
255
|
+
isRunning,
|
|
256
|
+
pid,
|
|
257
|
+
exitCode,
|
|
258
|
+
lastExitReason: this.interpretExitCode(exitCode),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
isRunning: false,
|
|
265
|
+
pid: null,
|
|
266
|
+
exitCode: null,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
return {
|
|
271
|
+
isRunning: false,
|
|
272
|
+
pid: null,
|
|
273
|
+
exitCode: null,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Interpret exit code to human-readable reason
|
|
279
|
+
*/
|
|
280
|
+
interpretExitCode(code) {
|
|
281
|
+
if (code === null || code === 0)
|
|
282
|
+
return undefined;
|
|
283
|
+
if (code === -9)
|
|
284
|
+
return 'Force killed (SIGKILL)';
|
|
285
|
+
if (code === -15)
|
|
286
|
+
return 'Terminated (SIGTERM)';
|
|
287
|
+
return `Exit code: ${code}`;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Wait for service to start (with timeout)
|
|
291
|
+
*/
|
|
292
|
+
async waitForServiceStart(label, timeoutMs = 5000) {
|
|
293
|
+
const startTime = Date.now();
|
|
294
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
295
|
+
const status = await this.getServiceStatus(label);
|
|
296
|
+
if (status.isRunning) {
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
300
|
+
}
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Wait for service to stop (with timeout)
|
|
305
|
+
*/
|
|
306
|
+
async waitForServiceStop(label, timeoutMs = 5000) {
|
|
307
|
+
const startTime = Date.now();
|
|
308
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
309
|
+
const status = await this.getServiceStatus(label);
|
|
310
|
+
if (!status.isRunning) {
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
314
|
+
}
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Start admin service
|
|
319
|
+
*/
|
|
320
|
+
async start() {
|
|
321
|
+
await this.initialize();
|
|
322
|
+
let config = await this.loadConfig();
|
|
323
|
+
if (!config) {
|
|
324
|
+
// Create default config
|
|
325
|
+
config = this.getDefaultConfig();
|
|
326
|
+
await this.saveConfig(config);
|
|
327
|
+
}
|
|
328
|
+
// Check if already running
|
|
329
|
+
if (config.status === 'running') {
|
|
330
|
+
throw new Error('Admin service is already running');
|
|
331
|
+
}
|
|
332
|
+
// Check for throttled state (exit code 78)
|
|
333
|
+
const currentStatus = await this.getServiceStatus(config.label);
|
|
334
|
+
if (currentStatus.exitCode === 78) {
|
|
335
|
+
// Service is throttled - clean up and start fresh
|
|
336
|
+
await this.unloadService(config.plistPath);
|
|
337
|
+
await this.deletePlist(config);
|
|
338
|
+
// Give launchd a moment to clean up
|
|
339
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
340
|
+
}
|
|
341
|
+
// Create plist
|
|
342
|
+
await this.createPlist(config);
|
|
343
|
+
// Load and start service
|
|
344
|
+
try {
|
|
345
|
+
await this.loadService(config.plistPath);
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
// May already be loaded
|
|
349
|
+
}
|
|
350
|
+
await this.startService(config.label);
|
|
351
|
+
// Wait for startup
|
|
352
|
+
const started = await this.waitForServiceStart(config.label, 5000);
|
|
353
|
+
if (!started) {
|
|
354
|
+
throw new Error('Admin service failed to start');
|
|
355
|
+
}
|
|
356
|
+
// Update config
|
|
357
|
+
const status = await this.getServiceStatus(config.label);
|
|
358
|
+
await this.updateConfig({
|
|
359
|
+
status: 'running',
|
|
360
|
+
pid: status.pid || undefined,
|
|
361
|
+
lastStarted: new Date().toISOString(),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Stop admin service
|
|
366
|
+
*/
|
|
367
|
+
async stop() {
|
|
368
|
+
const config = await this.loadConfig();
|
|
369
|
+
if (!config) {
|
|
370
|
+
throw new Error('Admin configuration not found');
|
|
371
|
+
}
|
|
372
|
+
if (config.status !== 'running') {
|
|
373
|
+
throw new Error('Admin service is not running');
|
|
374
|
+
}
|
|
375
|
+
// Unload service
|
|
376
|
+
await this.unloadService(config.plistPath);
|
|
377
|
+
// Wait for shutdown
|
|
378
|
+
await this.waitForServiceStop(config.label, 5000);
|
|
379
|
+
// Update config
|
|
380
|
+
await this.updateConfig({
|
|
381
|
+
status: 'stopped',
|
|
382
|
+
pid: undefined,
|
|
383
|
+
lastStopped: new Date().toISOString(),
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Restart admin service
|
|
388
|
+
*/
|
|
389
|
+
async restart() {
|
|
390
|
+
try {
|
|
391
|
+
await this.stop();
|
|
392
|
+
}
|
|
393
|
+
catch (error) {
|
|
394
|
+
// May not be running
|
|
395
|
+
}
|
|
396
|
+
await this.start();
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get admin status
|
|
400
|
+
*/
|
|
401
|
+
async getStatus() {
|
|
402
|
+
const config = await this.loadConfig();
|
|
403
|
+
if (!config) {
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
const status = await this.getServiceStatus(config.label);
|
|
407
|
+
return { config, status };
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
exports.AdminManager = AdminManager;
|
|
411
|
+
// Export singleton instance
|
|
412
|
+
exports.adminManager = new AdminManager();
|
|
413
|
+
//# sourceMappingURL=admin-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-manager.js","sourceRoot":"","sources":["../../src/lib/admin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Admin HTTP server - REST API for managing llama.cpp servers
|
|
4
|
+
*/
|
|
5
|
+
declare class AdminServer {
|
|
6
|
+
private config;
|
|
7
|
+
private server;
|
|
8
|
+
initialize(): Promise<void>;
|
|
9
|
+
start(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Main request handler
|
|
12
|
+
*/
|
|
13
|
+
private handleRequest;
|
|
14
|
+
/**
|
|
15
|
+
* Health check endpoint
|
|
16
|
+
*/
|
|
17
|
+
private handleHealth;
|
|
18
|
+
/**
|
|
19
|
+
* List all servers
|
|
20
|
+
*/
|
|
21
|
+
private handleListServers;
|
|
22
|
+
/**
|
|
23
|
+
* Get server details
|
|
24
|
+
*/
|
|
25
|
+
private handleGetServer;
|
|
26
|
+
/**
|
|
27
|
+
* Create new server
|
|
28
|
+
*/
|
|
29
|
+
private handleCreateServer;
|
|
30
|
+
/**
|
|
31
|
+
* Update server configuration
|
|
32
|
+
*/
|
|
33
|
+
private handleUpdateServer;
|
|
34
|
+
/**
|
|
35
|
+
* Delete server
|
|
36
|
+
*/
|
|
37
|
+
private handleDeleteServer;
|
|
38
|
+
/**
|
|
39
|
+
* Start server
|
|
40
|
+
*/
|
|
41
|
+
private handleStartServer;
|
|
42
|
+
/**
|
|
43
|
+
* Stop server
|
|
44
|
+
*/
|
|
45
|
+
private handleStopServer;
|
|
46
|
+
/**
|
|
47
|
+
* Restart server
|
|
48
|
+
*/
|
|
49
|
+
private handleRestartServer;
|
|
50
|
+
/**
|
|
51
|
+
* Get server logs
|
|
52
|
+
*/
|
|
53
|
+
private handleGetLogs;
|
|
54
|
+
/**
|
|
55
|
+
* List models
|
|
56
|
+
*/
|
|
57
|
+
private handleListModels;
|
|
58
|
+
/**
|
|
59
|
+
* Get model details
|
|
60
|
+
*/
|
|
61
|
+
private handleGetModel;
|
|
62
|
+
/**
|
|
63
|
+
* Search models on HuggingFace
|
|
64
|
+
*/
|
|
65
|
+
private handleSearchModels;
|
|
66
|
+
/**
|
|
67
|
+
* Get GGUF files for a HuggingFace model
|
|
68
|
+
*/
|
|
69
|
+
private handleGetModelFiles;
|
|
70
|
+
/**
|
|
71
|
+
* List all download jobs
|
|
72
|
+
*/
|
|
73
|
+
private handleListJobs;
|
|
74
|
+
/**
|
|
75
|
+
* Get a specific download job
|
|
76
|
+
*/
|
|
77
|
+
private handleGetJob;
|
|
78
|
+
/**
|
|
79
|
+
* Cancel a download job
|
|
80
|
+
*/
|
|
81
|
+
private handleCancelJob;
|
|
82
|
+
/**
|
|
83
|
+
* Download model from HuggingFace
|
|
84
|
+
*/
|
|
85
|
+
private handleDownloadModel;
|
|
86
|
+
/**
|
|
87
|
+
* Delete model
|
|
88
|
+
*/
|
|
89
|
+
private handleDeleteModel;
|
|
90
|
+
/**
|
|
91
|
+
* Get system status
|
|
92
|
+
*/
|
|
93
|
+
private handleSystemStatus;
|
|
94
|
+
/**
|
|
95
|
+
* Get router status
|
|
96
|
+
*/
|
|
97
|
+
private handleGetRouter;
|
|
98
|
+
/**
|
|
99
|
+
* Start router service
|
|
100
|
+
*/
|
|
101
|
+
private handleStartRouter;
|
|
102
|
+
/**
|
|
103
|
+
* Stop router service
|
|
104
|
+
*/
|
|
105
|
+
private handleStopRouter;
|
|
106
|
+
/**
|
|
107
|
+
* Restart router service
|
|
108
|
+
*/
|
|
109
|
+
private handleRestartRouter;
|
|
110
|
+
/**
|
|
111
|
+
* Get router logs
|
|
112
|
+
*/
|
|
113
|
+
private handleGetRouterLogs;
|
|
114
|
+
/**
|
|
115
|
+
* Update router configuration
|
|
116
|
+
*/
|
|
117
|
+
private handleUpdateRouter;
|
|
118
|
+
/**
|
|
119
|
+
* Authenticate request via API key
|
|
120
|
+
*/
|
|
121
|
+
private authenticate;
|
|
122
|
+
/**
|
|
123
|
+
* Read request body as string
|
|
124
|
+
*/
|
|
125
|
+
private readBody;
|
|
126
|
+
/**
|
|
127
|
+
* Send JSON response
|
|
128
|
+
*/
|
|
129
|
+
private sendJson;
|
|
130
|
+
/**
|
|
131
|
+
* Send error response
|
|
132
|
+
*/
|
|
133
|
+
private sendError;
|
|
134
|
+
/**
|
|
135
|
+
* Serve static files from web/dist directory
|
|
136
|
+
*/
|
|
137
|
+
private handleStaticFile;
|
|
138
|
+
/**
|
|
139
|
+
* Log request
|
|
140
|
+
*/
|
|
141
|
+
private logRequest;
|
|
142
|
+
/**
|
|
143
|
+
* Log response
|
|
144
|
+
*/
|
|
145
|
+
private logResponse;
|
|
146
|
+
}
|
|
147
|
+
export { AdminServer };
|
|
148
|
+
//# sourceMappingURL=admin-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-server.d.ts","sourceRoot":"","sources":["../../src/lib/admin-server.ts"],"names":[],"mappings":";AA+BA;;GAEG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;IAEvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;OAEG;YACW,aAAa;IAwH3B;;OAEG;YACW,YAAY;IAQ1B;;OAEG;YACW,iBAAiB;IAa/B;;OAEG;YACW,eAAe;IAc7B;;OAEG;YACW,kBAAkB;IA8GhC;;OAEG;YACW,kBAAkB;IAsFhC;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,iBAAiB;IA6C/B;;OAEG;YACW,gBAAgB;IA8B9B;;OAEG;YACW,mBAAmB;IA0CjC;;OAEG;YACW,aAAa;IAgC3B;;OAEG;YACW,gBAAgB;IAqB9B;;OAEG;YACW,cAAc;IAyB5B;;OAEG;YACW,kBAAkB;IAiBhC;;OAEG;YACW,mBAAmB;IASjC;;OAEG;YACW,cAAc;IAK5B;;OAEG;YACW,YAAY;IAS1B;;OAEG;YACW,eAAe;IAsB7B;;OAEG;YACW,mBAAmB;IA+BjC;;OAEG;YACW,iBAAiB;IAqD/B;;OAEG;YACW,kBAAkB;IAqChC;;OAEG;YACW,eAAe;IAmD7B;;OAEG;YACW,iBAAiB;IAe/B;;OAEG;YACW,gBAAgB;IAa9B;;OAEG;YACW,mBAAmB;IAejC;;OAEG;YACW,mBAAmB;IAgCjC;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;YACW,QAAQ;IAStB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;YACW,gBAAgB;IA0E9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB;AAkBD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|