github-issue-tower-defence-management 1.107.0 → 1.108.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 +7 -0
- package/README.md +1 -1
- package/bin/adapter/entry-points/console/dashboardComposeService.js +1 -0
- package/bin/adapter/entry-points/console/dashboardComposeService.js.map +1 -1
- package/bin/adapter/entry-points/handlers/machineStatusWriter.js +2 -0
- package/bin/adapter/entry-points/handlers/machineStatusWriter.js.map +1 -1
- package/bin/adapter/repositories/ProcHostMetricsRepository.js +25 -2
- package/bin/adapter/repositories/ProcHostMetricsRepository.js.map +1 -1
- package/bin/domain/usecases/dashboard/ComposeDashboardUseCase.js +12 -6
- package/bin/domain/usecases/dashboard/ComposeDashboardUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/console/dashboardComposeService.test.ts +8 -1
- package/src/adapter/entry-points/console/dashboardComposeService.ts +1 -0
- package/src/adapter/entry-points/console/webServer.test.ts +4 -1
- package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +14 -2
- package/src/adapter/entry-points/handlers/machineStatusWriter.ts +3 -0
- package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +26 -0
- package/src/adapter/repositories/ProcHostMetricsRepository.ts +36 -0
- package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +44 -17
- package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +13 -5
- package/types/adapter/entry-points/console/dashboardComposeService.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/machineStatusWriter.d.ts +1 -0
- package/types/adapter/entry-points/handlers/machineStatusWriter.d.ts.map +1 -1
- package/types/adapter/repositories/ProcHostMetricsRepository.d.ts +10 -1
- package/types/adapter/repositories/ProcHostMetricsRepository.d.ts.map +1 -1
- package/types/domain/usecases/dashboard/ComposeDashboardUseCase.d.ts +2 -1
- package/types/domain/usecases/dashboard/ComposeDashboardUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.108.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.107.0...v1.108.0) (2026-06-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **dashboard:** add disk usage and 2-line host metrics to the CLI composer ([#1004](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1004)) ([13b1ba0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/13b1ba07577300fc88a0e51523c9778d6e9e82bf)), closes [#1002](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1002)
|
|
7
|
+
|
|
1
8
|
# [1.107.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.106.0...v1.107.0) (2026-06-26)
|
|
2
9
|
|
|
3
10
|
|
package/README.md
CHANGED
|
@@ -83,7 +83,7 @@ Options for countInTmuxByHumanSessionsPerToken:
|
|
|
83
83
|
|
|
84
84
|
The `serveWeb` sub-command starts a local HTTP server that serves the TDPM web surface — the console tabs, the dashboard, and the in-tmux-by-human session list. `serveConsole` remains available as a deprecated alias that maps to the same handler, so existing invokers keep working during rollout; new usage should prefer `serveWeb`. One running instance serves every project: the user opens a per-project URL path `/projects/{pjcode}` (or `/projects/{pjcode}/{workflow-blocker|prs|triage|unread|failed-preparation|todo-by-human}`) and the bundled UI reads the `pjcode` from its own URL path and loads that project's list data. The server serves the bundled single-page-application `index.html` at `/`, `/index.html`, and every `/projects/{pjcode}` and `/projects/{pjcode}/{tab}` app route. Every response is sent with `Cache-Control: no-store`. Any request path containing a segment that begins with a dot (for example `/.git` or `/.env`) is rejected with HTTP 404. The UI bootstrap assets (HTML and JS) are served without authentication; served `*.json` files and `/api/*` paths require an access token supplied either as the `k` query parameter (`?k=<token>`) or the `X-PV-Token` request header. The access token is read from the `consoleAccessToken` config value and never appears on the command line. When the built UI bundle directory (`ui-dist`) is absent the server still starts and serves a minimal placeholder index for `/`, `/index.html`, and the per-project app routes.
|
|
85
85
|
|
|
86
|
-
The dashboard fragment is served unauthenticated at `GET /tdpm.txt` as `text/html`. Compose mode is opt-in: when `--dashboardDataDir` is set and every required data file is present (`machine-status.json`, `token-status.json`, and a `projects/<pjcode>.json` for every code in `--dashboardProjectCodes`), the server composes the fragment at request time from those files emitted by the scheduled run — one `projects/<pjcode>.json` per project (that project's actionable status counts), `machine-status.json` (mem%, cpu%, loadavg, cycle-minutes), and `token-status.json` (per-token rate-limit utilization, reset countdown, status color, and prep/hum counts). It renders the fixed-width fragment — the host-metrics line, the project grid (header then one row per code in `--dashboardProjectCodes` order with its severity dot), a blank separator line, then one row per token sorted by soonest seven-day reset — wrapped in `<tt>…</tt><br>` with spaces encoded as ` `. Otherwise — when `--dashboardDataDir` is unset, or it is set but any required data file is missing — the server falls back to serving the static `tdpm.txt` byte-for-byte from `--dashboardDir`, exactly as before compose mode existed. The route returns HTTP 404 only when neither source is available (compose mode inactive and no static `tdpm.txt` present). Only `GET` is accepted on this path.
|
|
86
|
+
The dashboard fragment is served unauthenticated at `GET /tdpm.txt` as `text/html`. Compose mode is opt-in: when `--dashboardDataDir` is set and every required data file is present (`machine-status.json`, `token-status.json`, and a `projects/<pjcode>.json` for every code in `--dashboardProjectCodes`), the server composes the fragment at request time from those files emitted by the scheduled run — one `projects/<pjcode>.json` per project (that project's actionable status counts), `machine-status.json` (mem%, cpu%, disk%, loadavg, cycle-minutes), and `token-status.json` (per-token rate-limit utilization, reset countdown, status color, and prep/hum counts). It renders the fixed-width fragment — the two host-metrics lines (line 1 `M{mem}% C{cpu}% D{disk}% cy{cycle}`, line 2 `LA {load1} {load5} {load15}`), the project grid (header then one row per code in `--dashboardProjectCodes` order with its severity dot), a blank separator line, then one row per token sorted by soonest seven-day reset — wrapped in `<tt>…</tt><br>` with spaces encoded as ` `. Otherwise — when `--dashboardDataDir` is unset, or it is set but any required data file is missing — the server falls back to serving the static `tdpm.txt` byte-for-byte from `--dashboardDir`, exactly as before compose mode existed. The route returns HTTP 404 only when neither source is available (compose mode inactive and no static `tdpm.txt` present). Only `GET` is accepted on this path.
|
|
87
87
|
|
|
88
88
|
Behind the token gate the server exposes three groups of routes:
|
|
89
89
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardComposeService.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/dashboardComposeService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dashboardComposeService.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/dashboardComposeService.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,6 +43,7 @@ const writeMachineStatus = async (params) => {
|
|
|
43
43
|
const hostMetricsRepository = params.hostMetricsRepository ?? new ProcHostMetricsRepository_1.ProcHostMetricsRepository();
|
|
44
44
|
const memPct = hostMetricsRepository.readMemoryUsedPercent();
|
|
45
45
|
const cpuPct = await hostMetricsRepository.readCpuUsedPercent();
|
|
46
|
+
const diskPct = hostMetricsRepository.readDiskUsedPercent();
|
|
46
47
|
const load = hostMetricsRepository.readLoadAverages();
|
|
47
48
|
const cycleMinutes = allIssuesCacheDir
|
|
48
49
|
? (0, ProcHostMetricsRepository_1.cycleMinutesFromMtimes)(cacheFileMtimesDescending(allIssuesCacheDir))
|
|
@@ -50,6 +51,7 @@ const writeMachineStatus = async (params) => {
|
|
|
50
51
|
const file = {
|
|
51
52
|
memPct,
|
|
52
53
|
cpuPct,
|
|
54
|
+
diskPct,
|
|
53
55
|
load: [load.oneMinute, load.fiveMinute, load.fifteenMinute],
|
|
54
56
|
cycleMinutes,
|
|
55
57
|
capturedAt: (params.now ?? new Date()).toISOString(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machineStatusWriter.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/machineStatusWriter.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4FAGsD;
|
|
1
|
+
{"version":3,"file":"machineStatusWriter.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/machineStatusWriter.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4FAGsD;AAkBtD,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,IAAa,EAAQ,EAAE;IAChE,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,CAAC;IAClC,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,YAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,iBAAyB,EAAY,EAAE;IACxE,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,YAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;SAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAiC,EAClB,EAAE;IACjB,MAAM,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC;IACvD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,qBAAqB,GACzB,MAAM,CAAC,qBAAqB,IAAI,IAAI,qDAAyB,EAAE,CAAC;IAElE,MAAM,MAAM,GAAG,qBAAqB,CAAC,qBAAqB,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,kBAAkB,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,qBAAqB,CAAC,mBAAmB,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;IAEtD,MAAM,YAAY,GAAG,iBAAiB;QACpC,CAAC,CAAC,IAAA,kDAAsB,EAAC,yBAAyB,CAAC,iBAAiB,CAAC,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,IAAI,GAAsB;QAC9B,MAAM;QACN,MAAM;QACN,OAAO;QACP,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QAC3D,YAAY;QACZ,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;KACrD,CAAC;IAEF,eAAe,CAAC,cAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC,CAAC;AA9BW,QAAA,kBAAkB,sBA8B7B"}
|
|
@@ -33,10 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ProcHostMetricsRepository = exports.cycleMinutesFromMtimes = exports.parseLoadAverages = exports.cpuUsedPercentFromSamples = exports.parseCpuSample = exports.parseMemoryUsedPercent = void 0;
|
|
36
|
+
exports.ProcHostMetricsRepository = exports.cycleMinutesFromMtimes = exports.parseLoadAverages = exports.parseDiskUsedPercent = exports.cpuUsedPercentFromSamples = exports.parseCpuSample = exports.parseMemoryUsedPercent = void 0;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const DEFAULT_PROC_DIRECTORY = '/proc';
|
|
40
|
+
const DEFAULT_ROOT_PATH = '/';
|
|
40
41
|
const CPU_SAMPLE_INTERVAL_MS = 400;
|
|
41
42
|
const parseMemoryUsedPercent = (meminfoText) => {
|
|
42
43
|
const fields = new Map();
|
|
@@ -96,6 +97,15 @@ const cpuUsedPercentFromSamples = (first, second) => {
|
|
|
96
97
|
return Math.round((busyDelta / totalDelta) * 100);
|
|
97
98
|
};
|
|
98
99
|
exports.cpuUsedPercentFromSamples = cpuUsedPercentFromSamples;
|
|
100
|
+
const parseDiskUsedPercent = (blocks, bfree, bavail) => {
|
|
101
|
+
const total = blocks - bfree + bavail;
|
|
102
|
+
if (total <= 0) {
|
|
103
|
+
throw new Error('disk total must be positive');
|
|
104
|
+
}
|
|
105
|
+
const used = blocks - bfree;
|
|
106
|
+
return Math.round((used / total) * 100);
|
|
107
|
+
};
|
|
108
|
+
exports.parseDiskUsedPercent = parseDiskUsedPercent;
|
|
99
109
|
const parseLoadAverages = (loadavgText) => {
|
|
100
110
|
const parts = loadavgText.trim().split(/\s+/);
|
|
101
111
|
const oneMinute = Number(parts[0]);
|
|
@@ -119,9 +129,18 @@ exports.cycleMinutesFromMtimes = cycleMinutesFromMtimes;
|
|
|
119
129
|
class ProcHostMetricsRepository {
|
|
120
130
|
constructor(procDirectory = DEFAULT_PROC_DIRECTORY, sleep = (milliseconds) => new Promise((resolve) => {
|
|
121
131
|
setTimeout(resolve, milliseconds);
|
|
122
|
-
})) {
|
|
132
|
+
}), readDiskBlocks = (rootPath) => {
|
|
133
|
+
const stats = fs.statfsSync(rootPath);
|
|
134
|
+
return {
|
|
135
|
+
blocks: Number(stats.blocks),
|
|
136
|
+
bfree: Number(stats.bfree),
|
|
137
|
+
bavail: Number(stats.bavail),
|
|
138
|
+
};
|
|
139
|
+
}, rootPath = DEFAULT_ROOT_PATH) {
|
|
123
140
|
this.procDirectory = procDirectory;
|
|
124
141
|
this.sleep = sleep;
|
|
142
|
+
this.readDiskBlocks = readDiskBlocks;
|
|
143
|
+
this.rootPath = rootPath;
|
|
125
144
|
this.readMemoryUsedPercent = () => (0, exports.parseMemoryUsedPercent)(fs.readFileSync(path.join(this.procDirectory, 'meminfo'), 'utf8'));
|
|
126
145
|
this.readCpuUsedPercent = async () => {
|
|
127
146
|
const first = (0, exports.parseCpuSample)(fs.readFileSync(path.join(this.procDirectory, 'stat'), 'utf8'));
|
|
@@ -130,6 +149,10 @@ class ProcHostMetricsRepository {
|
|
|
130
149
|
return (0, exports.cpuUsedPercentFromSamples)(first, second);
|
|
131
150
|
};
|
|
132
151
|
this.readLoadAverages = () => (0, exports.parseLoadAverages)(fs.readFileSync(path.join(this.procDirectory, 'loadavg'), 'utf8'));
|
|
152
|
+
this.readDiskUsedPercent = () => {
|
|
153
|
+
const { blocks, bfree, bavail } = this.readDiskBlocks(this.rootPath);
|
|
154
|
+
return (0, exports.parseDiskUsedPercent)(blocks, bfree, bavail);
|
|
155
|
+
};
|
|
133
156
|
}
|
|
134
157
|
}
|
|
135
158
|
exports.ProcHostMetricsRepository = ProcHostMetricsRepository;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcHostMetricsRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/ProcHostMetricsRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAa7B,MAAM,sBAAsB,GAAG,OAAO,CAAC;AACvC,MAAM,sBAAsB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"ProcHostMetricsRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/ProcHostMetricsRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ComposeDashboardUseCase = exports.formatTokenRowLine = exports.formatProjectRowLine = exports.formatProjectHeaderLine = exports.
|
|
3
|
+
exports.ComposeDashboardUseCase = exports.formatTokenRowLine = exports.formatProjectRowLine = exports.formatProjectHeaderLine = exports.formatMachineStatusLines = exports.formatResetCountdown = exports.roundHalfToEven = exports.PROJECT_ROW_WIDTH_BUDGET = void 0;
|
|
4
4
|
exports.PROJECT_ROW_WIDTH_BUDGET = 32;
|
|
5
5
|
const PROJECT_COLUMNS = [
|
|
6
6
|
{ header: 'unr', key: 'unread' },
|
|
@@ -63,13 +63,16 @@ const formatResetCountdown = (totalSeconds) => {
|
|
|
63
63
|
return `${days}d${padStartZero(String(hours), 2)}h${padStartZero(String(minutes), 2)}`;
|
|
64
64
|
};
|
|
65
65
|
exports.formatResetCountdown = formatResetCountdown;
|
|
66
|
-
const
|
|
66
|
+
const formatMachineStatusLines = (machineStatus) => {
|
|
67
67
|
const memText = machineStatus !== null && machineStatus.memPct !== null
|
|
68
68
|
? `${machineStatus.memPct}%`
|
|
69
69
|
: '?%';
|
|
70
70
|
const cpuText = machineStatus !== null && machineStatus.cpuPct !== null
|
|
71
71
|
? `${machineStatus.cpuPct}%`
|
|
72
72
|
: '?%';
|
|
73
|
+
const diskText = machineStatus !== null && machineStatus.diskPct !== null
|
|
74
|
+
? `${machineStatus.diskPct}%`
|
|
75
|
+
: '?%';
|
|
73
76
|
const load = machineStatus !== null ? machineStatus.load : null;
|
|
74
77
|
const oneMinute = load === null ? '?' : String((0, exports.roundHalfToEven)(load[0]));
|
|
75
78
|
const fiveMinute = load === null ? '?' : String((0, exports.roundHalfToEven)(load[1]));
|
|
@@ -77,9 +80,12 @@ const formatMachineStatusLine = (machineStatus) => {
|
|
|
77
80
|
const cycle = machineStatus !== null && machineStatus.cycleMinutes !== null
|
|
78
81
|
? `cy${machineStatus.cycleMinutes}`
|
|
79
82
|
: 'cy-';
|
|
80
|
-
return
|
|
83
|
+
return [
|
|
84
|
+
`M${memText} C${cpuText} D${diskText} ${cycle}`,
|
|
85
|
+
`LA ${oneMinute} ${fiveMinute} ${fifteenMinute}`,
|
|
86
|
+
];
|
|
81
87
|
};
|
|
82
|
-
exports.
|
|
88
|
+
exports.formatMachineStatusLines = formatMachineStatusLines;
|
|
83
89
|
const capThreeDigits = (value) => value > 999 ? '999' : String(value);
|
|
84
90
|
const formatProjectHeaderLine = () => {
|
|
85
91
|
const head = padEnd('pj', 4, ' ');
|
|
@@ -146,13 +152,13 @@ const wrapLine = (line) => `<tt>${line.replace(/ /g, ' ')}</tt><br>`;
|
|
|
146
152
|
class ComposeDashboardUseCase {
|
|
147
153
|
constructor() {
|
|
148
154
|
this.run = (input) => {
|
|
149
|
-
const
|
|
155
|
+
const statsLines = (0, exports.formatMachineStatusLines)(input.machineStatus);
|
|
150
156
|
const projectLines = [
|
|
151
157
|
(0, exports.formatProjectHeaderLine)(),
|
|
152
158
|
...input.projects.map((project) => (0, exports.formatProjectRowLine)(project)),
|
|
153
159
|
];
|
|
154
160
|
const tokenLines = sortTokens(input.tokens).map((token) => (0, exports.formatTokenRowLine)(token));
|
|
155
|
-
const lines = [
|
|
161
|
+
const lines = [...statsLines, ...projectLines, '', ...tokenLines];
|
|
156
162
|
return lines.map((line) => wrapLine(line)).join('\n') + '\n';
|
|
157
163
|
};
|
|
158
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposeDashboardUseCase.js","sourceRoot":"","sources":["../../../../src/domain/usecases/dashboard/ComposeDashboardUseCase.ts"],"names":[],"mappings":";;;AAGa,QAAA,wBAAwB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ComposeDashboardUseCase.js","sourceRoot":"","sources":["../../../../src/domain/usecases/dashboard/ComposeDashboardUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -96,6 +96,7 @@ describe('buildComposeDashboardInput', () => {
|
|
|
96
96
|
JSON.stringify({
|
|
97
97
|
memPct: 55,
|
|
98
98
|
cpuPct: 62,
|
|
99
|
+
diskPct: 89,
|
|
99
100
|
load: [16, 23, 40],
|
|
100
101
|
cycleMinutes: 14,
|
|
101
102
|
capturedAt: 'x',
|
|
@@ -108,6 +109,7 @@ describe('buildComposeDashboardInput', () => {
|
|
|
108
109
|
expect(input.machineStatus).toEqual({
|
|
109
110
|
memPct: 55,
|
|
110
111
|
cpuPct: 62,
|
|
112
|
+
diskPct: 89,
|
|
111
113
|
load: [16, 23, 40],
|
|
112
114
|
cycleMinutes: 14,
|
|
113
115
|
});
|
|
@@ -124,6 +126,7 @@ describe('buildComposeDashboardInput', () => {
|
|
|
124
126
|
JSON.stringify({
|
|
125
127
|
memPct: 1,
|
|
126
128
|
cpuPct: 2,
|
|
129
|
+
diskPct: 3,
|
|
127
130
|
load: [0, 0, 0],
|
|
128
131
|
cycleMinutes: null,
|
|
129
132
|
capturedAt: 'x',
|
|
@@ -262,6 +265,7 @@ describe('composeDashboardText', () => {
|
|
|
262
265
|
JSON.stringify({
|
|
263
266
|
memPct: 55,
|
|
264
267
|
cpuPct: 62,
|
|
268
|
+
diskPct: 89,
|
|
265
269
|
load: [16, 23, 40],
|
|
266
270
|
cycleMinutes: 14,
|
|
267
271
|
capturedAt: 'x',
|
|
@@ -291,7 +295,8 @@ describe('composeDashboardText', () => {
|
|
|
291
295
|
projectCodes: ['um', 'xc'],
|
|
292
296
|
}),
|
|
293
297
|
).toBe(
|
|
294
|
-
'<tt>M55% C62%
|
|
298
|
+
'<tt>M55% C62% D89% cy14</tt><br>\n' +
|
|
299
|
+
'<tt>LA 16 23 40</tt><br>\n' +
|
|
295
300
|
'<tt>pj unr tdo aqc fal prp aws dep</tt><br>\n' +
|
|
296
301
|
'<tt>🟢um 3 1 2 0 0 4 1</tt><br>\n' +
|
|
297
302
|
'<tt> xc -- -- -- -- -- -- --</tt><br>\n' +
|
|
@@ -311,6 +316,7 @@ describe('dashboardComposeFilesPresent', () => {
|
|
|
311
316
|
JSON.stringify({
|
|
312
317
|
memPct: 1,
|
|
313
318
|
cpuPct: 2,
|
|
319
|
+
diskPct: 3,
|
|
314
320
|
load: [0, 0, 0],
|
|
315
321
|
cycleMinutes: null,
|
|
316
322
|
capturedAt: 'x',
|
|
@@ -409,6 +415,7 @@ describe('dashboardComposeFilesPresent', () => {
|
|
|
409
415
|
JSON.stringify({
|
|
410
416
|
memPct: 1,
|
|
411
417
|
cpuPct: 2,
|
|
418
|
+
diskPct: 3,
|
|
412
419
|
load: [0, 0, 0],
|
|
413
420
|
cycleMinutes: null,
|
|
414
421
|
capturedAt: 'x',
|
|
@@ -1155,6 +1155,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1155
1155
|
JSON.stringify({
|
|
1156
1156
|
memPct: 55,
|
|
1157
1157
|
cpuPct: 62,
|
|
1158
|
+
diskPct: 89,
|
|
1158
1159
|
load: [16, 23, 40],
|
|
1159
1160
|
cycleMinutes: 14,
|
|
1160
1161
|
capturedAt: '2026-06-26T00:00:00.000Z',
|
|
@@ -1181,7 +1182,8 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1181
1182
|
};
|
|
1182
1183
|
|
|
1183
1184
|
const expectedComposed =
|
|
1184
|
-
'<tt>M55% C62%
|
|
1185
|
+
'<tt>M55% C62% D89% cy14</tt><br>\n' +
|
|
1186
|
+
'<tt>LA 16 23 40</tt><br>\n' +
|
|
1185
1187
|
'<tt>pj unr tdo aqc fal prp aws dep</tt><br>\n' +
|
|
1186
1188
|
'<tt>🟢um 3 1 2 0 0 4 1</tt><br>\n' +
|
|
1187
1189
|
'<tt>🟢xc 0 0 0 0 0 2 0</tt><br>\n' +
|
|
@@ -1299,6 +1301,7 @@ describe('webServer dashboard /tdpm.txt route integration', () => {
|
|
|
1299
1301
|
JSON.stringify({
|
|
1300
1302
|
memPct: 55,
|
|
1301
1303
|
cpuPct: 62,
|
|
1304
|
+
diskPct: 89,
|
|
1302
1305
|
load: [16, 23, 40],
|
|
1303
1306
|
cycleMinutes: 14,
|
|
1304
1307
|
capturedAt: '2026-06-26T00:00:00.000Z',
|
|
@@ -25,7 +25,18 @@ const buildHostMetricsRepository = (
|
|
|
25
25
|
const sleep = async (): Promise<void> => {
|
|
26
26
|
fs.writeFileSync(statPath, 'cpu 660 0 0 440 0 0 0 0 0 0\n');
|
|
27
27
|
};
|
|
28
|
-
|
|
28
|
+
const readDiskBlocks = (): {
|
|
29
|
+
blocks: number;
|
|
30
|
+
bfree: number;
|
|
31
|
+
bavail: number;
|
|
32
|
+
} => ({ blocks: 1100, bfree: 200, bavail: 100 });
|
|
33
|
+
return {
|
|
34
|
+
repository: new ProcHostMetricsRepository(
|
|
35
|
+
procDirectory,
|
|
36
|
+
sleep,
|
|
37
|
+
readDiskBlocks,
|
|
38
|
+
),
|
|
39
|
+
};
|
|
29
40
|
};
|
|
30
41
|
|
|
31
42
|
describe('writeMachineStatus', () => {
|
|
@@ -42,7 +53,7 @@ describe('writeMachineStatus', () => {
|
|
|
42
53
|
fs.rmSync(procDirectory, { recursive: true, force: true });
|
|
43
54
|
});
|
|
44
55
|
|
|
45
|
-
it('writes machine-status.json with mem, cpu, load and cycle minutes', async () => {
|
|
56
|
+
it('writes machine-status.json with mem, cpu, disk, load and cycle minutes', async () => {
|
|
46
57
|
const { repository } = buildHostMetricsRepository(procDirectory);
|
|
47
58
|
const cacheDir = path.join(dir, 'allIssues-PVT');
|
|
48
59
|
fs.mkdirSync(cacheDir, { recursive: true });
|
|
@@ -65,6 +76,7 @@ describe('writeMachineStatus', () => {
|
|
|
65
76
|
const expected: MachineStatusFile = {
|
|
66
77
|
memPct: 55,
|
|
67
78
|
cpuPct: 60,
|
|
79
|
+
diskPct: 90,
|
|
68
80
|
load: [1.5, 0.8, 0.4],
|
|
69
81
|
cycleMinutes: 15,
|
|
70
82
|
capturedAt: '2026-06-26T12:00:00.000Z',
|
|
@@ -15,6 +15,7 @@ export type MachineStatusWriterParams = {
|
|
|
15
15
|
export type MachineStatusFile = {
|
|
16
16
|
memPct: number;
|
|
17
17
|
cpuPct: number;
|
|
18
|
+
diskPct: number;
|
|
18
19
|
load: [number, number, number];
|
|
19
20
|
cycleMinutes: number | null;
|
|
20
21
|
capturedAt: string;
|
|
@@ -61,6 +62,7 @@ export const writeMachineStatus = async (
|
|
|
61
62
|
|
|
62
63
|
const memPct = hostMetricsRepository.readMemoryUsedPercent();
|
|
63
64
|
const cpuPct = await hostMetricsRepository.readCpuUsedPercent();
|
|
65
|
+
const diskPct = hostMetricsRepository.readDiskUsedPercent();
|
|
64
66
|
const load = hostMetricsRepository.readLoadAverages();
|
|
65
67
|
|
|
66
68
|
const cycleMinutes = allIssuesCacheDir
|
|
@@ -70,6 +72,7 @@ export const writeMachineStatus = async (
|
|
|
70
72
|
const file: MachineStatusFile = {
|
|
71
73
|
memPct,
|
|
72
74
|
cpuPct,
|
|
75
|
+
diskPct,
|
|
73
76
|
load: [load.oneMinute, load.fiveMinute, load.fifteenMinute],
|
|
74
77
|
cycleMinutes,
|
|
75
78
|
capturedAt: (params.now ?? new Date()).toISOString(),
|
|
@@ -2,10 +2,12 @@ import * as fs from 'fs';
|
|
|
2
2
|
import * as os from 'os';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import {
|
|
5
|
+
DiskBlocks,
|
|
5
6
|
ProcHostMetricsRepository,
|
|
6
7
|
cpuUsedPercentFromSamples,
|
|
7
8
|
cycleMinutesFromMtimes,
|
|
8
9
|
parseCpuSample,
|
|
10
|
+
parseDiskUsedPercent,
|
|
9
11
|
parseLoadAverages,
|
|
10
12
|
parseMemoryUsedPercent,
|
|
11
13
|
} from './ProcHostMetricsRepository';
|
|
@@ -72,6 +74,20 @@ describe('parseLoadAverages', () => {
|
|
|
72
74
|
});
|
|
73
75
|
});
|
|
74
76
|
|
|
77
|
+
describe('parseDiskUsedPercent', () => {
|
|
78
|
+
it('excludes root-reserved blocks from the denominator like df', () => {
|
|
79
|
+
expect(parseDiskUsedPercent(1100, 200, 100)).toBe(90);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('matches df when there is no root reservation (bfree equals bavail)', () => {
|
|
83
|
+
expect(parseDiskUsedPercent(1000, 100, 100)).toBe(90);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('throws when the disk total is not positive', () => {
|
|
87
|
+
expect(() => parseDiskUsedPercent(100, 200, 0)).toThrow();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
75
91
|
describe('cycleMinutesFromMtimes', () => {
|
|
76
92
|
it('rounds the gap between the two newest generations to whole minutes', () => {
|
|
77
93
|
expect(cycleMinutesFromMtimes([1782469254.0, 1782468443.0])).toBe(14);
|
|
@@ -120,6 +136,16 @@ describe('ProcHostMetricsRepository', () => {
|
|
|
120
136
|
});
|
|
121
137
|
});
|
|
122
138
|
|
|
139
|
+
it('reads the df-style disk used percent from the root filesystem statfs', () => {
|
|
140
|
+
const diskBlocks: DiskBlocks = { blocks: 1100, bfree: 200, bavail: 100 };
|
|
141
|
+
const repository = new ProcHostMetricsRepository(
|
|
142
|
+
procDirectory,
|
|
143
|
+
async () => {},
|
|
144
|
+
() => diskBlocks,
|
|
145
|
+
);
|
|
146
|
+
expect(repository.readDiskUsedPercent()).toBe(90);
|
|
147
|
+
});
|
|
148
|
+
|
|
123
149
|
it('samples /proc/stat twice and computes the busy percent', async () => {
|
|
124
150
|
const statPath = path.join(procDirectory, 'stat');
|
|
125
151
|
let sampleIndex = 0;
|
|
@@ -13,8 +13,15 @@ export type LoadAverages = {
|
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
const DEFAULT_PROC_DIRECTORY = '/proc';
|
|
16
|
+
const DEFAULT_ROOT_PATH = '/';
|
|
16
17
|
const CPU_SAMPLE_INTERVAL_MS = 400;
|
|
17
18
|
|
|
19
|
+
export type DiskBlocks = {
|
|
20
|
+
blocks: number;
|
|
21
|
+
bfree: number;
|
|
22
|
+
bavail: number;
|
|
23
|
+
};
|
|
24
|
+
|
|
18
25
|
export const parseMemoryUsedPercent = (meminfoText: string): number => {
|
|
19
26
|
const fields = new Map<string, number>();
|
|
20
27
|
for (const line of meminfoText.split('\n')) {
|
|
@@ -76,6 +83,19 @@ export const cpuUsedPercentFromSamples = (
|
|
|
76
83
|
return Math.round((busyDelta / totalDelta) * 100);
|
|
77
84
|
};
|
|
78
85
|
|
|
86
|
+
export const parseDiskUsedPercent = (
|
|
87
|
+
blocks: number,
|
|
88
|
+
bfree: number,
|
|
89
|
+
bavail: number,
|
|
90
|
+
): number => {
|
|
91
|
+
const total = blocks - bfree + bavail;
|
|
92
|
+
if (total <= 0) {
|
|
93
|
+
throw new Error('disk total must be positive');
|
|
94
|
+
}
|
|
95
|
+
const used = blocks - bfree;
|
|
96
|
+
return Math.round((used / total) * 100);
|
|
97
|
+
};
|
|
98
|
+
|
|
79
99
|
export const parseLoadAverages = (loadavgText: string): LoadAverages => {
|
|
80
100
|
const parts = loadavgText.trim().split(/\s+/);
|
|
81
101
|
const oneMinute = Number(parts[0]);
|
|
@@ -111,6 +131,17 @@ export class ProcHostMetricsRepository {
|
|
|
111
131
|
new Promise((resolve) => {
|
|
112
132
|
setTimeout(resolve, milliseconds);
|
|
113
133
|
}),
|
|
134
|
+
private readonly readDiskBlocks: (rootPath: string) => DiskBlocks = (
|
|
135
|
+
rootPath,
|
|
136
|
+
) => {
|
|
137
|
+
const stats = fs.statfsSync(rootPath);
|
|
138
|
+
return {
|
|
139
|
+
blocks: Number(stats.blocks),
|
|
140
|
+
bfree: Number(stats.bfree),
|
|
141
|
+
bavail: Number(stats.bavail),
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
private readonly rootPath: string = DEFAULT_ROOT_PATH,
|
|
114
145
|
) {}
|
|
115
146
|
|
|
116
147
|
readMemoryUsedPercent = (): number =>
|
|
@@ -133,4 +164,9 @@ export class ProcHostMetricsRepository {
|
|
|
133
164
|
parseLoadAverages(
|
|
134
165
|
fs.readFileSync(path.join(this.procDirectory, 'loadavg'), 'utf8'),
|
|
135
166
|
);
|
|
167
|
+
|
|
168
|
+
readDiskUsedPercent = (): number => {
|
|
169
|
+
const { blocks, bfree, bavail } = this.readDiskBlocks(this.rootPath);
|
|
170
|
+
return parseDiskUsedPercent(blocks, bfree, bavail);
|
|
171
|
+
};
|
|
136
172
|
}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ComposeDashboardInput,
|
|
3
3
|
ComposeDashboardUseCase,
|
|
4
4
|
PROJECT_ROW_WIDTH_BUDGET,
|
|
5
|
-
|
|
5
|
+
formatMachineStatusLines,
|
|
6
6
|
formatProjectHeaderLine,
|
|
7
7
|
formatProjectRowLine,
|
|
8
8
|
formatResetCountdown,
|
|
@@ -64,53 +64,76 @@ describe('formatResetCountdown', () => {
|
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
describe('
|
|
68
|
-
it('renders the host
|
|
67
|
+
describe('formatMachineStatusLines', () => {
|
|
68
|
+
it('renders the host metrics as two lines from a machine status', () => {
|
|
69
69
|
expect(
|
|
70
|
-
|
|
70
|
+
formatMachineStatusLines({
|
|
71
71
|
memPct: 55,
|
|
72
72
|
cpuPct: 62,
|
|
73
|
+
diskPct: 93,
|
|
73
74
|
load: [16, 23, 40],
|
|
74
|
-
cycleMinutes:
|
|
75
|
+
cycleMinutes: 13,
|
|
75
76
|
}),
|
|
76
|
-
).
|
|
77
|
+
).toEqual(['M55% C62% D93% cy13', 'LA 16 23 40']);
|
|
77
78
|
});
|
|
78
79
|
|
|
79
80
|
it('rounds loads with half-to-even and renders integers', () => {
|
|
80
81
|
expect(
|
|
81
|
-
|
|
82
|
+
formatMachineStatusLines({
|
|
82
83
|
memPct: 62,
|
|
83
84
|
cpuPct: 31,
|
|
85
|
+
diskPct: 7,
|
|
84
86
|
load: [1.2, 0.98, 0.75],
|
|
85
87
|
cycleMinutes: 14,
|
|
86
88
|
}),
|
|
87
|
-
).
|
|
89
|
+
).toEqual(['M62% C31% D7% cy14', 'LA 1 1 1']);
|
|
88
90
|
});
|
|
89
91
|
|
|
90
92
|
it('falls back to placeholders when the machine status is absent', () => {
|
|
91
|
-
expect(
|
|
93
|
+
expect(formatMachineStatusLines(null)).toEqual([
|
|
94
|
+
'M?% C?% D?% cy-',
|
|
95
|
+
'LA ? ? ?',
|
|
96
|
+
]);
|
|
92
97
|
});
|
|
93
98
|
|
|
94
99
|
it('renders cy- when cycle minutes is null', () => {
|
|
95
100
|
expect(
|
|
96
|
-
|
|
101
|
+
formatMachineStatusLines({
|
|
97
102
|
memPct: 1,
|
|
98
103
|
cpuPct: 2,
|
|
104
|
+
diskPct: 3,
|
|
99
105
|
load: [0, 0, 0],
|
|
100
106
|
cycleMinutes: null,
|
|
101
107
|
}),
|
|
102
|
-
).
|
|
108
|
+
).toEqual(['M1% C2% D3% cy-', 'LA 0 0 0']);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('renders D?% when only the disk percent is unavailable', () => {
|
|
112
|
+
expect(
|
|
113
|
+
formatMachineStatusLines({
|
|
114
|
+
memPct: 55,
|
|
115
|
+
cpuPct: 62,
|
|
116
|
+
diskPct: null,
|
|
117
|
+
load: [16, 23, 40],
|
|
118
|
+
cycleMinutes: 13,
|
|
119
|
+
}),
|
|
120
|
+
).toEqual(['M55% C62% D?% cy13', 'LA 16 23 40']);
|
|
103
121
|
});
|
|
104
122
|
|
|
105
|
-
it('
|
|
106
|
-
const
|
|
123
|
+
it('keeps both lines within the 32 character width budget at worst case', () => {
|
|
124
|
+
const lines = formatMachineStatusLines({
|
|
107
125
|
memPct: 100,
|
|
108
126
|
cpuPct: 100,
|
|
127
|
+
diskPct: 100,
|
|
109
128
|
load: [108.5, 120.25, 95.1],
|
|
110
129
|
cycleMinutes: 999,
|
|
111
130
|
});
|
|
112
|
-
expect(
|
|
113
|
-
|
|
131
|
+
expect(lines).toEqual(['M100% C100% D100% cy999', 'LA 108 120 95']);
|
|
132
|
+
for (const line of lines) {
|
|
133
|
+
expect(codePointLength(line)).toBeLessThanOrEqual(
|
|
134
|
+
PROJECT_ROW_WIDTH_BUDGET,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
114
137
|
});
|
|
115
138
|
});
|
|
116
139
|
|
|
@@ -260,6 +283,7 @@ describe('ComposeDashboardUseCase', () => {
|
|
|
260
283
|
machineStatus: {
|
|
261
284
|
memPct: 55,
|
|
262
285
|
cpuPct: 62,
|
|
286
|
+
diskPct: 89,
|
|
263
287
|
load: [16, 23, 40],
|
|
264
288
|
cycleMinutes: 14,
|
|
265
289
|
},
|
|
@@ -310,7 +334,8 @@ describe('ComposeDashboardUseCase', () => {
|
|
|
310
334
|
};
|
|
311
335
|
|
|
312
336
|
const expectedBody =
|
|
313
|
-
'<tt>M55% C62%
|
|
337
|
+
'<tt>M55% C62% D89% cy14</tt><br>\n' +
|
|
338
|
+
'<tt>LA 16 23 40</tt><br>\n' +
|
|
314
339
|
'<tt>pj unr tdo aqc fal prp aws dep</tt><br>\n' +
|
|
315
340
|
'<tt>🟢um 3 1 2 0 0 4 1</tt><br>\n' +
|
|
316
341
|
'<tt>🟠xm 12 0 16 6 1 0 0</tt><br>\n' +
|
|
@@ -357,7 +382,8 @@ describe('ComposeDashboardUseCase', () => {
|
|
|
357
382
|
});
|
|
358
383
|
expect(
|
|
359
384
|
output.startsWith(
|
|
360
|
-
'<tt>M?% C?%
|
|
385
|
+
'<tt>M?% C?% D?% cy-</tt><br>\n' +
|
|
386
|
+
'<tt>LA ? ? ?</tt><br>\n',
|
|
361
387
|
),
|
|
362
388
|
).toBe(true);
|
|
363
389
|
});
|
|
@@ -367,6 +393,7 @@ describe('ComposeDashboardUseCase', () => {
|
|
|
367
393
|
machineStatus: {
|
|
368
394
|
memPct: 100,
|
|
369
395
|
cpuPct: 100,
|
|
396
|
+
diskPct: 100,
|
|
370
397
|
load: [108.5, 120.25, 95.1],
|
|
371
398
|
cycleMinutes: 999,
|
|
372
399
|
},
|
|
@@ -11,6 +11,7 @@ export type ComposeDashboardProject = {
|
|
|
11
11
|
export type ComposeDashboardMachineStatus = {
|
|
12
12
|
memPct: number | null;
|
|
13
13
|
cpuPct: number | null;
|
|
14
|
+
diskPct: number | null;
|
|
14
15
|
load: [number, number, number] | null;
|
|
15
16
|
cycleMinutes: number | null;
|
|
16
17
|
};
|
|
@@ -97,9 +98,9 @@ export const formatResetCountdown = (totalSeconds: number): string => {
|
|
|
97
98
|
)}`;
|
|
98
99
|
};
|
|
99
100
|
|
|
100
|
-
export const
|
|
101
|
+
export const formatMachineStatusLines = (
|
|
101
102
|
machineStatus: ComposeDashboardMachineStatus | null,
|
|
102
|
-
): string => {
|
|
103
|
+
): [string, string] => {
|
|
103
104
|
const memText =
|
|
104
105
|
machineStatus !== null && machineStatus.memPct !== null
|
|
105
106
|
? `${machineStatus.memPct}%`
|
|
@@ -108,6 +109,10 @@ export const formatMachineStatusLine = (
|
|
|
108
109
|
machineStatus !== null && machineStatus.cpuPct !== null
|
|
109
110
|
? `${machineStatus.cpuPct}%`
|
|
110
111
|
: '?%';
|
|
112
|
+
const diskText =
|
|
113
|
+
machineStatus !== null && machineStatus.diskPct !== null
|
|
114
|
+
? `${machineStatus.diskPct}%`
|
|
115
|
+
: '?%';
|
|
111
116
|
const load = machineStatus !== null ? machineStatus.load : null;
|
|
112
117
|
const oneMinute = load === null ? '?' : String(roundHalfToEven(load[0]));
|
|
113
118
|
const fiveMinute = load === null ? '?' : String(roundHalfToEven(load[1]));
|
|
@@ -116,7 +121,10 @@ export const formatMachineStatusLine = (
|
|
|
116
121
|
machineStatus !== null && machineStatus.cycleMinutes !== null
|
|
117
122
|
? `cy${machineStatus.cycleMinutes}`
|
|
118
123
|
: 'cy-';
|
|
119
|
-
return
|
|
124
|
+
return [
|
|
125
|
+
`M${memText} C${cpuText} D${diskText} ${cycle}`,
|
|
126
|
+
`LA ${oneMinute} ${fiveMinute} ${fifteenMinute}`,
|
|
127
|
+
];
|
|
120
128
|
};
|
|
121
129
|
|
|
122
130
|
const capThreeDigits = (value: number): string =>
|
|
@@ -206,7 +214,7 @@ const wrapLine = (line: string): string =>
|
|
|
206
214
|
|
|
207
215
|
export class ComposeDashboardUseCase {
|
|
208
216
|
run = (input: ComposeDashboardInput): string => {
|
|
209
|
-
const
|
|
217
|
+
const statsLines = formatMachineStatusLines(input.machineStatus);
|
|
210
218
|
const projectLines = [
|
|
211
219
|
formatProjectHeaderLine(),
|
|
212
220
|
...input.projects.map((project) => formatProjectRowLine(project)),
|
|
@@ -214,7 +222,7 @@ export class ComposeDashboardUseCase {
|
|
|
214
222
|
const tokenLines = sortTokens(input.tokens).map((token) =>
|
|
215
223
|
formatTokenRowLine(token),
|
|
216
224
|
);
|
|
217
|
-
const lines = [
|
|
225
|
+
const lines = [...statsLines, ...projectLines, '', ...tokenLines];
|
|
218
226
|
return lines.map((line) => wrapLine(line)).join('\n') + '\n';
|
|
219
227
|
};
|
|
220
228
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardComposeService.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/dashboardComposeService.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EAItB,MAAM,4DAA4D,CAAC;AAOpE,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboardComposeService.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/console/dashboardComposeService.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EAItB,MAAM,4DAA4D,CAAC;AAOpE,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AA4IF,eAAO,MAAM,0BAA0B,GACrC,SAAS,uBAAuB,KAC/B,qBAYF,CAAC;AAUF,eAAO,MAAM,4BAA4B,GACvC,SAAS,uBAAuB,KAC/B,OAYF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,uBAAuB,KAC/B,MACqE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machineStatusWriter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/machineStatusWriter.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AAEtD,MAAM,MAAM,yBAAyB,GAAG;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA8BF,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,yBAAyB,KAChC,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"machineStatusWriter.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/machineStatusWriter.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AAEtD,MAAM,MAAM,yBAAyB,GAAG;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA8BF,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,yBAAyB,KAChC,OAAO,CAAC,IAAI,CA4Bd,CAAC"}
|
|
@@ -7,17 +7,26 @@ export type LoadAverages = {
|
|
|
7
7
|
fiveMinute: number;
|
|
8
8
|
fifteenMinute: number;
|
|
9
9
|
};
|
|
10
|
+
export type DiskBlocks = {
|
|
11
|
+
blocks: number;
|
|
12
|
+
bfree: number;
|
|
13
|
+
bavail: number;
|
|
14
|
+
};
|
|
10
15
|
export declare const parseMemoryUsedPercent: (meminfoText: string) => number;
|
|
11
16
|
export declare const parseCpuSample: (statText: string) => CpuSample;
|
|
12
17
|
export declare const cpuUsedPercentFromSamples: (first: CpuSample, second: CpuSample) => number;
|
|
18
|
+
export declare const parseDiskUsedPercent: (blocks: number, bfree: number, bavail: number) => number;
|
|
13
19
|
export declare const parseLoadAverages: (loadavgText: string) => LoadAverages;
|
|
14
20
|
export declare const cycleMinutesFromMtimes: (mtimesDescendingSeconds: number[]) => number | null;
|
|
15
21
|
export declare class ProcHostMetricsRepository {
|
|
16
22
|
private readonly procDirectory;
|
|
17
23
|
private readonly sleep;
|
|
18
|
-
|
|
24
|
+
private readonly readDiskBlocks;
|
|
25
|
+
private readonly rootPath;
|
|
26
|
+
constructor(procDirectory?: string, sleep?: (milliseconds: number) => Promise<void>, readDiskBlocks?: (rootPath: string) => DiskBlocks, rootPath?: string);
|
|
19
27
|
readMemoryUsedPercent: () => number;
|
|
20
28
|
readCpuUsedPercent: () => Promise<number>;
|
|
21
29
|
readLoadAverages: () => LoadAverages;
|
|
30
|
+
readDiskUsedPercent: () => number;
|
|
22
31
|
}
|
|
23
32
|
//# sourceMappingURL=ProcHostMetricsRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcHostMetricsRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ProcHostMetricsRepository.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProcHostMetricsRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ProcHostMetricsRepository.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAMF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,aAAa,MAAM,KAAG,MA2B5D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,SAiBjD,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,OAAO,SAAS,EAChB,QAAQ,SAAS,KAChB,MAQF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,EACd,OAAO,MAAM,EACb,QAAQ,MAAM,KACb,MAOF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,YAavD,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,yBAAyB,MAAM,EAAE,KAChC,MAAM,GAAG,IAOX,CAAC;AAEF,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAMtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAU/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAjBR,aAAa,GAAE,MAA+B,EAC9C,KAAK,GAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAK1D,EACa,cAAc,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAStD,EACgB,QAAQ,GAAE,MAA0B;IAGvD,qBAAqB,QAAO,MAAM,CAG9B;IAEJ,kBAAkB,QAAa,OAAO,CAAC,MAAM,CAAC,CAS5C;IAEF,gBAAgB,QAAO,YAAY,CAG/B;IAEJ,mBAAmB,QAAO,MAAM,CAG9B;CACH"}
|
|
@@ -8,6 +8,7 @@ export type ComposeDashboardProject = {
|
|
|
8
8
|
export type ComposeDashboardMachineStatus = {
|
|
9
9
|
memPct: number | null;
|
|
10
10
|
cpuPct: number | null;
|
|
11
|
+
diskPct: number | null;
|
|
11
12
|
load: [number, number, number] | null;
|
|
12
13
|
cycleMinutes: number | null;
|
|
13
14
|
};
|
|
@@ -18,7 +19,7 @@ export type ComposeDashboardInput = {
|
|
|
18
19
|
};
|
|
19
20
|
export declare const roundHalfToEven: (value: number) => number;
|
|
20
21
|
export declare const formatResetCountdown: (totalSeconds: number) => string;
|
|
21
|
-
export declare const
|
|
22
|
+
export declare const formatMachineStatusLines: (machineStatus: ComposeDashboardMachineStatus | null) => [string, string];
|
|
22
23
|
export declare const formatProjectHeaderLine: () => string;
|
|
23
24
|
export declare const formatProjectRowLine: (project: ComposeDashboardProject) => string;
|
|
24
25
|
export declare const formatTokenRowLine: (token: TokenStatus) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposeDashboardUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/dashboard/ComposeDashboardUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAoB,MAAM,8BAA8B,CAAC;AAE7E,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,aAAa,EAAE,6BAA6B,GAAG,IAAI,CAAC;IACpD,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAmDF,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAU/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,KAAG,MAa3D,CAAC;AAEF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"ComposeDashboardUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/dashboard/ComposeDashboardUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAoB,MAAM,8BAA8B,CAAC;AAE7E,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,aAAa,EAAE,6BAA6B,GAAG,IAAI,CAAC;IACpD,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAmDF,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAU/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,KAAG,MAa3D,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,6BAA6B,GAAG,IAAI,KAClD,CAAC,MAAM,EAAE,MAAM,CAyBjB,CAAC;AAKF,eAAO,MAAM,uBAAuB,QAAO,MAM1C,CAAC;AAkBF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,uBAAuB,KAC/B,MAQF,CAAC;AA6BF,eAAO,MAAM,kBAAkB,GAAI,OAAO,WAAW,KAAG,MAcvD,CAAC;AAKF,qBAAa,uBAAuB;IAClC,GAAG,GAAI,OAAO,qBAAqB,KAAG,MAAM,CAW1C;CACH"}
|