extracted responsibilities from Program.cs (208→46 lines) and ReplLoop.cs (274→174 lines) into focused service classes: HeaderRenderer, SessionManager, ApplicationStartup, ResponseStreamer, SpinnerService, UsageDisplayer, and ContextCompactionService. Each class now has a single, well-defined responsibility, improving testability and maintainability.
49 lines
1.4 KiB
C#
49 lines
1.4 KiB
C#
using Spectre.Console;
|
|
|
|
namespace AnchorCli.OpenRouter;
|
|
|
|
/// <summary>
|
|
/// Displays token usage and cost information to the console.
|
|
/// </summary>
|
|
internal sealed class UsageDisplayer
|
|
{
|
|
private readonly TokenTracker _tokenTracker;
|
|
|
|
public UsageDisplayer(TokenTracker tokenTracker)
|
|
{
|
|
_tokenTracker = tokenTracker;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Displays the usage statistics for a single response.
|
|
/// </summary>
|
|
public void Display(int inputTokens, int outputTokens)
|
|
{
|
|
if (inputTokens > 0 || outputTokens > 0)
|
|
{
|
|
_tokenTracker.AddUsage(inputTokens, outputTokens);
|
|
var cost = _tokenTracker.CalculateCost(inputTokens, outputTokens);
|
|
var ctxPct = _tokenTracker.ContextUsagePercent;
|
|
|
|
AnsiConsole.WriteLine();
|
|
AnsiConsole.MarkupLine(
|
|
$"[dim grey] {TokenTracker.FormatTokens(inputTokens)}↑ {TokenTracker.FormatTokens(outputTokens)}↓" +
|
|
$" {TokenTracker.FormatCost(cost)}" +
|
|
(ctxPct >= 0 ? $" ctx:{ctxPct:F0}%" : "") +
|
|
$" │ session: {TokenTracker.FormatCost(_tokenTracker.SessionCost)}[/]");
|
|
}
|
|
else
|
|
{
|
|
AnsiConsole.WriteLine();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Displays a rule separator.
|
|
/// </summary>
|
|
public void DisplaySeparator()
|
|
{
|
|
AnsiConsole.Write(new Rule().RuleStyle(Style.Parse("grey dim")));
|
|
}
|
|
}
|