Changes in version 0.0.9 (2026-10-14) - retro_color_rgb() and retro_color_rgba() now parse each color with grDevices::col2rgb() and re-format it with grDevices::rgb(), instead of slicing and concatenating the string. magick::image_raster() returns color specifications rather than guaranteed hex, and for a fully transparent pixel it returns the name "transparent", which the old string handling turned into the invalid "transpa" and "transpaff". The 0.0.8 fix addressed this by flattening at the entry point, but several internal steps build images from character matrices and never pass through retro_image_png(), so the error persisted on platforms whose ImageMagick build retains an alpha channel. Fixing the helpers themselves covers every path. Output is unchanged for hex input. - Clarify in retro_image_png() that flattening onto white is what makes a partially transparent source image tractable: the blend a reader sees is the color to digitize, so compositing is not interchangeable with discarding the alpha channel. Changes in version 0.0.8 - retro_image_png() now flattens the source image onto an opaque white background, and retro_agent_class$register() routes every format through it instead of copying PNG files verbatim. magick::image_raster() reports a fully transparent pixel as the color name "transparent" rather than as hex, which retro_color_rgb() truncated to "transpa" and retro_color_rgba() extended to "transpaff", both invalid color names that stopped the pipeline. Removing the alpha channel once at the entry point means no later step encounters a non-hex pixel value. Changes in version 0.0.7 - Collapse tool call cards in retro_app() by default instead of expanding them. - Top-align and left-align the Step 2 greeting in retro_app() instead of centering it vertically. Changes in version 0.0.6 - Fix the cancel button in retro_app(): the chat turn now runs in a shiny::ExtendedTask, so a cancel click can actually reach stream_controller() and stop the stream instead of being processed only after the response already finished. Since the tools now run outside a reactive context, they read state via shiny::isolate(). - retro_chat_replay_simulation()$stream_async() now returns a promise instead of the finished text. A finished string is not a stream, so retro_app() rendered the replay as an already-complete message and the stop button never appeared. - Give retro_app() a theme argument for bslib theming, and put a light/dark mode toggle in the top right of the main panel. - Add a preload hint for shinychat's JS and CSS bundle in retro_app(), so the browser starts fetching it in parallel with other blocking