/**
* @fileoverview StatusBar component
*
* Bottom status bar showing:
* - Session status (idle/working)
* - Token count
* - Cost
* - Runtime
* - Quick keyboard shortcuts
*/
import React from 'react';
import { Box, Text } from 'ink';
import type { ScreenSession } from '../../types.js';
interface RespawnStatus {
enabled: boolean;
state: string;
cycleCount: number;
}
interface StatusBarProps {
session: ScreenSession | null;
inputMode?: boolean;
respawnStatus?: RespawnStatus | null;
}
/**
* Formats duration from milliseconds to human-readable string
*/
function formatDuration(ms: number): string {
const seconds = Math.floor(ms / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
if (hours > 0) {
return `${hours}h ${minutes % 60}m`;
}
if (minutes > 0) {
return `${minutes}m ${seconds % 60}s`;
}
return `${seconds}s`;
}
/**
* StatusBar component showing session information
*/
export function StatusBar({ session, inputMode = false, respawnStatus }: StatusBarProps): React.ReactElement {
if (!session) {
return (
No session selected
Press ? for help | Esc to go back
);
}
const runtime = formatDuration(Date.now() - session.createdAt);
const statusColor = session.attached ? 'green' : 'red';
const statusText = session.attached ? 'alive' : 'dead';
const sessionName = session.name || 'unnamed';
return (
{/* Left side: Session info */}
{sessionName}
|
{'\u25CF'} {statusText}
|
runtime: {runtime}
|
mode: {session.mode}
{inputMode && (
<>
|
INPUT MODE
>
)}
{respawnStatus?.enabled && (
<>
|
respawn: {respawnStatus.state.replace(/_/g, ' ')}
{respawnStatus.cycleCount > 0 && ` (${respawnStatus.cycleCount})`}
>
)}
{/* Right side: Keyboard hints */}
? help | Esc back | type to send input
);
}