feat: add usage command (#281)

This commit is contained in:
cthomas
2025-12-17 19:48:04 -08:00
committed by GitHub
parent fb6fecddf8
commit b9e52d20e8
5 changed files with 145 additions and 48 deletions

View File

@@ -1,12 +1,6 @@
import { Box, Text } from "ink";
import type { SessionStatsSnapshot } from "../../agent/stats";
interface SessionStatsProps {
stats: SessionStatsSnapshot;
agentId?: string;
}
function formatDuration(ms: number): string {
export function formatDuration(ms: number): string {
if (ms < 1000) {
return `${Math.round(ms)}ms`;
}
@@ -25,25 +19,43 @@ function formatDuration(ms: number): string {
return `${(ms / 1000).toFixed(1)}s`;
}
function formatNumber(n: number): string {
export function formatNumber(n: number): string {
return n.toLocaleString();
}
export function SessionStats({ stats, agentId }: SessionStatsProps) {
const wallDuration = formatDuration(stats.totalWallMs);
const apiDuration = formatDuration(stats.totalApiMs);
const steps = stats.usage.stepCount;
const inputTokens = formatNumber(stats.usage.promptTokens);
const outputTokens = formatNumber(stats.usage.completionTokens);
return (
<Box flexDirection="column" paddingTop={1}>
<Text dimColor>Total duration (API): {apiDuration}</Text>
<Text dimColor>Total duration (wall): {wallDuration}</Text>
<Text dimColor>
Usage: {steps} steps · {inputTokens} input · {outputTokens} output
</Text>
{agentId && <Text dimColor>Agent ID: {agentId}</Text>}
</Box>
);
interface BalanceInfo {
total_balance: number;
monthly_credit_balance: number;
purchased_credit_balance: number;
billing_tier: string;
}
interface FormatUsageStatsOptions {
stats: SessionStatsSnapshot;
balance?: BalanceInfo;
}
/**
* Format usage statistics as markdown text for display in CommandMessage
*/
export function formatUsageStats({
stats,
balance,
}: FormatUsageStatsOptions): string {
const outputLines = [
`Total duration (API): ${formatDuration(stats.totalApiMs)}`,
`Total duration (wall): ${formatDuration(stats.totalWallMs)}`,
`Session usage: ${stats.usage.stepCount} steps, ${formatNumber(stats.usage.promptTokens)} input, ${formatNumber(stats.usage.completionTokens)} output`,
"",
];
if (balance) {
outputLines.push(
`Available credits: $${balance.total_balance.toFixed(2)} Plan: [${balance.billing_tier}]`,
` Monthly credits: $${balance.monthly_credit_balance.toFixed(2)}`,
` Purchased credits: $${balance.purchased_credit_balance.toFixed(2)}`,
);
}
return outputLines.join("\n");
}