Le picker lit /api/ai/status une seule fois, à sa construction, et le panneau
de l'assistant est un singleton monté pour toute la session : ajouter ou
supprimer une clé API dans la configuration du projet laissait la liste des
fournisseurs figée jusqu'à un rechargement de page.
- ai.js : nouveau refreshAIPickers() qui reconstruit chaque picker monté dans
son emplacement .ai-picker-slot (constante PICKER_SLOT_CLASS) ; le slot est
conservé même sans fournisseur configuré, donc le premier fournisseur ajouté
s'y monte aussi ; une sélection persistée dont le fournisseur n'est plus
configuré est purgée de obsigate_ai_picker (retour au défaut, plus de modèle
fantôme dans le déclencheur).
- bookslm.js : l'emplacement .bookslm-picker-host porte la classe
ai-picker-slot et reste dans la barre (replaceChildren au lieu de replaceWith).
- config.js : refreshAIPickers() après saveAIKeys() et deleteAIKey().
- tests : +4 tests JSDOM (ajout/retrait dans la barre, premier montage dans un
slot vide, purge de la sélection orpheline, câblage save/delete).
Vérifié : tests frontend 66/66 (IA) + 9 suites JSDOM, validate-imports 36
modules, pytest 963 passed / 6 skipped, ruff 0, et contrôle navigateur
(Playwright) sur l'instance de test — ajout de nvidia visible sans rechargement,
retrait effectif + sélection réinitialisée.
BUG-012: le menu @ est toujours rendu et _mentionVault() retombe sur le vault de contexte puis le premier vault disponible. #82: suppression des intitules Fournisseur & modele / Fournisseur:, description du contexte General en info-bulle, placeholder retire, bouton Envoyer en emoji, indicateur d'activite (envoi/reception/outils/confirmation/succes/echec), SW_VERSION v5.
BUG-011: popover des modeles aligne a droite (right:0), largeur 340px bornee, noms sur plusieurs lignes + title. BUG-010: la selection @ capture le vault renvoye par tree-search et _contextVault() le propage aux requetes /context et /chat, corrigeant le contexte ad-hoc en mode General.
Locales chargees en cache no-store + SW_VERSION v4 pour eviter les cles brutes (fr.json obsolete). Picker : styles critiques en ligne (popover/liste/options), plafond de 200 modeles avec indicateur, et non-chevauchement entre la liste de modeles et la bulle de capacites.
Refonte de la section Fournisseur & modele de l'assistant : capacites regroupees dans une bulle d'information (survol/clic/appui long) au lieu d'une liste permanente, et liste de modeles avec recherche. Correctifs : detection Unicode + filtrage insensible aux accents des commandes / et mentions @, navigation clavier fiable, et prise en compte du contexte ad-hoc en mode General cote backend.
Trois bugs corrigés + une amélioration demandée :
1. **fix(admin): /admin.html redirigeait toujours vers /**
- admin.js _gateAdmin() lisait /api/auth/status qui ne contient PAS le rôle user
- Remplacé par /api/auth/me (retourne username, role, vaults)
- Le code distingue maintenant le cas 'auth désactivé' (admin anonyme) du
cas 'auth requise non admin' (affiche écran forbidden)
2. **fix(ai): les modèles Nvidia/Xiaomi ne se chargeaient pas dans les dropdowns**
- Xiaomi : l'endpoint public /v1/models est instable, échec réseau fréquent
- Toutes les erreurs réseau/d'API renvoyaient models=[] → dropdown vide
- Ajout d'un fallback curé : _FALLBACK_MODELS dict avec 4-8 modèles populaires
par provider, TOUJOURS retourné si la clé manque OU si l'API distante échoue
- Le frontend voit désormais 'fallback' vs 'live' comme hint pour l'utilisateur
- Gemini parsing : strip du préfixe 'models/' retourné par l'API Gemini
- 7 nouveaux tests pytest pour _FALLBACK_MODELS + endpoint /api/config/ai-models
3. **feat(ai): picker provider/model dans la toolbar AI + BooksLM**
- Plusieurs providers peuvent maintenant être activés simultanément
- Sélection provider+model par section (Forge, BooksLM, etc.) via dropdown
- État persisté en localStorage (le choix suit l'utilisateur entre sections)
- Chaque appel AI passe maintenant {provider, model} au backend
- ai.js : aiAction() lit le picker et l'injecte dans le body
- bookslm.js : envoie provider+model à /api/ai/bookslm/chat
- ai_routes.py + bookslm_routes.py : AIRequest et BooksLMChatRequest
acceptent provider+model, avec save/restore du modèle original
pour ne pas affecter les autres requêtes concurrentes
- 7 nouvelles clés i18n (ai.provider, ai.model, ai.model_loading, etc.)
- 1 nouveau test bookslm vérifie que le schema accepte provider+model
- validate-imports.mjs : fix faux positif sur 'export { X as Y }'
Vérifié :
- pytest : 502 passed, 5 skipped (494 baseline + 7 AI models + 1 BooksLM)
- frontend unit : 7 passed
- validate-imports : 30 modules / 204 exports / 0 erreur
- pane-manager JSDOM : 9/9
- ruff check backend/ : All checks passed
1. Suppression du badge vault-context-pill doublon en mobile
2. Couleurs dynamiques indicateur header:
- Bleu pour 'All' (.vault-ctx-all)
- Mauve/violet pour les vaults (.vault-ctx-vault)
- Jaune/ambre pour les répertoires (.vault-ctx-dir)
3. Statut IA: vérifie la présence du toolbar AI dans le DOM
au lieu d'appeler /api/ai/status (qui ne fonctionnait pas)
4. Indicateur de traitement AI dans l'éditeur (spinner + badge
'AI...' dans le header de l'editor modal) au lieu du flash
blanc sur le badge sync
Le menu déroulant AI dans le mode édition était coupé par le
overflow:hidden du .editor-container. Le menu est maintenant:
- Attaché à document.body avec position:fixed
- Positionné aux coordonnées du bouton via getBoundingClientRect()
- Retourné au-dessus si le menu dépasse le bas de l'écran
- maxHeight: 60vh avec overflow-y: auto pour les menus très longs
Point 11a — Indicateur AI Actif:
- Badge sync flashe en blanc pendant traitement AI (animation CSS)
- Événements ai-processing-start/end dans ai.js
- Section statut IA dans panneau sync (configurée/non configurée/en cours)
- Endpoint GET /api/ai/status vérifiant les clés API configurées
Point 11b — Page d'accueil de voute:
- Endpoint GET /api/vault/{vault}/files?dir=... (trié par mtime)
- Module vaulthome.js: affichage style résultats de recherche
- Breadcrumb navigable, mise à jour auto sur clic dossier dans tree
- Déclenché auto quand un vault spécifique est sélectionné