Files
agent-wiki-ui/docs/adr/0006-immagini-nel-markdown.md
T
davideandClaude Sonnet 5.5 15c664007d Immagini nel markdown da file locale e struttura src/tests
Il renderer mostra le immagini ![alt](percorso) da file locali (ADR-0006):
segnaposto [alt] e decodifica in background, ripiego sul testo per URL,
file mancanti, corrotti o troppo grandi. Nessuna richiesta di rete.

Primo progetto di test (xUnit v3 + Avalonia Headless, MD-14 e MD-19…MD-27).
Il codice passa in src/agent-wiki-ui/, c'è la soluzione agent-wiki-ui.slnx;
aggiornati script di publish, comandi e link nei documenti.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 15:22:39 +02:00

4.1 KiB

ADR-0006 — Immagini nel markdown: solo file locali

Contesto

Il renderer markdown (Gui/MarkdownView.cs) trasforma ![alt](percorso) nel solo testo alternativo [alt]: non carica nulla. Un motore (Claude Code, Codex) può però produrre o citare un'immagine su disco (un grafico, uno screenshot) e rispondere con ![descrizione](percorso). Se il percorso è noto e il file esiste, l'utente si aspetta di vederla nella chat. Oggi l'app contatta la rete solo per il controllo delle versioni (AGENT.md, "Vincoli non ovvi"); aprire le immagini remote cambierebbe questo vincolo.

Criteri di decisione

  1. Mostrare l'immagine quando il percorso è locale e il file è leggibile.
  2. Nessun accesso alla rete oltre a quello già previsto.
  3. Nessun crash e nessun blocco della chat per file mancanti, enormi o corrotti: ripiego sul testo alternativo di oggi.
  4. Coerenza con il resto del renderer: colori dal tema, testo selezionabile, accessibilità.

Opzioni considerate

Opzione Esito Motivo
Lasciare il testo [alt] Scartata Il percorso noto resta inutilizzato.
Solo percorsi locali Scelta Soddisfa il caso d'uso, nessuna rete, sola lettura.
Locali + URL http(s) Rimandata Una risposta del modello farebbe partire richieste di rete verso indirizzi scelti dal modello (tracciamento, indirizzo IP dell'utente esposto). Si può riprendere con un nuovo ADR e un consenso esplicito.

Decisione

  • ![alt](destinazione) mostra l'immagine se la destinazione è un percorso locale: assoluto, relativo alla cartella dell'exe (AppContext.BaseDirectory, la stessa working directory dei motori) oppure un URI file://.
  • Formati: png, jpg/jpeg, gif (primo fotogramma), webp, bmp. Altre estensioni ⇒ ripiego.
  • Limiti: file fino a 20 MB; se l'immagine è più larga di 1600 px si decodifica a 1600 px di larghezza, per non occupare memoria inutile. In visualizzazione l'immagine non supera la larghezza della colonna dei messaggi (proporzioni mantenute) e non è mai ingrandita oltre l'originale.
  • Un paragrafo fatto solo di immagini le mostra come blocchi; un'immagine dentro una riga di testo (o dentro un link) è inline, con larghezza massima di 480 px.
  • Ripiego sul testo [alt] (come oggi) quando: la destinazione è http(s) o altro schema, il file manca o non è leggibile, il formato non è ammesso, il file supera il limite, la decodifica fallisce. Nessun errore a schermo, nessuna eccezione.
  • Caricamento in background: al rendering un controllo di controllo rapido e sincrono (percorso, estensione, esistenza, dimensione) decide se l'immagine è plausibile; se no, compare subito [alt]. Se sì, compare [alt] come segnaposto e la decodifica avviene su un altro thread; a fine decodifica il segnaposto diventa l'immagine, se la decodifica fallisce resta [alt]. Così la GUI non si blocca con file grandi o dischi lenti.
  • Accessibilità: l'immagine espone alt come nome per le tecnologie assistive e come suggerimento al passaggio del mouse.
  • Nessuna azione al clic (non si apre il file). Il pulsante Copia della risposta continua a copiare il markdown originale.

Conseguenze

Positive: le immagini prodotte dai motori si vedono nella chat; nessuna richiesta di rete in più; ripiego sicuro. Negative: una risposta può far leggere e mostrare un file immagine qualsiasi dell'utente (sola lettura, solo a schermo, nessun invio altrove); le immagini remote restano non supportate e si vedono come testo.

Da verificare

  • Quali formati decodifica davvero Avalonia 12 con Skia su Windows e Linux (in particolare webp e gif) e se il limite di 20 MB è adeguato.
  • Il comportamento dei percorsi Windows (C:\…, UNC) e di quelli WSL (/mnt/c/…).
  • Se i percorsi relativi vanno risolti anche rispetto a una cartella diversa da quella dell'exe.

Riferimenti