diff --git a/docs/plans/state.json b/docs/plans/state.json index 18340e2..f8ec337 100644 --- a/docs/plans/state.json +++ b/docs/plans/state.json @@ -5612,6 +5612,18 @@ "docs/plans/state.json" ], "test_status": "pnpm test:run src/gateway/handlers/agent.test.ts + pnpm typecheck passing" + }, + "system-info-disk-usage-reporting": { + "status": "completed", + "date": "2026-02-19", + "updated": "2026-02-19", + "summary": "Extended `system.info` tool output to include disk usage metrics (path, total/free/used, and used percentage) so machine health summaries include storage headroom in addition to memory.", + "files_modified": [ + "src/tools/builtin/system-info.ts", + "src/tools/builtin/system-info.test.ts", + "docs/plans/state.json" + ], + "test_status": "pnpm test:run src/tools/builtin/system-info.test.ts + pnpm typecheck passing" } }, "overall_progress": { diff --git a/src/tools/builtin/system-info.test.ts b/src/tools/builtin/system-info.test.ts index ac2d713..fa4666f 100644 --- a/src/tools/builtin/system-info.test.ts +++ b/src/tools/builtin/system-info.test.ts @@ -42,6 +42,7 @@ describe('system.info tool', () => { 'Node.js:', 'Uptime:', 'Memory Total:', + 'Disk', ]; for (const field of expectedFields) { diff --git a/src/tools/builtin/system-info.ts b/src/tools/builtin/system-info.ts index 91dcd9a..9c3008f 100644 --- a/src/tools/builtin/system-info.ts +++ b/src/tools/builtin/system-info.ts @@ -1,4 +1,5 @@ import os from 'os'; +import { statfsSync } from 'fs'; import type { Tool, ToolResult } from '../types.js'; function formatUptime(seconds: number): string { @@ -12,6 +13,34 @@ function formatBytes(bytes: number): string { return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB'; } +function getDiskUsageSummary(): string[] { + try { + const rootPath = process.platform === 'win32' ? process.cwd().slice(0, 3) : '/'; + const stat = statfsSync(rootPath); + const blockSize = typeof stat.bsize === 'number' ? stat.bsize : Number(stat.bsize); + const totalBlocks = typeof stat.blocks === 'number' ? stat.blocks : Number(stat.blocks); + const freeBlocks = typeof stat.bavail === 'number' ? stat.bavail : Number(stat.bavail); + + if (!Number.isFinite(blockSize) || !Number.isFinite(totalBlocks) || !Number.isFinite(freeBlocks)) { + return ['Disk: unavailable']; + } + + const totalBytes = totalBlocks * blockSize; + const freeBytes = freeBlocks * blockSize; + const usedBytes = Math.max(0, totalBytes - freeBytes); + const usedPct = totalBytes > 0 ? (usedBytes / totalBytes) * 100 : 0; + + return [ + `Disk Path: ${rootPath}`, + `Disk Total: ${formatBytes(totalBytes)}`, + `Disk Free: ${formatBytes(freeBytes)}`, + `Disk Used: ${formatBytes(usedBytes)} (${usedPct.toFixed(1)}%)`, + ]; + } catch { + return ['Disk: unavailable']; + } +} + export const systemInfoTool: Tool = { name: 'system.info', description: 'Get current system information including date, time, hostname, OS, platform, architecture, uptime, Node.js version, and memory usage.', @@ -52,6 +81,7 @@ export const systemInfoTool: Tool = { `Node.js: ${process.version}`, `Memory Total: ${formatBytes(totalMem)}`, `Memory Free: ${formatBytes(freeMem)}`, + ...getDiskUsageSummary(), `Working Dir: ${process.cwd()}`, ];