Skip to content

feat(ccrunner): 调研并完善 CCRunner 事件类型系统 #63

@hrygo

Description

@hrygo

🎯 目标

深入调研 Claude Code CLI 的 stream-json 输出格式,完善 CCRunner 事件类型系统,确保所有 CLI 事件都被正确处理和展示。

📊 当前状态分析

已实现的事件类型

事件类型 后端处理 前端显示 状态
thinking 完整
tool_use 完整
tool_result 完整
answer 完整
error 完整
session_stats 后端已支持,前端未实现
system ✅ (静默) - 控制消息,无需前端
result 已提取统计,前端未展示

前端缺失

  • session_stats 事件未在前端 StreamEvent 类型中定义
  • EventBadge.tsx 不包含 session_stats 配置
  • useEventStream.ts 不处理 session_stats 事件
  • 前端无法显示会话完成后的统计信息(成本、token、耗时)

🔍 待调研问题

1. CLI 事件类型完整性

通过实际 CLI 测试验证:

  • Claude Code CLI v2.1.15 完整的事件类型列表
  • 是否有其他未处理的事件类型?
  • status 消息类型的用途和处理方式
  • progress 或其他进度相关事件

2. 事件元数据

  • CLI 返回的 modelUsage 详细结构
  • permission_denials 事件的处理
  • 事件时间戳的统一处理

3. 前端展示

  • 设计会话统计面板 UI(成本、token、耗时)
  • 添加 session_statsEventBadge 配置
  • 更新 useEventStream 处理统计事件

🛠️ 实施计划

Phase 1: 事件类型调研 (高优先级)

# 测试 CLI 完整输出
echo "测试各种操作" | claude --print --verbose --output-format stream-json --session-id <uuid>

输出包含:

  • system - 初始化
  • assistant - 响应(含嵌套 tool_use)
  • user - 工具结果(含嵌套 tool_result)
  • result - 完成统计
  • 是否有其他类型?

Phase 2: 前端完善

  1. 扩展 StreamEvent 类型
  2. 添加 session_statsEventBadge
  3. 创建 SessionSummaryPanel 组件
  4. 更新 useEventStream 处理逻辑

Phase 3: 数据持久化

  • 创建 cc_session_stats 表存储历史会话数据
  • 实现成本追踪和预算告警

📁 相关文件

  • ai/agent/cc_runner.go - 事件处理逻辑
  • ai/agent/types.go - 事件类型定义
  • server/router/api/v1/ai/handler.go - 事件适配器
  • web/src/components/AIChat/EventBadge.tsx - 事件徽章
  • web/src/components/AIChat/hooks/useEventStream.ts - 事件流 Hook
  • docs/research/cc-runner-message-handling-research.md - 已完成调研

🔗 参考文档


预期成果:

  1. 完整的 CLI 事件类型清单
  2. 前端能展示所有事件(包括会话统计)
  3. 为后续数据持久化打好基础

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions