@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,485 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.RouterServer = void 0;
38
+ const http = __importStar(require("http"));
39
+ const https = __importStar(require("https"));
40
+ const url_1 = require("url");
41
+ const fs = __importStar(require("fs/promises"));
42
+ const path = __importStar(require("path"));
43
+ const file_utils_1 = require("../utils/file-utils");
44
+ const router_logger_1 = require("./router-logger");
45
+ /**
46
+ * Router HTTP server - proxies requests to backend llama.cpp servers
47
+ */
48
+ class RouterServer {
49
+ async initialize() {
50
+ // Load router config
51
+ const configPath = path.join((0, file_utils_1.getConfigDir)(), 'router.json');
52
+ if (!(await (0, file_utils_1.fileExists)(configPath))) {
53
+ throw new Error('Router configuration not found');
54
+ }
55
+ this.config = await (0, file_utils_1.readJson)(configPath);
56
+ // Initialize logger with verbose setting
57
+ this.logger = new router_logger_1.RouterLogger(this.config.verbose);
58
+ // Rotate log file if needed
59
+ await this.logger.rotateIfNeeded();
60
+ // Create HTTP server
61
+ this.server = http.createServer(async (req, res) => {
62
+ await this.handleRequest(req, res);
63
+ });
64
+ // Graceful shutdown
65
+ process.on('SIGTERM', async () => {
66
+ console.error('[Router] Received SIGTERM, shutting down gracefully...');
67
+ this.server.close(() => {
68
+ console.error('[Router] Server closed');
69
+ process.exit(0);
70
+ });
71
+ });
72
+ process.on('SIGINT', async () => {
73
+ console.error('[Router] Received SIGINT, shutting down gracefully...');
74
+ this.server.close(() => {
75
+ console.error('[Router] Server closed');
76
+ process.exit(0);
77
+ });
78
+ });
79
+ }
80
+ async start() {
81
+ await this.initialize();
82
+ this.server.listen(this.config.port, this.config.host, () => {
83
+ console.error(`[Router] Listening on http://${this.config.host}:${this.config.port}`);
84
+ console.error(`[Router] PID: ${process.pid}`);
85
+ });
86
+ }
87
+ /**
88
+ * Main request handler
89
+ */
90
+ async handleRequest(req, res) {
91
+ // CORS headers
92
+ res.setHeader('Access-Control-Allow-Origin', '*');
93
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
94
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
95
+ // Handle OPTIONS preflight
96
+ if (req.method === 'OPTIONS') {
97
+ res.writeHead(200);
98
+ res.end();
99
+ return;
100
+ }
101
+ try {
102
+ // Route based on path
103
+ if (req.url === '/health' && req.method === 'GET') {
104
+ await this.handleHealth(req, res);
105
+ }
106
+ else if (req.url === '/v1/models' && req.method === 'GET') {
107
+ await this.handleModels(req, res);
108
+ }
109
+ else if (req.url === '/v1/chat/completions' && req.method === 'POST') {
110
+ await this.handleChatCompletions(req, res);
111
+ }
112
+ else if (req.url === '/v1/embeddings' && req.method === 'POST') {
113
+ await this.handleEmbeddings(req, res);
114
+ }
115
+ else {
116
+ this.sendError(res, 404, 'Not Found', `Unknown endpoint: ${req.url}`);
117
+ }
118
+ }
119
+ catch (error) {
120
+ console.error('[Router] Error handling request:', error);
121
+ this.sendError(res, 500, 'Internal Server Error', error.message);
122
+ }
123
+ }
124
+ /**
125
+ * Health check endpoint
126
+ */
127
+ async handleHealth(req, res) {
128
+ res.writeHead(200, { 'Content-Type': 'application/json' });
129
+ res.end(JSON.stringify({
130
+ status: 'healthy',
131
+ uptime: process.uptime(),
132
+ timestamp: new Date().toISOString(),
133
+ }));
134
+ }
135
+ /**
136
+ * List models endpoint - aggregate from all running servers
137
+ */
138
+ async handleModels(req, res) {
139
+ const servers = await this.getAllServers();
140
+ const runningServers = servers.filter(s => s.status === 'running');
141
+ const models = runningServers.map(server => ({
142
+ id: server.modelName,
143
+ object: 'model',
144
+ created: Math.floor(new Date(server.createdAt).getTime() / 1000),
145
+ owned_by: 'llamacpp',
146
+ }));
147
+ const response = {
148
+ object: 'list',
149
+ data: models,
150
+ };
151
+ res.writeHead(200, { 'Content-Type': 'application/json' });
152
+ res.end(JSON.stringify(response));
153
+ }
154
+ /**
155
+ * Chat completions endpoint - route to backend server
156
+ */
157
+ async handleChatCompletions(req, res) {
158
+ const timer = new router_logger_1.RequestTimer();
159
+ let modelName = 'unknown';
160
+ let statusCode = 500;
161
+ let errorMsg;
162
+ let promptPreview;
163
+ try {
164
+ // Parse request body
165
+ const body = await this.readBody(req);
166
+ let requestData;
167
+ try {
168
+ requestData = JSON.parse(body);
169
+ }
170
+ catch (error) {
171
+ statusCode = 400;
172
+ errorMsg = 'Invalid JSON in request body';
173
+ this.sendError(res, statusCode, 'Bad Request', errorMsg);
174
+ await this.logRequest(modelName, '/v1/chat/completions', statusCode, timer.elapsed(), errorMsg);
175
+ return;
176
+ }
177
+ // Extract model name and prompt preview
178
+ modelName = requestData.model || 'unknown';
179
+ promptPreview = this.extractPromptPreview(requestData);
180
+ if (!requestData.model) {
181
+ statusCode = 400;
182
+ errorMsg = 'Missing "model" field in request';
183
+ this.sendError(res, statusCode, 'Bad Request', errorMsg);
184
+ await this.logRequest(modelName, '/v1/chat/completions', statusCode, timer.elapsed(), errorMsg, undefined, promptPreview);
185
+ return;
186
+ }
187
+ // Find server for model
188
+ const server = await this.findServerForModel(modelName);
189
+ if (!server) {
190
+ statusCode = 404;
191
+ errorMsg = `No server found for model: ${modelName}`;
192
+ this.sendError(res, statusCode, 'Not Found', errorMsg);
193
+ await this.logRequest(modelName, '/v1/chat/completions', statusCode, timer.elapsed(), errorMsg, undefined, promptPreview);
194
+ return;
195
+ }
196
+ if (server.status !== 'running') {
197
+ statusCode = 503;
198
+ errorMsg = `Server for model "${modelName}" is not running`;
199
+ this.sendError(res, statusCode, 'Service Unavailable', errorMsg);
200
+ await this.logRequest(modelName, '/v1/chat/completions', statusCode, timer.elapsed(), errorMsg, `${server.host}:${server.port}`, promptPreview);
201
+ return;
202
+ }
203
+ // Proxy request to backend
204
+ const backendUrl = `http://${server.host}:${server.port}/v1/chat/completions`;
205
+ await this.proxyRequest(backendUrl, requestData, req, res);
206
+ // Log success
207
+ statusCode = 200;
208
+ await this.logRequest(modelName, '/v1/chat/completions', statusCode, timer.elapsed(), undefined, `${server.host}:${server.port}`, promptPreview);
209
+ }
210
+ catch (error) {
211
+ errorMsg = error.message;
212
+ await this.logRequest(modelName, '/v1/chat/completions', statusCode, timer.elapsed(), errorMsg, undefined, promptPreview);
213
+ throw error;
214
+ }
215
+ }
216
+ /**
217
+ * Embeddings endpoint - route to backend server
218
+ */
219
+ async handleEmbeddings(req, res) {
220
+ const timer = new router_logger_1.RequestTimer();
221
+ let modelName = 'unknown';
222
+ let statusCode = 500;
223
+ let errorMsg;
224
+ let promptPreview;
225
+ try {
226
+ // Parse request body
227
+ const body = await this.readBody(req);
228
+ let requestData;
229
+ try {
230
+ requestData = JSON.parse(body);
231
+ }
232
+ catch (error) {
233
+ statusCode = 400;
234
+ errorMsg = 'Invalid JSON in request body';
235
+ this.sendError(res, statusCode, 'Bad Request', errorMsg);
236
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), errorMsg);
237
+ return;
238
+ }
239
+ // Extract model name and prompt preview
240
+ modelName = requestData.model || 'unknown';
241
+ promptPreview = this.extractPromptPreview(requestData);
242
+ if (!requestData.model) {
243
+ statusCode = 400;
244
+ errorMsg = 'Missing "model" field in request';
245
+ this.sendError(res, statusCode, 'Bad Request', errorMsg);
246
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), errorMsg, undefined, promptPreview);
247
+ return;
248
+ }
249
+ // Find server for model
250
+ const server = await this.findServerForModel(modelName);
251
+ if (!server) {
252
+ statusCode = 404;
253
+ errorMsg = `No server found for model: ${modelName}`;
254
+ this.sendError(res, statusCode, 'Not Found', errorMsg);
255
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), errorMsg, undefined, promptPreview);
256
+ return;
257
+ }
258
+ if (server.status !== 'running') {
259
+ statusCode = 503;
260
+ errorMsg = `Server for model "${modelName}" is not running`;
261
+ this.sendError(res, statusCode, 'Service Unavailable', errorMsg);
262
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), errorMsg, `${server.host}:${server.port}`, promptPreview);
263
+ return;
264
+ }
265
+ // Check if server has embeddings enabled
266
+ if (!server.embeddings) {
267
+ statusCode = 400;
268
+ errorMsg = `Server for model "${modelName}" does not have embeddings enabled`;
269
+ this.sendError(res, statusCode, 'Bad Request', errorMsg);
270
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), errorMsg, `${server.host}:${server.port}`, promptPreview);
271
+ return;
272
+ }
273
+ // Proxy request to backend
274
+ const backendUrl = `http://${server.host}:${server.port}/v1/embeddings`;
275
+ await this.proxyRequest(backendUrl, requestData, req, res);
276
+ // Log success
277
+ statusCode = 200;
278
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), undefined, `${server.host}:${server.port}`, promptPreview);
279
+ }
280
+ catch (error) {
281
+ errorMsg = error.message;
282
+ await this.logRequest(modelName, '/v1/embeddings', statusCode, timer.elapsed(), errorMsg, undefined, promptPreview);
283
+ throw error;
284
+ }
285
+ }
286
+ /**
287
+ * Proxy a request to a backend server
288
+ */
289
+ async proxyRequest(backendUrl, requestData, originalReq, res) {
290
+ const url = new url_1.URL(backendUrl);
291
+ const isHttps = url.protocol === 'https:';
292
+ const httpModule = isHttps ? https : http;
293
+ const requestBody = JSON.stringify(requestData);
294
+ const options = {
295
+ hostname: url.hostname,
296
+ port: url.port || (isHttps ? 443 : 80),
297
+ path: url.pathname + url.search,
298
+ method: 'POST',
299
+ headers: {
300
+ 'Content-Type': 'application/json',
301
+ 'Content-Length': Buffer.byteLength(requestBody),
302
+ },
303
+ timeout: this.config.requestTimeout,
304
+ };
305
+ return new Promise((resolve, reject) => {
306
+ const proxyReq = httpModule.request(options, (proxyRes) => {
307
+ // Forward status and headers
308
+ res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);
309
+ // Stream response
310
+ proxyRes.pipe(res);
311
+ proxyRes.on('end', () => {
312
+ resolve();
313
+ });
314
+ });
315
+ proxyReq.on('error', (error) => {
316
+ console.error('[Router] Proxy request failed:', error);
317
+ if (!res.headersSent) {
318
+ this.sendError(res, 502, 'Bad Gateway', 'Failed to connect to backend server');
319
+ }
320
+ reject(error);
321
+ });
322
+ proxyReq.on('timeout', () => {
323
+ console.error('[Router] Proxy request timed out');
324
+ proxyReq.destroy();
325
+ if (!res.headersSent) {
326
+ this.sendError(res, 504, 'Gateway Timeout', 'Backend server did not respond in time');
327
+ }
328
+ reject(new Error('Request timeout'));
329
+ });
330
+ // Send request body
331
+ proxyReq.write(requestBody);
332
+ proxyReq.end();
333
+ });
334
+ }
335
+ /**
336
+ * Read request body as string
337
+ */
338
+ async readBody(req) {
339
+ return new Promise((resolve, reject) => {
340
+ const chunks = [];
341
+ req.on('data', (chunk) => chunks.push(chunk));
342
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
343
+ req.on('error', reject);
344
+ });
345
+ }
346
+ /**
347
+ * Send error response
348
+ */
349
+ sendError(res, statusCode, error, details) {
350
+ if (res.headersSent)
351
+ return;
352
+ const response = { error };
353
+ if (details)
354
+ response.details = details;
355
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
356
+ res.end(JSON.stringify(response));
357
+ }
358
+ /**
359
+ * Get all server configurations
360
+ */
361
+ async getAllServers() {
362
+ const serversDir = (0, file_utils_1.getServersDir)();
363
+ try {
364
+ const files = await fs.readdir(serversDir);
365
+ const configFiles = files.filter(f => f.endsWith('.json'));
366
+ const servers = [];
367
+ for (const file of configFiles) {
368
+ const filePath = path.join(serversDir, file);
369
+ try {
370
+ const config = await (0, file_utils_1.readJson)(filePath);
371
+ servers.push(config);
372
+ }
373
+ catch (error) {
374
+ console.error(`[Router] Failed to load server config ${file}:`, error);
375
+ }
376
+ }
377
+ return servers;
378
+ }
379
+ catch (error) {
380
+ console.error('[Router] Failed to read servers directory:', error);
381
+ return [];
382
+ }
383
+ }
384
+ /**
385
+ * Helper method to log a request
386
+ */
387
+ async logRequest(model, endpoint, statusCode, durationMs, error, backend, prompt) {
388
+ const entry = {
389
+ timestamp: router_logger_1.RequestTimer.now(),
390
+ model,
391
+ endpoint,
392
+ method: 'POST',
393
+ status: statusCode >= 200 && statusCode < 300 ? 'success' : 'error',
394
+ statusCode,
395
+ durationMs,
396
+ error,
397
+ backend,
398
+ prompt,
399
+ };
400
+ await this.logger.logRequest(entry);
401
+ }
402
+ /**
403
+ * Extract prompt preview from request data (first 50 chars)
404
+ */
405
+ extractPromptPreview(requestData) {
406
+ try {
407
+ // For chat completions, get the last user message
408
+ if (requestData.messages && Array.isArray(requestData.messages)) {
409
+ const lastUserMessage = [...requestData.messages]
410
+ .reverse()
411
+ .find((msg) => msg.role === 'user');
412
+ if (lastUserMessage?.content) {
413
+ const content = typeof lastUserMessage.content === 'string'
414
+ ? lastUserMessage.content
415
+ : JSON.stringify(lastUserMessage.content);
416
+ return content.substring(0, 50).replace(/\n/g, ' ');
417
+ }
418
+ }
419
+ // For embeddings, get the input text
420
+ if (requestData.input) {
421
+ const input = typeof requestData.input === 'string'
422
+ ? requestData.input
423
+ : Array.isArray(requestData.input)
424
+ ? requestData.input[0]
425
+ : JSON.stringify(requestData.input);
426
+ return input.substring(0, 50).replace(/\n/g, ' ');
427
+ }
428
+ return undefined;
429
+ }
430
+ catch {
431
+ return undefined;
432
+ }
433
+ }
434
+ /**
435
+ * Find a server by model name
436
+ */
437
+ async findServerForModel(modelName) {
438
+ const servers = await this.getAllServers();
439
+ // Normalize a model name for flexible matching (lowercase, no extension, normalize separators)
440
+ const normalize = (name) => {
441
+ return name
442
+ .toLowerCase()
443
+ .replace(/\.gguf$/i, '')
444
+ .replace(/[_-]/g, '-'); // Normalize underscores and hyphens to hyphens
445
+ };
446
+ const normalizedRequest = normalize(modelName);
447
+ // Try exact match first
448
+ const exactMatch = servers.find(s => s.modelName === modelName);
449
+ if (exactMatch)
450
+ return exactMatch;
451
+ // Try case-insensitive match
452
+ const caseInsensitiveMatch = servers.find(s => s.modelName.toLowerCase() === modelName.toLowerCase());
453
+ if (caseInsensitiveMatch)
454
+ return caseInsensitiveMatch;
455
+ // Try adding .gguf extension if not present
456
+ if (!modelName.endsWith('.gguf')) {
457
+ const withExtension = modelName + '.gguf';
458
+ const extensionMatch = servers.find(s => s.modelName.toLowerCase() === withExtension.toLowerCase());
459
+ if (extensionMatch)
460
+ return extensionMatch;
461
+ }
462
+ // Try normalized matching (handles case, extension, and underscore/hyphen variations)
463
+ const normalizedMatch = servers.find(s => normalize(s.modelName) === normalizedRequest);
464
+ if (normalizedMatch)
465
+ return normalizedMatch;
466
+ return null;
467
+ }
468
+ }
469
+ exports.RouterServer = RouterServer;
470
+ // Main entry point
471
+ async function main() {
472
+ try {
473
+ const server = new RouterServer();
474
+ await server.start();
475
+ }
476
+ catch (error) {
477
+ console.error('[Router] Failed to start:', error);
478
+ process.exit(1);
479
+ }
480
+ }
481
+ // Only run if this is the main module
482
+ if (require.main === module) {
483
+ main();
484
+ }
485
+ //# sourceMappingURL=router-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-server.js","sourceRoot":"","sources":["../../src/lib/router-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import blessed from 'blessed';
2
+ import { ServerConfig } from '../types/server-config.js';
3
+ /**
4
+ * Config screen TUI for editing server configuration
5
+ */
6
+ export declare function createConfigUI(screen: blessed.Widgets.Screen, server: ServerConfig, onBack: (updatedServer?: ServerConfig) => void): Promise<void>;
7
+ //# sourceMappingURL=ConfigApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigApp.d.ts","sourceRoot":"","sources":["../../src/tui/ConfigApp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAqB,MAAM,2BAA2B,CAAC;AA0B5E;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAC9B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,YAAY,KAAK,IAAI,GAC7C,OAAO,CAAC,IAAI,CAAC,CAyhCf"}