feat: v0.2.0 — API REST, TTS support, documentazione completa e UI mobile-first

✨ Nuove funzionalità:
- Nuovo endpoint API REST /api/v1/query (GET+POST) per consumo programmatico
- Campo speakable_text ottimizzato per sintesi vocale (Alexa, Google Home)
- Funzione strip_markdown() per conversione Markdown → plain text TTS
- Supporto CORS per accesso cross-origin
- UI responsive mobile-first con micro-interazioni e stati
- Nuovo pulsante 'Nuova ricerca' e metadata bar

📚 Documentazione completa:
- docs/ARCHITECTURE.md — architettura di sistema, stack, componenti
- docs/FLOW.md — diagrammi Mermaid della pipeline e flussi
- docs/API.md — documentazione endpoint REST con esempi curl
- docs/WIKI.md — FAQ, glossario, roadmap
- docs/DEPLOYMENT.md — guida deployment (Gunicorn, Nginx, Docker, systemd)
- docs/CONTRIBUTING.md — guida alla contribuzione

🔧 Migliorie tecniche:
- Pipeline di ricerca condivisa in _run_search_pipeline()
- Gestione errori Gemini migliorata con _clean_error()
- Sanitizzazione HTML con allowlist per prevenzione XSS
- .env.example completo con commenti

🧪 Test: 109/109 passati
This commit is contained in:
Sibilla committed 2026-07-18 10:05:46 +00:00
1 parent f3fe13c60e
commit 76bc667adf
20 files changed
+3385 -245

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
<defs>
<!-- Background gradient: deep indigo to purple -->
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#312E81"/>
<stop offset="50%" stop-color="#4F46E5"/>
<stop offset="100%" stop-color="#7C3AED"/>
</linearGradient>
<!-- Glow for the eye -->
<radialGradient id="eyeGlow" cx="0.45" cy="0.4" r="0.55">
<stop offset="0%" stop-color="#FFFFFF"/>
<stop offset="60%" stop-color="#E0E7FF"/>
<stop offset="100%" stop-color="#A5B4FC"/>
</radialGradient>
<!-- Pupil gradient -->
<radialGradient id="pupil" cx="0.4" cy="0.35" r="0.5">
<stop offset="0%" stop-color="#1E1B4B"/>
<stop offset="100%" stop-color="#0F0D2E"/>
</radialGradient>
<!-- Subtle shadow -->
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="0" stdDeviation="2" flood-color="#1E1B4B" flood-opacity="0.5"/>
</filter>
</defs>
<!-- Base circle -->
<circle cx="32" cy="32" r="30" fill="url(#bg)" filter="url(#shadow)"/>
<!-- Outer ring -->
<circle cx="32" cy="32" r="28" fill="none" stroke="#A5B4FC" stroke-width="0.8" opacity="0.5"/>
<circle cx="32" cy="32" r="25" fill="none" stroke="#C7D2FE" stroke-width="0.5" opacity="0.25"/>
<!-- Eye shape (almond) -->
<ellipse cx="32" cy="31" rx="14" ry="10" fill="url(#eyeGlow)" opacity="0.95"/>
<!-- Upper eyelid arc -->
<path d="M18 30 Q32 18 46 30" fill="none" stroke="#312E81" stroke-width="1.5" stroke-linecap="round" opacity="0.8"/>
<!-- Lower lid hint -->
<path d="M20 33 Q32 42 44 33" fill="none" stroke="#312E81" stroke-width="0.8" stroke-linecap="round" opacity="0.4"/>
<!-- Pupil -->
<circle cx="32" cy="31" r="5.5" fill="url(#pupil)"/>
<!-- Pupil highlight / sparkle -->
<circle cx="30" cy="29" r="1.8" fill="#FFFFFF" opacity="0.85"/>
<circle cx="34" cy="33" r="0.8" fill="#FFFFFF" opacity="0.4"/>
<!-- Small oracle sparkle in top-right -->
<g transform="translate(48, 16)" opacity="0.9">
<path d="M0 -6 L1.5 -1.5 L6 0 L1.5 1.5 L0 6 L-1.5 1.5 L-6 0 L-1.5 -1.5 Z" fill="#FDE68A"/>
<circle cx="0" cy="0" r="1" fill="#FEF3C7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB