87 lines
4.4 KiB
Markdown
87 lines
4.4 KiB
Markdown
# #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.
|