透明展示:工具执行时,用户在终端能看到什么
Tool 接口上有大量 render* 方法,这些是工具系统的第二个职责:控制自己在界面上怎么显示。
// src/Tool.ts(节选)
renderToolUseMessage(input, options): React.ReactNode // 执行前:显示"正在执行什么"
renderToolUseProgressMessage(progressMessages, options) // 执行中:进度更新
renderToolResultMessage(content, progressMessages, options) // 执行后:结果如何展示
renderToolUseRejectedMessage(input, options) // 被拒绝后:为什么拒绝
renderToolUseErrorMessage(result, options) // 出错后:错误怎么展示
每个工具自己定义这些渲染方法,意味着不同工具有完全不同的视觉呈现:BashTool 显示命令行输出,FileEditTool 显示 diff,AgentTool 显示子 Agent 的独立会话流。
有一个特殊标记 isTransparentWrapper:
// src/Tool.ts
isTransparentWrapper?(): boolean
标记为透明包装器的工具(例如 REPLTool)本身不显示任何内容——它的每个内部调用都渲染成"原生"样子,就像 Claude 直接调用了那个内部工具。