@appkit/llamacpp-cli 1.5.0 → 1.7.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.
- package/CHANGELOG.md +20 -0
- package/MONITORING-ACCURACY-FIX.md +199 -0
- package/PER-PROCESS-METRICS.md +190 -0
- package/README.md +124 -9
- package/dist/cli.js +32 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +15 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +12 -4
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.js +12 -10
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/logs-all.d.ts +9 -0
- package/dist/commands/logs-all.d.ts.map +1 -0
- package/dist/commands/logs-all.js +209 -0
- package/dist/commands/logs-all.js.map +1 -0
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +108 -2
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +51 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/ps.d.ts +3 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +75 -5
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/rm.d.ts.map +1 -1
- package/dist/commands/rm.js +5 -12
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/server-show.d.ts.map +1 -1
- package/dist/commands/server-show.js +30 -3
- package/dist/commands/server-show.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +34 -7
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.js +3 -3
- package/dist/commands/stop.js.map +1 -1
- package/dist/lib/history-manager.d.ts +46 -0
- package/dist/lib/history-manager.d.ts.map +1 -0
- package/dist/lib/history-manager.js +157 -0
- package/dist/lib/history-manager.js.map +1 -0
- package/dist/lib/metrics-aggregator.d.ts +2 -1
- package/dist/lib/metrics-aggregator.d.ts.map +1 -1
- package/dist/lib/metrics-aggregator.js +15 -4
- package/dist/lib/metrics-aggregator.js.map +1 -1
- package/dist/lib/system-collector.d.ts +9 -4
- package/dist/lib/system-collector.d.ts.map +1 -1
- package/dist/lib/system-collector.js +29 -28
- package/dist/lib/system-collector.js.map +1 -1
- package/dist/tui/HistoricalMonitorApp.d.ts +5 -0
- package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -0
- package/dist/tui/HistoricalMonitorApp.js +490 -0
- package/dist/tui/HistoricalMonitorApp.js.map +1 -0
- package/dist/tui/MonitorApp.d.ts.map +1 -1
- package/dist/tui/MonitorApp.js +84 -62
- package/dist/tui/MonitorApp.js.map +1 -1
- package/dist/tui/MultiServerMonitorApp.d.ts +1 -1
- package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
- package/dist/tui/MultiServerMonitorApp.js +293 -77
- package/dist/tui/MultiServerMonitorApp.js.map +1 -1
- package/dist/types/history-types.d.ts +30 -0
- package/dist/types/history-types.d.ts.map +1 -0
- package/dist/types/history-types.js +11 -0
- package/dist/types/history-types.js.map +1 -0
- package/dist/types/monitor-types.d.ts +1 -0
- package/dist/types/monitor-types.d.ts.map +1 -1
- package/dist/types/server-config.d.ts +1 -0
- package/dist/types/server-config.d.ts.map +1 -1
- package/dist/types/server-config.js.map +1 -1
- package/dist/utils/downsample-utils.d.ts +35 -0
- package/dist/utils/downsample-utils.d.ts.map +1 -0
- package/dist/utils/downsample-utils.js +107 -0
- package/dist/utils/downsample-utils.js.map +1 -0
- package/dist/utils/file-utils.d.ts +6 -0
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +38 -0
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/log-utils.d.ts +43 -0
- package/dist/utils/log-utils.d.ts.map +1 -0
- package/dist/utils/log-utils.js +190 -0
- package/dist/utils/log-utils.js.map +1 -0
- package/dist/utils/process-utils.d.ts +19 -1
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +79 -1
- package/dist/utils/process-utils.js.map +1 -1
- package/docs/images/.gitkeep +1 -0
- package/package.json +3 -1
- package/src/cli.ts +32 -7
- package/src/commands/config.ts +15 -1
- package/src/commands/create.ts +14 -5
- package/src/commands/delete.ts +10 -10
- package/src/commands/logs-all.ts +251 -0
- package/src/commands/logs.ts +138 -2
- package/src/commands/monitor.ts +21 -1
- package/src/commands/ps.ts +88 -5
- package/src/commands/rm.ts +5 -12
- package/src/commands/server-show.ts +35 -3
- package/src/commands/start.ts +35 -7
- package/src/commands/stop.ts +3 -3
- package/src/lib/history-manager.ts +172 -0
- package/src/lib/metrics-aggregator.ts +18 -5
- package/src/lib/system-collector.ts +31 -28
- package/src/tui/HistoricalMonitorApp.ts +548 -0
- package/src/tui/MonitorApp.ts +89 -64
- package/src/tui/MultiServerMonitorApp.ts +348 -103
- package/src/types/history-types.ts +39 -0
- package/src/types/monitor-types.ts +1 -0
- package/src/types/server-config.ts +1 -0
- package/src/utils/downsample-utils.ts +128 -0
- package/src/utils/file-utils.ts +40 -0
- package/src/utils/log-utils.ts +178 -0
- package/src/utils/process-utils.ts +85 -1
- package/test-load.sh +100 -0
- package/dist/tui/components/ErrorState.d.ts +0 -8
- package/dist/tui/components/ErrorState.d.ts.map +0 -1
- package/dist/tui/components/ErrorState.js +0 -22
- package/dist/tui/components/ErrorState.js.map +0 -1
- package/dist/tui/components/LoadingState.d.ts +0 -8
- package/dist/tui/components/LoadingState.d.ts.map +0 -1
- package/dist/tui/components/LoadingState.js +0 -21
- 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"}
|
|
@@ -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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"}
|
|
@@ -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;
|
|
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":";;
|
|
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"}
|
package/dist/utils/file-utils.js
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8BASC;AAKD,0CAIC;AAKD,0CAGC;AAKD,4BAGC;AAKD,gCAOC;AAKD,oCAEC;AAKD,sCAEC;AAKD,gCAEC;AAKD,kDAEC;AAKD,oCAEC;AAKD,gDAEC;AAKD,gCAKC;
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the size of a file in bytes
|
|
3
|
+
*/
|
|
4
|
+
export declare function getFileSize(filePath: string): Promise<number>;
|
|
5
|
+
/**
|
|
6
|
+
* Format bytes to human-readable size
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatFileSize(bytes: number): string;
|
|
9
|
+
/**
|
|
10
|
+
* Rotate a log file with timestamp
|
|
11
|
+
* Renames current log to <name>.YYYY-MM-DD-HH-MM-SS.<ext>
|
|
12
|
+
* Returns the new archived filename
|
|
13
|
+
*/
|
|
14
|
+
export declare function rotateLogFile(logPath: string): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Clear (truncate) a log file to zero bytes
|
|
17
|
+
*/
|
|
18
|
+
export declare function clearLogFile(logPath: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Auto-rotate log files if they exceed threshold
|
|
21
|
+
* Returns true if rotation occurred, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
export declare function autoRotateIfNeeded(stdoutPath: string, stderrPath: string, thresholdMB?: number): Promise<{
|
|
24
|
+
rotated: boolean;
|
|
25
|
+
files: string[];
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Get information about archived log files for a server
|
|
29
|
+
* Returns count and total size of timestamped archived logs
|
|
30
|
+
*/
|
|
31
|
+
export declare function getArchivedLogInfo(serverId: string): Promise<{
|
|
32
|
+
count: number;
|
|
33
|
+
totalSize: number;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete all archived log files for a server
|
|
37
|
+
* Returns count and total size of deleted files
|
|
38
|
+
*/
|
|
39
|
+
export declare function deleteArchivedLogs(serverId: string): Promise<{
|
|
40
|
+
count: number;
|
|
41
|
+
totalSize: number;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=log-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-utils.d.ts","sourceRoot":"","sources":["../../src/utils/log-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BpE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAY,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0BhD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAwBD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAyBD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getFileSize = getFileSize;
|
|
37
|
+
exports.formatFileSize = formatFileSize;
|
|
38
|
+
exports.rotateLogFile = rotateLogFile;
|
|
39
|
+
exports.clearLogFile = clearLogFile;
|
|
40
|
+
exports.autoRotateIfNeeded = autoRotateIfNeeded;
|
|
41
|
+
exports.getArchivedLogInfo = getArchivedLogInfo;
|
|
42
|
+
exports.deleteArchivedLogs = deleteArchivedLogs;
|
|
43
|
+
const fs = __importStar(require("fs/promises"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const file_utils_1 = require("./file-utils");
|
|
46
|
+
/**
|
|
47
|
+
* Get the size of a file in bytes
|
|
48
|
+
*/
|
|
49
|
+
async function getFileSize(filePath) {
|
|
50
|
+
try {
|
|
51
|
+
const stats = await fs.stat(filePath);
|
|
52
|
+
return stats.size;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format bytes to human-readable size
|
|
60
|
+
*/
|
|
61
|
+
function formatFileSize(bytes) {
|
|
62
|
+
if (bytes === 0)
|
|
63
|
+
return '0 B';
|
|
64
|
+
const k = 1024;
|
|
65
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
66
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
67
|
+
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Rotate a log file with timestamp
|
|
71
|
+
* Renames current log to <name>.YYYY-MM-DD-HH-MM-SS.<ext>
|
|
72
|
+
* Returns the new archived filename
|
|
73
|
+
*/
|
|
74
|
+
async function rotateLogFile(logPath) {
|
|
75
|
+
if (!(await (0, file_utils_1.fileExists)(logPath))) {
|
|
76
|
+
throw new Error(`Log file does not exist: ${logPath}`);
|
|
77
|
+
}
|
|
78
|
+
// Get file size before rotation
|
|
79
|
+
const size = await getFileSize(logPath);
|
|
80
|
+
if (size === 0) {
|
|
81
|
+
throw new Error('Log file is empty, nothing to rotate');
|
|
82
|
+
}
|
|
83
|
+
// Generate timestamp
|
|
84
|
+
const timestamp = new Date()
|
|
85
|
+
.toISOString()
|
|
86
|
+
.replace(/T/, '-')
|
|
87
|
+
.replace(/:/g, '-')
|
|
88
|
+
.replace(/\..+/, '');
|
|
89
|
+
// Parse path components
|
|
90
|
+
const dir = path.dirname(logPath);
|
|
91
|
+
const ext = path.extname(logPath);
|
|
92
|
+
const basename = path.basename(logPath, ext);
|
|
93
|
+
// New archived filename
|
|
94
|
+
const archivedPath = path.join(dir, `${basename}.${timestamp}${ext}`);
|
|
95
|
+
// Rename current log to archived version
|
|
96
|
+
await fs.rename(logPath, archivedPath);
|
|
97
|
+
return archivedPath;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Clear (truncate) a log file to zero bytes
|
|
101
|
+
*/
|
|
102
|
+
async function clearLogFile(logPath) {
|
|
103
|
+
if (!(await (0, file_utils_1.fileExists)(logPath))) {
|
|
104
|
+
throw new Error(`Log file does not exist: ${logPath}`);
|
|
105
|
+
}
|
|
106
|
+
// Truncate file to 0 bytes
|
|
107
|
+
await fs.truncate(logPath, 0);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Auto-rotate log files if they exceed threshold
|
|
111
|
+
* Returns true if rotation occurred, false otherwise
|
|
112
|
+
*/
|
|
113
|
+
async function autoRotateIfNeeded(stdoutPath, stderrPath, thresholdMB = 100) {
|
|
114
|
+
const thresholdBytes = thresholdMB * 1024 * 1024;
|
|
115
|
+
const rotatedFiles = [];
|
|
116
|
+
// Check stdout
|
|
117
|
+
if (await (0, file_utils_1.fileExists)(stdoutPath)) {
|
|
118
|
+
const stdoutSize = await getFileSize(stdoutPath);
|
|
119
|
+
if (stdoutSize > thresholdBytes) {
|
|
120
|
+
const archived = await rotateLogFile(stdoutPath);
|
|
121
|
+
rotatedFiles.push(archived);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check stderr
|
|
125
|
+
if (await (0, file_utils_1.fileExists)(stderrPath)) {
|
|
126
|
+
const stderrSize = await getFileSize(stderrPath);
|
|
127
|
+
if (stderrSize > thresholdBytes) {
|
|
128
|
+
const archived = await rotateLogFile(stderrPath);
|
|
129
|
+
rotatedFiles.push(archived);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
rotated: rotatedFiles.length > 0,
|
|
134
|
+
files: rotatedFiles,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get information about archived log files for a server
|
|
139
|
+
* Returns count and total size of timestamped archived logs
|
|
140
|
+
*/
|
|
141
|
+
async function getArchivedLogInfo(serverId) {
|
|
142
|
+
const logsDir = (0, file_utils_1.getLogsDir)();
|
|
143
|
+
let count = 0;
|
|
144
|
+
let totalSize = 0;
|
|
145
|
+
try {
|
|
146
|
+
const files = await fs.readdir(logsDir);
|
|
147
|
+
// Pattern matches: server-id.YYYY-MM-DD-HH-MM-SS.{stdout,stderr}
|
|
148
|
+
const pattern = new RegExp(`^${serverId}\\.(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2})\\.(stdout|stderr)$`);
|
|
149
|
+
for (const file of files) {
|
|
150
|
+
if (pattern.test(file)) {
|
|
151
|
+
count++;
|
|
152
|
+
const filePath = path.join(logsDir, file);
|
|
153
|
+
totalSize += await getFileSize(filePath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Directory doesn't exist or can't be read
|
|
159
|
+
return { count: 0, totalSize: 0 };
|
|
160
|
+
}
|
|
161
|
+
return { count, totalSize };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Delete all archived log files for a server
|
|
165
|
+
* Returns count and total size of deleted files
|
|
166
|
+
*/
|
|
167
|
+
async function deleteArchivedLogs(serverId) {
|
|
168
|
+
const logsDir = (0, file_utils_1.getLogsDir)();
|
|
169
|
+
let count = 0;
|
|
170
|
+
let totalSize = 0;
|
|
171
|
+
try {
|
|
172
|
+
const files = await fs.readdir(logsDir);
|
|
173
|
+
// Pattern matches: server-id.YYYY-MM-DD-HH-MM-SS.{stdout,stderr}
|
|
174
|
+
const pattern = new RegExp(`^${serverId}\\.(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2})\\.(stdout|stderr)$`);
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
if (pattern.test(file)) {
|
|
177
|
+
const filePath = path.join(logsDir, file);
|
|
178
|
+
const size = await getFileSize(filePath);
|
|
179
|
+
await fs.unlink(filePath);
|
|
180
|
+
count++;
|
|
181
|
+
totalSize += size;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
throw new Error(`Failed to delete archived logs: ${error.message}`);
|
|
187
|
+
}
|
|
188
|
+
return { count, totalSize };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=log-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-utils.js","sourceRoot":"","sources":["../../src/utils/log-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,kCAOC;AAKD,wCAMC;AAOD,sCA8BC;AAKD,oCAOC;AAMD,gDA8BC;AAMD,gDA2BC;AAMD,gDA4BC;AAjLD,gDAAkC;AAClC,2CAA6B;AAC7B,6CAAsD;AAEtD;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,IAAI,CAAC,CAAC,MAAM,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,gCAAgC;IAChC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;SACzB,WAAW,EAAE;SACb,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;SACjB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEvB,wBAAwB;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE7C,wBAAwB;IACxB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IAEtE,yCAAyC;IACzC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEvC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,IAAI,CAAC,CAAC,MAAM,IAAA,uBAAU,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,UAAkB,EAClB,cAAsB,GAAG;IAEzB,MAAM,cAAc,GAAG,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,eAAe;IACf,IAAI,MAAM,IAAA,uBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;YACjD,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,MAAM,IAAA,uBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;YACjD,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC;QAChC,KAAK,EAAE,YAAY;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAIvD,MAAM,OAAO,GAAG,IAAA,uBAAU,GAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,iEAAiE;QACjE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,QAAQ,mEAAmE,CAAC,CAAC;QAE5G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,KAAK,EAAE,CAAC;gBACR,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC1C,SAAS,IAAI,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;QAC3C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAIvD,MAAM,OAAO,GAAG,IAAA,uBAAU,GAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,iEAAiE;QACjE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,QAAQ,mEAAmE,CAAC,CAAC;QAE5G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,KAAK,EAAE,CAAC;gBACR,SAAS,IAAI,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -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
|
|
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,
|
|
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"}
|