* feat(providers): render images Claude Code emits instead of base64 Claude returns images as base64 blocks inside tool_result content; they were dumped into the tool output as a wall of raw base64 text. Materialize them to a temp file and emit an assistant_message markdown image — the path Codex already uses — so the client fetches the bytes over the existing WebSocket binary-frame channel. No protocol or client change; assistant_message is an existing type. Also strips the base64 out of the failed-tool-call error field, and widens the Claude history-replay filter so the image survives reload. Collapses the image writer Codex had duplicated twice into one shared materializeProviderImage. * fix(providers): match only materialized image paths in the history filter The history-replay filter recognized a provider image by a leading "
