From 862881ac913ca8e5c8f7a505a935dd2eec0c934a Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Tue, 31 Mar 2026 02:17:44 +0900 Subject: [PATCH] fix: show actual memory usage (exclude cache) + add build:container script - Dashboard memory: use /proc/meminfo MemAvailable instead of os.freemem() to exclude Linux buffer/cache from reported usage - Add build:container npm script for reviewer Docker image rebuild - Update deploy commands in CLAUDE.md and README.md to include build:container --- CLAUDE.md | 3 ++- README.md | 4 +++- package.json | 1 + src/unified-dashboard.ts | 13 ++++++++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index a691fe5..bf7d709 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,6 +40,7 @@ Run commands directly—don't tell the user to run them. ```bash bun run build # Build main project bun run build:runners # Install + build both runners +bun run build:container # Rebuild reviewer Docker image bun run dev # Dev mode with hot reload ``` @@ -52,7 +53,7 @@ journalctl --user -u ejclaw -f # Follow logs Deploy to server (build on server, not locally): ```bash -ssh clone-ej@100.64.185.108 'cd ~/EJClaw && git pull && bun run build && bun run build:runners && systemctl --user restart ejclaw' +ssh clone-ej@100.64.185.108 'cd ~/EJClaw && git pull && bun run build && bun run build:runners && bun run build:container && systemctl --user restart ejclaw' ``` ## Service Stack Architecture diff --git a/README.md b/README.md index 88de9bb..484551b 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ cd EJClaw bun install bun run build:runners bun run build +bun run build:container # Build reviewer Docker image ``` ### Environment @@ -157,7 +158,7 @@ MOA_GLM_API_FORMAT=anthropic ### Deploy ```bash -ssh clone-ej@100.64.185.108 'cd ~/EJClaw && git pull && bun run build && bun run build:runners && systemctl --user restart ejclaw' +ssh clone-ej@100.64.185.108 'cd ~/EJClaw && git pull && bun run build && bun run build:runners && bun run build:container && systemctl --user restart ejclaw' ``` ## Development @@ -165,6 +166,7 @@ ssh clone-ej@100.64.185.108 'cd ~/EJClaw && git pull && bun run build && bun run ```bash bun run build # Build main project bun run build:runners # Install + build both runners +bun run build:container # Rebuild reviewer Docker image bun run dev # Dev mode with hot reload bun test # Run tests ``` diff --git a/package.json b/package.json index 23bb5c5..189e371 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "tsc", "build:runners": "bun install --cwd runners/agent-runner && bun run --cwd runners/agent-runner build && bun install --cwd runners/codex-runner && bun run --cwd runners/codex-runner build", + "build:container": "docker build -f container/Dockerfile -t ejclaw-reviewer:latest .", "restart:stack": "bash scripts/restart-ejclaw-stack.sh", "restart:hint": "bun src/restart-context-cli.ts write", "start": "bun dist/index.js", diff --git a/src/unified-dashboard.ts b/src/unified-dashboard.ts index e473a74..75970fb 100644 --- a/src/unified-dashboard.ts +++ b/src/unified-dashboard.ts @@ -1,4 +1,5 @@ import { execSync } from 'child_process'; +import fs from 'fs'; import os from 'os'; import { @@ -524,7 +525,17 @@ async function buildUsageContent(): Promise { const cpuCount = os.cpus().length; const cpuPct = Math.round((loadAvg[1] / cpuCount) * 100); const totalMem = os.totalmem(); - const usedMem = totalMem - os.freemem(); + // os.freemem() includes buffers/cache as "used" — misleading. + // Read MemAvailable from /proc/meminfo for actual available memory. + let availableMem = os.freemem(); + try { + const meminfo = fs.readFileSync('/proc/meminfo', 'utf-8'); + const match = meminfo.match(/MemAvailable:\s+(\d+)\s+kB/); + if (match) availableMem = parseInt(match[1], 10) * 1024; + } catch { + /* non-Linux or unreadable — fall back to os.freemem() */ + } + const usedMem = totalMem - availableMem; const memPct = Math.round((usedMem / totalMem) * 100); const memUsedGB = (usedMem / 1073741824).toFixed(1); const memTotalGB = (totalMem / 1073741824).toFixed(1);