Files
ObsiGate/docs/features/ai-assistant-conversation-ux.md
T
bruno cdb4d29676
CI / lint (push) Successful in 1m23s
CI / security (push) Successful in 55s
CI / test (push) Successful in 2m55s
CI / build (push) Successful in 50s
CI / e2e (push) Successful in 10m58s
feat(assistant): #91 refonte Notion de la zone de discussion — question ancrée en haut, fil chronologique, étapes repliables, barre Copier/Ajouter
2026-09-15 15:51:19 -04:00

5.3 KiB

#91 — Assistant IA — Zone de discussion façon Notion : post ancré en haut, fournisseur/modèle discret & barre d'actions

Statut : ✅ Livré Effort : 0,5-1 jour | Impact : 🟡 Références : Roadmap · BooksLM #76 · Assistant UX #80 · Changelog

  • Description : Refonte de la présentation de la fenêtre de résultats de l'assistant IA (frontend/js/bookslm.js, frontend/style.css) sur le modèle de l'assistant Notion :
    1. Ancrage en haut : après l'envoi, le post de l'utilisateur est amené tout en haut de la zone visible (scrollIntoView({ block: 'start' }) + scroll-margin-top) ; la réponse se diffuse en dessous, lisible sans défilement. Plus de scroll-into-bottom ni d'astuce order: -1.
    2. Fil Notion-style : messages en ordre chronologique ; post utilisateur = bulle arrondie alignée à droite (max 80 %) ; réponse assistant = texte pleine largeur sans bulle de fond ; les appels d'outils du mode agent se replient dans un bloc discret « N étapes » (<details>).
    3. Fournisseur & modèle discrets : libellé au-dessus de chaque réponse, issu du SSE réel du backend (provider/model).
    4. Barre d'actions au survol : sous chaque bloc non vide, « Copier » (utilisateur et assistant) ; sous une réponse, « Ajouter » qui insère le texte dans le document ouvert dans l'éditeur Forge (aucun bouton factice).

A. Positionnement automatique (ancre en haut) — ✅ livré

  • A1. _renderMessages({ anchor: true }) appelé à l'envoi du message, à l'ouverture d'un contexte, au rechargement d'une session et à la reprise après confirmation agent : cible = dernier .bookslm-msg.user, scrollIntoView fluide block: 'start', repli calcul scrollTop += delta si indisponible.
  • A2. Re-rendus de streaming : la position de scroll est préservée (plus de scrollTop = scrollHeight) — la réponse s'allonge sous la question sans jamais déplacer la vue.
  • A3. Marge supérieure : scroll-margin-top: 14px sur .bookslm-msg pour que le post ne colle pas au bord.
  • A4. Seule la zone du fil défile : .bookslm-messages { flex: 1; overflow-y: auto } (en-tête, toolbar, statut et barre de saisie fixes — structure déjà en place).

B. Fil chronologique Notion-style — ✅ livré

  • B1. Ordre naturel (user puis assistant, empilés, gap: 24px).
  • B2. Utilisateur : bulle --surface2 alignée à droite, max-width: 80%, coins arrondis 18px.
  • B3. Assistant : width: 100%, pas de fond ni de padding de bulle — le markdown occupe toute la largeur (titres, listes, code, sources inchangés).
  • B4. Mode agent : _renderToolActivity() → <details class="bookslm-tool-trace"> avec <summary> « N étapes » (i18n ai.steps_count) ; les lignes d'outils restent accessibles en déroulant le bloc.

C. Fournisseur & modèle discrets — ✅ livré

  • C1. _streamResponse() capture data.provider / data.model du flux SSE (déjà émis par /chat et /agent) sur le message assistant.
  • C2. .bookslm-msg-meta au-dessus du bloc assistant : « fournisseur · modèle » (persisté avec la session, visible au rechargement).

D. Barre d'actions — ✅ livré

  • D1. _appendActionBar() sous chaque bloc non vide : bouton Copier pour les deux rôles ; bouton Ajouter pour l'assistant uniquement.
  • D2. Copier : texte brut du message (navigator.clipboard, repli execCommand) + toast bookslm.copied.
  • D3. Ajouter (_insertIntoEditor) : insertion du texte à la position de fin de sélection dans state.editorView (Forge) ; toast bookslm.inserted ou bookslm.insert_no_editor si aucun éditeur ouvert.
  • D4. Révélation au survol / focus clavier (.bookslm-msg:hover, :focus-within) — icônes Lucide copy / corner-down-left.

E. Tests & documentation — ✅ livré

  • E1. tests/frontend/ai.test.mjs : ordre chronologique, ancrage scrollIntoView block:start, tag provider/modèle, barre d'actions par rôle, copie du texte brut, insertion éditeur (mock state.editorView), bloc repliable des étapes, absence de barre pour contenu vide.
  • E2. i18n FR/EN : bookslm.copied, bookslm.insert, bookslm.insert_hint, bookslm.inserted, bookslm.insert_no_editor, ai.steps_count.
  • E3. CHANGELOG + Roadmap ; SW_VERSION bump (cache bust).

F. Points d'attention

  • Le tag fournisseur provient du backend réel (SSE), donc correct même avec la sélection « par défaut » du fournisseur.
  • Le streaming appelle _renderMessages() à chaque chunk : l'ancre est posée une seule fois à l'envoi, les re-rendus préservent ensuite le scroll — pas de sauts.
  • L'ancien épinglage flex order: -1 (première itération de #91) est remplacé : l'ordre est redevenu chronologique, l'ancrage est fait par défilement explicite.
  • Les pouces haut/bas Notion ne sont pas repris : aucun signal n'existe côté backend ; « Ajouter » (insertion éditeur réelle) les remplace utilement.