Files
bruno 3131277b19
CI / lint (push) Successful in 1m33s
CI / security (push) Successful in 1m1s
CI / test (push) Successful in 2m50s
CI / build (push) Successful in 1m6s
CI / e2e (push) Successful in 10m48s
feat(forge): assistant IA partage et plein ecran Forge/Editer (#101)
2026-09-17 08:30:32 -04:00

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}.json Tests : 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 :

  1. que le bouton « AI Panel » de Forge affiche le même contenu que le panneau Assistant IA (fournisseur/modèle, historique, skills /, contexte @) ;
  2. que Forge utilise le fournisseur et le modèle configurés dans l'Assistant IA (actions IA, autocomplétion fantôme) ;
  3. 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) — repli ollama si 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-fullscreen dans la barre, document.documentElement.requestFullscreen() (l'iframe reçoit allow="fullscreen" côté parent, viewer.js), icône basculée sur fullscreenchange.
  • Editer : bouton #editor-fullscreen dans 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.