mirror of
https://github.com/chenhg5/cc-connect.git
synced 2026-07-03 12:28:10 +08:00
* fix(claudecode): emit EventToolResult so tool output reaches progress card
## 背景
cc-connect 的飞书卡片(以及其他平台的 progress card)渲染工具结果
依赖 engine 收到 EventToolResult 事件。engine.go:4745 的 case
EventToolResult 会调用 formatProgressToolResult / cp.AppendEvent
把工具输出渲染到卡片。
## 问题
agent/claudecode/session.go 的 handleUser 函数处理 stream-json
里的 tool_result content block 时,原本只做了一件事:
if isError { slog.Debug("claudeSession: tool error", ...) }
也就是 **error 情况只记日志,正常情况完全静默丢弃**,始终没有
emit EventToolResult 事件给 engine。
对照 agent/codex/session.go:522 case "command_execution":codex
agent 在工具完成时正确构造了 EventToolResult 事件并发送到
cs.events channel,engine 收到后才能渲染工具结果卡片。
## 用户感知的现象
- claude-multi 飞书群里调工具后,**只看到最终文字回复,看不到
工具调用面板和工具结果**
- codex-multi 飞书群里调工具后,能看到完整的 "工具调用 + 工具结果"
卡片渲染
- 两个 project 的 cc-connect 配置完全一致,差异只在 agent type
之前误以为是 stream preview / 飞书 universal card payload
(ErrCode 200800) 等问题,实际那些是次要现象 —— 真正的根因是
claudecode agent 根本没把工具结果事件转发给 engine。
## 方案
最小化修复:在 if contentType == "tool_result" 分支里,无论
isError 与否都构造 EventToolResult 事件 emit 出去。
实现细节:
- content 字段兼容两种格式:string 直接用;array of {type:"text",
text:"..."} 拼接所有 text 块(Anthropic SDK 两种格式都可能出现)
- 工具名留空:Anthropic 的 tool_result block 只带 tool_use_id 不
带工具名,反查 id→name 映射需要额外缓存且容易出错。视觉上工具
调用面板和结果面板按顺序排列,用户能自行配对,因此留空可接受
(飞书 buildToolDisplay 对空名 fallback 显示为 "Tool")
- exit code: isError → 1, 否则 0;success: !isError
- 复用包内已有的 truncateStr 截断到 500 字符(与 codex agent 一致)
## 影响范围
- 只改 agent/claudecode/session.go 一处(handleUser 函数)
- 不影响 codex / gemini / opencode 等其他 agent
- 不影响 engine 及下游渲染逻辑(只是补上之前缺失的事件源)
* test(claudecode): regression test for EventToolResult emit