4.9 KiB
#106 — Assistant IA : actions instantanées contextuelles & catalogue de prompts
Statut : livré en 2.14.0 · Domaine : Assistant IA (frontend) · Fichiers :
frontend/js/ai-quick-actions.js,frontend/js/bookslm.js,frontend/style.css,frontend/locales/{fr,en}.json,tests/frontend/ai-quick-actions.test.mjs
Problème
La zone d'accueil de l'assistant affichait 3 suggestions statiques par mode (résumé / thèmes / contradictions), sans lien avec ce que l'utilisateur regarde réellement (un fichier de code ? plusieurs documents ? une sélection dans l'éditeur ?), et sans point d'accès au reste des prompts utiles.
Solution
Catalogue (frontend/js/ai-quick-actions.js, module pur sans DOM)
25 actions en 6 catégories, chacune = {id, cat, icon (lucide), labelKey, promptKey, agent?} — libellés et prompts i18n FR/EN (clés qa.*) :
| Catégorie | Actions |
|---|---|
| 📝 Synthèse & Analyse | Résumer en 3 points clés · Frictions/contradictions · Vulgariser · FAQ |
| ✅ Productivité & Structuration | Checklist d'actions · Plan d'action · Mémo exécutif · Générer le frontmatter YAML · Mettre à jour le frontmatter · Liens/backlinks · Sections hiérarchiques |
| 💻 Code & Scripts | Expliquer · Bugs & failles · Docstrings/types · Tests unitaires |
| 🔗 Cross-documents | Comparer · Fusionner en note de synthèse · Chronologie |
| ✍️ Édition & Reformulation | Concis · Corriger le style · Reformuler · Traduire · Expliquer la sélection |
| ❔ Assistant (général) | Que sais-tu faire · Rechercher efficacement · Créer une note de réunion |
Les deux actions frontmatter sont marquées agent: true : un clic bascule
transparentement le panneau en mode agent (comme Deep Research) puis envoie
le prompt — l'assistant lit le document, propose la mutation via l'outil
edit_file/append_to_file, et la carte de confirmation (#79) applique le
nouveau bloc en tête du fichier.
Le prompt « Générer le frontmatter YAML » demande le format complet du vault de
Bruno (titre, auteur, creation_date/modification_date ISO-8601 avec fuseau,
catégorie, tags en liste inline, aliases, status, publish, favoris, template,
task, archive, draft, private, NomDeVoute, Description). « Mettre à jour le
frontmatter » conserve les champs existants : actualise
modification_date, recalcule titre/tags/aliases/catégorie/NomDeVoute/Description
d'après le contenu, complète les champs manquants.
Sélection contextuelle (triage par défaut dans l'UI)
detectContext({mode, docCount, currentPath, hasSelection}) — précédence :
sélection > code > multi-docs > doc unique > répertoire > général.
| Contexte | Boutons suggérés |
|---|---|
| 1 doc texte | Résumer 3 points · Checklist · Générer le frontmatter · Mettre à jour le frontmatter |
| 2+ docs | Fusionner · Comparer · Frictions/contradictions |
| Fichier de code (.py, .ts, .sh…) | Expliquer · Bugs & failles · Tests unitaires |
| Sélection dans l'éditeur | Concis · Corriger le style · Expliquer la sélection |
| Répertoire | Résumer le répertoire · Thèmes · Checklist |
| Général | Que sais-tu faire · Rechercher · Créer une note |
Présentation (calquée sur le POC ai_assistant_quick_actions_poc.html)
- Badge de contexte dans l'en-tête (« 1 doc ouvert », « Fichier de code », « Sélection active », « 3 docs ouverts »…).
- Ligne « Actions suggérées » + bouton « Toutes les actions » ouvrant un
tiroir bottom-sheet : recherche instantanée (insensible aux accents/casse
via
normalizeSearch) + catalogue groupé par catégorie, Échap/backdrop pour fermer. - Boutons icône + libellé + flèche au survol ; clic = envoi immédiat du
prompt dans le composer (chemin
_sendMessage(): skills, images et mode agent continuent de fonctionner). - La rangée se masque dès le premier message du fil (comportement historique) ;
le rafraîchissement du contexte à la sélection éditeur est throttled 250 ms
(
selectionchange+mouseup/keyup, CodeMirror n'émettant passelectionchangenatif). - CSS 100 % variables de thème (
--surface,--accent,--accent-bg…) → conforme aux 15 thèmes ; transitions désactivées enprefers-reduced-motion.
Tests
tests/frontend/ai-quick-actions.test.mjs (13 tests, câblé au job lint CI) :
précédence des contextes, presets 3-4 actions résolvables, table de conception,
agent-flag des actions frontmatter, complétude FR+EN de chaque clé
catalogue/badge contre les vrais JSON de locales.
Vérification live (obsigate-test :2020, Playwright)
badge « 1 doc ouvert », 4 suggestions dont les 2 frontmatter, tiroir à 6
catégories / 25 actions, recherche « frontmatter » → 2 résultats, clic →
aria-pressed=true sur le bouton agent + message envoyé avec le nouveau
prompt + réponse de l'assistant.