From fddbaec82edcdef9aed6ada572cf534be0222d6a Mon Sep 17 00:00:00 2001 From: Spark Date: Mon, 26 Oct 2026 16:56:28 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20panneau=20Spark=20=E2=80=94=20version?= =?UTF-8?q?=20du=20service=20d'agents=20visible=20en=20mode=20sidebar=20#2?= =?UTF-8?q?25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 19 ++++++++- README.fr.md | 6 +-- README.md | 6 +-- VERSION | 2 +- desktop/Cargo.lock | 2 +- desktop/Cargo.toml | 2 +- desktop/tauri.conf.json | 2 +- docs/ROADMAP.md | 21 +++++++++- .../fusion-panneau-version-agent-225.md | 40 +++++++++++++++++++ frontend/draco-panneau.js | 33 +++++++++++++++ package.json | 2 +- tests/test_draco_barre.py | 17 ++++++++ 12 files changed, 139 insertions(+), 13 deletions(-) create mode 100644 docs/features/fusion-panneau-version-agent-225.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 49a83bf..acba604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ 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.78.2**. +> [Unreleased](#unreleased). La dernière version livrée est **2.79.0**. --- @@ -14,6 +14,23 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [2.79.0] — 2026-10-26 + +### Ajouté + +- **Panneau Spark : version du service d'agents visible en mode + sidebar (#225)** — le pied du panneau Spark + (`frontend/draco-panneau.js`, asset partagé des 4 applications) + affiche la ligne discrète « Service d'agents vX », comme la + console pleine page. La version est lue en direct dans la santé + du service (`GET /healthz` de l'origine injectée par l'hôte), à + l'ouverture du panneau, avec cache de session ; jamais une + valeur codée en dur — service injoignable, rien d'affiché. + Demande de Bruno (2026-10-26), carte fusion #64 ; même + livraison : TikTak 0.61.3, Flowdeck 7.83.1, Kanbante 0.37.1. + +--- + ## [2.78.2] — 2026-10-26 ### Corrigé diff --git a/README.fr.md b/README.fr.md index 1676273..2d80934 100644 --- a/README.fr.md +++ b/README.fr.md @@ -4,7 +4,7 @@ **Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive. -[![Version](https://img.shields.io/badge/Version-2.78.2-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.79.0-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l ## 📝 Changelog -Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.78.2). +Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.79.0). --- -*Projet : ObsiGate | Version : 2.78.2 | Dernière mise à jour : Septembre 2026* +*Projet : ObsiGate | Version : 2.79.0 | Dernière mise à jour : Septembre 2026* diff --git a/README.md b/README.md index f0cc170..0fb677e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface. -[![Version](https://img.shields.io/badge/Version-2.78.2-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.79.0-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) ## 📝 Changelog -See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.78.2). +See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.79.0). --- -*Project: ObsiGate | Version: 2.78.2 | Last updated: September 2026* +*Project: ObsiGate | Version: 2.79.0 | Last updated: September 2026* diff --git a/VERSION b/VERSION index cd46641..45cc88f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.78.2 +2.79.0 diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index fa4e742..8721dc7 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "obsigate-desktop" -version = "2.78.2" +version = "2.79.0" dependencies = [ "chrono", "env_logger", diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 6e99ce6..8d7dfe4 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obsigate-desktop" -version = "2.78.2" +version = "2.79.0" description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian" authors = ["Bruno Charest"] edition = "2021" diff --git a/desktop/tauri.conf.json b/desktop/tauri.conf.json index 152b222..03aaaa2 100644 --- a/desktop/tauri.conf.json +++ b/desktop/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json", "productName": "ObsiGate", - "version": "2.78.2", + "version": "2.79.0", "identifier": "com.obsigate.desktop", "build": { "frontendDist": "../frontend", diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index c9f3601..e37c565 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # ObsiGate — Roadmap -> **Version :** 2.78.2 | **Dernière mise à jour :** 2026-10-26 +> **Version :** 2.79.0 | **Dernière mise à jour :** 2026-10-26 > **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact > vers les fonctionnalités livrées. > - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)** @@ -30,6 +30,24 @@ ## 🔵 En cours +### 225. Fusion — panneau Spark : version du service d'agents visible en mode sidebar + +- **Effort :** ~0,1 jour | **Impact :** 🟢 | **Ouvert :** 2026-10-26 | **Statut :** ✅ livré le 2026-10-26 (version du hook — voir CHANGELOG ; redéploiement Docker requis) +- **Fiche :** [features/fusion-panneau-version-agent-225.md](./features/fusion-panneau-version-agent-225.md) +- **Description :** demande de Bruno (2026-10-26, carte fusion #64) : la + version « Service d'agents vX », déjà visible dans la console pleine + page, doit se lire aussi dans le **panneau natif des apps** (mode + sidebar). Le pied du panneau Spark affiche désormais cette ligne, + discrète et permanente, lue **en direct** dans la santé du service + (`GET /healthz` de l'origine injectée par l'hôte) à l'ouverture du + panneau, avec cache de session — jamais une valeur codée en dur ; + service injoignable = rien d'affiché. Même livraison : TikTak + 0.61.3, Flowdeck 7.83.1, Kanbante 0.37.1. +- **Sous-tâches :** + - [x] Ligne de version dans le pied du panneau (canonique TikTak, propagée aux 4 apps) + - [x] Test `tests/test_draco_barre.py::test_panneau_version_service_affichee_225` + épreuve comportementale jsdom sur les 4 copies + - [x] Release publiée — CI verte à constater, redéploiement Docker (geste de Bruno) + ### 224. Sécurité des dépendances — pip-audit vierge (brotli, filelock, opentelemetry-api, pypdf) - **Effort :** ~0,1 jour | **Impact :** 🔴 | **Ouvert :** 2026-10-25 | **Statut :** ✅ livré le 2026-10-25 (version du hook — voir CHANGELOG ; redéploiement Docker requis) @@ -1150,6 +1168,7 @@ | 170 | Assistant IA — tâches planifiées type cron (create/append/notify, interval/daily/once, tick 60 s, échec notifié) | Unreleased | [features/agent-phase4-166-168-170.md](./features/agent-phase4-166-168-170.md) | | BUG-119 | Panneau Spark — « mode console » bloqué par la CSP (`frame-src` sans l'origine du service d'agents) | 2.77.1 | [ISSUES_TODOLIST.md](./ISSUES_TODOLIST.md) | | BUG-120 | Menu inter-apps — les URL sœurs (`window.DRACO_URLS`) dérivent l'environnement de l'hôte de l'agent (`-dev` en dev), explicite prioritaire, Gitea inchangée (suite de #223) | 2.78.2 | [ISSUES_TODOLIST.md](./ISSUES_TODOLIST.md) | +| 225 | Panneau Spark — version du service d'agents visible en mode sidebar (pied du panneau, lue en direct via `GET /healthz`) | 2.79.0 | [features/fusion-panneau-version-agent-225.md](./features/fusion-panneau-version-agent-225.md) | --- diff --git a/docs/features/fusion-panneau-version-agent-225.md b/docs/features/fusion-panneau-version-agent-225.md new file mode 100644 index 0000000..1aee072 --- /dev/null +++ b/docs/features/fusion-panneau-version-agent-225.md @@ -0,0 +1,40 @@ +# #225 — Fusion : panneau Spark, version du service d'agents visible en mode sidebar + +**Contexte.** La version « Service d'agents vX » du service d'agents +est visible dans la console pleine page (pilule d'en-tête, rendue par +le service lui-même), mais pas dans le **panneau natif des +applications** (mode sidebar) — or c'est là que Bruno vit au +quotidien. Demande de Bruno (2026-10-26), carte fusion #64 : la +version doit se lire dans le panneau ouvert, sans ouvrir la console. + +**Changement.** Dans `frontend/draco-panneau.js` — asset **vendangé**, +maintenu en canonique dans TikTak et recopié dans les 4 applications +(TikTak, Flowdeck, Kanbante, ObsiGate ; chaque copie garde son bloc +d'injection d'origine propre à l'hôte, le corps est commun) : + +- le pied du panneau gagne une ligne dédiée + `.draco-panneau-version`, discrète (11,5 px, opacité 0,6, + monochrome, aucun emoji), **masquée tant qu'aucune version n'est + connue** ; +- à l'ouverture du panneau, `chargerVersion()` interroge la santé + du service — `GET /healthz` de l'origine que le panneau connaît + déjà (celle injectée par l'hôte, ici `window.DRACO_URLS.agent`) — + et affiche « Service d'agents vX » depuis le champ `version` de + la réponse (la même source que la pilule de la console) ; +- cache de session de 5 minutes, rafraîchissement au rythme des + ouvertures du panneau (comme la vérification d'identité) ; +- **jamais de valeur codée en dur** : réponse illisible ou service + injoignable = la ligne reste masquée — pas de fausse version, pas + d'erreur visible. + +**Preuve.** Épreuve comportementale (jsdom) exécutée sur les 4 +copies avec le contrat d'injection de chaque hôte : santé joignable +→ la ligne affiche « Service d'agents v0.38.0 » (version lue sur +l'origine de l'agent) ; santé injoignable → rien d'affiché ; hôte +sans injection → aucun appel. Test de garde : +`tests/test_draco_barre.py::test_panneau_version_service_affichee_225`. + +**Même livraison** (carte fusion #64) : TikTak 0.61.3, Flowdeck +7.83.1, Kanbante 0.37.1. Côté ObsiGate, la prise d'effet attend le +**redéploiement Docker** (geste de Bruno), comme les items panneau +précédents. diff --git a/frontend/draco-panneau.js b/frontend/draco-panneau.js index 7df5945..ff2ce2d 100644 --- a/frontend/draco-panneau.js +++ b/frontend/draco-panneau.js @@ -42,6 +42,7 @@ var etatConnu = false; var root = null, msgsEl = null, etatEl = null, inputEl = null, sendBtn = null; var titreEl = null, tiroirEl = null; + var versionEl = null, versionConnue = "", versionMaj = 0; function domaine() { try { return localStorage.getItem("draco_domain") || "pro"; } catch (e) { return "pro"; } @@ -269,6 +270,7 @@ ' ' + ' ' + '
Conversation réelle, sous-agents (J3) et missions longues (J5) vers les exécuteurs configurés ; toute écriture dans les apps passe par une approbation.
' + + ' ' + ''; document.body.appendChild(root); msgsEl = root.querySelector(".draco-panneau-msgs"); @@ -277,6 +279,7 @@ sendBtn = root.querySelector("button[type=submit]"); titreEl = root.querySelector(".d-titre"); tiroirEl = root.querySelector(".draco-discussions"); + versionEl = root.querySelector(".draco-panneau-version"); root.querySelector(".fermer").addEventListener("click", fermer); root.querySelector('[data-disc="liste"]').addEventListener("click", basculerTiroir); root.querySelector('[data-disc="nouvelle"]').addEventListener("click", nouvelleDiscussion); @@ -331,6 +334,35 @@ titreEl.title = titreEl.textContent; } + /* ── Version du service : lue en direct dans la santé de + * l'agent (GET /healthz → champ « version », la même source que + * la console) à l'origine que le panneau connaît déjà. Cache de + * session (5 min), rafraîchie à l'ouverture du panneau, au même + * rythme que la vérification d'identité. Jamais de valeur codée + * en dur : source injoignable ou réponse illisible = la ligne + * reste masquée — pas de fausse version, pas d'erreur visible. */ + function afficherVersion() { + if (!versionEl) return; + if (versionConnue) { + versionEl.textContent = "Service d'agents v" + versionConnue; + versionEl.hidden = false; + } + } + function chargerVersion() { + if (!API || !versionEl) return; + if (versionConnue && Date.now() - versionMaj < 300000) { afficherVersion(); return; } + fetch(API + "/healthz") + .then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); }) + .then(function (d) { + if (d && typeof d.version === "string" && /^[0-9]+\.[0-9]+\.[0-9]+/.test(d.version)) { + versionConnue = d.version; + versionMaj = Date.now(); + afficherVersion(); + } + }) + .catch(function () { /* service injoignable : rien d'affiché */ }); + } + function verifierIdentite() { if (etatConnu) return; fetch(API + "/api/v1/me", { credentials: "include" }) @@ -807,6 +839,7 @@ root.classList.add("open"); appliquerTheme(); verifierIdentite(); + chargerVersion(); setTimeout(function () { inputEl.focus(); }, 300); } function fermer() { if (root) root.classList.remove("open"); } diff --git a/package.json b/package.json index 190fdae..522c8dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsigate", - "version": "2.78.2", + "version": "2.79.0", "description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.", "main": "patch.js", "directories": { diff --git a/tests/test_draco_barre.py b/tests/test_draco_barre.py index 5c60162..8e660cd 100644 --- a/tests/test_draco_barre.py +++ b/tests/test_draco_barre.py @@ -129,3 +129,20 @@ def test_rail_mobile_vers_le_vrai_hamburger(): assert 'matchMedia("(max-width: 768px)")' in html assert '"hamburger-btn"' in html assert '"sidebar-toggle-btn"' in html + + +def test_panneau_version_service_affichee_225(): + # #225 : le pied du panneau Spark (mode sidebar) affiche la + # version du service d'agents, comme la console pleine page. + # La version est lue en direct dans la santé du service + # (GET /healthz de l'origine injectée par l'hôte), à l'ouverture + # du panneau ; jamais un littéral de version dans l'asset, et + # source injoignable = ligne laissée masquée (rien d'affiché). + panneau = (FRONTEND / "draco-panneau.js").read_text(encoding="utf-8") + assert "draco-panneau-version" in panneau + assert "chargerVersion" in panneau + assert 'API + "/healthz"' in panneau + assert '"Service d\'agents v" + versionConnue' in panneau + # La ligne naît masquée et n'est démasquée qu'avec une version lue. + assert 'class="draco-panneau-version"' in panneau + assert "versionEl.hidden = false" in panneau