task_runs.tokens_in only ever held the API's uncached "input_tokens" field (off by a factor of ~400,000 on a resumed session), and tokens_out summed only the last result event instead of the whole session. TaskRunner now reads each run's cache-read/cache-write/input/output totals from the session transcript via a new ITranscriptUsageReader.ReadSessionTotalsAsync, storing the delta against prior runs on the same session so a --resume doesn't double-count. New task_runs.cache_read_tokens/cache_write_tokens columns; the Session tab now shows the raw total (what actually counts against the 5h/7d usage limit) with a breakdown tooltip.
19 lines
833 B
C#
19 lines
833 B
C#
using ClaudeDo.Worker.Usage;
|
|
using ClaudeDo.Worker.Usage.Interfaces;
|
|
|
|
namespace ClaudeDo.Worker.Tests.Infrastructure;
|
|
|
|
public sealed class FakeTranscriptUsageReader : ITranscriptUsageReader
|
|
{
|
|
private readonly Dictionary<string, SessionUsageTotals> _totalsBySession = new();
|
|
|
|
public void SetTotals(string sessionId, SessionUsageTotals totals) => _totalsBySession[sessionId] = totals;
|
|
|
|
public Task<IReadOnlyList<UsageAggregateRow>> ReadAsync(
|
|
DateOnly start, DateOnly end, CancellationToken ct = default) =>
|
|
Task.FromResult<IReadOnlyList<UsageAggregateRow>>(Array.Empty<UsageAggregateRow>());
|
|
|
|
public Task<SessionUsageTotals?> ReadSessionTotalsAsync(string sessionId, CancellationToken ct = default) =>
|
|
Task.FromResult(_totalsBySession.TryGetValue(sessionId, out var totals) ? totals : null);
|
|
}
|