Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
109
vendor/ruvector/.claude/statusline.mjs
vendored
Executable file
109
vendor/ruvector/.claude/statusline.mjs
vendored
Executable file
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* 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(' │ ');
|
||||
}
|
||||
Reference in New Issue
Block a user