4.4 KiB
#101 - Forge : Assistant IA partagé + plein écran (Forge & Editer)
Statut : 🟢 livré (en attente de vérification utilisateur) Version : 2.8.0 Composants :
frontend/editor-poc.html,frontend/js/sync.js,frontend/js/viewer.js,frontend/js/utils.js,frontend/index.html,frontend/style.css,frontend/locales/{fr,en}.jsonTests :tests/frontend/editor-inline.test.mjs(+10)
Contexte
L'éditeur Forge (frontend/editor-poc.html, iframe même origine) embarque son propre
mini-panneau « AI Panel » : un chat rudimentaire qui appelait /api/ai/improve sans
fournisseur ni modèle (donc toujours le défaut serveur), sans historique, sans streaming,
sans commandes / ni contexte @. L'éditeur Editer (CodeMirror) n'avait aucun bouton
plein écran, et Forge non plus.
L'utilisateur veut :
- que le bouton « AI Panel » de Forge affiche le même contenu que le panneau
Assistant IA (fournisseur/modèle, historique, skills
/, contexte@) ; - que Forge utilise le fournisseur et le modèle configurés dans l'Assistant IA (actions IA, autocomplétion fantôme) ;
- un bouton plein écran dans Forge et dans Editer.
Conception
1. Forge ouvre l'Assistant IA existant (pas de duplication)
bookslm.js est un singleton monté sur le document parent, couplé à state, TabManager,
AuthManager et au CSS global : le porter dans l'iframe serait une duplication lourde à
maintenir. Forge étant une iframe même origine, son bouton AI se contente de demander au
parent d'ouvrir l'assistant :
| Côté | Mécanisme |
|---|---|
| Iframe | openAssistant() → parent.postMessage({ type: 'forge-open-ai' }, '*') (#btn-ai, Ctrl+J) |
Parent (sync.js) |
sur forge-open-ai : import('./bookslm.js') → openForCurrentContext() |
Le mini-panneau Forge (#ai-panel, sendAIChat, suggestions) est supprimé : le contenu,
le fournisseur/modèle, l'historique, les menus / et @ sont ceux de l'assistant, sans
double maintenance.
2. Fournisseur/modèle partagé
Le sélecteur de l'assistant persiste son choix dans localStorage['obsigate_ai_picker']
({provider, model}), clé partagée par l'iframe (même origine). Forge la lit via
aiPickerSelection() et l'injecte :
- dans
aiCall()(actions IA du menu/et de la bulle de sélection) ; - dans la complétion fantôme (
/api/ai/inline-complete) — repliollamasi aucun fournisseur n'est sélectionné (comportement local conservé).
Les noms d'endpoints erronés sont corrigés au passage : make-longer / make-shorter
(au lieu de lengthen / simplify) et target_lang pour la traduction.
3. Plein écran natif
- Forge : bouton
#btn-fullscreendans la barre,document.documentElement.requestFullscreen()(l'iframe reçoitallow="fullscreen"côté parent,viewer.js), icône basculée surfullscreenchange. - Editer : bouton
#editor-fullscreendans l'en-tête ; plein écran sur le conteneur#editor-container(getEditorContainer(), fonctionne en mode modale et inline), styles:fullscreen(width/height: 100vw/100vh), icône/label basculés, sortie du plein écran à la fermeture (closeEditor) et Échap laissé au navigateur pendant le plein écran.
Libellés i18n editor.fullscreen / editor.exit_fullscreen (FR + EN).
Fichiers
| Fichier | Modification |
|---|---|
frontend/editor-poc.html |
suppression du mini-panneau AI ; openAssistant() (postMessage) ; aiPickerSelection() injecté dans aiCall/complétion fantôme ; AI_MAP corrigé ; bouton + logique plein écran |
frontend/js/sync.js |
routage forge-open-ai → bookslm.openForCurrentContext() |
frontend/js/viewer.js |
allow="fullscreen" sur #forge-iframe |
frontend/index.html |
bouton #editor-fullscreen (titre i18n) |
frontend/js/utils.js |
toggleEditorFullscreen / updateFullscreenButton / isEditorFullscreen ; sortie du plein écran dans closeEditor |
frontend/style.css |
.editor-container:fullscreen |
frontend/locales/{fr,en}.json |
editor.fullscreen, editor.exit_fullscreen |
Tests
tests/frontend/editor-inline.test.mjs (+10) : suppression du mini-panneau, postMessage
forge-open-ai, routage sync.js, lecture de obsigate_ai_picker, endpoints corrigés,
complétion fantôme, boutons plein écran (Forge + Editer), allow="fullscreen", CSS
:fullscreen, clés i18n.