getStats method

Get aggregate stats across all conversations.

Implementation

Future<ConversationStats> getStats() async {
  final conversations = await listConversations();

  final toolCounts = <String, int>{};
  final modelCounts = <String, int>{};

  for (final conv in conversations) {
    for (final tool in conv.toolsUsed) {
      toolCounts[tool] = (toolCounts[tool] ?? 0) + 1;
    }
    modelCounts[conv.model] = (modelCounts[conv.model] ?? 0) + 1;
  }

  final totalMessages = conversations.fold(
    0,
    (sum, c) => sum + c.messageCount,
  );
  final totalCost = conversations.fold(0.0, (sum, c) => sum + c.totalCost);

  return ConversationStats(
    totalSessions: conversations.length,
    totalMessages: totalMessages,
    totalTokens: conversations.fold(
      0,
      (sum, c) => sum + c.totalInputTokens + c.totalOutputTokens,
    ),
    totalCost: totalCost,
    totalDuration: conversations.fold(
      Duration.zero,
      (sum, c) => sum + c.lastActiveAt.difference(c.startedAt),
    ),
    toolUsageCounts: toolCounts,
    modelUsageCounts: modelCounts,
    averageMessagesPerSession: conversations.isEmpty
        ? 0
        : totalMessages ~/ conversations.length,
    averageCostPerSession: conversations.isEmpty
        ? 0.0
        : totalCost / conversations.length,
  );
}