feat: add usage command (#281)
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user