feat(ai): rendu Markdown, liens fichiers/paths et sessions (#80)
CI / lint (push) Successful in 57s
CI / security (push) Successful in 43s
CI / test (push) Successful in 1m14s
CI / build (push) Successful in 37s
CI / e2e (push) Successful in 10m36s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s

Assistant IA (BooksLM) :

- renderer Markdown complet (titres, listes, tableaux, citations, code) avec echappement HTML

- mentions fichiers/paths cliquables : ouverture du fichier / revelation dans l'arborescence

- gestion multi-sessions par contexte (historique, rechargement, suppression, migration)

- i18n FR/EN, aide in-app, styles, tests frontend (24)
This commit is contained in:
2026-09-11 16:14:21 -04:00
parent 240fd8586e
commit c55e3e0cbc
11 changed files with 906 additions and 36 deletions
+12 -1
View File
@@ -54,6 +54,16 @@
- [ ] **F.** Durcissement (rate limiting, redaction secrets, OpenAPI + guide MCP, E2E)
- **Documentation :** [AI_ARCHITECTURE_GUIDE.md](./AI_ARCHITECTURE_GUIDE.md) (architecture, catalogue d'outils, sécurité, phases).
### 80. Assistant IA — Rendu Markdown, liens fichiers/paths & sessions
- **Effort :** 1-2 jours | **Impact :** 🟡
- **Statut :** livré (en attente de vérification utilisateur). Détail complet : [features/ai-assistant-ux.md](./features/ai-assistant-ux.md)
- **Description :** Réponses de l'assistant rendues en **Markdown formaté** (titres, listes, tableaux,
citations, code) ; les **fichiers et chemins** mentionnés deviennent des liens cliquables (ouvrir
le fichier / révéler le répertoire dans l'arborescence) ; **gestion des sessions** (historique
consultable, rechargeable et supprimable par contexte).
- **Reste à faire :** validation utilisateur.
---
## ⚪ Backlog — Priorité 3 (P3)
@@ -162,6 +172,7 @@
| 76 | BooksLM — Console AI contextuelle par répertoire | 2.2.0 | [features/bookslm.md](./features/bookslm.md) |
| 78 | Éditeur Excalidraw | 2.2.0 | [features/excalidraw.md](./features/excalidraw.md) |
| 77 | Application Desktop native — Tauri | 🔵 en cours | [features/desktop-tauri.md](./features/desktop-tauri.md) |
| 80 | Assistant IA — Rendu Markdown, liens fichiers/paths & sessions | 🔵 en cours | [features/ai-assistant-ux.md](./features/ai-assistant-ux.md) |
---
@@ -171,7 +182,7 @@
|---|---|---|
| ✅ Complété | #1 → #59, #61, #63–68, #71, #72, #74–76, #78 | ~82 jours réalisés |
| 🔵 P2 restant | #77 Desktop : signature code (optionnel), wizard 1er lancement (optionnel), 6 tests E2E **manuels** | ~1-2 jours |
| ⚪ P3 restant | #62 Collaboration Yjs (5-7j) · #79 Assistant IA outils + MCP (10-15j, Phase 0 + G livrés) | ~15-22 jours |
| ⚪ P3 restant | #62 Collaboration Yjs (5-7j) · #79 Assistant IA outils + MCP (10-15j, Phase 0 + G livrés) · #80 Assistant IA UX (livré, en attente vérif) | ~15-22 jours |
| ⚪ P4 restant | #69 Mobile éditeur (2-3j) · #70 Sémantique (4-5j) · #73 Sync (6-8j) | 11-16 jours |
| **Total restant** | **6 items + finitions** | **~27-39 jours** |
+55
View File
@@ -0,0 +1,55 @@
# #80 — Assistant IA — Rendu Markdown, liens de fichiers/paths & sessions
> **Statut :** 🔵 Livré (en attente de vérification utilisateur)
> **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).
+2 -2
View File
@@ -1,6 +1,6 @@
# #79 — Assistant IA — Outils (function calling) & serveur MCP
> **Statut :** 🔵 En cours — Phase 0 + B1/B2/B3/B7 + G livrés (2026-09-11)
> **Statut :** 🔵 En cours — Phase 0 + B1/B2/B3/B6/B7 + G livrés (2026-09-11)
> **Effort :** 10-15 jours | **Impact :** 🟡
> **Références :** [Roadmap](../ROADMAP.md) · [Guide d'architecture IA](../AI_ARCHITECTURE_GUIDE.md)
@@ -20,7 +20,7 @@
- [x] **B3.** Fallback : retry sans `tools` si le provider rejette les tools (400/404/422) → chat simple ; protocole texte `obsigate-action` conservé côté frontend
- [ ] **B4.** SSE réellement streaming (corriger `bookslm_routes.py` — le message final reste envoyé en un seul événement)
- [ ] **B5.** Confirmations UI : outils `read` auto, outils `write` via carte Apply (`bookslm.js:515`), aperçu diff pour `edit_file`
- [ ] **B6.** Outils de navigation in-app : `open_file`, `reveal_in_tree` (événement `obsigate:open-file`)
- [x] **B6.** Outils de navigation in-app : `open_file`, `reveal_in_tree` (événement `obsigate:open-file`) — livré via les liens cliquables de l'assistant (#80, [ai-assistant-ux.md](./ai-assistant-ux.md))
- [x] **B7.** Tests : agent loop LLM mocké (`tests/test_agent_loop.py`), providers (`tests/test_ai_chat.py`), endpoint (`tests/test_bookslm.py`)
## C. Catalogue d'outils — lecture & recherche (1-2 jours)
+3
View File
@@ -4,6 +4,9 @@
> **Effort :** 5-6 jours (réalisé) | **Impact :** 🟡
> **Références :** [Roadmap](../ROADMAP.md) · [Changelog — 2.2.0](../../CHANGELOG.md)
> **Extension (#80, 2026-09-11) :** rendu Markdown complet des réponses, liens cliquables
> fichiers/chemins et gestion multi-sessions — voir [ai-assistant-ux.md](./ai-assistant-ux.md).
>
> **Extension (2026-09-11) :** l'assistant AI est désormais **multi-contexte** — Répertoire
> (mode historique), Documents (documents ouverts, via le bouton flottant) et Général (aucun
> document ouvert : aide sur l'app + création de fichiers/dossiers par cartes d'action). Header