fix(ai): contexte applicatif de l'assistant, dossier vide et liens fiables (#88, BUG-041, BUG-042)
- BUG-041 : le contexte d'un dossier vide ne renvoie plus 404 ; il degrade vers le prompt General enrichi d'un bloc « Dossier vide ». - BUG-042 : liens de fichiers deterministes (nom -> presse-papiers, dossier -> arborescence, chemin -> viewer) et resolution du chemin contre l'index du vault (exact -> suffixe -> basename) avant ouverture, fin des 'File not found'. - #88 : app_context (documents ouverts, repertoire/vault courants, recherche + resultats affiches) et fichiers recemment modifies injectes dans le prompt General. Tests : pytest 963 passed / 6 skipped, ruff 0, mypy 0, frontend 52/52 + validate-imports 36 modules.
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
# #88 — Assistant IA : contexte applicatif & fiabilité des liens
|
||||
|
||||
> **Statut :** 🟢 corrigé / livré (en attente de vérification utilisateur)
|
||||
> **Version :** 2.3.0
|
||||
> **Composants :** `frontend/js/bookslm.js`, `backend/bookslm.py`, `backend/bookslm_routes.py`
|
||||
> **Bugs liés :** BUG-041, BUG-042
|
||||
|
||||
## Contexte
|
||||
|
||||
Trois troubles d'usage signalés sur l'Assistant IA (BooksLM) :
|
||||
|
||||
1. **Répertoire vide bloquant** — ouvrir l'assistant sur un dossier ne contenant
|
||||
aucun fichier markdown renvoyait `⚠ Error: Aucun fichier markdown trouvé dans ce dossier`
|
||||
(HTTP 404) au lieu de répondre à la question de l'utilisateur.
|
||||
2. **Assistant Général aveugle** — en mode Général, l'assistant ne savait que
|
||||
lister les vaults : il ne connaissait ni les documents ouverts, ni le répertoire
|
||||
courant, ni la page de résultats de recherche, ni les fichiers récemment modifiés.
|
||||
3. **Liens de fichiers peu fiables** — l'assistant produisait des liens vers des
|
||||
noms de fichiers qui échouaient avec `File not found: …`, sans règle claire
|
||||
(nom simple, dossier, chemin complet).
|
||||
|
||||
## Conception
|
||||
|
||||
### 1. Dégradation gracieuse du dossier vide (BUG-041)
|
||||
|
||||
`_resolve_system_prompt` (`backend/bookslm_routes.py`) ne lève plus de 404 quand
|
||||
le contexte d'un dossier est vide. Il construit le prompt Général (aide
|
||||
applicative + actions), enrichi d'un bloc **« Dossier vide »**, et prévient le
|
||||
modèle qu'aucun contexte documentaire n'est disponible — il répond quand même et
|
||||
propose une création de fichier si pertinent.
|
||||
|
||||
Le prompt Général reçoit en outre les **fichiers récemment modifiés** de
|
||||
l'utilisateur (`backend/services/recent.list_recent`, best-effort).
|
||||
|
||||
### 2. Contexte applicatif de l'assistant Général (#88)
|
||||
|
||||
Le frontend envoie un nouveau champ `app_context` dans les requêtes `/chat` et
|
||||
`/agent` (`_buildAppContext()`), contenant l'état vivant de l'interface :
|
||||
|
||||
| Champ | Contenu |
|
||||
|---|---|
|
||||
| `open_documents` | Documents ouverts dans les onglets/panneaux (via `collectOpenDocuments()`) |
|
||||
| `current_path` | Document affiché dans le viewer |
|
||||
| `directory` | Répertoire courant de l'assistant |
|
||||
| `vault` | Vault sélectionné |
|
||||
| `search_query` / `search_total` | Dernière recherche et nombre de résultats |
|
||||
| `search_results` | Fichiers affichés sur la page de résultats (max 20) |
|
||||
|
||||
Côté backend, `build_general_system_prompt(vaults, app_context, recent_files)`
|
||||
rend un bloc **« Contexte applicatif actuel »** ajouté au prompt Général.
|
||||
|
||||
### 3. Liens de fichiers déterministes (BUG-042)
|
||||
|
||||
Classification des liens (`_classifyPath`) :
|
||||
|
||||
| Forme | `data-kind` | Action au clic |
|
||||
|---|---|---|
|
||||
| Nom de fichier seul (`readme.md`) | `name` | Copie le nom dans le presse-papiers |
|
||||
| Chemin de dossier (`projets/2026`) | `dir` | Révèle le dossier dans l'arborescence |
|
||||
| Chemin de fichier (`notes/a.md`) | `file` | Ouvre le fichier dans le viewer |
|
||||
|
||||
Avant d'agir, `_activatePath()` **résout** le chemin contre l'index du vault
|
||||
(`_resolveExistingPath`) : correspondance exacte, puis suffixe
|
||||
(segment de tête omis par le modèle), puis basename unique. Les chemins non
|
||||
résolus copient le nom au lieu d'ouvrir un lien mort — plus de `File not found`.
|
||||
|
||||
## Tests
|
||||
|
||||
- `tests/frontend/ai.test.mjs` : classification (`name`/`file`/`dir`), routage
|
||||
`_activatePath` (ouvre/révèle/copie), clic d'un lien « nom » → presse-papiers.
|
||||
- `tests/test_bookslm.py` : `build_general_system_prompt` avec `app_context` +
|
||||
`recent_files` ; prompt inchangé sans contexte ; chat sur dossier vide ne
|
||||
renvoie plus 404.
|
||||
Reference in New Issue
Block a user