56 lines
3.7 KiB
Markdown
56 lines
3.7 KiB
Markdown
# #80 — Assistant IA — Rendu Markdown, liens de fichiers/paths & sessions
|
|
|
|
> **Statut :** ✅ Livré (validé)
|
|
> **Effort :** 1-2 jours | **Impact :** 🟡
|
|
> **Références :** [Roadmap](../ROADMAP.md) · [BooksLM #76](./bookslm.md) · [Outils IA #79](./ai-tools-mcp.md) · [Changelog](../../CHANGELOG.md)
|
|
|
|
- **Description :** Trois améliorations d'expérience de l'assistant IA (`frontend/js/bookslm.js`) :
|
|
1. **Rendu Markdown** des réponses de l'assistant (titres, listes, tableaux, citations, blocs de
|
|
code, emphase) au lieu d'un rendu texte approximatif.
|
|
2. **Liens cliquables** : les noms de fichiers et chemins mentionnés par l'assistant deviennent
|
|
des liens — clic sur un **fichier** → ouverture dans le viewer ; clic sur un **répertoire** →
|
|
révélation et surlignage dans l'arborescence (outil `reveal_in_tree`).
|
|
3. **Gestion des sessions** : chaque contexte (répertoire / documents / général) conserve un
|
|
**historique de sessions** consultable, rechargeable et supprimable.
|
|
|
|
## A. Rendu Markdown — ✅ livré
|
|
- [x] **A1.** Renderer auto-contenu (aucune dépendance externe) : titres `#`→`######`, listes
|
|
ordonnées/non ordonnées (imbriquées), listes de tâches, tableaux, citations `>`, règles
|
|
horizontales, blocs de code clôturés avec langage, code inline, gras/italique/barré, liens.
|
|
- [x] **A2.** Échappement HTML systématique avant génération de balises (anti-injection) ;
|
|
seules les balises produites par le renderer sont injectées.
|
|
- [x] **A3.** Styles dédiés dans `frontend/style.css` (`.bookslm-bubble.assistant ...`).
|
|
|
|
## B. Liens fichiers / chemins — ✅ livré
|
|
- [x] **B1.** Détection des mentions : code inline (`` `notes/a.md` ``), liens Markdown
|
|
`[libellé](chemin)` et chemins nus `dossier/fichier.ext`.
|
|
- [x] **B2.** Classification `file` (extension connue) vs `dir` (le reste) via `_classifyPath()`.
|
|
- [x] **B3.** Clic fichier → `Viewer.openFile()` (événement `obsigate:open-file` également émis) puis
|
|
repositionnement de l'indicateur dans l'arborescence ; clic répertoire → `focusPathInSidebar()`
|
|
(`obsigate:reveal-in-tree`).
|
|
- [x] **B4.** Résolution du vault : vault du contexte, sinon premier document ouvert, sinon
|
|
`state.currentVault`. Lien externe `http(s)` conservé tel quel.
|
|
|
|
## C. Gestion des sessions — ✅ livré
|
|
- [x] **C1.** Stockage `bookslm-sessions-{mode}-{contexte}` (localStorage) : liste de sessions
|
|
`{id, title, createdAt, updatedAt, messages}`.
|
|
- [x] **C2.** Migration automatique de l'ancienne clé mono-conversation
|
|
`bookslm-history-{mode}-{contexte}`.
|
|
- [x] **C3.** Bouton « Historique » dans l'en-tête → menu listant les sessions (titre dérivé du
|
|
1er message utilisateur + date), sélection pour recharger, bouton de suppression.
|
|
- [x] **C4.** `Nouvelle conversation` crée une session ; `_saveHistory()` met à jour la session
|
|
courante (upsert) et son titre.
|
|
|
|
## D. Tests & documentation — ✅ livré
|
|
- [x] **D1.** `tests/frontend/ai.test.mjs` : rendu Markdown, échappement HTML, liens fichier/dossier,
|
|
clic sur lien, persistance/rechargement/suppression de session, menu d'historique, migration.
|
|
- [x] **D2.** i18n FR/EN (`bookslm.session_history`, `bookslm.session_delete`, `bookslm.history_empty`,
|
|
`bookslm.untitled`, `bookslm.no_vault`).
|
|
- [x] **D3.** CHANGELOG + Roadmap.
|
|
|
|
## E. Points d'attention
|
|
- Le renderer est volontairement **autonome** (pas de CDN) pour rester disponible hors-ligne et
|
|
compatible PWA. Il ne couvre pas les extensions Markdown d'Obsidian (wikilinks, callouts).
|
|
- Les liens de chemin utilisent `data-kind` pour distinguer fichier/répertoire ; le vault est
|
|
résolu au moment du clic (pas stocké dans le HTML).
|