Documentation Index
Fetch the complete documentation index at: https://mintlify.com/EvoMap/evolver/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The health check module monitors system resources (disk, memory, CPU) and validates that critical environment variables are configured.
Location: src/ops/health_check.js
Function
runHealthCheck()
Execute comprehensive health checks.
Location: src/ops/health_check.js:30
function runHealthCheck()
Overall status: ok, warning, or error
ISO timestamp of check execution
Array of individual check results
Check Categories
1. Secret Check
Location: src/ops/health_check.js:36
const criticalSecrets = ['FEISHU_APP_ID', 'FEISHU_APP_SECRET'];
criticalSecrets.forEach(key => {
if (!process.env[key] || process.env[key].trim() === '') {
checks.push({
name: `env:${key}`,
ok: false,
status: 'missing',
severity: 'warning' // Downgraded to prevent restart loops
});
warnings++;
} else {
checks.push({ name: `env:${key}`, ok: true, status: 'present' });
}
});
const optionalSecrets = ['CLAWHUB_TOKEN', 'OPENAI_API_KEY'];
optionalSecrets.forEach(key => {
if (!process.env[key] || process.env[key].trim() === '') {
checks.push({
name: `env:${key}`,
ok: false,
status: 'missing',
severity: 'info'
});
} else {
checks.push({ name: `env:${key}`, ok: true, status: 'present' });
}
});
Critical Secrets:
FEISHU_APP_ID - Feishu application ID
FEISHU_APP_SECRET - Feishu application secret
Optional Secrets:
CLAWHUB_TOKEN - ClawHub API token for ecosystem integration
OPENAI_API_KEY - OpenAI API key for LLM review
2. Disk Space Check
Location: src/ops/health_check.js:6
function getDiskUsage(mount) {
// Use Node 18+ statfs if available
if (fs.statfsSync) {
const stats = fs.statfsSync(mount || '/');
const total = stats.blocks * stats.bsize;
const free = stats.bavail * stats.bsize; // Available to unprivileged users
const used = total - free;
return {
pct: Math.round((used / total) * 100),
freeMb: Math.round(free / 1024 / 1024)
};
}
// Fallback to df command
const out = execSync(`df -P "${mount || '/'}" | tail -1 | awk '{print $5, $4}'`).toString().trim().split(' ');
return {
pct: parseInt(out[0].replace('%', '')),
freeMb: Math.round(parseInt(out[1]) / 1024)
};
}
Thresholds:
Location: src/ops/health_check.js:56
const disk = getDiskUsage('/');
if (disk.pct > 90) {
checks.push({
name: 'disk_space',
ok: false,
status: `${disk.pct}% used`,
severity: 'critical'
});
criticalErrors++;
} else if (disk.pct > 80) {
checks.push({
name: 'disk_space',
ok: false,
status: `${disk.pct}% used`,
severity: 'warning'
});
warnings++;
} else {
checks.push({
name: 'disk_space',
ok: true,
status: `${disk.pct}% used`
});
}
- Critical: >90% used
- Warning: >80% used
- OK: ≤80% used
3. Memory Check
Location: src/ops/health_check.js:67
const memFree = os.freemem();
const memTotal = os.totalmem();
const memPct = Math.round(((memTotal - memFree) / memTotal) * 100);
if (memPct > 95) {
checks.push({
name: 'memory',
ok: false,
status: `${memPct}% used`,
severity: 'critical'
});
criticalErrors++;
} else {
checks.push({
name: 'memory',
ok: true,
status: `${memPct}% used`
});
}
Threshold:
- Critical: >95% used
- OK: ≤95% used
4. Process Count Check (Linux only)
Location: src/ops/health_check.js:80
if (process.platform === 'linux') {
try {
const pids = fs.readdirSync('/proc').filter(f => /^\d+$/.test(f));
if (pids.length > 2000) {
checks.push({
name: 'process_count',
ok: false,
status: `${pids.length} procs`,
severity: 'warning'
});
warnings++;
} else {
checks.push({
name: 'process_count',
ok: true,
status: `${pids.length} procs`
});
}
} catch(e) {}
}
Threshold:
- Warning: >2000 processes
- OK: ≤2000 processes
Status Determination
Location: src/ops/health_check.js:94
let status = 'ok';
if (criticalErrors > 0) status = 'error';
else if (warnings > 0) status = 'warning';
return {
status,
timestamp: new Date().toISOString(),
checks
};
Example Usage
const { runHealthCheck } = require('./src/ops/health_check');
const result = runHealthCheck();
console.log('Health status:', result.status);
console.log('Timestamp:', result.timestamp);
for (const check of result.checks) {
if (!check.ok) {
console.error(`[${check.severity}] ${check.name}: ${check.status}`);
}
}
// Example output:
// {
// status: 'warning',
// timestamp: '2026-03-09T12:34:56.789Z',
// checks: [
// { name: 'env:FEISHU_APP_ID', ok: true, status: 'present' },
// { name: 'env:FEISHU_APP_SECRET', ok: true, status: 'present' },
// { name: 'env:CLAWHUB_TOKEN', ok: false, status: 'missing', severity: 'info' },
// { name: 'disk_space', ok: false, status: '85% used', severity: 'warning' },
// { name: 'memory', ok: true, status: '62% used' },
// { name: 'process_count', ok: true, status: '1247 procs' }
// ]
// }
Integration with Lifecycle
const lifecycle = require('./src/ops/lifecycle');
const { runHealthCheck } = require('./src/ops/health_check');
function monitorLoop() {
setInterval(() => {
const health = runHealthCheck();
if (health.status === 'error') {
console.error('[Monitor] Critical health issues detected');
lifecycle.restart();
} else if (health.status === 'warning') {
console.warn('[Monitor] Health warnings:', health.checks.filter(c => !c.ok));
}
}, 5 * 60 * 1000); // Check every 5 minutes
}
monitorLoop();