@appkit/llamacpp-cli 1.5.0 → 1.6.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 (95) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/MONITORING-ACCURACY-FIX.md +199 -0
  3. package/PER-PROCESS-METRICS.md +190 -0
  4. package/README.md +57 -8
  5. package/dist/cli.js +9 -6
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/create.d.ts.map +1 -1
  8. package/dist/commands/create.js +12 -3
  9. package/dist/commands/create.js.map +1 -1
  10. package/dist/commands/monitor.d.ts.map +1 -1
  11. package/dist/commands/monitor.js +51 -1
  12. package/dist/commands/monitor.js.map +1 -1
  13. package/dist/commands/ps.d.ts +3 -1
  14. package/dist/commands/ps.d.ts.map +1 -1
  15. package/dist/commands/ps.js +75 -5
  16. package/dist/commands/ps.js.map +1 -1
  17. package/dist/commands/server-show.d.ts.map +1 -1
  18. package/dist/commands/server-show.js +10 -3
  19. package/dist/commands/server-show.js.map +1 -1
  20. package/dist/commands/start.d.ts.map +1 -1
  21. package/dist/commands/start.js +14 -2
  22. package/dist/commands/start.js.map +1 -1
  23. package/dist/lib/history-manager.d.ts +46 -0
  24. package/dist/lib/history-manager.d.ts.map +1 -0
  25. package/dist/lib/history-manager.js +157 -0
  26. package/dist/lib/history-manager.js.map +1 -0
  27. package/dist/lib/metrics-aggregator.d.ts +2 -1
  28. package/dist/lib/metrics-aggregator.d.ts.map +1 -1
  29. package/dist/lib/metrics-aggregator.js +15 -4
  30. package/dist/lib/metrics-aggregator.js.map +1 -1
  31. package/dist/lib/system-collector.d.ts +9 -4
  32. package/dist/lib/system-collector.d.ts.map +1 -1
  33. package/dist/lib/system-collector.js +29 -28
  34. package/dist/lib/system-collector.js.map +1 -1
  35. package/dist/tui/HistoricalMonitorApp.d.ts +5 -0
  36. package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -0
  37. package/dist/tui/HistoricalMonitorApp.js +490 -0
  38. package/dist/tui/HistoricalMonitorApp.js.map +1 -0
  39. package/dist/tui/MonitorApp.d.ts.map +1 -1
  40. package/dist/tui/MonitorApp.js +84 -62
  41. package/dist/tui/MonitorApp.js.map +1 -1
  42. package/dist/tui/MultiServerMonitorApp.d.ts +1 -1
  43. package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
  44. package/dist/tui/MultiServerMonitorApp.js +293 -77
  45. package/dist/tui/MultiServerMonitorApp.js.map +1 -1
  46. package/dist/types/history-types.d.ts +30 -0
  47. package/dist/types/history-types.d.ts.map +1 -0
  48. package/dist/types/history-types.js +11 -0
  49. package/dist/types/history-types.js.map +1 -0
  50. package/dist/types/monitor-types.d.ts +1 -0
  51. package/dist/types/monitor-types.d.ts.map +1 -1
  52. package/dist/types/server-config.d.ts +1 -0
  53. package/dist/types/server-config.d.ts.map +1 -1
  54. package/dist/types/server-config.js.map +1 -1
  55. package/dist/utils/downsample-utils.d.ts +35 -0
  56. package/dist/utils/downsample-utils.d.ts.map +1 -0
  57. package/dist/utils/downsample-utils.js +107 -0
  58. package/dist/utils/downsample-utils.js.map +1 -0
  59. package/dist/utils/file-utils.d.ts +6 -0
  60. package/dist/utils/file-utils.d.ts.map +1 -1
  61. package/dist/utils/file-utils.js +38 -0
  62. package/dist/utils/file-utils.js.map +1 -1
  63. package/dist/utils/process-utils.d.ts +19 -1
  64. package/dist/utils/process-utils.d.ts.map +1 -1
  65. package/dist/utils/process-utils.js +79 -1
  66. package/dist/utils/process-utils.js.map +1 -1
  67. package/docs/images/.gitkeep +1 -0
  68. package/package.json +3 -1
  69. package/src/cli.ts +9 -6
  70. package/src/commands/create.ts +14 -4
  71. package/src/commands/monitor.ts +21 -1
  72. package/src/commands/ps.ts +88 -5
  73. package/src/commands/server-show.ts +10 -3
  74. package/src/commands/start.ts +15 -2
  75. package/src/lib/history-manager.ts +172 -0
  76. package/src/lib/metrics-aggregator.ts +18 -5
  77. package/src/lib/system-collector.ts +31 -28
  78. package/src/tui/HistoricalMonitorApp.ts +548 -0
  79. package/src/tui/MonitorApp.ts +89 -64
  80. package/src/tui/MultiServerMonitorApp.ts +348 -103
  81. package/src/types/history-types.ts +39 -0
  82. package/src/types/monitor-types.ts +1 -0
  83. package/src/types/server-config.ts +1 -0
  84. package/src/utils/downsample-utils.ts +128 -0
  85. package/src/utils/file-utils.ts +40 -0
  86. package/src/utils/process-utils.ts +85 -1
  87. package/test-load.sh +100 -0
  88. package/dist/tui/components/ErrorState.d.ts +0 -8
  89. package/dist/tui/components/ErrorState.d.ts.map +0 -1
  90. package/dist/tui/components/ErrorState.js +0 -22
  91. package/dist/tui/components/ErrorState.js.map +0 -1
  92. package/dist/tui/components/LoadingState.d.ts +0 -8
  93. package/dist/tui/components/LoadingState.d.ts.map +0 -1
  94. package/dist/tui/components/LoadingState.js +0 -21
  95. package/dist/tui/components/LoadingState.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-types.d.ts","sourceRoot":"","sources":["../../src/types/history-types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAE7C,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIxD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,UAAU,EAAwB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ // Historical monitoring data types
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TIME_WINDOWS = exports.TIME_WINDOW_HOURS = void 0;
5
+ exports.TIME_WINDOW_HOURS = {
6
+ '1h': 1,
7
+ '6h': 6,
8
+ '24h': 24,
9
+ };
10
+ exports.TIME_WINDOWS = ['1h', '6h', '24h'];
11
+ //# sourceMappingURL=history-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-types.js","sourceRoot":"","sources":["../../src/types/history-types.ts"],"names":[],"mappings":";AAAA,mCAAmC;;;AAgCtB,QAAA,iBAAiB,GAA+B;IAC3D,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;CACV,CAAC;AAEW,QAAA,YAAY,GAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC"}
@@ -93,6 +93,7 @@ export interface ServerMetrics {
93
93
  avgLatency?: number;
94
94
  cacheHitRate?: number;
95
95
  processMemory?: number;
96
+ processCpuUsage?: number;
96
97
  timestamp: number;
97
98
  stale: boolean;
98
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-types.d.ts","sourceRoot":"","sources":["../../src/types/monitor-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor-types.d.ts","sourceRoot":"","sources":["../../src/types/monitor-types.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export interface ServerConfig {
17
17
  createdAt: string;
18
18
  lastStarted?: string;
19
19
  lastStopped?: string;
20
+ metalMemoryMB?: number;
20
21
  plistPath: string;
21
22
  label: string;
22
23
  stdoutPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/types/server-config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAGvB,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,MAAM,CAAC;IAGd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM3D"}
1
+ {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/types/server-config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAGvB,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;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IAGd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/types/server-config.ts"],"names":[],"mappings":";;AAsCA,8CAMC;AAVD;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,OAAO,SAAS;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAW,yBAAyB;SAC3D,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAI,wCAAwC;SAC1E,WAAW,EAAE,CAAsB,YAAY;SAC/C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAU,yBAAyB;AAChE,CAAC"}
1
+ {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/types/server-config.ts"],"names":[],"mappings":";;AAuCA,8CAMC;AAVD;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,OAAO,SAAS;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAW,yBAAyB;SAC3D,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAI,wCAAwC;SAC1E,WAAW,EAAE,CAAsB,YAAY;SAC/C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAU,yBAAyB;AAChE,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Downsampling utilities for time-series chart data
3
+ * Uses time-aligned buckets to ensure stable charts as new data arrives
4
+ */
5
+ export interface TimeSeriesPoint {
6
+ timestamp: number;
7
+ value: number;
8
+ }
9
+ /**
10
+ * Downsample using time-aligned bucket max - preserves peaks.
11
+ * Best for: GPU/CPU usage, token speeds where peaks matter.
12
+ */
13
+ export declare function downsampleMaxTime(data: TimeSeriesPoint[], targetPoints: number): number[];
14
+ /**
15
+ * Downsample using time-aligned bucket mean - preserves average trends.
16
+ * Best for: Memory usage where average is meaningful.
17
+ */
18
+ export declare function downsampleMeanTime(data: TimeSeriesPoint[], targetPoints: number): number[];
19
+ /**
20
+ * Calculate downsampling ratio as a display string.
21
+ */
22
+ export declare function getDownsampleRatio(originalCount: number, targetCount: number): string;
23
+ /**
24
+ * Downsample with full hour coverage using max aggregation.
25
+ * Creates buckets for the entire hour (60 minutes), filling gaps with 0.
26
+ * Best for: Hour view where we want to show the full time range.
27
+ */
28
+ export declare function downsampleMaxTimeWithFullHour(data: TimeSeriesPoint[], targetPoints: number): number[];
29
+ /**
30
+ * Downsample with full hour coverage using mean aggregation.
31
+ * Creates buckets for the entire hour (60 minutes), filling gaps with 0.
32
+ * Best for: Hour view where we want to show the full time range.
33
+ */
34
+ export declare function downsampleMeanTimeWithFullHour(data: TimeSeriesPoint[], targetPoints: number): number[];
35
+ //# sourceMappingURL=downsample-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downsample-utils.d.ts","sourceRoot":"","sources":["../../src/utils/downsample-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAkDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAWzF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAW1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAIrF;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrG;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAOtG"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * Downsampling utilities for time-series chart data
4
+ * Uses time-aligned buckets to ensure stable charts as new data arrives
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.downsampleMaxTime = downsampleMaxTime;
8
+ exports.downsampleMeanTime = downsampleMeanTime;
9
+ exports.getDownsampleRatio = getDownsampleRatio;
10
+ exports.downsampleMaxTimeWithFullHour = downsampleMaxTimeWithFullHour;
11
+ exports.downsampleMeanTimeWithFullHour = downsampleMeanTimeWithFullHour;
12
+ const ONE_HOUR_MS = 60 * 60 * 1000;
13
+ /**
14
+ * Core bucketing logic shared by all downsampling functions.
15
+ * Uses ABSOLUTE bucket boundaries that never shift, ensuring chart stability.
16
+ */
17
+ function createTimeBuckets(data, targetPoints, startTime, endTime) {
18
+ const timeRange = endTime - startTime;
19
+ const bucketDuration = Math.ceil(timeRange / targetPoints);
20
+ const alignedStart = Math.floor(startTime / bucketDuration) * bucketDuration;
21
+ const buckets = Array.from({ length: targetPoints }, () => []);
22
+ for (const point of data) {
23
+ if (point.timestamp < startTime || point.timestamp > endTime)
24
+ continue;
25
+ const bucketIndex = Math.floor((point.timestamp - alignedStart) / bucketDuration);
26
+ if (bucketIndex >= 0 && bucketIndex < targetPoints) {
27
+ buckets[bucketIndex].push(point.value);
28
+ }
29
+ }
30
+ return buckets;
31
+ }
32
+ /**
33
+ * Aggregate bucket values using the specified method.
34
+ */
35
+ function aggregateBuckets(buckets, method) {
36
+ return buckets.map(bucket => {
37
+ const validValues = method === 'max'
38
+ ? bucket.filter(v => !isNaN(v) && v > 0)
39
+ : bucket.filter(v => !isNaN(v) && isFinite(v));
40
+ if (validValues.length === 0)
41
+ return 0;
42
+ if (method === 'max') {
43
+ return Math.max(...validValues);
44
+ }
45
+ return validValues.reduce((sum, v) => sum + v, 0) / validValues.length;
46
+ });
47
+ }
48
+ /**
49
+ * Downsample using time-aligned bucket max - preserves peaks.
50
+ * Best for: GPU/CPU usage, token speeds where peaks matter.
51
+ */
52
+ function downsampleMaxTime(data, targetPoints) {
53
+ if (data.length === 0)
54
+ return [];
55
+ if (data.length <= targetPoints)
56
+ return data.map(d => d.value);
57
+ const buckets = createTimeBuckets(data, targetPoints, data[0].timestamp, data[data.length - 1].timestamp);
58
+ return aggregateBuckets(buckets, 'max');
59
+ }
60
+ /**
61
+ * Downsample using time-aligned bucket mean - preserves average trends.
62
+ * Best for: Memory usage where average is meaningful.
63
+ */
64
+ function downsampleMeanTime(data, targetPoints) {
65
+ if (data.length === 0)
66
+ return [];
67
+ if (data.length <= targetPoints)
68
+ return data.map(d => d.value);
69
+ const buckets = createTimeBuckets(data, targetPoints, data[0].timestamp, data[data.length - 1].timestamp);
70
+ return aggregateBuckets(buckets, 'mean');
71
+ }
72
+ /**
73
+ * Calculate downsampling ratio as a display string.
74
+ */
75
+ function getDownsampleRatio(originalCount, targetCount) {
76
+ if (originalCount <= targetCount)
77
+ return '1:1';
78
+ const ratio = Math.round(originalCount / targetCount);
79
+ return `${ratio}:1`;
80
+ }
81
+ /**
82
+ * Downsample with full hour coverage using max aggregation.
83
+ * Creates buckets for the entire hour (60 minutes), filling gaps with 0.
84
+ * Best for: Hour view where we want to show the full time range.
85
+ */
86
+ function downsampleMaxTimeWithFullHour(data, targetPoints) {
87
+ if (data.length === 0)
88
+ return Array(targetPoints).fill(0);
89
+ const now = Date.now();
90
+ const oneHourAgo = now - ONE_HOUR_MS;
91
+ const buckets = createTimeBuckets(data, targetPoints, oneHourAgo, now);
92
+ return aggregateBuckets(buckets, 'max');
93
+ }
94
+ /**
95
+ * Downsample with full hour coverage using mean aggregation.
96
+ * Creates buckets for the entire hour (60 minutes), filling gaps with 0.
97
+ * Best for: Hour view where we want to show the full time range.
98
+ */
99
+ function downsampleMeanTimeWithFullHour(data, targetPoints) {
100
+ if (data.length === 0)
101
+ return Array(targetPoints).fill(0);
102
+ const now = Date.now();
103
+ const oneHourAgo = now - ONE_HOUR_MS;
104
+ const buckets = createTimeBuckets(data, targetPoints, oneHourAgo, now);
105
+ return aggregateBuckets(buckets, 'mean');
106
+ }
107
+ //# sourceMappingURL=downsample-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downsample-utils.js","sourceRoot":"","sources":["../../src/utils/downsample-utils.ts"],"names":[],"mappings":"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"}
@@ -46,4 +46,10 @@ export declare function getLaunchAgentsDir(): string;
46
46
  * Expand tilde (~) in path to home directory
47
47
  */
48
48
  export declare function expandHome(filePath: string): string;
49
+ /**
50
+ * Parse Metal (GPU) memory allocation from llama-server stderr logs
51
+ * Looks for line: "load_tensors: Metal_Mapped model buffer size = 11120.23 MiB"
52
+ * Returns memory in MB, or null if not found
53
+ */
54
+ export declare function parseMetalMemoryFromLog(stderrPath: string): Promise<number | null>;
49
55
  //# sourceMappingURL=file-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKnD"}
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiCxF"}
@@ -45,6 +45,7 @@ exports.getGlobalConfigPath = getGlobalConfigPath;
45
45
  exports.getModelsDir = getModelsDir;
46
46
  exports.getLaunchAgentsDir = getLaunchAgentsDir;
47
47
  exports.expandHome = expandHome;
48
+ exports.parseMetalMemoryFromLog = parseMetalMemoryFromLog;
48
49
  const fs = __importStar(require("fs/promises"));
49
50
  const path = __importStar(require("path"));
50
51
  const os = __importStar(require("os"));
@@ -141,4 +142,41 @@ function expandHome(filePath) {
141
142
  }
142
143
  return filePath;
143
144
  }
145
+ /**
146
+ * Parse Metal (GPU) memory allocation from llama-server stderr logs
147
+ * Looks for line: "load_tensors: Metal_Mapped model buffer size = 11120.23 MiB"
148
+ * Returns memory in MB, or null if not found
149
+ */
150
+ async function parseMetalMemoryFromLog(stderrPath) {
151
+ try {
152
+ // Check if log file exists
153
+ if (!(await fileExists(stderrPath))) {
154
+ return null;
155
+ }
156
+ // Open file for reading
157
+ const fileHandle = await fs.open(stderrPath, 'r');
158
+ try {
159
+ // Read first 256KB (Metal allocation happens early during model loading)
160
+ const buffer = Buffer.alloc(256 * 1024);
161
+ const { bytesRead } = await fileHandle.read(buffer, 0, buffer.length, 0);
162
+ const content = buffer.toString('utf-8', 0, bytesRead);
163
+ const lines = content.split('\n');
164
+ // Look for Metal_Mapped buffer size
165
+ for (const line of lines) {
166
+ const match = line.match(/Metal_Mapped model buffer size\s*=\s*([\d.]+)\s*MiB/);
167
+ if (match) {
168
+ const sizeInMB = parseFloat(match[1]);
169
+ return isNaN(sizeInMB) ? null : sizeInMB;
170
+ }
171
+ }
172
+ return null;
173
+ }
174
+ finally {
175
+ await fileHandle.close();
176
+ }
177
+ }
178
+ catch {
179
+ return null;
180
+ }
181
+ }
144
182
  //# sourceMappingURL=file-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
@@ -38,11 +38,29 @@ export declare function spawnAndReadOneLine(command: string, args: string[], tim
38
38
  export declare function getBatchProcessMemory(pids: number[]): Promise<Map<number, number | null>>;
39
39
  /**
40
40
  * Get memory usage for a single process in bytes
41
- * Uses 'top' on macOS which includes GPU/Metal memory (more accurate for llama-server)
41
+ * Uses 'top' on macOS which reports CPU memory only (NOT GPU/Metal memory)
42
42
  * Returns null if process not found or error occurs
43
43
  * Caches results for 3 seconds to prevent spawning too many top processes
44
44
  *
45
+ * Note: For llama-server processes with GPU offloading, use ServerConfig.metalMemoryMB
46
+ * to get GPU memory allocation (parsed from logs during server startup)
47
+ *
45
48
  * Note: For multiple PIDs, use getBatchProcessMemory() instead - much more efficient
46
49
  */
47
50
  export declare function getProcessMemory(pid: number): Promise<number | null>;
51
+ /**
52
+ * Batch get CPU usage for multiple processes in one ps call
53
+ * Much more efficient than calling getProcessCpu() multiple times
54
+ * Returns Map<pid, percentage> for all requested PIDs
55
+ */
56
+ export declare function getBatchProcessCpu(pids: number[]): Promise<Map<number, number | null>>;
57
+ /**
58
+ * Get CPU usage for a single process as percentage (0-100+)
59
+ * Uses 'ps -o %cpu' on macOS
60
+ * Returns null if process not found or error occurs
61
+ * Caches results for 3 seconds to prevent spawning too many ps processes
62
+ *
63
+ * Note: For multiple PIDs, use getBatchProcessCpu() instead - much more efficient
64
+ */
65
+ export declare function getProcessCpu(pid: number): Promise<number | null>;
48
66
  //# sourceMappingURL=process-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../../src/utils/process-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAS,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,SAAS,2BAAkB,CAAC;AAEzC;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAMlG;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqExB;AAOD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAmE/F;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG1E"}
1
+ {"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../../src/utils/process-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAS,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,SAAS,2BAAkB,CAAC;AAEzC;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAMlG;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqExB;AAOD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAmE/F;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG1E;AAOD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAwD5F;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGvE"}
@@ -9,6 +9,8 @@ exports.isPortInUse = isPortInUse;
9
9
  exports.spawnAndReadOneLine = spawnAndReadOneLine;
10
10
  exports.getBatchProcessMemory = getBatchProcessMemory;
11
11
  exports.getProcessMemory = getProcessMemory;
12
+ exports.getBatchProcessCpu = getBatchProcessCpu;
13
+ exports.getProcessCpu = getProcessCpu;
12
14
  const child_process_1 = require("child_process");
13
15
  const util_1 = require("util");
14
16
  exports.execAsync = (0, util_1.promisify)(child_process_1.exec);
@@ -205,14 +207,90 @@ async function getBatchProcessMemory(pids) {
205
207
  }
206
208
  /**
207
209
  * Get memory usage for a single process in bytes
208
- * Uses 'top' on macOS which includes GPU/Metal memory (more accurate for llama-server)
210
+ * Uses 'top' on macOS which reports CPU memory only (NOT GPU/Metal memory)
209
211
  * Returns null if process not found or error occurs
210
212
  * Caches results for 3 seconds to prevent spawning too many top processes
211
213
  *
214
+ * Note: For llama-server processes with GPU offloading, use ServerConfig.metalMemoryMB
215
+ * to get GPU memory allocation (parsed from logs during server startup)
216
+ *
212
217
  * Note: For multiple PIDs, use getBatchProcessMemory() instead - much more efficient
213
218
  */
214
219
  async function getProcessMemory(pid) {
215
220
  const result = await getBatchProcessMemory([pid]);
216
221
  return result.get(pid) ?? null;
217
222
  }
223
+ // Process CPU cache to prevent spawning too many 'ps' processes
224
+ // Cache per PID with 3-second TTL
225
+ const processCpuCache = new Map();
226
+ const PROCESS_CPU_CACHE_TTL = 3000; // 3 seconds
227
+ /**
228
+ * Batch get CPU usage for multiple processes in one ps call
229
+ * Much more efficient than calling getProcessCpu() multiple times
230
+ * Returns Map<pid, percentage> for all requested PIDs
231
+ */
232
+ async function getBatchProcessCpu(pids) {
233
+ const result = new Map();
234
+ const now = Date.now();
235
+ // Check cache and collect PIDs that need fetching
236
+ const pidsToFetch = [];
237
+ for (const pid of pids) {
238
+ const cached = processCpuCache.get(pid);
239
+ if (cached && (now - cached.timestamp) < PROCESS_CPU_CACHE_TTL) {
240
+ result.set(pid, cached.value);
241
+ }
242
+ else {
243
+ pidsToFetch.push(pid);
244
+ }
245
+ }
246
+ // If all PIDs were cached, return early
247
+ if (pidsToFetch.length === 0) {
248
+ return result;
249
+ }
250
+ try {
251
+ // Build ps command with all PIDs: ps -p X,Y,Z -o pid=,%cpu=
252
+ const pidList = pidsToFetch.join(',');
253
+ const output = await execCommand(`ps -p ${pidList} -o pid=,%cpu= 2>/dev/null`);
254
+ // Parse output: each line is "PID %CPU" (e.g., "1438 45.2")
255
+ const lines = output.split('\n');
256
+ for (const line of lines) {
257
+ const match = line.trim().match(/^(\d+)\s+([\d.]+)\s*$/);
258
+ if (!match)
259
+ continue;
260
+ const pid = parseInt(match[1], 10);
261
+ const cpuPercent = parseFloat(match[2]);
262
+ // Cache and store result
263
+ processCpuCache.set(pid, { value: cpuPercent, timestamp: now });
264
+ result.set(pid, cpuPercent);
265
+ }
266
+ // For any PIDs that weren't in the output, cache null (process not running)
267
+ for (const pid of pidsToFetch) {
268
+ if (!result.has(pid)) {
269
+ processCpuCache.set(pid, { value: null, timestamp: now });
270
+ result.set(pid, null);
271
+ }
272
+ }
273
+ return result;
274
+ }
275
+ catch {
276
+ // On error, cache null for all requested PIDs
277
+ for (const pid of pidsToFetch) {
278
+ processCpuCache.set(pid, { value: null, timestamp: now });
279
+ result.set(pid, null);
280
+ }
281
+ return result;
282
+ }
283
+ }
284
+ /**
285
+ * Get CPU usage for a single process as percentage (0-100+)
286
+ * Uses 'ps -o %cpu' on macOS
287
+ * Returns null if process not found or error occurs
288
+ * Caches results for 3 seconds to prevent spawning too many ps processes
289
+ *
290
+ * Note: For multiple PIDs, use getBatchProcessCpu() instead - much more efficient
291
+ */
292
+ async function getProcessCpu(pid) {
293
+ const result = await getBatchProcessCpu([pid]);
294
+ return result.get(pid) ?? null;
295
+ }
218
296
  //# sourceMappingURL=process-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-utils.js","sourceRoot":"","sources":["../../src/utils/process-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-utils.js","sourceRoot":"","sources":["../../src/utils/process-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ # Screenshots directory
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appkit/llamacpp-cli",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "CLI tool to manage local llama.cpp servers on macOS",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -40,12 +40,14 @@
40
40
  "url": "https://github.com/appkitstudio/llamacpp-cli/issues"
41
41
  },
42
42
  "dependencies": {
43
+ "asciichart": "^1.5.25",
43
44
  "blessed": "^0.1.81",
44
45
  "chalk": "^4.1.2",
45
46
  "cli-table3": "^0.6.5",
46
47
  "commander": "^13.0.0"
47
48
  },
48
49
  "devDependencies": {
50
+ "@types/asciichart": "^1.5.8",
49
51
  "@types/blessed": "^0.1.27",
50
52
  "@types/node": "^20.12.7",
51
53
  "commit-and-tag-version": "^12.6.1",
package/src/cli.ts CHANGED
@@ -42,11 +42,12 @@ program
42
42
 
43
43
  // List running servers
44
44
  program
45
- .command('ps')
46
- .description('List all servers with status')
47
- .action(async () => {
45
+ .command('ps [identifier]')
46
+ .description('Interactive server monitoring dashboard')
47
+ .option('--table', 'Show static table instead of TUI (for scripting)')
48
+ .action(async (identifier?: string, options?: { table?: boolean }) => {
48
49
  try {
49
- await psCommand();
50
+ await psCommand(identifier, options);
50
51
  } catch (error) {
51
52
  console.error(chalk.red('❌ Error:'), (error as Error).message);
52
53
  process.exit(1);
@@ -269,12 +270,14 @@ server
269
270
  }
270
271
  });
271
272
 
272
- // Monitor server
273
+ // Monitor server (deprecated - redirects to ps)
273
274
  server
274
275
  .command('monitor [identifier]')
275
- .description('Monitor server with real-time metrics TUI')
276
+ .description('Monitor server with real-time metrics TUI (deprecated: use "llamacpp ps" instead)')
276
277
  .action(async (identifier?: string) => {
277
278
  try {
279
+ console.log(chalk.yellow('⚠️ The "monitor" command is deprecated and will be removed in a future version.'));
280
+ console.log(chalk.dim(' Please use "llamacpp ps" instead for the same functionality.\n'));
278
281
  await monitorCommand(identifier);
279
282
  } catch (error) {
280
283
  console.error(chalk.red('❌ Error:'), (error as Error).message);
@@ -9,7 +9,7 @@ import { launchctlManager } from '../lib/launchctl-manager';
9
9
  import { statusChecker } from '../lib/status-checker';
10
10
  import { commandExists } from '../utils/process-utils';
11
11
  import { formatBytes } from '../utils/format-utils';
12
- import { ensureDir } from '../utils/file-utils';
12
+ import { ensureDir, parseMetalMemoryFromLog } from '../utils/file-utils';
13
13
  import { ensureModelsDirectory } from '../lib/models-dir-setup';
14
14
 
15
15
  interface CreateOptions {
@@ -159,12 +159,22 @@ export async function createCommand(model: string, options: CreateOptions): Prom
159
159
  }
160
160
 
161
161
  // 12. Update config with running status
162
- const updatedConfig = await statusChecker.updateServerStatus(config);
162
+ let updatedConfig = await statusChecker.updateServerStatus(config);
163
+
164
+ // 13. Parse Metal (GPU) memory allocation from logs
165
+ // Wait a few seconds for model to start loading (large models take time)
166
+ console.log(chalk.dim('Detecting Metal (GPU) memory allocation...'));
167
+ await new Promise(resolve => setTimeout(resolve, 8000)); // 8 second delay
168
+ const metalMemoryMB = await parseMetalMemoryFromLog(updatedConfig.stderrPath);
169
+ if (metalMemoryMB) {
170
+ updatedConfig = { ...updatedConfig, metalMemoryMB };
171
+ console.log(chalk.dim(`Metal memory: ${metalMemoryMB.toFixed(0)} MB`));
172
+ }
163
173
 
164
- // 13. Save server config
174
+ // 14. Save server config
165
175
  await stateManager.saveServerConfig(updatedConfig);
166
176
 
167
- // 14. Display success message
177
+ // 15. Display success message
168
178
  console.log();
169
179
  console.log(chalk.green('✅ Server created and started successfully!'));
170
180
  console.log();
@@ -36,6 +36,12 @@ export async function monitorCommand(identifier?: string): Promise<void> {
36
36
  );
37
37
  }
38
38
 
39
+ // Update server status to reflect actual launchctl state
40
+ const { statusChecker } = await import('../lib/status-checker.js');
41
+ const status = await statusChecker.checkServer(server);
42
+ server.status = status.isRunning ? 'running' : 'stopped';
43
+ server.pid = status.pid || undefined;
44
+
39
45
  // Check if server is running
40
46
  if (server.status !== 'running') {
41
47
  screen.destroy();
@@ -51,6 +57,12 @@ export async function monitorCommand(identifier?: string): Promise<void> {
51
57
  // Only one server - single server mode
52
58
  const server = allServers[0];
53
59
 
60
+ // Update server status to reflect actual launchctl state
61
+ const { statusChecker } = await import('../lib/status-checker.js');
62
+ const status = await statusChecker.checkServer(server);
63
+ server.status = status.isRunning ? 'running' : 'stopped';
64
+ server.pid = status.pid || undefined;
65
+
54
66
  // Check if server is running
55
67
  if (server.status !== 'running') {
56
68
  screen.destroy();
@@ -64,6 +76,14 @@ export async function monitorCommand(identifier?: string): Promise<void> {
64
76
  await createMonitorUI(screen, server);
65
77
  } else {
66
78
  // Multiple servers - multi-server mode
79
+ // Update all server statuses to reflect actual launchctl state
80
+ const { statusChecker } = await import('../lib/status-checker.js');
81
+ for (const server of allServers) {
82
+ const status = await statusChecker.checkServer(server);
83
+ server.status = status.isRunning ? 'running' : 'stopped';
84
+ server.pid = status.pid || undefined;
85
+ }
86
+
67
87
  // Filter to only running servers for monitoring
68
88
  const runningServers = allServers.filter(s => s.status === 'running');
69
89
 
@@ -78,7 +98,7 @@ export async function monitorCommand(identifier?: string): Promise<void> {
78
98
  );
79
99
  }
80
100
 
81
- // Launch multi-server TUI
101
+ // Launch multi-server TUI (pass all servers so we can see stopped ones too)
82
102
  await createMultiServerMonitorUI(screen, allServers);
83
103
  }
84
104