# Changelog All notable changes to this project are documented in this file. Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [1.1.0] - 2026-08-29 ### Added - Surface ①: input-box image preview row (standard DSH slot `conversation.input.dock`; reads the composer draft, zero event listeners; no path → zero layout) - Surface ②: image display in sent user-message bubbles (conservative client DOM post-processing; onerror restores the path text — worst case is the image not appearing) - Settings card in the DSH settings UI (`settings.plugin.item`): display size tiers + add/remove extra whitelist roots (`extraRoots`) - Multi-root whitelist: default roots = session workspace + DSH paste root (`os.tmpdir()/modlens-dsh-paste`), plus user-added roots; failed roots silently skipped - Display size tiers: small 320×240 / medium 640×420 (default) / large 960×600 (CSS caps, aspect preserved, no thumbnail files) - `GET /plugins/dsh-tu4-inline-images/state` same-origin route serving the token to the client half - 4-stage security self-audit record (`docs/SELF-AUDIT.md`) ### Changed - **Removed the `TU4_INLINE_ALLOWED_ROOT` environment variable** — non-standard install surface replaced by the standard DSH settings namespace (whitelist roots now survive directory/workspace changes by design) - `path-guard` generalized from single-root to multi-root realpath containment - `llm/stream` rewrite now resolves roots dynamically (hot updates: added roots take effect immediately; size tier re-registers the index CSS) ### Notes - 1.0.0 behavior (surface ③, default medium tier 640×420) is preserved — no regression. ## [1.0.0] - 2026-08-28 ### Added - Initial release: surface ③ — LLM output local image paths rendered inline (loopback route + strong token + workspace single-root whitelist + display-size CSS via `tapIndex`) - Path guard: sanitize → realpath → whitelist containment (blocks `..` traversal and symlink/junction escape) → regular-file stat → byte limit - Build-time security gate (`test/gate.mjs`): zero URL literals, zero `Math.random`, zero install-type lifecycle scripts, zero external-endpoint residue - 38 unit tests (guard / handler / stream rewrite / style)