/**
* Agentic Flow Statusline for Claude Code
* Shows model, tokens, cost, swarm status, and memory usage
*/
import { execSync } from 'child_process';
// Cache for expensive operations
let lastSwarmCheck = 0;
let cachedSwarmStatus = null;
const CACHE_TTL = 5000; // 5 seconds
/**
* Get swarm status (cached)
*/
function getSwarmStatus() {
const now = Date.now();
if (cachedSwarmStatus && (now - lastSwarmCheck) < CACHE_TTL) {
return cachedSwarmStatus;
}
try {
const result = execSync('npx agentic-flow@alpha mcp status 2>/dev/null || echo "idle"', {
encoding: 'utf-8',
timeout: 2000
}).trim();
cachedSwarmStatus = result.includes('running') ? '🐝' : '⚡';
lastSwarmCheck = now;
return cachedSwarmStatus;
} catch {
cachedSwarmStatus = '⚡';
lastSwarmCheck = now;
return cachedSwarmStatus;
}
}
/**
* Format token count
*/
function formatTokens(tokens) {
if (tokens >= 1000000) {
return `${(tokens / 1000000).toFixed(1)}M`;
}
if (tokens >= 1000) {
return `${(tokens / 1000).toFixed(1)}K`;
}
return String(tokens);
}
/**
* Format cost
*/
function formatCost(cost) {
if (cost >= 1) {
return `$${cost.toFixed(2)}`;
}
return `$${cost.toFixed(4)}`;
}
/**
* Main statusline export
*/
export default function statusline(context) {
const parts = [];
// Agentic Flow indicator
parts.push('🤖');
// Model name (shortened)
if (context.model) {
const model = context.model
.replace('claude-', '')
.replace('-20250514', '')
.replace('sonnet-4', 'S4')
.replace('opus-4', 'O4')
.replace('haiku-3.5', 'H3.5');
parts.push(model);
}
// Token usage
if (context.inputTokens !== undefined || context.outputTokens !== undefined) {
const input = formatTokens(context.inputTokens || 0);
const output = formatTokens(context.outputTokens || 0);
parts.push(`↑${input} ↓${output}`);
}
// Cost
if (context.totalCost !== undefined && context.totalCost > 0) {
parts.push(formatCost(context.totalCost));
}
// Swarm/MCP status indicator
parts.push(getSwarmStatus());
// Session time
if (context.sessionStartTime) {
const elapsed = Math.floor((Date.now() - context.sessionStartTime) / 1000);
const mins = Math.floor(elapsed / 60);
const secs = elapsed % 60;
if (mins > 0) {
parts.push(`${mins}m${secs}s`);
} else {
parts.push(`${secs}s`);
}
}
return parts.join(' │ ');
}