@appkit/llamacpp-cli 1.8.0 → 1.10.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 +58 -0
- package/README.md +249 -40
- package/dist/cli.js +154 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/completion.d.ts +9 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +83 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/monitor.js +1 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/ps.d.ts +1 -3
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +36 -115
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/router/config.d.ts +11 -0
- package/dist/commands/router/config.d.ts.map +1 -0
- package/dist/commands/router/config.js +100 -0
- package/dist/commands/router/config.js.map +1 -0
- package/dist/commands/router/logs.d.ts +12 -0
- package/dist/commands/router/logs.d.ts.map +1 -0
- package/dist/commands/router/logs.js +238 -0
- package/dist/commands/router/logs.js.map +1 -0
- package/dist/commands/router/restart.d.ts +2 -0
- package/dist/commands/router/restart.d.ts.map +1 -0
- package/dist/commands/router/restart.js +39 -0
- package/dist/commands/router/restart.js.map +1 -0
- package/dist/commands/router/start.d.ts +2 -0
- package/dist/commands/router/start.d.ts.map +1 -0
- package/dist/commands/router/start.js +60 -0
- package/dist/commands/router/start.js.map +1 -0
- package/dist/commands/router/status.d.ts +2 -0
- package/dist/commands/router/status.d.ts.map +1 -0
- package/dist/commands/router/status.js +116 -0
- package/dist/commands/router/status.js.map +1 -0
- package/dist/commands/router/stop.d.ts +2 -0
- package/dist/commands/router/stop.d.ts.map +1 -0
- package/dist/commands/router/stop.js +36 -0
- package/dist/commands/router/stop.js.map +1 -0
- package/dist/commands/tui.d.ts +2 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +27 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/lib/completion.d.ts +5 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +195 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +5 -1
- package/dist/lib/model-downloader.d.ts.map +1 -1
- package/dist/lib/model-downloader.js +53 -20
- package/dist/lib/model-downloader.js.map +1 -1
- package/dist/lib/router-logger.d.ts +61 -0
- package/dist/lib/router-logger.d.ts.map +1 -0
- package/dist/lib/router-logger.js +200 -0
- package/dist/lib/router-logger.js.map +1 -0
- package/dist/lib/router-manager.d.ts +103 -0
- package/dist/lib/router-manager.d.ts.map +1 -0
- package/dist/lib/router-manager.js +394 -0
- package/dist/lib/router-manager.js.map +1 -0
- package/dist/lib/router-server.d.ts +61 -0
- package/dist/lib/router-server.d.ts.map +1 -0
- package/dist/lib/router-server.js +485 -0
- package/dist/lib/router-server.js.map +1 -0
- package/dist/tui/ConfigApp.d.ts +7 -0
- package/dist/tui/ConfigApp.d.ts.map +1 -0
- package/dist/tui/ConfigApp.js +1002 -0
- package/dist/tui/ConfigApp.js.map +1 -0
- package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
- package/dist/tui/HistoricalMonitorApp.js +85 -49
- package/dist/tui/HistoricalMonitorApp.js.map +1 -1
- package/dist/tui/ModelsApp.d.ts +7 -0
- package/dist/tui/ModelsApp.d.ts.map +1 -0
- package/dist/tui/ModelsApp.js +362 -0
- package/dist/tui/ModelsApp.js.map +1 -0
- package/dist/tui/MultiServerMonitorApp.d.ts +6 -1
- package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
- package/dist/tui/MultiServerMonitorApp.js +1038 -122
- package/dist/tui/MultiServerMonitorApp.js.map +1 -1
- package/dist/tui/RootNavigator.d.ts +7 -0
- package/dist/tui/RootNavigator.d.ts.map +1 -0
- package/dist/tui/RootNavigator.js +55 -0
- package/dist/tui/RootNavigator.js.map +1 -0
- package/dist/tui/SearchApp.d.ts +6 -0
- package/dist/tui/SearchApp.d.ts.map +1 -0
- package/dist/tui/SearchApp.js +451 -0
- package/dist/tui/SearchApp.js.map +1 -0
- package/dist/tui/SplashScreen.d.ts +16 -0
- package/dist/tui/SplashScreen.d.ts.map +1 -0
- package/dist/tui/SplashScreen.js +129 -0
- package/dist/tui/SplashScreen.js.map +1 -0
- package/dist/types/router-config.d.ts +19 -0
- package/dist/types/router-config.d.ts.map +1 -0
- package/dist/types/router-config.js +3 -0
- package/dist/types/router-config.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +121 -10
- package/src/commands/monitor.ts +1 -1
- package/src/commands/ps.ts +44 -133
- package/src/commands/router/config.ts +116 -0
- package/src/commands/router/logs.ts +256 -0
- package/src/commands/router/restart.ts +36 -0
- package/src/commands/router/start.ts +60 -0
- package/src/commands/router/status.ts +119 -0
- package/src/commands/router/stop.ts +33 -0
- package/src/commands/tui.ts +25 -0
- package/src/lib/model-downloader.ts +57 -20
- package/src/lib/router-logger.ts +201 -0
- package/src/lib/router-manager.ts +414 -0
- package/src/lib/router-server.ts +538 -0
- package/src/tui/ConfigApp.ts +1085 -0
- package/src/tui/HistoricalMonitorApp.ts +88 -49
- package/src/tui/ModelsApp.ts +368 -0
- package/src/tui/MultiServerMonitorApp.ts +1163 -122
- package/src/tui/RootNavigator.ts +74 -0
- package/src/tui/SearchApp.ts +511 -0
- package/src/tui/SplashScreen.ts +149 -0
- package/src/types/router-config.ts +25 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import blessed from "blessed";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
|
|
5
|
+
// Get version from package.json at runtime
|
|
6
|
+
function getVersion(): string {
|
|
7
|
+
try {
|
|
8
|
+
// Try to find package.json relative to this file's location
|
|
9
|
+
// Works both in src/ (dev) and dist/ (production)
|
|
10
|
+
const possiblePaths = [
|
|
11
|
+
join(__dirname, "../../package.json"), // From dist/tui/
|
|
12
|
+
join(__dirname, "../../../package.json"), // Fallback
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
for (const pkgPath of possiblePaths) {
|
|
16
|
+
try {
|
|
17
|
+
const content = readFileSync(pkgPath, "utf-8");
|
|
18
|
+
const pkg = JSON.parse(content);
|
|
19
|
+
if (pkg.version) return pkg.version;
|
|
20
|
+
} catch {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return "1.0.0";
|
|
25
|
+
} catch {
|
|
26
|
+
return "1.0.0";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ASCII art logo for llama.cpp
|
|
31
|
+
const LOGO = `
|
|
32
|
+
{cyan-fg} ██╗ ██╗ █████╗ ███╗ ███╗ █████╗ ██████╗██████╗ ██████╗{/cyan-fg}
|
|
33
|
+
{cyan-fg}██║ ██║ ██╔══██╗████╗ ████║██╔══██╗ ██╔════╝██╔══██╗██╔══██╗{/cyan-fg}
|
|
34
|
+
{cyan-fg}██║ ██║ ███████║██╔████╔██║███████║ ██║ ██████╔╝██████╔╝{/cyan-fg}
|
|
35
|
+
{cyan-fg}██║ ██║ ██╔══██║██║╚██╔╝██║██╔══██║ ██║ ██╔═══╝ ██╔═══╝{/cyan-fg}
|
|
36
|
+
{cyan-fg}███████╗███████╗██║ ██║██║ ╚═╝ ██║██║ ██║ ╚██████╗██║ ██║{/cyan-fg}
|
|
37
|
+
{cyan-fg}╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝{/cyan-fg}
|
|
38
|
+
`.trim();
|
|
39
|
+
|
|
40
|
+
export interface SplashCallbacks {
|
|
41
|
+
onLoadConfigs: () => Promise<void>;
|
|
42
|
+
onCheckServices: () => Promise<void>;
|
|
43
|
+
onInitMetrics: () => Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface SplashScreenControls {
|
|
47
|
+
updateStatus: (line: number, text: string, done?: boolean) => void;
|
|
48
|
+
complete: () => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates and displays the splash screen with loading status
|
|
53
|
+
* Returns a cleanup function to remove the splash when the main UI is ready
|
|
54
|
+
*/
|
|
55
|
+
export async function createSplashScreen(
|
|
56
|
+
screen: blessed.Widgets.Screen,
|
|
57
|
+
callbacks: SplashCallbacks,
|
|
58
|
+
): Promise<() => void> {
|
|
59
|
+
const version = getVersion();
|
|
60
|
+
|
|
61
|
+
// Create top-left aligned container
|
|
62
|
+
const container = blessed.box({
|
|
63
|
+
top: 0,
|
|
64
|
+
left: 0,
|
|
65
|
+
width: 75,
|
|
66
|
+
height: 19,
|
|
67
|
+
tags: true,
|
|
68
|
+
});
|
|
69
|
+
screen.append(container);
|
|
70
|
+
|
|
71
|
+
// Logo box
|
|
72
|
+
const logoBox = blessed.box({
|
|
73
|
+
parent: container,
|
|
74
|
+
top: 0,
|
|
75
|
+
left: 0,
|
|
76
|
+
width: 73,
|
|
77
|
+
height: 7,
|
|
78
|
+
tags: true,
|
|
79
|
+
content: LOGO,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Info box with border
|
|
83
|
+
const infoBox = blessed.box({
|
|
84
|
+
parent: container,
|
|
85
|
+
top: 7,
|
|
86
|
+
left: 0,
|
|
87
|
+
width: 73,
|
|
88
|
+
height: 10,
|
|
89
|
+
tags: true,
|
|
90
|
+
border: {
|
|
91
|
+
type: "line",
|
|
92
|
+
},
|
|
93
|
+
style: {
|
|
94
|
+
border: {
|
|
95
|
+
fg: "blue",
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Status lines (inside the info box)
|
|
101
|
+
const statusLines = [
|
|
102
|
+
"{bold}Local LLM Server Manager{/bold} v" +
|
|
103
|
+
version,
|
|
104
|
+
"",
|
|
105
|
+
"{gray-fg}>{/gray-fg} Loading server configurations...",
|
|
106
|
+
"{gray-fg}>{/gray-fg} Checking launchctl services...",
|
|
107
|
+
"{gray-fg}>{/gray-fg} Initializing metrics collectors...",
|
|
108
|
+
"{gray-fg}>{/gray-fg} Loading UI...",
|
|
109
|
+
];
|
|
110
|
+
|
|
111
|
+
function updateDisplay() {
|
|
112
|
+
infoBox.setContent(statusLines.join("\n"));
|
|
113
|
+
screen.render();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function updateStatus(line: number, text: string, done: boolean = false) {
|
|
117
|
+
const prefix = done ? "{green-fg}✓{/green-fg}" : "{yellow-fg}>{/yellow-fg}";
|
|
118
|
+
statusLines[line + 2] = `${prefix} ${text}`;
|
|
119
|
+
updateDisplay();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Initial render
|
|
123
|
+
updateDisplay();
|
|
124
|
+
|
|
125
|
+
// Run loading sequence
|
|
126
|
+
// Step 1: Load configs
|
|
127
|
+
updateStatus(0, "Loading server configurations...", false);
|
|
128
|
+
await callbacks.onLoadConfigs();
|
|
129
|
+
updateStatus(0, "Server configurations loaded", true);
|
|
130
|
+
|
|
131
|
+
// Step 2: Check services
|
|
132
|
+
updateStatus(1, "Checking launchctl services...", false);
|
|
133
|
+
await callbacks.onCheckServices();
|
|
134
|
+
updateStatus(1, "Launchctl services checked", true);
|
|
135
|
+
|
|
136
|
+
// Step 3: Init metrics
|
|
137
|
+
updateStatus(2, "Initializing metrics collectors...", false);
|
|
138
|
+
await callbacks.onInitMetrics();
|
|
139
|
+
updateStatus(2, "Metrics collectors ready", true);
|
|
140
|
+
|
|
141
|
+
// Step 4: Loading UI (stays active until cleanup is called)
|
|
142
|
+
updateStatus(3, "Loading UI...", false);
|
|
143
|
+
|
|
144
|
+
// Return cleanup function - caller decides when to remove splash
|
|
145
|
+
return () => {
|
|
146
|
+
screen.remove(container);
|
|
147
|
+
screen.render();
|
|
148
|
+
};
|
|
149
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type RouterStatus = 'running' | 'stopped' | 'crashed';
|
|
2
|
+
|
|
3
|
+
export interface RouterConfig {
|
|
4
|
+
id: 'router';
|
|
5
|
+
port: number;
|
|
6
|
+
host: string;
|
|
7
|
+
|
|
8
|
+
// State tracking
|
|
9
|
+
status: RouterStatus;
|
|
10
|
+
pid?: number;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
lastStarted?: string;
|
|
13
|
+
lastStopped?: string;
|
|
14
|
+
|
|
15
|
+
// launchctl metadata
|
|
16
|
+
plistPath: string;
|
|
17
|
+
label: 'com.llama.router';
|
|
18
|
+
stdoutPath: string;
|
|
19
|
+
stderrPath: string;
|
|
20
|
+
|
|
21
|
+
// Router settings
|
|
22
|
+
healthCheckInterval: number; // ms between health checks (default: 5000)
|
|
23
|
+
requestTimeout: number; // ms for backend requests (default: 120000)
|
|
24
|
+
verbose: boolean; // Enable verbose logging to file (default: false)
|
|
25
|
+
}
|