Skip to content

feat(stats): 增强stats能力,支持跨session的全局用量统计,参考Claude Code #4597

@BenGuanRan

Description

@BenGuanRan

What would you like to be added?

增强 /stats 命令,支持跨会话的持久化用量追踪和交互式全屏仪表盘,对标 Claude Code 的 stats 体验。

当前行为

  • /stats 仅展示当前会话的指标(token、工具调用、时长)
  • CLI 退出后所有数据丢失(仅存在于内存中的 uiTelemetryService
  • 无法查看历史趋势或跨会话的聚合用量

期望行为

1. 用量持久化

会话退出时自动将用量摘要追加写入 ~/.qwen/usage-history.jsonl,包含:

  • 按模型的 token 明细(input/output/cached/thoughts)
  • 工具调用汇总
  • 文件变更统计(增/删行数)
  • 会话时长与项目路径

2. 交互式 /stats 仪表盘

交互模式下将 /stats 升级为全屏 Dialog,包含:

  • Overview 标签页:GitHub 风格活动热力图(·░▒▓█)、会话数、活跃天数、连续活跃天数、最长会话、常用模型
  • Models 标签页:ASCII 每日 token 折线图、按模型占比展示 In/Out 明细及费用估算
  • 日期范围切换:按 r 在 All time / Last 7 days / Last 30 days 之间循环
  • 标签页导航Tab/Shift+Tab 切换 Overview 和 Models

3. Report 子命令

/stats report [today|week|month|all] 输出内联文本报告,/stats report export [json|csv] 导出文件。

4. 非交互模式兼容

headless 模式(-p)下 /stats 仍返回纯文本的当前会话统计,行为不变。

Why is this needed?

对于日常使用 CLI 编程助手的用户,了解 token 消耗模式至关重要:

  1. 成本感知 — 用户无法看到跨会话的累计开销。单次会话看起来便宜,但按天/周聚合后才能看到真实花费。
  2. 用量优化 — 了解哪些模型消耗最多 token、缓存命中率随时间的变化、哪些项目最活跃,有助于用户优化工作流。
  3. 使用趋势 — 连续活跃天数、活跃天数占比、会话趋势等指标让用户直观感受自己的使用模式,类似 GitHub 贡献图。
  4. 团队管理 — 共享 API Key 的团队需要按项目的用量明细来分摊成本。

Claude Code 已经提供了包含热力图、图表和日期过滤的交互式 stats 页面,Qwen Code 应该提供同等或更好的用量可视化能力。

Additional context

参考:Claude Code 的 stats 界面

Claude Code 的 /stats 渲染一个交互式全屏面板,包含:

  • 贡献热力图日历
  • 标签页切换(Overview / Models),支持键盘操作
  • 每日 token 折线图
  • 日期范围循环(All time / Last 7 days / Last 30 days)
  • 趣味统计(最长会话、连续天数、趣味对比)
  • 按模型占比的 token 明细

实现思路

  • 持久化使用追加写入 JSONL(复用已有的 jsonl-utils.ts 中的 writeLineSync),保证崩溃安全
  • Dialog 遵循已有的 Help/MCP/Hooks 对话框模式(通过 DialogManager 全屏接管)
  • 热力图使用 Unicode 方块字符渲染;折线图使用 box-drawing 字符
  • 已有子命令(/stats model/stats tools)保持不变,仍为内联面板
  • 数据聚合复用 /insight 流水线中的 streak 计算逻辑
Image

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions