@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.
Files changed (116) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +249 -40
  3. package/dist/cli.js +154 -10
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/completion.d.ts +9 -0
  6. package/dist/commands/completion.d.ts.map +1 -0
  7. package/dist/commands/completion.js +83 -0
  8. package/dist/commands/completion.js.map +1 -0
  9. package/dist/commands/monitor.js +1 -1
  10. package/dist/commands/monitor.js.map +1 -1
  11. package/dist/commands/ps.d.ts +1 -3
  12. package/dist/commands/ps.d.ts.map +1 -1
  13. package/dist/commands/ps.js +36 -115
  14. package/dist/commands/ps.js.map +1 -1
  15. package/dist/commands/router/config.d.ts +11 -0
  16. package/dist/commands/router/config.d.ts.map +1 -0
  17. package/dist/commands/router/config.js +100 -0
  18. package/dist/commands/router/config.js.map +1 -0
  19. package/dist/commands/router/logs.d.ts +12 -0
  20. package/dist/commands/router/logs.d.ts.map +1 -0
  21. package/dist/commands/router/logs.js +238 -0
  22. package/dist/commands/router/logs.js.map +1 -0
  23. package/dist/commands/router/restart.d.ts +2 -0
  24. package/dist/commands/router/restart.d.ts.map +1 -0
  25. package/dist/commands/router/restart.js +39 -0
  26. package/dist/commands/router/restart.js.map +1 -0
  27. package/dist/commands/router/start.d.ts +2 -0
  28. package/dist/commands/router/start.d.ts.map +1 -0
  29. package/dist/commands/router/start.js +60 -0
  30. package/dist/commands/router/start.js.map +1 -0
  31. package/dist/commands/router/status.d.ts +2 -0
  32. package/dist/commands/router/status.d.ts.map +1 -0
  33. package/dist/commands/router/status.js +116 -0
  34. package/dist/commands/router/status.js.map +1 -0
  35. package/dist/commands/router/stop.d.ts +2 -0
  36. package/dist/commands/router/stop.d.ts.map +1 -0
  37. package/dist/commands/router/stop.js +36 -0
  38. package/dist/commands/router/stop.js.map +1 -0
  39. package/dist/commands/tui.d.ts +2 -0
  40. package/dist/commands/tui.d.ts.map +1 -0
  41. package/dist/commands/tui.js +27 -0
  42. package/dist/commands/tui.js.map +1 -0
  43. package/dist/lib/completion.d.ts +5 -0
  44. package/dist/lib/completion.d.ts.map +1 -0
  45. package/dist/lib/completion.js +195 -0
  46. package/dist/lib/completion.js.map +1 -0
  47. package/dist/lib/model-downloader.d.ts +5 -1
  48. package/dist/lib/model-downloader.d.ts.map +1 -1
  49. package/dist/lib/model-downloader.js +53 -20
  50. package/dist/lib/model-downloader.js.map +1 -1
  51. package/dist/lib/router-logger.d.ts +61 -0
  52. package/dist/lib/router-logger.d.ts.map +1 -0
  53. package/dist/lib/router-logger.js +200 -0
  54. package/dist/lib/router-logger.js.map +1 -0
  55. package/dist/lib/router-manager.d.ts +103 -0
  56. package/dist/lib/router-manager.d.ts.map +1 -0
  57. package/dist/lib/router-manager.js +394 -0
  58. package/dist/lib/router-manager.js.map +1 -0
  59. package/dist/lib/router-server.d.ts +61 -0
  60. package/dist/lib/router-server.d.ts.map +1 -0
  61. package/dist/lib/router-server.js +485 -0
  62. package/dist/lib/router-server.js.map +1 -0
  63. package/dist/tui/ConfigApp.d.ts +7 -0
  64. package/dist/tui/ConfigApp.d.ts.map +1 -0
  65. package/dist/tui/ConfigApp.js +1002 -0
  66. package/dist/tui/ConfigApp.js.map +1 -0
  67. package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
  68. package/dist/tui/HistoricalMonitorApp.js +85 -49
  69. package/dist/tui/HistoricalMonitorApp.js.map +1 -1
  70. package/dist/tui/ModelsApp.d.ts +7 -0
  71. package/dist/tui/ModelsApp.d.ts.map +1 -0
  72. package/dist/tui/ModelsApp.js +362 -0
  73. package/dist/tui/ModelsApp.js.map +1 -0
  74. package/dist/tui/MultiServerMonitorApp.d.ts +6 -1
  75. package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
  76. package/dist/tui/MultiServerMonitorApp.js +1038 -122
  77. package/dist/tui/MultiServerMonitorApp.js.map +1 -1
  78. package/dist/tui/RootNavigator.d.ts +7 -0
  79. package/dist/tui/RootNavigator.d.ts.map +1 -0
  80. package/dist/tui/RootNavigator.js +55 -0
  81. package/dist/tui/RootNavigator.js.map +1 -0
  82. package/dist/tui/SearchApp.d.ts +6 -0
  83. package/dist/tui/SearchApp.d.ts.map +1 -0
  84. package/dist/tui/SearchApp.js +451 -0
  85. package/dist/tui/SearchApp.js.map +1 -0
  86. package/dist/tui/SplashScreen.d.ts +16 -0
  87. package/dist/tui/SplashScreen.d.ts.map +1 -0
  88. package/dist/tui/SplashScreen.js +129 -0
  89. package/dist/tui/SplashScreen.js.map +1 -0
  90. package/dist/types/router-config.d.ts +19 -0
  91. package/dist/types/router-config.d.ts.map +1 -0
  92. package/dist/types/router-config.js +3 -0
  93. package/dist/types/router-config.js.map +1 -0
  94. package/package.json +1 -1
  95. package/src/cli.ts +121 -10
  96. package/src/commands/monitor.ts +1 -1
  97. package/src/commands/ps.ts +44 -133
  98. package/src/commands/router/config.ts +116 -0
  99. package/src/commands/router/logs.ts +256 -0
  100. package/src/commands/router/restart.ts +36 -0
  101. package/src/commands/router/start.ts +60 -0
  102. package/src/commands/router/status.ts +119 -0
  103. package/src/commands/router/stop.ts +33 -0
  104. package/src/commands/tui.ts +25 -0
  105. package/src/lib/model-downloader.ts +57 -20
  106. package/src/lib/router-logger.ts +201 -0
  107. package/src/lib/router-manager.ts +414 -0
  108. package/src/lib/router-server.ts +538 -0
  109. package/src/tui/ConfigApp.ts +1085 -0
  110. package/src/tui/HistoricalMonitorApp.ts +88 -49
  111. package/src/tui/ModelsApp.ts +368 -0
  112. package/src/tui/MultiServerMonitorApp.ts +1163 -122
  113. package/src/tui/RootNavigator.ts +74 -0
  114. package/src/tui/SearchApp.ts +511 -0
  115. package/src/tui/SplashScreen.ts +149 -0
  116. 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
+ }