@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,451 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSearchUI = createSearchUI;
7
+ const blessed_1 = __importDefault(require("blessed"));
8
+ const model_search_js_1 = require("../lib/model-search.js");
9
+ const model_downloader_js_1 = require("../lib/model-downloader.js");
10
+ const state_manager_js_1 = require("../lib/state-manager.js");
11
+ const format_utils_js_1 = require("../utils/format-utils.js");
12
+ /**
13
+ * Search HuggingFace and download models TUI
14
+ */
15
+ async function createSearchUI(screen, onBack) {
16
+ const state = {
17
+ query: '',
18
+ results: [],
19
+ selectedIndex: 0,
20
+ isSearching: false,
21
+ expandedModelIndex: null,
22
+ modelFiles: [],
23
+ selectedFileIndex: 0,
24
+ isLoadingFiles: false,
25
+ error: null,
26
+ };
27
+ // Create content box for results
28
+ const contentBox = blessed_1.default.box({
29
+ parent: screen,
30
+ top: 0,
31
+ left: 0,
32
+ right: 0,
33
+ bottom: 0,
34
+ tags: true,
35
+ scrollable: true,
36
+ alwaysScroll: true,
37
+ keys: true,
38
+ vi: true,
39
+ mouse: true,
40
+ scrollbar: {
41
+ ch: '█',
42
+ style: {
43
+ fg: 'blue',
44
+ },
45
+ },
46
+ });
47
+ // Render content
48
+ function render() {
49
+ const termWidth = screen.width || 80;
50
+ const divider = '─'.repeat(termWidth - 2);
51
+ let content = '';
52
+ // Header
53
+ content += '{bold}{blue-fg}═══ Search Models{/blue-fg}{/bold}\n';
54
+ content += '{gray-fg}Press [/] to search HuggingFace{/gray-fg}\n';
55
+ content += divider + '\n\n';
56
+ // Show searching state
57
+ if (state.isSearching) {
58
+ content += '{cyan-fg}⏳ Searching...{/cyan-fg}\n';
59
+ contentBox.setContent(content);
60
+ screen.render();
61
+ return;
62
+ }
63
+ // Show error
64
+ if (state.error) {
65
+ content += `{red-fg}❌ Error: ${state.error}{/red-fg}\n\n`;
66
+ content += '{gray-fg}Press [/] to search again{/gray-fg}\n';
67
+ contentBox.setContent(content);
68
+ screen.render();
69
+ return;
70
+ }
71
+ // Show results or empty state
72
+ if (state.results.length === 0) {
73
+ if (state.query) {
74
+ content += `{yellow-fg}No results found for: ${state.query}{/yellow-fg}\n`;
75
+ }
76
+ else {
77
+ content += '{gray-fg}Press [/] to search HuggingFace for models{/gray-fg}\n';
78
+ }
79
+ content += '\n' + divider + '\n';
80
+ content += '{gray-fg}[/] Search [ESC] Back [Q]uit{/gray-fg}';
81
+ contentBox.setContent(content);
82
+ screen.render();
83
+ return;
84
+ }
85
+ // Show expanded model files
86
+ if (state.expandedModelIndex !== null) {
87
+ const model = state.results[state.expandedModelIndex];
88
+ content += `{bold}Model: ${model.modelId}{/bold}\n`;
89
+ content += `Downloads: ${model.downloads.toLocaleString()} | Likes: ${model.likes}\n`;
90
+ content += divider + '\n\n';
91
+ if (state.isLoadingFiles) {
92
+ content += '{cyan-fg}⏳ Loading GGUF files...{/cyan-fg}\n';
93
+ }
94
+ else if (state.modelFiles.length === 0) {
95
+ content += '{yellow-fg}No GGUF files found for this model{/yellow-fg}\n';
96
+ }
97
+ else {
98
+ content += '{bold}GGUF Files:{/bold}\n\n';
99
+ for (let i = 0; i < state.modelFiles.length; i++) {
100
+ const file = state.modelFiles[i];
101
+ const isSelected = i === state.selectedFileIndex;
102
+ const indicator = isSelected ? '►' : ' ';
103
+ let rowContent = '';
104
+ if (isSelected) {
105
+ rowContent = `{cyan-bg}{15-fg}${indicator} ${file}{/15-fg}{/cyan-bg}`;
106
+ }
107
+ else {
108
+ rowContent = `${indicator} ${file}`;
109
+ }
110
+ content += rowContent + '\n';
111
+ }
112
+ content += '\n{gray-fg}Press Enter to download selected file{/gray-fg}\n';
113
+ }
114
+ content += '\n' + divider + '\n';
115
+ content += '{gray-fg}[↑/↓] Navigate [Enter] Download [ESC] Back{/gray-fg}';
116
+ contentBox.setContent(content);
117
+ screen.render();
118
+ return;
119
+ }
120
+ // Show results table
121
+ content += `{bold}Results for: "${state.query}"{/bold}\n`;
122
+ content += divider + '\n\n';
123
+ // Table header
124
+ content += '{bold} │ Model │ Downloads │ Likes{/bold}\n';
125
+ content += divider + '\n';
126
+ // Result rows
127
+ for (let i = 0; i < state.results.length; i++) {
128
+ const result = state.results[i];
129
+ const isSelected = i === state.selectedIndex;
130
+ const indicator = isSelected ? '►' : ' ';
131
+ // Model ID (truncate if too long)
132
+ const maxModelLen = 51;
133
+ let modelId = result.modelId;
134
+ if (modelId.length > maxModelLen) {
135
+ modelId = modelId.substring(0, maxModelLen - 3) + '...';
136
+ }
137
+ modelId = modelId.padEnd(maxModelLen);
138
+ // Downloads
139
+ const downloads = result.downloads.toLocaleString().padStart(10);
140
+ // Likes
141
+ const likes = result.likes.toString().padStart(6);
142
+ // Build row content
143
+ let rowContent = '';
144
+ if (isSelected) {
145
+ rowContent = `{cyan-bg}{15-fg}${indicator} │ ${modelId} │ ${downloads} │ ${likes}{/15-fg}{/cyan-bg}`;
146
+ }
147
+ else {
148
+ rowContent = `${indicator} │ ${modelId} │ ${downloads} │ ${likes}`;
149
+ }
150
+ content += rowContent + '\n';
151
+ }
152
+ // Footer
153
+ content += '\n' + divider + '\n';
154
+ content += '{gray-fg}[↑/↓] Navigate [Enter] View files [/] New search [ESC] Back [Q]uit{/gray-fg}';
155
+ contentBox.setContent(content);
156
+ screen.render();
157
+ }
158
+ // Show search popup modal
159
+ function showSearchPopup() {
160
+ const searchBox = blessed_1.default.box({
161
+ parent: screen,
162
+ top: 'center',
163
+ left: 'center',
164
+ width: '60%',
165
+ height: 7,
166
+ border: { type: 'line' },
167
+ style: {
168
+ border: { fg: 'cyan' },
169
+ },
170
+ tags: true,
171
+ });
172
+ searchBox.setContent('{bold}Search HuggingFace{/bold}\n\nType your query and press Enter:');
173
+ const searchInput = blessed_1.default.textbox({
174
+ parent: searchBox,
175
+ bottom: 0,
176
+ left: 1,
177
+ right: 1,
178
+ height: 1,
179
+ inputOnFocus: true,
180
+ style: {
181
+ fg: 'white',
182
+ bg: 'black',
183
+ },
184
+ });
185
+ // Handle submit
186
+ searchInput.on('submit', async (value) => {
187
+ screen.remove(searchBox);
188
+ screen.render();
189
+ if (value && value.trim()) {
190
+ await executeSearch(value.trim());
191
+ }
192
+ });
193
+ // Handle cancel
194
+ searchInput.on('cancel', () => {
195
+ screen.remove(searchBox);
196
+ render();
197
+ });
198
+ searchInput.key(['escape'], () => {
199
+ screen.remove(searchBox);
200
+ render();
201
+ });
202
+ screen.append(searchBox);
203
+ searchInput.focus();
204
+ screen.render();
205
+ }
206
+ // Execute search
207
+ async function executeSearch(query) {
208
+ state.query = query;
209
+ state.isSearching = true;
210
+ state.error = null;
211
+ state.results = [];
212
+ state.selectedIndex = 0;
213
+ render();
214
+ try {
215
+ const results = await model_search_js_1.modelSearch.searchModels(query, 20);
216
+ state.results = results;
217
+ state.isSearching = false;
218
+ render();
219
+ }
220
+ catch (error) {
221
+ state.error = error instanceof Error ? error.message : 'Unknown error';
222
+ state.isSearching = false;
223
+ render();
224
+ }
225
+ }
226
+ // Load model files
227
+ async function loadModelFiles(modelIndex) {
228
+ const model = state.results[modelIndex];
229
+ state.expandedModelIndex = modelIndex;
230
+ state.isLoadingFiles = true;
231
+ state.modelFiles = [];
232
+ state.selectedFileIndex = 0;
233
+ render();
234
+ try {
235
+ const files = await model_search_js_1.modelSearch.getModelFiles(model.modelId);
236
+ state.modelFiles = files;
237
+ state.isLoadingFiles = false;
238
+ render();
239
+ }
240
+ catch (error) {
241
+ state.error = error instanceof Error ? error.message : 'Unknown error';
242
+ state.expandedModelIndex = null;
243
+ state.isLoadingFiles = false;
244
+ render();
245
+ }
246
+ }
247
+ // Download selected file
248
+ async function downloadFile() {
249
+ if (state.expandedModelIndex === null || state.modelFiles.length === 0)
250
+ return;
251
+ const model = state.results[state.expandedModelIndex];
252
+ const filename = state.modelFiles[state.selectedFileIndex];
253
+ // Get models directory
254
+ const modelsDir = await state_manager_js_1.stateManager.getModelsDirectory();
255
+ // Create progress modal
256
+ const progressBox = blessed_1.default.box({
257
+ parent: screen,
258
+ top: 'center',
259
+ left: 'center',
260
+ width: '70%',
261
+ height: 12,
262
+ border: { type: 'line' },
263
+ style: {
264
+ border: { fg: 'cyan' },
265
+ },
266
+ tags: true,
267
+ });
268
+ // Create abort controller for cancellation
269
+ const abortController = new AbortController();
270
+ let downloadCancelled = false;
271
+ // Update progress display
272
+ function updateProgress(progress) {
273
+ if (downloadCancelled)
274
+ return;
275
+ const percentage = progress.percentage.toFixed(1);
276
+ const barLength = 40;
277
+ const filled = Math.round((progress.percentage / 100) * barLength);
278
+ const empty = barLength - filled;
279
+ const bar = '█'.repeat(Math.max(0, filled)) + '░'.repeat(Math.max(0, empty));
280
+ let content = `{bold}Downloading: ${progress.filename}{/bold}\n\n`;
281
+ content += `[${bar}] ${percentage}%\n\n`;
282
+ content += `Downloaded: ${(0, format_utils_js_1.formatBytes)(progress.downloaded)} / ${(0, format_utils_js_1.formatBytes)(progress.total)}\n`;
283
+ content += `Speed: ${progress.speed}\n\n`;
284
+ content += '{gray-fg}Press ESC or Ctrl+C to cancel{/gray-fg}';
285
+ progressBox.setContent(content);
286
+ screen.render();
287
+ }
288
+ // Temporarily unregister main handlers during download
289
+ screen.unkey('escape', keyHandlers.escape);
290
+ screen.unkey('C-c', keyHandlers.quit);
291
+ // Handle cancel
292
+ const cancelHandler = () => {
293
+ downloadCancelled = true;
294
+ abortController.abort(); // Actually abort the download
295
+ };
296
+ // Cleanup function to restore handlers
297
+ const cleanup = () => {
298
+ screen.unkey('escape', cancelHandler);
299
+ screen.unkey('C-c', cancelHandler);
300
+ screen.remove(progressBox);
301
+ // Re-register main handlers
302
+ screen.key(['escape'], keyHandlers.escape);
303
+ screen.key(['C-c'], keyHandlers.quit);
304
+ };
305
+ screen.append(progressBox);
306
+ progressBox.focus();
307
+ screen.key(['escape', 'C-c'], cancelHandler);
308
+ screen.render();
309
+ try {
310
+ // Start download with silent mode and abort signal
311
+ await model_downloader_js_1.modelDownloader.downloadModel(model.modelId, filename, (progress) => {
312
+ if (!downloadCancelled) {
313
+ updateProgress(progress);
314
+ }
315
+ }, modelsDir, { silent: true, signal: abortController.signal });
316
+ if (!downloadCancelled) {
317
+ // Show success message
318
+ cleanup();
319
+ const successBox = blessed_1.default.message({
320
+ parent: screen,
321
+ top: 'center',
322
+ left: 'center',
323
+ width: '60%',
324
+ height: 'shrink',
325
+ border: { type: 'line' },
326
+ style: {
327
+ border: { fg: 'green' },
328
+ fg: 'green',
329
+ },
330
+ tags: true,
331
+ });
332
+ successBox.display(`{bold}Download complete!{/bold}\n\nFile: ${filename}\nLocation: ${modelsDir}\n\nPress any key to continue`, () => {
333
+ screen.remove(successBox);
334
+ render();
335
+ });
336
+ }
337
+ }
338
+ catch (error) {
339
+ cleanup();
340
+ if (!downloadCancelled) {
341
+ // Show error message (not cancelled by user)
342
+ const errorBox = blessed_1.default.message({
343
+ parent: screen,
344
+ top: 'center',
345
+ left: 'center',
346
+ width: '60%',
347
+ height: 'shrink',
348
+ border: { type: 'line' },
349
+ style: {
350
+ border: { fg: 'red' },
351
+ fg: 'red',
352
+ },
353
+ tags: true,
354
+ });
355
+ const errorMsg = error instanceof Error ? error.message : 'Unknown error';
356
+ errorBox.display(`{bold}Download failed{/bold}\n\n${errorMsg}\n\nPress any key to continue`, () => {
357
+ screen.remove(errorBox);
358
+ render();
359
+ });
360
+ }
361
+ else {
362
+ // Cancelled by user - just render
363
+ render();
364
+ }
365
+ }
366
+ }
367
+ // Store key handler references for cleanup
368
+ const keyHandlers = {
369
+ up: () => {
370
+ if (state.expandedModelIndex !== null) {
371
+ // Navigating files
372
+ state.selectedFileIndex = Math.max(0, state.selectedFileIndex - 1);
373
+ }
374
+ else {
375
+ // Navigating results
376
+ state.selectedIndex = Math.max(0, state.selectedIndex - 1);
377
+ }
378
+ render();
379
+ },
380
+ down: () => {
381
+ if (state.expandedModelIndex !== null) {
382
+ // Navigating files
383
+ state.selectedFileIndex = Math.min(state.modelFiles.length - 1, state.selectedFileIndex + 1);
384
+ }
385
+ else {
386
+ // Navigating results
387
+ state.selectedIndex = Math.min(state.results.length - 1, state.selectedIndex + 1);
388
+ }
389
+ render();
390
+ },
391
+ enter: () => {
392
+ if (state.expandedModelIndex !== null) {
393
+ // Download selected file
394
+ downloadFile();
395
+ }
396
+ else if (state.results.length > 0) {
397
+ // Expand selected model to show files
398
+ loadModelFiles(state.selectedIndex);
399
+ }
400
+ },
401
+ search: () => {
402
+ if (state.expandedModelIndex !== null)
403
+ return; // Don't allow search when viewing files
404
+ showSearchPopup();
405
+ },
406
+ escape: () => {
407
+ if (state.expandedModelIndex !== null) {
408
+ // Go back to results list
409
+ state.expandedModelIndex = null;
410
+ state.modelFiles = [];
411
+ state.selectedFileIndex = 0;
412
+ render();
413
+ }
414
+ else {
415
+ // Go back to models view
416
+ unregisterHandlers();
417
+ screen.remove(contentBox);
418
+ onBack();
419
+ }
420
+ },
421
+ quit: () => {
422
+ screen.destroy();
423
+ process.exit(0);
424
+ },
425
+ };
426
+ // Unregister all keyboard handlers
427
+ function unregisterHandlers() {
428
+ screen.unkey('up', keyHandlers.up);
429
+ screen.unkey('k', keyHandlers.up);
430
+ screen.unkey('down', keyHandlers.down);
431
+ screen.unkey('j', keyHandlers.down);
432
+ screen.unkey('enter', keyHandlers.enter);
433
+ screen.unkey('/', keyHandlers.search);
434
+ screen.unkey('escape', keyHandlers.escape);
435
+ screen.unkey('q', keyHandlers.quit);
436
+ screen.unkey('Q', keyHandlers.quit);
437
+ screen.unkey('C-c', keyHandlers.quit);
438
+ }
439
+ // Register key handlers
440
+ screen.key(['up', 'k'], keyHandlers.up);
441
+ screen.key(['down', 'j'], keyHandlers.down);
442
+ screen.key(['enter'], keyHandlers.enter);
443
+ screen.key(['/'], keyHandlers.search);
444
+ screen.key(['escape'], keyHandlers.escape);
445
+ screen.key(['q', 'Q', 'C-c'], keyHandlers.quit);
446
+ // Initial render
447
+ render();
448
+ // Auto-open search popup on load
449
+ showSearchPopup();
450
+ }
451
+ //# sourceMappingURL=SearchApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchApp.js","sourceRoot":"","sources":["../../src/tui/SearchApp.ts"],"names":[],"mappings":";;;;;AAqBA,wCAyeC;AA9fD,sDAA8B;AAC9B,4DAAoE;AACpE,oEAA+E;AAC/E,8DAAuD;AACvD,8DAAuD;AAcvD;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,MAA8B,EAC9B,MAAkB;IAElB,MAAM,KAAK,GAAgB;QACzB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,KAAK;QAClB,kBAAkB,EAAE,IAAI;QACxB,UAAU,EAAE,EAAE;QACd,iBAAiB,EAAE,CAAC;QACpB,cAAc,EAAE,KAAK;QACrB,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,iCAAiC;IACjC,MAAM,UAAU,GAAG,iBAAO,CAAC,GAAG,CAAC;QAC7B,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,IAAI;QACX,SAAS,EAAE;YACT,EAAE,EAAE,GAAG;YACP,KAAK,EAAE;gBACL,EAAE,EAAE,MAAM;aACX;SACF;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,SAAS,MAAM;QACb,MAAM,SAAS,GAAI,MAAM,CAAC,KAAgB,IAAI,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,SAAS;QACT,OAAO,IAAI,qDAAqD,CAAC;QACjE,OAAO,IAAI,sDAAsD,CAAC;QAClE,OAAO,IAAI,OAAO,GAAG,MAAM,CAAC;QAE5B,uBAAuB;QACvB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO,IAAI,qCAAqC,CAAC;YACjD,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,aAAa;QACb,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,oBAAoB,KAAK,CAAC,KAAK,eAAe,CAAC;YAC1D,OAAO,IAAI,gDAAgD,CAAC;YAC5D,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,IAAI,oCAAoC,KAAK,CAAC,KAAK,gBAAgB,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,iEAAiE,CAAC;YAC/E,CAAC;YACD,OAAO,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;YACjC,OAAO,IAAI,iDAAiD,CAAC;YAC7D,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtD,OAAO,IAAI,gBAAgB,KAAK,CAAC,OAAO,WAAW,CAAC;YACpD,OAAO,IAAI,cAAc,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,aAAa,KAAK,CAAC,KAAK,IAAI,CAAC;YACtF,OAAO,IAAI,OAAO,GAAG,MAAM,CAAC;YAE5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzB,OAAO,IAAI,8CAA8C,CAAC;YAC5D,CAAC;iBAAM,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,IAAI,6DAA6D,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,8BAA8B,CAAC;gBAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACjC,MAAM,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC,iBAAiB,CAAC;oBACjD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBAEzC,IAAI,UAAU,GAAG,EAAE,CAAC;oBACpB,IAAI,UAAU,EAAE,CAAC;wBACf,UAAU,GAAG,mBAAmB,SAAS,IAAI,IAAI,oBAAoB,CAAC;oBACxE,CAAC;yBAAM,CAAC;wBACN,UAAU,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;oBACtC,CAAC;oBAED,OAAO,IAAI,UAAU,GAAG,IAAI,CAAC;gBAC/B,CAAC;gBAED,OAAO,IAAI,8DAA8D,CAAC;YAC5E,CAAC;YAED,OAAO,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;YACjC,OAAO,IAAI,+DAA+D,CAAC;YAC3E,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,OAAO,IAAI,uBAAuB,KAAK,CAAC,KAAK,YAAY,CAAC;QAC1D,OAAO,IAAI,OAAO,GAAG,MAAM,CAAC;QAE5B,eAAe;QACf,OAAO,IAAI,2FAA2F,CAAC;QACvG,OAAO,IAAI,OAAO,GAAG,IAAI,CAAC;QAE1B,cAAc;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC,aAAa,CAAC;YAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAEzC,kCAAkC;YAClC,MAAM,WAAW,GAAG,EAAE,CAAC;YACvB,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;gBACjC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YAC1D,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEtC,YAAY;YACZ,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAEjE,QAAQ;YACR,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAElD,oBAAoB;YACpB,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,GAAG,mBAAmB,SAAS,MAAM,OAAO,MAAM,SAAS,MAAM,KAAK,oBAAoB,CAAC;YACvG,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,GAAG,SAAS,MAAM,OAAO,MAAM,SAAS,MAAM,KAAK,EAAE,CAAC;YACrE,CAAC;YAED,OAAO,IAAI,UAAU,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,SAAS;QACT,OAAO,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,uFAAuF,CAAC;QAEnG,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,SAAS,eAAe;QACtB,MAAM,SAAS,GAAG,iBAAO,CAAC,GAAG,CAAC;YAC5B,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACxB,KAAK,EAAE;gBACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;aACvB;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,SAAS,CAAC,UAAU,CAAC,qEAAqE,CAAC,CAAC;QAE5F,MAAM,WAAW,GAAG,iBAAO,CAAC,OAAO,CAAC;YAClC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE;gBACL,EAAE,EAAE,OAAO;gBACX,EAAE,EAAE,OAAO;aACZ;SACF,CAAC,CAAC;QAEH,gBAAgB;QAChB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzB,MAAM,CAAC,MAAM,EAAE,CAAC;YAEhB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1B,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzB,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,KAAK,UAAU,aAAa,CAAC,KAAa;QACxC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;QACxB,MAAM,EAAE,CAAC;QAET,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,6BAAW,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1D,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YAC1B,MAAM,EAAE,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACvE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YAC1B,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,UAAU,cAAc,CAAC,UAAkB;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,KAAK,CAAC,kBAAkB,GAAG,UAAU,CAAC;QACtC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC;QAET,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,6BAAW,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;YACzB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;YAC7B,MAAM,EAAE,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACvE,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAChC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;YAC7B,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,KAAK,UAAU,YAAY;QACzB,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAE3D,uBAAuB;QACvB,MAAM,SAAS,GAAG,MAAM,+BAAY,CAAC,kBAAkB,EAAE,CAAC;QAE1D,wBAAwB;QACxB,MAAM,WAAW,GAAG,iBAAO,CAAC,GAAG,CAAC;YAC9B,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACxB,KAAK,EAAE;gBACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;aACvB;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAE9B,0BAA0B;QAC1B,SAAS,cAAc,CAAC,QAA0B;YAChD,IAAI,iBAAiB;gBAAE,OAAO;YAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAE7E,IAAI,OAAO,GAAG,sBAAsB,QAAQ,CAAC,QAAQ,aAAa,CAAC;YACnE,OAAO,IAAI,IAAI,GAAG,KAAK,UAAU,OAAO,CAAC;YACzC,OAAO,IAAI,eAAe,IAAA,6BAAW,EAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,IAAA,6BAAW,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAChG,OAAO,IAAI,UAAU,QAAQ,CAAC,KAAK,MAAM,CAAC;YAC1C,OAAO,IAAI,kDAAkD,CAAC;YAE9D,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;QAED,uDAAuD;QACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAEtC,gBAAgB;QAChB,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,iBAAiB,GAAG,IAAI,CAAC;YACzB,eAAe,CAAC,KAAK,EAAE,CAAC,CAAE,8BAA8B;QAC1D,CAAC,CAAC;QAEF,uCAAuC;QACvC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3B,4BAA4B;YAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,mDAAmD;YACnD,MAAM,qCAAe,CAAC,aAAa,CACjC,KAAK,CAAC,OAAO,EACb,QAAQ,EACR,CAAC,QAAQ,EAAE,EAAE;gBACX,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,EACD,SAAS,EACT,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CACjD,CAAC;YAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,uBAAuB;gBACvB,OAAO,EAAE,CAAC;gBAEV,MAAM,UAAU,GAAG,iBAAO,CAAC,OAAO,CAAC;oBACjC,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,QAAQ;oBACb,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;oBACxB,KAAK,EAAE;wBACL,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;wBACvB,EAAE,EAAE,OAAO;qBACZ;oBACD,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBAEH,UAAU,CAAC,OAAO,CAChB,4CAA4C,QAAQ,eAAe,SAAS,+BAA+B,EAC3G,GAAG,EAAE;oBACH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC1B,MAAM,EAAE,CAAC;gBACX,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YAEV,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,6CAA6C;gBAC7C,MAAM,QAAQ,GAAG,iBAAO,CAAC,OAAO,CAAC;oBAC/B,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,QAAQ;oBACb,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;oBACxB,KAAK,EAAE;wBACL,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;wBACrB,EAAE,EAAE,KAAK;qBACV;oBACD,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBAC1E,QAAQ,CAAC,OAAO,CAAC,mCAAmC,QAAQ,+BAA+B,EAAE,GAAG,EAAE;oBAChG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACxB,MAAM,EAAE,CAAC;gBACX,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,kCAAkC;gBAClC,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,GAAG,EAAE;YACP,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBACtC,mBAAmB;gBACnB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,EAAE,CAAC;QACX,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBACtC,mBAAmB;gBACnB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;YAC/F,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,EAAE,CAAC;QACX,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBACtC,yBAAyB;gBACzB,YAAY,EAAE,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,sCAAsC;gBACtC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI;gBAAE,OAAO,CAAC,wCAAwC;YACvF,eAAe,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBACtC,0BAA0B;gBAC1B,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAChC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;gBACtB,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC5B,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,kBAAkB,EAAE,CAAC;gBACrB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC1B,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;KACF,CAAC;IAEF,mCAAmC;IACnC,SAAS,kBAAkB;QACzB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhD,iBAAiB;IACjB,MAAM,EAAE,CAAC;IAET,iCAAiC;IACjC,eAAe,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import blessed from "blessed";
2
+ export interface SplashCallbacks {
3
+ onLoadConfigs: () => Promise<void>;
4
+ onCheckServices: () => Promise<void>;
5
+ onInitMetrics: () => Promise<void>;
6
+ }
7
+ export interface SplashScreenControls {
8
+ updateStatus: (line: number, text: string, done?: boolean) => void;
9
+ complete: () => void;
10
+ }
11
+ /**
12
+ * Creates and displays the splash screen with loading status
13
+ * Returns a cleanup function to remove the splash when the main UI is ready
14
+ */
15
+ export declare function createSplashScreen(screen: blessed.Widgets.Screen, callbacks: SplashCallbacks): Promise<() => void>;
16
+ //# sourceMappingURL=SplashScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplashScreen.d.ts","sourceRoot":"","sources":["../../src/tui/SplashScreen.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAuC9B,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnE,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAC9B,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,MAAM,IAAI,CAAC,CA2FrB"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSplashScreen = createSplashScreen;
7
+ const blessed_1 = __importDefault(require("blessed"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ // Get version from package.json at runtime
11
+ function getVersion() {
12
+ try {
13
+ // Try to find package.json relative to this file's location
14
+ // Works both in src/ (dev) and dist/ (production)
15
+ const possiblePaths = [
16
+ (0, path_1.join)(__dirname, "../../package.json"), // From dist/tui/
17
+ (0, path_1.join)(__dirname, "../../../package.json"), // Fallback
18
+ ];
19
+ for (const pkgPath of possiblePaths) {
20
+ try {
21
+ const content = (0, fs_1.readFileSync)(pkgPath, "utf-8");
22
+ const pkg = JSON.parse(content);
23
+ if (pkg.version)
24
+ return pkg.version;
25
+ }
26
+ catch {
27
+ continue;
28
+ }
29
+ }
30
+ return "1.0.0";
31
+ }
32
+ catch {
33
+ return "1.0.0";
34
+ }
35
+ }
36
+ // ASCII art logo for llama.cpp
37
+ const LOGO = `
38
+ {cyan-fg} ██╗ ██╗ █████╗ ███╗ ███╗ █████╗ ██████╗██████╗ ██████╗{/cyan-fg}
39
+ {cyan-fg}██║ ██║ ██╔══██╗████╗ ████║██╔══██╗ ██╔════╝██╔══██╗██╔══██╗{/cyan-fg}
40
+ {cyan-fg}██║ ██║ ███████║██╔████╔██║███████║ ██║ ██████╔╝██████╔╝{/cyan-fg}
41
+ {cyan-fg}██║ ██║ ██╔══██║██║╚██╔╝██║██╔══██║ ██║ ██╔═══╝ ██╔═══╝{/cyan-fg}
42
+ {cyan-fg}███████╗███████╗██║ ██║██║ ╚═╝ ██║██║ ██║ ╚██████╗██║ ██║{/cyan-fg}
43
+ {cyan-fg}╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝{/cyan-fg}
44
+ `.trim();
45
+ /**
46
+ * Creates and displays the splash screen with loading status
47
+ * Returns a cleanup function to remove the splash when the main UI is ready
48
+ */
49
+ async function createSplashScreen(screen, callbacks) {
50
+ const version = getVersion();
51
+ // Create top-left aligned container
52
+ const container = blessed_1.default.box({
53
+ top: 0,
54
+ left: 0,
55
+ width: 75,
56
+ height: 19,
57
+ tags: true,
58
+ });
59
+ screen.append(container);
60
+ // Logo box
61
+ const logoBox = blessed_1.default.box({
62
+ parent: container,
63
+ top: 0,
64
+ left: 0,
65
+ width: 73,
66
+ height: 7,
67
+ tags: true,
68
+ content: LOGO,
69
+ });
70
+ // Info box with border
71
+ const infoBox = blessed_1.default.box({
72
+ parent: container,
73
+ top: 7,
74
+ left: 0,
75
+ width: 73,
76
+ height: 10,
77
+ tags: true,
78
+ border: {
79
+ type: "line",
80
+ },
81
+ style: {
82
+ border: {
83
+ fg: "blue",
84
+ },
85
+ },
86
+ });
87
+ // Status lines (inside the info box)
88
+ const statusLines = [
89
+ "{bold}Local LLM Server Manager{/bold} v" +
90
+ version,
91
+ "",
92
+ "{gray-fg}>{/gray-fg} Loading server configurations...",
93
+ "{gray-fg}>{/gray-fg} Checking launchctl services...",
94
+ "{gray-fg}>{/gray-fg} Initializing metrics collectors...",
95
+ "{gray-fg}>{/gray-fg} Loading UI...",
96
+ ];
97
+ function updateDisplay() {
98
+ infoBox.setContent(statusLines.join("\n"));
99
+ screen.render();
100
+ }
101
+ function updateStatus(line, text, done = false) {
102
+ const prefix = done ? "{green-fg}✓{/green-fg}" : "{yellow-fg}>{/yellow-fg}";
103
+ statusLines[line + 2] = `${prefix} ${text}`;
104
+ updateDisplay();
105
+ }
106
+ // Initial render
107
+ updateDisplay();
108
+ // Run loading sequence
109
+ // Step 1: Load configs
110
+ updateStatus(0, "Loading server configurations...", false);
111
+ await callbacks.onLoadConfigs();
112
+ updateStatus(0, "Server configurations loaded", true);
113
+ // Step 2: Check services
114
+ updateStatus(1, "Checking launchctl services...", false);
115
+ await callbacks.onCheckServices();
116
+ updateStatus(1, "Launchctl services checked", true);
117
+ // Step 3: Init metrics
118
+ updateStatus(2, "Initializing metrics collectors...", false);
119
+ await callbacks.onInitMetrics();
120
+ updateStatus(2, "Metrics collectors ready", true);
121
+ // Step 4: Loading UI (stays active until cleanup is called)
122
+ updateStatus(3, "Loading UI...", false);
123
+ // Return cleanup function - caller decides when to remove splash
124
+ return () => {
125
+ screen.remove(container);
126
+ screen.render();
127
+ };
128
+ }
129
+ //# sourceMappingURL=SplashScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplashScreen.js","sourceRoot":"","sources":["../../src/tui/SplashScreen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type RouterStatus = 'running' | 'stopped' | 'crashed';
2
+ export interface RouterConfig {
3
+ id: 'router';
4
+ port: number;
5
+ host: string;
6
+ status: RouterStatus;
7
+ pid?: number;
8
+ createdAt: string;
9
+ lastStarted?: string;
10
+ lastStopped?: string;
11
+ plistPath: string;
12
+ label: 'com.llama.router';
13
+ stdoutPath: string;
14
+ stderrPath: string;
15
+ healthCheckInterval: number;
16
+ requestTimeout: number;
17
+ verbose: boolean;
18
+ }
19
+ //# sourceMappingURL=router-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-config.d.ts","sourceRoot":"","sources":["../../src/types/router-config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=router-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-config.js","sourceRoot":"","sources":["../../src/types/router-config.ts"],"names":[],"mappings":""}