@appkit/llamacpp-cli 1.12.0 → 1.13.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/README.md +294 -168
  2. package/dist/cli.js +35 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/launch/claude.d.ts +6 -0
  5. package/dist/commands/launch/claude.d.ts.map +1 -0
  6. package/dist/commands/launch/claude.js +277 -0
  7. package/dist/commands/launch/claude.js.map +1 -0
  8. package/dist/lib/integration-checker.d.ts +26 -0
  9. package/dist/lib/integration-checker.d.ts.map +1 -0
  10. package/dist/lib/integration-checker.js +77 -0
  11. package/dist/lib/integration-checker.js.map +1 -0
  12. package/dist/lib/router-manager.d.ts +4 -0
  13. package/dist/lib/router-manager.d.ts.map +1 -1
  14. package/dist/lib/router-manager.js +10 -0
  15. package/dist/lib/router-manager.js.map +1 -1
  16. package/dist/lib/router-server.d.ts +13 -0
  17. package/dist/lib/router-server.d.ts.map +1 -1
  18. package/dist/lib/router-server.js +267 -7
  19. package/dist/lib/router-server.js.map +1 -1
  20. package/dist/types/integration-config.d.ts +28 -0
  21. package/dist/types/integration-config.d.ts.map +1 -0
  22. package/dist/types/integration-config.js +3 -0
  23. package/dist/types/integration-config.js.map +1 -0
  24. package/package.json +10 -2
  25. package/web/dist/assets/index-Bin89Lwr.css +1 -0
  26. package/web/dist/assets/index-CVmonw3T.js +17 -0
  27. package/web/{index.html → dist/index.html} +2 -1
  28. package/.versionrc.json +0 -16
  29. package/CHANGELOG.md +0 -213
  30. package/docs/images/.gitkeep +0 -1
  31. package/docs/images/web-ui-servers.png +0 -0
  32. package/src/cli.ts +0 -523
  33. package/src/commands/admin/config.ts +0 -121
  34. package/src/commands/admin/logs.ts +0 -91
  35. package/src/commands/admin/restart.ts +0 -26
  36. package/src/commands/admin/start.ts +0 -27
  37. package/src/commands/admin/status.ts +0 -84
  38. package/src/commands/admin/stop.ts +0 -16
  39. package/src/commands/config-global.ts +0 -38
  40. package/src/commands/config.ts +0 -323
  41. package/src/commands/create.ts +0 -183
  42. package/src/commands/delete.ts +0 -74
  43. package/src/commands/list.ts +0 -37
  44. package/src/commands/logs-all.ts +0 -251
  45. package/src/commands/logs.ts +0 -345
  46. package/src/commands/monitor.ts +0 -110
  47. package/src/commands/ps.ts +0 -84
  48. package/src/commands/pull.ts +0 -44
  49. package/src/commands/rm.ts +0 -107
  50. package/src/commands/router/config.ts +0 -116
  51. package/src/commands/router/logs.ts +0 -256
  52. package/src/commands/router/restart.ts +0 -36
  53. package/src/commands/router/start.ts +0 -60
  54. package/src/commands/router/status.ts +0 -119
  55. package/src/commands/router/stop.ts +0 -33
  56. package/src/commands/run.ts +0 -233
  57. package/src/commands/search.ts +0 -107
  58. package/src/commands/server-show.ts +0 -161
  59. package/src/commands/show.ts +0 -207
  60. package/src/commands/start.ts +0 -101
  61. package/src/commands/stop.ts +0 -39
  62. package/src/commands/tui.ts +0 -25
  63. package/src/lib/admin-manager.ts +0 -435
  64. package/src/lib/admin-server.ts +0 -1243
  65. package/src/lib/config-generator.ts +0 -130
  66. package/src/lib/download-job-manager.ts +0 -213
  67. package/src/lib/history-manager.ts +0 -172
  68. package/src/lib/launchctl-manager.ts +0 -225
  69. package/src/lib/metrics-aggregator.ts +0 -257
  70. package/src/lib/model-downloader.ts +0 -328
  71. package/src/lib/model-scanner.ts +0 -157
  72. package/src/lib/model-search.ts +0 -114
  73. package/src/lib/models-dir-setup.ts +0 -46
  74. package/src/lib/port-manager.ts +0 -80
  75. package/src/lib/router-logger.ts +0 -201
  76. package/src/lib/router-manager.ts +0 -414
  77. package/src/lib/router-server.ts +0 -538
  78. package/src/lib/state-manager.ts +0 -206
  79. package/src/lib/status-checker.ts +0 -113
  80. package/src/lib/system-collector.ts +0 -315
  81. package/src/tui/ConfigApp.ts +0 -1085
  82. package/src/tui/HistoricalMonitorApp.ts +0 -587
  83. package/src/tui/ModelsApp.ts +0 -368
  84. package/src/tui/MonitorApp.ts +0 -386
  85. package/src/tui/MultiServerMonitorApp.ts +0 -1833
  86. package/src/tui/RootNavigator.ts +0 -74
  87. package/src/tui/SearchApp.ts +0 -511
  88. package/src/tui/SplashScreen.ts +0 -149
  89. package/src/types/admin-config.ts +0 -25
  90. package/src/types/global-config.ts +0 -26
  91. package/src/types/history-types.ts +0 -39
  92. package/src/types/model-info.ts +0 -8
  93. package/src/types/monitor-types.ts +0 -162
  94. package/src/types/router-config.ts +0 -25
  95. package/src/types/server-config.ts +0 -46
  96. package/src/utils/downsample-utils.ts +0 -128
  97. package/src/utils/file-utils.ts +0 -146
  98. package/src/utils/format-utils.ts +0 -98
  99. package/src/utils/log-parser.ts +0 -284
  100. package/src/utils/log-utils.ts +0 -178
  101. package/src/utils/process-utils.ts +0 -316
  102. package/src/utils/prompt-utils.ts +0 -47
  103. package/test-load.sh +0 -100
  104. package/tsconfig.json +0 -20
  105. package/web/eslint.config.js +0 -23
  106. package/web/llamacpp-web-dist.tar.gz +0 -0
  107. package/web/package-lock.json +0 -4017
  108. package/web/package.json +0 -38
  109. package/web/postcss.config.js +0 -6
  110. package/web/src/App.css +0 -42
  111. package/web/src/App.tsx +0 -86
  112. package/web/src/assets/react.svg +0 -1
  113. package/web/src/components/ApiKeyPrompt.tsx +0 -71
  114. package/web/src/components/CreateServerModal.tsx +0 -372
  115. package/web/src/components/DownloadProgress.tsx +0 -123
  116. package/web/src/components/Nav.tsx +0 -89
  117. package/web/src/components/RouterConfigModal.tsx +0 -240
  118. package/web/src/components/SearchModal.tsx +0 -306
  119. package/web/src/components/ServerConfigModal.tsx +0 -291
  120. package/web/src/hooks/useApi.ts +0 -259
  121. package/web/src/index.css +0 -42
  122. package/web/src/lib/api.ts +0 -226
  123. package/web/src/main.tsx +0 -10
  124. package/web/src/pages/Dashboard.tsx +0 -103
  125. package/web/src/pages/Models.tsx +0 -258
  126. package/web/src/pages/Router.tsx +0 -270
  127. package/web/src/pages/RouterLogs.tsx +0 -201
  128. package/web/src/pages/ServerLogs.tsx +0 -553
  129. package/web/src/pages/Servers.tsx +0 -358
  130. package/web/src/types/api.ts +0 -140
  131. package/web/tailwind.config.js +0 -31
  132. package/web/tsconfig.app.json +0 -28
  133. package/web/tsconfig.json +0 -7
  134. package/web/tsconfig.node.json +0 -26
  135. package/web/vite.config.ts +0 -25
  136. /package/web/{public → dist}/vite.svg +0 -0
@@ -1,116 +0,0 @@
1
- import chalk from 'chalk';
2
- import { routerManager } from '../../lib/router-manager';
3
-
4
- interface ConfigOptions {
5
- port?: number;
6
- host?: string;
7
- timeout?: number;
8
- healthInterval?: number;
9
- verbose?: boolean;
10
- restart?: boolean;
11
- }
12
-
13
- export async function routerConfigCommand(options: ConfigOptions): Promise<void> {
14
- try {
15
- // Check if router exists
16
- const config = await routerManager.loadConfig();
17
- if (!config) {
18
- throw new Error('Router configuration not found. Use "llamacpp router start" to create it.');
19
- }
20
-
21
- // Check if any options were provided
22
- const hasOptions = options.port || options.host || options.timeout || options.healthInterval || options.verbose !== undefined;
23
- if (!hasOptions) {
24
- throw new Error('No configuration options provided. Use --port, --host, --timeout, --health-interval, or --verbose');
25
- }
26
-
27
- const isRunning = config.status === 'running';
28
-
29
- // Warn if running and no restart flag
30
- if (isRunning && !options.restart) {
31
- console.log(chalk.yellow('⚠️ Router is running. Changes will take effect after restart.'));
32
- console.log(chalk.dim(' Use --restart flag to apply changes immediately.\n'));
33
- }
34
-
35
- // Prepare updates
36
- const updates: any = {};
37
- const changes: string[] = [];
38
-
39
- if (options.port !== undefined) {
40
- changes.push(`Port: ${config.port} → ${options.port}`);
41
- updates.port = options.port;
42
- }
43
-
44
- if (options.host !== undefined) {
45
- changes.push(`Host: ${config.host} → ${options.host}`);
46
- updates.host = options.host;
47
- }
48
-
49
- if (options.timeout !== undefined) {
50
- changes.push(`Request Timeout: ${config.requestTimeout}ms → ${options.timeout}ms`);
51
- updates.requestTimeout = options.timeout;
52
- }
53
-
54
- if (options.healthInterval !== undefined) {
55
- changes.push(`Health Check Interval: ${config.healthCheckInterval}ms → ${options.healthInterval}ms`);
56
- updates.healthCheckInterval = options.healthInterval;
57
- }
58
-
59
- if (options.verbose !== undefined) {
60
- const verboseStr = (val: boolean) => val ? 'enabled' : 'disabled';
61
- changes.push(`Verbose Logging: ${verboseStr(config.verbose)} → ${verboseStr(options.verbose)}`);
62
- updates.verbose = options.verbose;
63
- }
64
-
65
- // Display changes
66
- console.log(chalk.blue('📝 Configuration changes:'));
67
- console.log();
68
- changes.forEach(change => {
69
- console.log(chalk.dim(` ${change}`));
70
- });
71
- console.log();
72
-
73
- // Apply changes
74
- if (isRunning && options.restart) {
75
- console.log(chalk.blue('⏹️ Stopping router...'));
76
- await routerManager.stop();
77
- }
78
-
79
- // Update config
80
- await routerManager.updateConfig(updates);
81
-
82
- // Regenerate plist if port or host changed
83
- if (options.port !== undefined || options.host !== undefined) {
84
- const updatedConfig = await routerManager.loadConfig();
85
- if (updatedConfig) {
86
- await routerManager.createPlist(updatedConfig);
87
- }
88
- }
89
-
90
- // Restart if requested
91
- if (isRunning && options.restart) {
92
- console.log(chalk.blue('▶️ Starting router...'));
93
- await routerManager.start();
94
-
95
- const finalConfig = await routerManager.loadConfig();
96
- console.log();
97
- console.log(chalk.green('✅ Router restarted with new configuration'));
98
- console.log();
99
- console.log(chalk.dim(`Endpoint: http://${finalConfig?.host}:${finalConfig?.port}`));
100
- } else {
101
- console.log(chalk.green('✅ Configuration updated'));
102
-
103
- if (isRunning) {
104
- console.log();
105
- console.log(chalk.yellow('⚠️ Restart required to apply changes:'));
106
- console.log(chalk.dim(' llamacpp router restart'));
107
- } else {
108
- console.log();
109
- console.log(chalk.dim('Start router to use new configuration:'));
110
- console.log(chalk.dim(' llamacpp router start'));
111
- }
112
- }
113
- } catch (error) {
114
- throw new Error(`Failed to update router configuration: ${(error as Error).message}`);
115
- }
116
- }
@@ -1,256 +0,0 @@
1
- import chalk from 'chalk';
2
- import { spawn } from 'child_process';
3
- import * as readline from 'readline';
4
- import * as fs from 'fs';
5
- import { routerManager } from '../../lib/router-manager';
6
- import { fileExists } from '../../utils/file-utils';
7
- import {
8
- getFileSize,
9
- formatFileSize,
10
- rotateLogFile,
11
- clearLogFile,
12
- } from '../../utils/log-utils';
13
-
14
- interface RouterLogsOptions {
15
- follow?: boolean;
16
- lines?: number;
17
- stderr?: boolean; // View system logs (stderr) instead of activity logs (stdout)
18
- verbose?: boolean;
19
- clear?: boolean;
20
- rotate?: boolean;
21
- clearAll?: boolean;
22
- }
23
-
24
- export async function routerLogsCommand(options: RouterLogsOptions): Promise<void> {
25
- // Load router config
26
- const config = await routerManager.loadConfig();
27
- if (!config) {
28
- throw new Error('Router configuration not found. Use "llamacpp router start" to create it.');
29
- }
30
-
31
- // Determine log file (default to stdout for activity logs, stderr for system logs)
32
- const logPath = options.stderr ? config.stderrPath : config.stdoutPath;
33
- const logType = options.stderr ? 'system' : 'activity';
34
-
35
- // Also check for verbose JSON log file if --verbose flag is used
36
- const verboseLogPath = '/Users/dweaver/.llamacpp/logs/router.log';
37
- const useVerboseLog = options.verbose && (await fileExists(verboseLogPath));
38
-
39
- // Handle --clear-all option (clears both stderr and stdout)
40
- if (options.clearAll) {
41
- let totalFreed = 0;
42
-
43
- // Clear stderr
44
- if (await fileExists(config.stderrPath)) {
45
- totalFreed += await getFileSize(config.stderrPath);
46
- await clearLogFile(config.stderrPath);
47
- }
48
-
49
- // Clear stdout
50
- if (await fileExists(config.stdoutPath)) {
51
- totalFreed += await getFileSize(config.stdoutPath);
52
- await clearLogFile(config.stdoutPath);
53
- }
54
-
55
- // Clear verbose log file
56
- if (await fileExists(verboseLogPath)) {
57
- totalFreed += await getFileSize(verboseLogPath);
58
- await clearLogFile(verboseLogPath);
59
- }
60
-
61
- console.log(chalk.green('✅ Cleared all router logs'));
62
- console.log(chalk.dim(` Total freed: ${formatFileSize(totalFreed)}`));
63
- return;
64
- }
65
-
66
- // Handle --clear option
67
- if (options.clear) {
68
- const targetPath = useVerboseLog ? verboseLogPath : logPath;
69
-
70
- if (!(await fileExists(targetPath))) {
71
- console.log(chalk.yellow(`⚠️ No ${useVerboseLog ? 'verbose log' : logType} found for router`));
72
- console.log(chalk.dim(` Log file does not exist: ${targetPath}`));
73
- return;
74
- }
75
-
76
- const sizeBefore = await getFileSize(targetPath);
77
- await clearLogFile(targetPath);
78
-
79
- console.log(chalk.green(`✅ Cleared router ${useVerboseLog ? 'verbose log' : logType}`));
80
- console.log(chalk.dim(` Freed: ${formatFileSize(sizeBefore)}`));
81
- console.log(chalk.dim(` ${targetPath}`));
82
- return;
83
- }
84
-
85
- // Handle --rotate option
86
- if (options.rotate) {
87
- const targetPath = useVerboseLog ? verboseLogPath : logPath;
88
-
89
- if (!(await fileExists(targetPath))) {
90
- console.log(chalk.yellow(`⚠️ No ${useVerboseLog ? 'verbose log' : logType} found for router`));
91
- console.log(chalk.dim(` Log file does not exist: ${targetPath}`));
92
- return;
93
- }
94
-
95
- try {
96
- const archivedPath = await rotateLogFile(targetPath);
97
- const size = await getFileSize(archivedPath);
98
-
99
- console.log(chalk.green(`✅ Rotated router ${useVerboseLog ? 'verbose log' : logType}`));
100
- console.log(chalk.dim(` Archived: ${formatFileSize(size)}`));
101
- console.log(chalk.dim(` → ${archivedPath}`));
102
- } catch (error) {
103
- throw new Error(`Failed to rotate log: ${(error as Error).message}`);
104
- }
105
- return;
106
- }
107
-
108
- // Determine which log to display
109
- const displayPath = useVerboseLog ? verboseLogPath : logPath;
110
- const displayType = useVerboseLog ? 'verbose JSON log' : logType;
111
-
112
- // Check if log file exists
113
- if (!(await fileExists(displayPath))) {
114
- console.log(chalk.yellow(`⚠️ No ${displayType} found for router`));
115
- console.log(chalk.dim(` Log file does not exist: ${displayPath}`));
116
-
117
- if (useVerboseLog) {
118
- console.log();
119
- console.log(chalk.dim(' Verbose logging is disabled. Enable with:'));
120
- console.log(chalk.dim(' llamacpp router config --verbose true --restart'));
121
- }
122
- return;
123
- }
124
-
125
- console.log(chalk.blue(`📋 Router logs (${displayType})`));
126
- console.log(chalk.dim(` ${displayPath}`));
127
-
128
- // Show log size information
129
- const currentSize = await getFileSize(displayPath);
130
- console.log(chalk.dim(` Size: ${formatFileSize(currentSize)}`));
131
-
132
- if (!useVerboseLog && config.verbose) {
133
- console.log(chalk.dim(` Verbose logging is enabled (use --verbose to view JSON log)`));
134
- } else if (!useVerboseLog && !config.verbose) {
135
- console.log(chalk.dim(` Verbose logging is disabled`));
136
- }
137
-
138
- console.log();
139
-
140
- if (options.follow) {
141
- // Follow logs in real-time
142
- if (useVerboseLog) {
143
- // Pretty-print JSON logs
144
- const tailProcess = spawn('tail', ['-f', displayPath]);
145
- const rl = readline.createInterface({
146
- input: tailProcess.stdout,
147
- crlfDelay: Infinity,
148
- });
149
-
150
- rl.on('line', (line) => {
151
- try {
152
- const entry = JSON.parse(line);
153
- // Format timestamp
154
- const timestamp = new Date(entry.timestamp).toLocaleTimeString();
155
- // Color code status
156
- const statusColor = entry.status === 'success' ? chalk.green : chalk.red;
157
-
158
- console.log(
159
- chalk.dim(`[${timestamp}]`),
160
- statusColor(entry.statusCode),
161
- entry.method,
162
- entry.endpoint,
163
- '→',
164
- chalk.cyan(entry.model),
165
- chalk.dim(`(${entry.backend || 'N/A'})`),
166
- chalk.yellow(`${entry.durationMs}ms`)
167
- );
168
- if (entry.prompt) {
169
- console.log(chalk.dim(` Prompt: "${entry.prompt}"`));
170
- }
171
- if (entry.error) {
172
- console.log(chalk.red(` Error: ${entry.error}`));
173
- }
174
- } catch {
175
- // Not JSON, just print raw line
176
- console.log(line);
177
- }
178
- });
179
-
180
- tailProcess.on('close', () => {
181
- process.exit(0);
182
- });
183
-
184
- // Handle Ctrl+C gracefully
185
- process.on('SIGINT', () => {
186
- tailProcess.kill();
187
- process.exit(0);
188
- });
189
- } else {
190
- // Standard tail for stderr/stdout
191
- const tailProcess = spawn('tail', ['-f', displayPath]);
192
- tailProcess.stdout.pipe(process.stdout);
193
- tailProcess.stderr.pipe(process.stderr);
194
-
195
- tailProcess.on('close', () => {
196
- process.exit(0);
197
- });
198
-
199
- // Handle Ctrl+C gracefully
200
- process.on('SIGINT', () => {
201
- tailProcess.kill();
202
- process.exit(0);
203
- });
204
- }
205
- } else {
206
- // Show last N lines (default 50)
207
- const linesToShow = options.lines || 50;
208
-
209
- if (useVerboseLog) {
210
- // Pretty-print JSON logs
211
- const lines = fs.readFileSync(displayPath, 'utf-8')
212
- .split('\n')
213
- .filter(line => line.trim())
214
- .slice(-linesToShow);
215
-
216
- for (const line of lines) {
217
- try {
218
- const entry = JSON.parse(line);
219
- // Format timestamp
220
- const timestamp = new Date(entry.timestamp).toLocaleTimeString();
221
- // Color code status
222
- const statusColor = entry.status === 'success' ? chalk.green : chalk.red;
223
-
224
- console.log(
225
- chalk.dim(`[${timestamp}]`),
226
- statusColor(entry.statusCode),
227
- entry.method,
228
- entry.endpoint,
229
- '→',
230
- chalk.cyan(entry.model),
231
- chalk.dim(`(${entry.backend || 'N/A'})`),
232
- chalk.yellow(`${entry.durationMs}ms`)
233
- );
234
- if (entry.prompt) {
235
- console.log(chalk.dim(` Prompt: "${entry.prompt}"`));
236
- }
237
- if (entry.error) {
238
- console.log(chalk.red(` Error: ${entry.error}`));
239
- }
240
- } catch {
241
- // Not JSON, just print raw line
242
- console.log(line);
243
- }
244
- }
245
- } else {
246
- // Standard tail for stderr/stdout
247
- const { execSync } = require('child_process');
248
- try {
249
- const output = execSync(`tail -n ${linesToShow} "${displayPath}"`, { encoding: 'utf-8' });
250
- process.stdout.write(output);
251
- } catch (error) {
252
- throw new Error(`Failed to read log file: ${(error as Error).message}`);
253
- }
254
- }
255
- }
256
- }
@@ -1,36 +0,0 @@
1
- import chalk from 'chalk';
2
- import { routerManager } from '../../lib/router-manager';
3
-
4
- export async function routerRestartCommand(): Promise<void> {
5
- console.log(chalk.blue('🔄 Restarting router...'));
6
-
7
- try {
8
- // Check if router exists
9
- const config = await routerManager.loadConfig();
10
- if (!config) {
11
- throw new Error('Router configuration not found. Use "llamacpp router start" to create it.');
12
- }
13
-
14
- // Restart router
15
- await routerManager.restart();
16
-
17
- // Get updated config
18
- const updatedConfig = await routerManager.loadConfig();
19
- if (!updatedConfig) {
20
- throw new Error('Failed to load router configuration after restart');
21
- }
22
-
23
- // Display success
24
- console.log();
25
- console.log(chalk.green('✅ Router restarted successfully!'));
26
- console.log();
27
- console.log(chalk.dim(`Endpoint: http://${updatedConfig.host}:${updatedConfig.port}`));
28
- console.log();
29
- console.log(chalk.dim('Quick commands:'));
30
- console.log(chalk.dim(' Status: llamacpp router status'));
31
- console.log(chalk.dim(' Stop: llamacpp router stop'));
32
- console.log(chalk.dim(` Logs: tail -f ${updatedConfig.stderrPath}`));
33
- } catch (error) {
34
- throw new Error(`Failed to restart router: ${(error as Error).message}`);
35
- }
36
- }
@@ -1,60 +0,0 @@
1
- import chalk from 'chalk';
2
- import { routerManager } from '../../lib/router-manager';
3
- import { stateManager } from '../../lib/state-manager';
4
-
5
- export async function routerStartCommand(): Promise<void> {
6
- console.log(chalk.blue('▶️ Starting router...'));
7
-
8
- try {
9
- // Initialize
10
- await routerManager.initialize();
11
- await stateManager.initialize();
12
-
13
- // Check if router already exists
14
- const existingConfig = await routerManager.loadConfig();
15
- if (existingConfig && existingConfig.status === 'running') {
16
- console.log(chalk.yellow(`⚠️ Router is already running on port ${existingConfig.port}`));
17
- return;
18
- }
19
-
20
- // Start router
21
- await routerManager.start();
22
-
23
- // Get updated config
24
- const config = await routerManager.loadConfig();
25
- if (!config) {
26
- throw new Error('Failed to load router configuration after start');
27
- }
28
-
29
- // Get running servers to show available models
30
- const servers = await stateManager.getAllServers();
31
- const runningServers = servers.filter(s => s.status === 'running');
32
-
33
- // Display success
34
- console.log();
35
- console.log(chalk.green('✅ Router started successfully!'));
36
- console.log();
37
- console.log(chalk.dim(`Endpoint: http://${config.host}:${config.port}`));
38
- console.log(chalk.dim(`Available models: ${runningServers.length}`));
39
-
40
- if (runningServers.length > 0) {
41
- console.log();
42
- console.log(chalk.dim('Models:'));
43
- runningServers.forEach(server => {
44
- console.log(chalk.dim(` • ${server.modelName} (port ${server.port})`));
45
- });
46
- } else {
47
- console.log();
48
- console.log(chalk.yellow('⚠️ No running servers found. Start a server first:'));
49
- console.log(chalk.dim(' llamacpp server create <model>'));
50
- }
51
-
52
- console.log();
53
- console.log(chalk.dim('Quick commands:'));
54
- console.log(chalk.dim(` Status: llamacpp router status`));
55
- console.log(chalk.dim(` Stop: llamacpp router stop`));
56
- console.log(chalk.dim(` Logs: tail -f ${config.stderrPath}`));
57
- } catch (error) {
58
- throw new Error(`Failed to start router: ${(error as Error).message}`);
59
- }
60
- }
@@ -1,119 +0,0 @@
1
- import chalk from 'chalk';
2
- import { routerManager } from '../../lib/router-manager';
3
- import { stateManager } from '../../lib/state-manager';
4
-
5
- export async function routerStatusCommand(): Promise<void> {
6
- try {
7
- // Get router status
8
- const result = await routerManager.getStatus();
9
- if (!result) {
10
- console.log(chalk.yellow('Router not configured'));
11
- console.log();
12
- console.log(chalk.dim('Create and start router:'));
13
- console.log(chalk.dim(' llamacpp router start'));
14
- return;
15
- }
16
-
17
- const { config, status } = result;
18
-
19
- // Calculate uptime if running
20
- let uptime = 'N/A';
21
- if (status.isRunning && config.lastStarted) {
22
- const startTime = new Date(config.lastStarted).getTime();
23
- const now = Date.now();
24
- const uptimeSeconds = Math.floor((now - startTime) / 1000);
25
- const hours = Math.floor(uptimeSeconds / 3600);
26
- const minutes = Math.floor((uptimeSeconds % 3600) / 60);
27
- const seconds = uptimeSeconds % 60;
28
-
29
- if (hours > 0) {
30
- uptime = `${hours}h ${minutes}m`;
31
- } else if (minutes > 0) {
32
- uptime = `${minutes}m ${seconds}s`;
33
- } else {
34
- uptime = `${seconds}s`;
35
- }
36
- }
37
-
38
- // Get running servers
39
- const servers = await stateManager.getAllServers();
40
- const runningServers = servers.filter(s => s.status === 'running');
41
-
42
- // Display status
43
- console.log();
44
- console.log(chalk.bold('Router Status'));
45
- console.log(chalk.dim('─'.repeat(50)));
46
- console.log();
47
-
48
- // Status badge
49
- const statusColor = status.isRunning ? chalk.green : chalk.gray;
50
- const statusBadge = status.isRunning ? '● RUN' : '○ OFF';
51
- console.log(`Status: ${statusColor(statusBadge)}`);
52
-
53
- if (status.isRunning) {
54
- console.log(`PID: ${status.pid || 'N/A'}`);
55
- console.log(`Uptime: ${uptime}`);
56
- }
57
-
58
- console.log(`Port: ${config.port}`);
59
- console.log(`Host: ${config.host}`);
60
- console.log(`Endpoint: http://${config.host}:${config.port}`);
61
- console.log();
62
-
63
- // Available models
64
- console.log(chalk.bold('Available Models'));
65
- console.log(chalk.dim('─'.repeat(50)));
66
- console.log();
67
-
68
- if (runningServers.length === 0) {
69
- console.log(chalk.dim('No running servers found'));
70
- console.log();
71
- console.log(chalk.yellow('⚠️ Start a server first:'));
72
- console.log(chalk.dim(' llamacpp server create <model>'));
73
- } else {
74
- runningServers.forEach(server => {
75
- console.log(` ${chalk.green('●')} ${server.modelName}`);
76
- console.log(chalk.dim(` Port: ${server.port}`));
77
- console.log(chalk.dim(` Backend: http://${server.host}:${server.port}`));
78
- console.log();
79
- });
80
- }
81
-
82
- // Configuration
83
- console.log(chalk.bold('Configuration'));
84
- console.log(chalk.dim('─'.repeat(50)));
85
- console.log();
86
- console.log(`Health Check Interval: ${config.healthCheckInterval}ms`);
87
- console.log(`Request Timeout: ${config.requestTimeout}ms`);
88
- console.log();
89
-
90
- // System paths
91
- console.log(chalk.bold('System Paths'));
92
- console.log(chalk.dim('─'.repeat(50)));
93
- console.log();
94
- console.log(chalk.dim(`Config: ${config.plistPath.replace(config.label + '.plist', 'router.json').replace('LaunchAgents', '.llamacpp')}`));
95
- console.log(chalk.dim(`Plist: ${config.plistPath}`));
96
- console.log(chalk.dim(`Stdout: ${config.stdoutPath}`));
97
- console.log(chalk.dim(`Stderr: ${config.stderrPath}`));
98
- console.log();
99
-
100
- // Quick commands
101
- console.log(chalk.bold('Quick Commands'));
102
- console.log(chalk.dim('─'.repeat(50)));
103
- console.log();
104
-
105
- if (status.isRunning) {
106
- console.log(chalk.dim(' Stop: llamacpp router stop'));
107
- console.log(chalk.dim(' Restart: llamacpp router restart'));
108
- console.log(chalk.dim(` Logs: tail -f ${config.stderrPath}`));
109
- console.log(chalk.dim(' Config: llamacpp router config --port <port> --restart'));
110
- } else {
111
- console.log(chalk.dim(' Start: llamacpp router start'));
112
- console.log(chalk.dim(' Config: llamacpp router config --port <port>'));
113
- console.log(chalk.dim(` Logs: cat ${config.stderrPath}`));
114
- }
115
- console.log();
116
- } catch (error) {
117
- throw new Error(`Failed to get router status: ${(error as Error).message}`);
118
- }
119
- }
@@ -1,33 +0,0 @@
1
- import chalk from 'chalk';
2
- import { routerManager } from '../../lib/router-manager';
3
-
4
- export async function routerStopCommand(): Promise<void> {
5
- console.log(chalk.blue('⏹️ Stopping router...'));
6
-
7
- try {
8
- // Check if router exists
9
- const config = await routerManager.loadConfig();
10
- if (!config) {
11
- throw new Error('Router configuration not found. Use "llamacpp router start" to create it.');
12
- }
13
-
14
- // Check if already stopped
15
- if (config.status !== 'running') {
16
- console.log(chalk.yellow('⚠️ Router is not running'));
17
- return;
18
- }
19
-
20
- // Stop router
21
- await routerManager.stop();
22
-
23
- // Display success
24
- console.log();
25
- console.log(chalk.green('✅ Router stopped successfully'));
26
- console.log();
27
- console.log(chalk.dim('Quick commands:'));
28
- console.log(chalk.dim(' Start: llamacpp router start'));
29
- console.log(chalk.dim(' Status: llamacpp router status'));
30
- } catch (error) {
31
- throw new Error(`Failed to stop router: ${(error as Error).message}`);
32
- }
33
- }