Transparency: What You See in the Terminal While Tools Run
The Tool interface carries a large number of render* methods. These are the tool system's second responsibility: controlling how each tool displays itself in the UI.
// src/Tool.ts (excerpt)
renderToolUseMessage(input, options): React.ReactNode // Before execution: "what is being done"
renderToolUseProgressMessage(progressMessages, options) // During execution: progress updates
renderToolResultMessage(content, progressMessages, options) // After execution: how to show the result
renderToolUseRejectedMessage(input, options) // After rejection: why it was rejected
renderToolUseErrorMessage(result, options) // After error: how to show the error
Each tool defines its own render methods, meaning different tools have completely different visual presentations: BashTool shows terminal output, FileEditTool shows a diff, AgentTool shows the sub-agent's own independent session stream.
There is a special flag, isTransparentWrapper:
// src/Tool.ts
isTransparentWrapper?(): boolean
Tools marked as transparent wrappers (e.g. REPLTool) don't display anything themselves — each of their internal calls renders in its "native" appearance, as if Claude called that internal tool directly.