# Changelog — ObsiGate Toutes les modifications notables d'ObsiGate sont documentées dans ce fichier. Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). > **En cours de développement** : les changements à venir sont listés dans la section > [Unreleased](#unreleased). La dernière version livrée est **2.77.0**. --- ## [Unreleased] --- ## [2.77.0] — 2026-10-23 ### Modifié - **Panneau Spark V3 : la console en surimpression pleine page (#222, Fusion)** — le bouton « Console ⤢ » du panneau Spark (asset vendangé, octet-identique dans les 4 apps) n'ouvre plus la console web du service d'agents en nouvel onglet (#221) : elle s'ouvre **dans la même page**, en surimpression née à la largeur du panneau et étendue à toute la fenêtre par transition, avec le lien profond conservé (`?disc=` et `?app=obsigate`). Sa barre offre les deux sorties : « Mode sidebar » (retour à l'agent en barre latérale) et « Fermer l'agent ». Les styles sont injectés par le panneau lui-même ; côté service (0.20.0), la console autorise l'encadrement par les 4 applications. Même livraison dans TikTak 0.60.0, Flowdeck 7.81.0 et Kanbante 0.29.0. Redéploiement Docker requis pour l'activer côté ObsiGate. --- ## [2.76.1] — 2026-10-22 ### Ajouté - **Panneau Spark : bouton « Console ↗ » (#221, Fusion)** — la barre des discussions du panneau Spark (asset vendangé, octet-identique dans les 4 apps) gagne un bouton « Console ↗ » qui ouvre la console web du service d'agents (https://agent.dracodev.net/) dans un nouvel onglet, sur la discussion actuellement affichée (`?disc=`, URL construite au clic) et avec l'app d'origine (`?app=obsigate`, déduite du sous-domaine `og`). Même livraison dans TikTak 0.59.1, Flowdeck 7.80.1 et Kanbante 0.28.1. Redéploiement Docker requis pour l'activer côté ObsiGate. --- ## [2.76.0] — 2026-10-22 ### Ajouté - **Émission d'événements vers le journal du service d'agents (#220, Fusion — Lot 2 vague 5)** — ObsiGate émet ses mutations de notes **explicites** au journal d'activité du service d'agents (contrat ACC-0.2) : `obsigate.note.created / edited / moved / deleted`, enveloppes signées HMAC-SHA256 (clé `AGENT_EVENEMENTS_CLE`), envoyées en arrière-plan sans jamais bloquer le métier, inactives tant que la clé n'est pas posée. Points d'accroche : les endpoints d'écriture de l'API web (acteur `user`) et la couche outils / serveur MCP (acteur `agent:mcp`). **Garde-fou : jamais le watcher** — les modifications faites hors API (Obsidian, éditeur externe) n'émettent rien. Domaine par vault via `AGENT_EVENEMENTS_DOMAINES`, repli `pro` (Q-A ouverte). Redéploiement Docker requis, puis pose de la clé des deux côtés pour activer. --- ## [2.75.0] — 2026-10-22 ### Ajouté - **Panneau Spark v2 (#219, Fusion — Lot 1)** — les assets partagés `frontend/draco-panneau.js` / `frontend/draco-panneau.css` passent en v2, à l'identique dans les quatre applications : réponses de l'agent en **Markdown rendu** (HTML produit par le service d'agents 0.10.0, sanitizé côté serveur), **largeur réglable** persistée, **thème clair/sombre** aligné sur l'application hôte (suivi en direct de `html[data-theme]`), et **discussions façon Muse** — discussion principale perpétuelle et discussions parallèles créées, archivées, supprimées depuis le tiroir du panneau. Aucun code propre à ObsiGate n'est modifié ; redéploiement Docker requis. --- ## [2.74.0] — 2026-10-22 ### Ajouté - **Panneau Spark intégré (#218, Fusion)** — le bouton Spark de la barre commune ouvre le panneau de l'agent commun (conversation, Aujourd'hui, approbations, missions longues), comme dans TikTak, Flowdeck et Kanbante : assets partagés `frontend/draco-panneau.js` et `frontend/draco-panneau.css` vendangés à l'identique, action `spark` branchée sur `DRACO_PANNEAU.toggle()`. La CSP nomme `https://agent.dracodev.net` en `connect-src` (seul hôte ajouté). Redéploiement Docker requis. --- ## [2.73.1] — 2026-10-21 ### Corrigé - **Barre commune v0.1.4 — palier mobile élargi de 700 à 900 px** (suite de BUG-118) : entre les deux seuils, la barre complète ne tenait pas (fenêtres réduites, tablettes, webviews) alors que les apps sont déjà en mise en page mobile ; le resserré (app courante, alertes, Spark, avatar) s'applique maintenant dès 900 px, et le décalage de `.app-container` suit le même seuil. Le changement d'app reste assuré par le menu du ✦. --- ## [2.73.0] — 2026-10-21 ### Ajouté - **Menu des applications par la marque ✦** (barre commune **v0.1.3**, #215) : cliquer le ✦ — un peu plus gros (24 px) — ouvre le menu des 4 applications (liens, icônes, badges), sur mobile comme sur bureau. C'est le changement d'app en mobile, où les onglets sont repliés depuis la v0.1.2. Fermeture au clic extérieur ou à Échap. Choix de Bruno (2026-10-21). --- ## [2.72.1] — 2026-10-21 ### Corrigé - **BUG-118 — barre d'apps Fusion en mobile** : la barre commune passe en **v0.1.2** (dracodev-commons) — au palier ≤ 700 px elle ne garde que la marque, l'onglet de l'app courante, les alertes, Spark et l'avatar (avant : onglets et pastilles domaines entiers, barre débordante sur téléphone). Le bouton ☰ de la barre pilote désormais le bon bouton selon la largeur : barre latérale bureau au-delà de 768 px, **vrai hamburger mobile** (tiroir) en dessous — avant, il cliquait le bouton bureau et ne faisait rien sur téléphone, donnant l'impression d'un hamburger mort à côté de celui d'ObsiGate. Test : `tests/test_draco_barre.py`. --- ## [2.72.0] — 2026-10-20 ### Ajouté - **Fusion ACC-3.2 (#217) — validation locale du jeton `draco_session`** : `get_current_user` accepte le cookie partagé à défaut de jeton natif valide ; le `sub` étant l'identifiant ObsiGate, la correspondance vers le compte local est directe (compte actif et garde-fou « changement de mot de passe » exigés). Fiche : `docs/features/fusion-acc32-validation-locale-217.md`. --- ## [2.71.0] — 2026-10-20 ### Ajouté - **Fusion ACC-3.1 (#216) — émettrice SSO `draco_session`** : ObsiGate émet le cookie de session partagé de l'écosystème dracodev (JWS HS256, claims minimaux, 12 h, domaine `.dracodev.net`) à chaque connexion, le renouvelle de façon glissante (middleware dédié), le révoque à la déconnexion (liste des `jti` exposée aux autres apps sous clé machine) et offre `GET /sso/authorize` avec `return_to` en liste blanche anti open-redirect. Inerte tant que `DRACO_SESSION_SECRET` n'est pas configuré. Fiche : `docs/features/fusion-acc31-sso-draco-session-216.md`. --- ## [2.70.1] — 2026-10-20 ### Corrigé - **Sécurité des dépendances (CI `pip-audit` rouge sur 2.70.0)** — planchers relevés dans `backend/requirements.txt`, selon le patron déjà en place dans le fichier : `aiohttp>=3.14.4` (8 CVE corrigées en 3.14.4, dont CVE-2026-111063/111064), `mcp==1.30.0` (CVE-2026-59951), `pillow>=13.0.0` (8 CVE corrigées en 13.0.0, dont CVE-2026-112895) et plancher explicite `certifi>=2026.10.19` (PYSEC-2026-4320, dépendance transitive). `pip-audit` redevient vierge ; aucune ligne de code applicatif n'est touchée. --- ## [2.70.0] — 2026-10-20 ### Ajouté - **#215 — Fusion bloc 1 : barre d'apps commune et références croisées des notes** (programme Fusion, issues Gitea #5/#6/#7 ; contrats `dracodev-commons` v0.1.0) : - **Barre d'apps commune** en tête de l'interface (snippet figé vendangé : `frontend/draco-barre.css/.js`, markup dans `index.html`) — navigation vers ObsiGate, Flowdeck, TikTak et Kanbante, ObsiGate marquée active, sélecteur de domaine mémorisé ; la recherche, le rail et le menu délèguent aux contrôles natifs d'ObsiGate. - **Références croisées `external_ref`** : section « Liens » dans la vue d'une note — coller une URL profonde (Flowdeck, TikTak, issue Gitea = carte Kanbante, ObsiGate) crée la référence (libellé automatique ou libre, pastille de couleur de l'app cible). Backend : stockage JSON par utilisateur (`backend/external_refs.py`), endpoints `GET/POST /api/refs` et `DELETE /api/refs/{id}`, parseur d'URL conforme au contrat figé (422 explicite sinon), schémas et tag OpenAPI « ExternalRefs ». - **Notes projetées TikTak reconnues** (frontmatter `tiktak_id`) : bandeau « Tâche TikTak projetée » et bouton « Ouvrir dans TikTak » dans la même section (module `frontend/draco-liens.js`, point d'extension `obsigate:file-rendered` émis par `renderFile`). - i18n FR/EN (clés `draco.links.*`) ; tests `test_external_refs.py`. --- ## [2.69.0] — 2026-10-15 ### Ajouté - **#201 — menu contextuel « Déplacer » / « Dupliquer »** (fichiers *et* dossiers) dans la sidebar : le modal de destination réutilise `promptTargetFolder` (celui de l'import, même thème, sélecteur de voute + arbo filtrable), généralisé par un paramètre `opts` optionnel (titre, résumé, libellé du bouton) ; l'emplacement actuel est pré-sélectionné ; cross-vault refusé proprement. Nouveau endpoint `POST /api/duplicate/{vault}` (`duplicate_path` : copie `X copie.ext`, collisions `copie 2`, `copie 3`… ; répertoires récursifs ; refus de dupliquer un dossier dans lui-même ; index incrémental, SSE + webhooks). i18n FR/EN. ### Corrigé - **BUG-117** — drag & drop interne de la sidebar (déplacement d'un fichier/dossier vers un autre) inopérant et silencieux depuis #89 : la détection « dépôt externe » dans `onDrop` testait `items.length > 0`, qui comptait aussi les formats *string* (`tree:*`) posés par `setData` au `dragstart` interne → chaque déplacement basculait dans la branche upload et disparaissait sans appel API ni toast. Restreinte aux vrais fichiers (`kind === 'file'`, type `Files`, `files` non vide), avec priorité au `dragState`. --- ## [2.68.6] — 2026-10-14 --- ## [2.68.5] — 2026-10-14 --- ## [2.68.4] — 2026-10-14 ### Corrigé - **BUG-116** — éditeur Forge : après insertion d'un tableau (ou bloc de code, diagramme), la textarea restait d'une seule ligne — les mutations programmatiques de `ta.value` ne déclenchent pas l'événement `input`, seul chemin qui rappelait `autoHeight()`. `insertAtCursor` et `wrapSelection` (les deux points de passage de toutes les insertions) appellent désormais `autoHeight()` + `updateLineNumbers()` — le nombre de lignes du gutter suit. Vérifié en Playwright : tableau 4 lignes sur document d'une ligne → hauteur 51 → 189 px, gutter cohérent. - **BUG-115** — éditeur Forge (aperçu et menus) : trois défauts — (1) collure case à cocher/texte dans l'aperçu des checklists : le HTML du serveur ne sépare pas l'`` du texte et `editor-poc.html` n'avait pas la règle `.task-list-item` de `style.css` (ajoutée à son `