背景
当前 Agent 看板(/health,AgentHealthPage)的数据来源是 扫描 /proc 目录发现当前运行中的进程(HealthChecker → AgentScanner::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.rs → get_agent_health()(读 HealthStore 内存)
- GenAI 查询:
src/storage/sqlite/genai/session.rs → list_agent_names()
- 轨迹查询:
crates/agentsight-trajectory-collector/src/store.rs → list_filters()
- 前端页面:
dashboard/src/pages/AgentHealthPage.tsx
- 前端 API:
dashboard/src/utils/apiClient.ts → fetchAgentHealth()
修改建议
改造 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"
}
]
}
实现步骤:
- 在
GenAISqliteStore 中新增聚合查询(按 agent_name 统计 last_seen、total_calls、total_tokens)
- 合并
TrajectoryStore 中的 agent_name(已有 list_filters(),可扩展为带统计的查询)
- 改造
get_agent_health() handler,数据源从 HealthStore 内存改为 SQLite 查询
- 前端
AgentHealthPage 适配新的响应结构
验收标准
参考
- 已有 SQLite 查询模式:
list_agent_names()、get_agent_token_summary()
- 轨迹 filters:
TrajectoryStore::list_filters()
- 前端分组逻辑:
AgentHealthPage.tsx → groupAgentsByName()
- Footprint Ladder:本 issue 属于 级别 1-2(扩展现有 handler + store 方法),无需新模块
背景
当前 Agent 看板(
/health,AgentHealthPage)的数据来源是 扫描/proc目录发现当前运行中的进程(HealthChecker→AgentScanner::scan())。这导致:期望行为
Agent 看板的 Agent 列表从 SQLite 数据库查询,展示所有曾被采集到的 Agent:
/proc进程扫描 → SQLite 查询(genai_events.db+trajectories.db)agent_name,无论当前是否在运行当前实现
现有数据流(需要改变)
可用的 SQLite 数据源
genai_events.db(eBPF 采集)list_agent_names()— distinct agent_nametrajectories.db(文件扫描采集)list_filters()— distinct agent_name关键代码
src/server/handlers.rs→get_agent_health()(读HealthStore内存)src/storage/sqlite/genai/session.rs→list_agent_names()crates/agentsight-trajectory-collector/src/store.rs→list_filters()dashboard/src/pages/AgentHealthPage.tsxdashboard/src/utils/apiClient.ts→fetchAgentHealth()修改建议
改造
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" } ] }实现步骤:
GenAISqliteStore中新增聚合查询(按agent_name统计 last_seen、total_calls、total_tokens)TrajectoryStore中的 agent_name(已有list_filters(),可扩展为带统计的查询)get_agent_health()handler,数据源从HealthStore内存改为 SQLite 查询AgentHealthPage适配新的响应结构验收标准
genai_events.db+trajectories.db),而非/proc扫描cargo fmt+cargo clippy --all-targets -- -D warnings+cargo test通过cd dashboard && npm run build:embed)参考
list_agent_names()、get_agent_token_summary()TrajectoryStore::list_filters()AgentHealthPage.tsx→groupAgentsByName()