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.