Skip to content

feat(sight): Agent 看板数据源改为 SQLite 查询,展示所有采集到的 Agent #2735

Description

@chengshuyi

背景

当前 Agent 看板(/healthAgentHealthPage)的数据来源是 扫描 /proc 目录发现当前运行中的进程HealthCheckerAgentScanner::scan())。这导致:

  • 只能看到此刻正在运行的 Agent 进程,大量 Agent 类型缺失
  • 实际使用中经常只显示 Claude 一个卡片,Qoder、Codex、Cursor 等间歇性运行的 Agent 根本看不到
  • 看板的信息价值大打折扣——用户期望看到"这台机器上有哪些 Agent",而非"此刻哪些进程在跑"

期望行为

Agent 看板的 Agent 列表从 SQLite 数据库查询,展示所有曾被采集到的 Agent:

  • 数据源从 /proc 进程扫描 → SQLite 查询(genai_events.db + trajectories.db
  • 展示所有出现过的 agent_name,无论当前是否在运行
  • 每个 Agent 显示最后活跃时间、累计调用量等统计信息

当前实现

现有数据流(需要改变)

/proc 扫描 → AgentScanner::scan() → HealthChecker → HealthStore(内存)→ GET /api/agent-health → 前端

可用的 SQLite 数据源

数据库 已有查询 覆盖的 Agent
genai_events.db(eBPF 采集) list_agent_names() — distinct agent_name 所有经 SSL 捕获到 LLM API 调用的 Agent
trajectories.db(文件扫描采集) list_filters() — distinct agent_name Qoder、QoderWork、Claude Code、Codex、Cursor

Qoder 等 Agent 主要通过轨迹采集入 trajectories.db,不一定在 genai_events.db 中有记录。需要合并两个库。

关键代码

  • 当前 handler: src/server/handlers.rsget_agent_health()(读 HealthStore 内存)
  • GenAI 查询: src/storage/sqlite/genai/session.rslist_agent_names()
  • 轨迹查询: crates/agentsight-trajectory-collector/src/store.rslist_filters()
  • 前端页面: dashboard/src/pages/AgentHealthPage.tsx
  • 前端 API: dashboard/src/utils/apiClient.tsfetchAgentHealth()

修改建议

改造 GET /api/agent-health 的数据源,从 SQLite 查询所有采集到的 Agent:

{
  "agents": [
    {
      "agent_name": "Claude",
      "last_seen_ns": 1724200000000000000,
      "total_calls": 512,
      "total_tokens": 2000000,
      "source": "genai_events"
    },
    {
      "agent_name": "Qoder",
      "last_seen_ns": 1724190000000000000,
      "total_calls": 128,
      "total_tokens": 500000,
      "source": "trajectories"
    }
  ]
}

实现步骤:

  1. GenAISqliteStore 中新增聚合查询(按 agent_name 统计 last_seen、total_calls、total_tokens)
  2. 合并 TrajectoryStore 中的 agent_name(已有 list_filters(),可扩展为带统计的查询)
  3. 改造 get_agent_health() handler,数据源从 HealthStore 内存改为 SQLite 查询
  4. 前端 AgentHealthPage 适配新的响应结构

验收标准

  • Agent 看板展示所有曾被采集到的 Agent(Claude、Qoder、Codex、Cursor 等)
  • 数据源为 SQLite(genai_events.db + trajectories.db),而非 /proc 扫描
  • 每个 Agent 显示最后活跃时间和基本统计
  • 无数据时(新环境)展示空状态
  • cargo fmt + cargo clippy --all-targets -- -D warnings + cargo test 通过
  • 前端构建通过(cd dashboard && npm run build:embed

参考

  • 已有 SQLite 查询模式:list_agent_names()get_agent_token_summary()
  • 轨迹 filters:TrajectoryStore::list_filters()
  • 前端分组逻辑:AgentHealthPage.tsxgroupAgentsByName()
  • Footprint Ladder:本 issue 属于 级别 1-2(扩展现有 handler + store 方法),无需新模块

Metadata

Metadata

Assignees

No one assigned

    Labels

    component:sightsrc/agentsight/good first issueApproachable for first-time contributors; scope and acceptance criteria are definedtype:enhancementA new capability or improvement request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions