Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
070add4e7b | ||
|
|
847b3225b2 | ||
|
|
3ae5c7efac | ||
|
|
4966c27548 | ||
|
|
fddbaec82e |
+18
-1
@@ -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).
|
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
|
> **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
|
## [2.78.2] — 2026-10-26
|
||||||
|
|
||||||
### Corrigé
|
### Corrigé
|
||||||
|
|||||||
+3
-3
@@ -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.
|
**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.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 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*
|
||||||
|
|||||||
@@ -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.
|
**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.
|
||||||
|
|
||||||
[]()
|
[]()
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
[](https://www.python.org/)
|
[](https://www.python.org/)
|
||||||
@@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE)
|
|||||||
|
|
||||||
## 📝 Changelog
|
## 📝 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*
|
||||||
|
|||||||
Generated
+1
-1
@@ -2626,7 +2626,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.78.2"
|
version = "2.79.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "obsigate-desktop"
|
name = "obsigate-desktop"
|
||||||
version = "2.78.2"
|
version = "2.79.0"
|
||||||
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian"
|
||||||
authors = ["Bruno Charest"]
|
authors = ["Bruno Charest"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
"$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json",
|
||||||
"productName": "ObsiGate",
|
"productName": "ObsiGate",
|
||||||
"version": "2.78.2",
|
"version": "2.79.0",
|
||||||
"identifier": "com.obsigate.desktop",
|
"identifier": "com.obsigate.desktop",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../frontend",
|
"frontendDist": "../frontend",
|
||||||
|
|||||||
+20
-1
@@ -1,6 +1,6 @@
|
|||||||
# ObsiGate — Roadmap
|
# 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
|
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
||||||
> vers les fonctionnalités livrées.
|
> vers les fonctionnalités livrées.
|
||||||
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
||||||
@@ -30,6 +30,24 @@
|
|||||||
|
|
||||||
## 🔵 En cours
|
## 🔵 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)
|
### 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)
|
- **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) |
|
| 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-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) |
|
| 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) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
+4
-4
@@ -19,8 +19,8 @@
|
|||||||
var mode = localStorage.getItem("obsigate-theme-mode") || "dark";
|
var mode = localStorage.getItem("obsigate-theme-mode") || "dark";
|
||||||
root.setAttribute("data-theme", mode);
|
root.setAttribute("data-theme", mode);
|
||||||
var light = mode === "light" || mode === "sepia";
|
var light = mode === "light" || mode === "sepia";
|
||||||
root.style.setProperty("--bg-primary", light ? "#ffffff" : "#0f1117");
|
root.style.setProperty("--bg-primary", light ? "#fbfbfa" : "#17181a");
|
||||||
root.style.setProperty("--text-primary", light ? "#1a1a1a" : "#e6edf3");
|
root.style.setProperty("--text-primary", light ? "#242624" : "#eceeeb");
|
||||||
} catch (e) { root.setAttribute("data-theme", "dark"); }
|
} catch (e) { root.setAttribute("data-theme", "dark"); }
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
overflow: auto; /* override SPA style.css: body{overflow:hidden} */
|
overflow: auto; /* override SPA style.css: body{overflow:hidden} */
|
||||||
height: auto; /* override SPA style.css: body{height:100vh} */
|
height: auto; /* override SPA style.css: body{height:100vh} */
|
||||||
background: var(--bg-primary, #0f1117);
|
background: var(--bg-primary, #17181a);
|
||||||
color: var(--text-primary, #e6edf3);
|
color: var(--text-primary, #eceeeb);
|
||||||
font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
|
font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
var etatConnu = false;
|
var etatConnu = false;
|
||||||
var root = null, msgsEl = null, etatEl = null, inputEl = null, sendBtn = null;
|
var root = null, msgsEl = null, etatEl = null, inputEl = null, sendBtn = null;
|
||||||
var titreEl = null, tiroirEl = null;
|
var titreEl = null, tiroirEl = null;
|
||||||
|
var versionEl = null, versionConnue = "", versionMaj = 0;
|
||||||
|
|
||||||
function domaine() {
|
function domaine() {
|
||||||
try { return localStorage.getItem("draco_domain") || "pro"; } catch (e) { return "pro"; }
|
try { return localStorage.getItem("draco_domain") || "pro"; } catch (e) { return "pro"; }
|
||||||
@@ -269,6 +270,7 @@
|
|||||||
' <input type="text" placeholder="Écrire à Spark…" autocomplete="off" aria-label="Message à Spark">' +
|
' <input type="text" placeholder="Écrire à Spark…" autocomplete="off" aria-label="Message à Spark">' +
|
||||||
' <button type="submit">Envoyer</button></form>' +
|
' <button type="submit">Envoyer</button></form>' +
|
||||||
' <div class="draco-panneau-note">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.</div>' +
|
' <div class="draco-panneau-note">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.</div>' +
|
||||||
|
' <div class="draco-panneau-version" style="margin-top:6px;font-size:11.5px;opacity:.6" hidden></div>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
document.body.appendChild(root);
|
document.body.appendChild(root);
|
||||||
msgsEl = root.querySelector(".draco-panneau-msgs");
|
msgsEl = root.querySelector(".draco-panneau-msgs");
|
||||||
@@ -277,6 +279,7 @@
|
|||||||
sendBtn = root.querySelector("button[type=submit]");
|
sendBtn = root.querySelector("button[type=submit]");
|
||||||
titreEl = root.querySelector(".d-titre");
|
titreEl = root.querySelector(".d-titre");
|
||||||
tiroirEl = root.querySelector(".draco-discussions");
|
tiroirEl = root.querySelector(".draco-discussions");
|
||||||
|
versionEl = root.querySelector(".draco-panneau-version");
|
||||||
root.querySelector(".fermer").addEventListener("click", fermer);
|
root.querySelector(".fermer").addEventListener("click", fermer);
|
||||||
root.querySelector('[data-disc="liste"]').addEventListener("click", basculerTiroir);
|
root.querySelector('[data-disc="liste"]').addEventListener("click", basculerTiroir);
|
||||||
root.querySelector('[data-disc="nouvelle"]').addEventListener("click", nouvelleDiscussion);
|
root.querySelector('[data-disc="nouvelle"]').addEventListener("click", nouvelleDiscussion);
|
||||||
@@ -331,6 +334,35 @@
|
|||||||
titreEl.title = titreEl.textContent;
|
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() {
|
function verifierIdentite() {
|
||||||
if (etatConnu) return;
|
if (etatConnu) return;
|
||||||
fetch(API + "/api/v1/me", { credentials: "include" })
|
fetch(API + "/api/v1/me", { credentials: "include" })
|
||||||
@@ -807,6 +839,7 @@
|
|||||||
root.classList.add("open");
|
root.classList.add("open");
|
||||||
appliquerTheme();
|
appliquerTheme();
|
||||||
verifierIdentite();
|
verifierIdentite();
|
||||||
|
chargerVersion();
|
||||||
setTimeout(function () { inputEl.focus(); }, 300);
|
setTimeout(function () { inputEl.focus(); }, 300);
|
||||||
}
|
}
|
||||||
function fermer() { if (root) root.classList.remove("open"); }
|
function fermer() { if (root) root.classList.remove("open"); }
|
||||||
|
|||||||
+4
-4
@@ -10,7 +10,7 @@
|
|||||||
name="description"
|
name="description"
|
||||||
content="Porte d'entrée web pour vos vaults Obsidian - Accédez, naviguez et recherchez dans toutes vos notes"
|
content="Porte d'entrée web pour vos vaults Obsidian - Accédez, naviguez et recherchez dans toutes vos notes"
|
||||||
/>
|
/>
|
||||||
<meta name="theme-color" content="#2563eb" />
|
<meta name="theme-color" content="#7c5cd6" />
|
||||||
<meta name="mobile-web-app-capable" content="yes" />
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
<meta
|
<meta
|
||||||
@@ -54,14 +54,14 @@
|
|||||||
#boot-splash {
|
#boot-splash {
|
||||||
position: fixed; inset: 0; z-index: 2147483647;
|
position: fixed; inset: 0; z-index: 2147483647;
|
||||||
display: flex; align-items: center; justify-content: center;
|
display: flex; align-items: center; justify-content: center;
|
||||||
background: radial-gradient(1200px 600px at 50% -10%, #1b2030 0%, #0e1117 60%);
|
background: radial-gradient(1200px 600px at 50% -10%, #26272b 0%, #17181a 60%);
|
||||||
color: #e6e8ee; font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
|
color: #eceeeb; font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
|
||||||
}
|
}
|
||||||
body.app-booted #boot-splash { display: none; }
|
body.app-booted #boot-splash { display: none; }
|
||||||
.bs-card { display: flex; flex-direction: column; align-items: center; gap: 14px; }
|
.bs-card { display: flex; flex-direction: column; align-items: center; gap: 14px; }
|
||||||
.bs-logo {
|
.bs-logo {
|
||||||
width: 72px; height: 72px; display: flex; align-items: center; justify-content: center;
|
width: 72px; height: 72px; display: flex; align-items: center; justify-content: center;
|
||||||
font-size: 38px; background: #171c26; border: 1px solid #2a3242; border-radius: 18px;
|
font-size: 38px; background: #1f2023; border: 1px solid #33353a; border-radius: 18px;
|
||||||
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.45);
|
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.45);
|
||||||
}
|
}
|
||||||
.bs-title { font-size: 22px; font-weight: 600; letter-spacing: 0.3px; }
|
.bs-title { font-size: 22px; font-weight: 600; letter-spacing: 0.3px; }
|
||||||
|
|||||||
+67
-2
@@ -1,5 +1,5 @@
|
|||||||
/* ObsiGate — Theme System
|
/* ObsiGate — Theme System
|
||||||
* 15 themes x 2 modes (dark/light)
|
* 16 themes x 2 modes (dark/light)
|
||||||
* Persisted in localStorage as 'obsigate-theme'
|
* Persisted in localStorage as 'obsigate-theme'
|
||||||
* Usage: import { initThemes, applyTheme, getCurrentTheme, THEMES } from './themes.js'
|
* Usage: import { initThemes, applyTheme, getCurrentTheme, THEMES } from './themes.js'
|
||||||
*/
|
*/
|
||||||
@@ -45,6 +45,71 @@ var THEMES = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ── Thème Spark ──────────────────────────────────────────────────────
|
||||||
|
// Palette source : console Spark (agent.dracodev.net), app/console/console.css
|
||||||
|
// (variables --p-*). Mapping Spark -> ObsiGate, identique en structure pour
|
||||||
|
// dark et light ; seules les valeurs changent (sauf accent/ok/warn/err).
|
||||||
|
// Fidèle (valeur Spark directe) :
|
||||||
|
// fond -> --bg-primary, --surface2 ; surface -> --surface ;
|
||||||
|
// chip -> --bg-secondary, --tag-bg ; chip-survol -> --bg-hover ;
|
||||||
|
// bord -> --border ; chip-bord -> --border-md, --scrollbar, --resize-handle ;
|
||||||
|
// texte -> --text-primary, --text ; doux -> --text-secondary, --text-2 ;
|
||||||
|
// faint -> --text-muted, --text-3 ; champ -> --search-bg ;
|
||||||
|
// code -> --code-bg ; accent -> --accent, --accent-card, --purple, --ai ;
|
||||||
|
// lien -> --accent-text (variante lisible de l'accent sur fond teinté) ;
|
||||||
|
// ok -> --accent-green, --success, --green ;
|
||||||
|
// danger -> --danger ; danger-fond -> --danger-bg ;
|
||||||
|
// pastilles ok (fond) -> --success-bg, --green-bg ;
|
||||||
|
// pastilles ok (texte) -> --ok ; ambre -> --warn ; rouge -> --err.
|
||||||
|
// Approximations documentées (ObsiGate a plus de variables que Spark,
|
||||||
|
// ce ne sont PAS des valeurs Spark) :
|
||||||
|
// --bg-sidebar <- fond (Spark n'a pas de token sidebar dédié) ;
|
||||||
|
// --accent-bg <- agent (surface teintée de Spark, pas de teinte lavande) ;
|
||||||
|
// --surface3 <- agent ; --purple-bg <- appro-fond (fond teinté le plus
|
||||||
|
// proche, la palette Spark n'a pas de teinte lavande) ;
|
||||||
|
// --overlay-bg <- convention ObsiGate (rgba noir 0.3 clair / 0.5 sombre,
|
||||||
|
// aucun token voile dans la palette Spark).
|
||||||
|
// Non reportés (aucune variable ObsiGate correspondante dans les 39) :
|
||||||
|
// bulle utilisateur/envoi #2f6fed, titres approbation #9a6a1c / #e8bc7a.
|
||||||
|
// Une seule entrée 'spark' : dark et light sont ses deux modes, jamais
|
||||||
|
// deux thèmes séparés. Modes high-contrast/sepia générés comme pour les
|
||||||
|
// autres thèmes (à partir de dark/light).
|
||||||
|
'spark': {
|
||||||
|
name: 'Spark', desc: 'Palette de la console Spark',
|
||||||
|
modes: {
|
||||||
|
dark: {
|
||||||
|
'--bg-primary': '#17181a', '--bg-secondary': '#26272b', '--bg-sidebar': '#17181a',
|
||||||
|
'--bg-hover': '#2e3036', '--border': '#33353a', '--text-primary': '#eceeeb',
|
||||||
|
'--text-secondary': '#a6aba0', '--text-muted': '#83887e', '--accent': '#7c5cd6',
|
||||||
|
'--accent-green': '#2ea36b', '--tag-bg': '#26272b', '--tag-text': '#7c5cd6',
|
||||||
|
'--code-bg': '#2c2e33', '--search-bg': '#1f2023', '--scrollbar': '#3a3c41',
|
||||||
|
'--resize-handle': '#3a3c41', '--overlay-bg': 'rgba(0,0,0,0.5)', '--danger': '#e8a08d',
|
||||||
|
'--danger-bg': '#40241f', '--success': '#2ea36b', '--success-bg': '#173d29',
|
||||||
|
'--accent-card': '#7c5cd6', '--accent-bg': '#26272b', '--accent-text': '#b39df5',
|
||||||
|
'--green': '#2ea36b', '--green-bg': '#173d29', '--purple': '#7c5cd6',
|
||||||
|
'--purple-bg': '#2a2118', '--surface': '#1f2023', '--surface2': '#17181a',
|
||||||
|
'--surface3': '#26272b', '--border-md': '#3a3c41', '--text': '#eceeeb',
|
||||||
|
'--text-2': '#a6aba0', '--text-3': '#83887e', '--ok': '#7fd6a8',
|
||||||
|
'--warn': '#e8a13c', '--ai': '#7c5cd6', '--err': '#cf4b32'
|
||||||
|
},
|
||||||
|
light: {
|
||||||
|
'--bg-primary': '#fbfbfa', '--bg-secondary': '#f4f5f1', '--bg-sidebar': '#fbfbfa',
|
||||||
|
'--bg-hover': '#e9ebe4', '--border': '#e4e5e0', '--text-primary': '#242624',
|
||||||
|
'--text-secondary': '#6c7268', '--text-muted': '#8a8f84', '--accent': '#7c5cd6',
|
||||||
|
'--accent-green': '#2ea36b', '--tag-bg': '#f4f5f1', '--tag-text': '#7c5cd6',
|
||||||
|
'--code-bg': '#e8eae3', '--search-bg': '#ffffff', '--scrollbar': '#d6d8d1',
|
||||||
|
'--resize-handle': '#d6d8d1', '--overlay-bg': 'rgba(0,0,0,0.3)', '--danger': '#a03a28',
|
||||||
|
'--danger-bg': '#f6e3de', '--success': '#2ea36b', '--success-bg': '#dff2e7',
|
||||||
|
'--accent-card': '#7c5cd6', '--accent-bg': '#eef0ea', '--accent-text': '#5b3df0',
|
||||||
|
'--green': '#2ea36b', '--green-bg': '#dff2e7', '--purple': '#7c5cd6',
|
||||||
|
'--purple-bg': '#fdf6ec', '--surface': '#ffffff', '--surface2': '#fbfbfa',
|
||||||
|
'--surface3': '#eef0ea', '--border-md': '#d6d8d1', '--text': '#242624',
|
||||||
|
'--text-2': '#6c7268', '--text-3': '#8a8f84', '--ok': '#1d7a4c',
|
||||||
|
'--warn': '#e8a13c', '--ai': '#7c5cd6', '--err': '#cf4b32'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
'github': {
|
'github': {
|
||||||
name: 'GitHub', desc: 'Contraste doux',
|
name: 'GitHub', desc: 'Contraste doux',
|
||||||
modes: {
|
modes: {
|
||||||
@@ -523,7 +588,7 @@ var THEMES = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// ── Theme Engine ─────────────────────────────────────────────────────
|
// ── Theme Engine ─────────────────────────────────────────────────────
|
||||||
var _currentTheme = 'defaut-obsigate';
|
var _currentTheme = 'spark';
|
||||||
var _currentMode = 'dark';
|
var _currentMode = 'dark';
|
||||||
|
|
||||||
var AVAILABLE_MODES = ['dark', 'light', 'high-contrast', 'sepia'];
|
var AVAILABLE_MODES = ['dark', 'light', 'high-contrast', 'sepia'];
|
||||||
|
|||||||
+42
-42
@@ -11,58 +11,58 @@
|
|||||||
|
|
||||||
/* ── Editor save dot state colors ── */
|
/* ── Editor save dot state colors ── */
|
||||||
:root {
|
:root {
|
||||||
--ok: #34d399;
|
--ok: #7fd6a8;
|
||||||
--warn: #fbbf24;
|
--warn: #e8a13c;
|
||||||
--ai: #8b5cf6;
|
--ai: #7c5cd6;
|
||||||
--err: #f87171;
|
--err: #cf4b32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===== THEME — DARK (fallback default, no data-theme) ===== */
|
/* ===== THEME — DARK (fallback default, no data-theme) ===== */
|
||||||
:root {
|
:root {
|
||||||
--bg-primary: #0f1117;
|
--bg-primary: #17181a;
|
||||||
--bg-secondary: #161b22;
|
--bg-secondary: #26272b;
|
||||||
--bg-sidebar: #13161d;
|
--bg-sidebar: #17181a;
|
||||||
--bg-hover: #1f2430;
|
--bg-hover: #2e3036;
|
||||||
--border: #21262d;
|
--border: #33353a;
|
||||||
--text-primary: #e6edf3;
|
--text-primary: #eceeeb;
|
||||||
--text-secondary: #8b949e;
|
--text-secondary: #a6aba0;
|
||||||
--text-muted: #484f58;
|
--text-muted: #83887e;
|
||||||
--accent: #58a6ff;
|
--accent: #7c5cd6;
|
||||||
--accent-green: #3fb950;
|
--accent-green: #2ea36b;
|
||||||
--tag-bg: #1f2a3a;
|
--tag-bg: #26272b;
|
||||||
--tag-text: #79c0ff;
|
--tag-text: #7c5cd6;
|
||||||
--code-bg: #161b22;
|
--code-bg: #2c2e33;
|
||||||
--search-bg: #21262d;
|
--search-bg: #1f2023;
|
||||||
--scrollbar: #30363d;
|
--scrollbar: #3a3c41;
|
||||||
--resize-handle: #30363d;
|
--resize-handle: #3a3c41;
|
||||||
--overlay-bg: rgba(0, 0, 0, 0.5);
|
--overlay-bg: rgba(0, 0, 0, 0.5);
|
||||||
--danger: #ff7b72;
|
--danger: #e8a08d;
|
||||||
--danger-bg: #3d1a18;
|
--danger-bg: #40241f;
|
||||||
--success: #3fb950;
|
--success: #2ea36b;
|
||||||
--success-bg: #1a3d1f;
|
--success-bg: #173d29;
|
||||||
--accent-card: #58a6ff;
|
--accent-card: #7c5cd6;
|
||||||
--accent-bg: #1f2a3a;
|
--accent-bg: #26272b;
|
||||||
--accent-text: #79c0ff;
|
--accent-text: #b39df5;
|
||||||
--green: #3fb950;
|
--green: #2ea36b;
|
||||||
--green-bg: #1a3d1f;
|
--green-bg: #173d29;
|
||||||
--purple: #a371f7;
|
--purple: #7c5cd6;
|
||||||
--purple-bg: #2d1b4e;
|
--purple-bg: #2a2118;
|
||||||
--surface: #161b22;
|
--surface: #1f2023;
|
||||||
--surface2: #0f1117;
|
--surface2: #17181a;
|
||||||
--surface3: #0d0f14;
|
--surface3: #26272b;
|
||||||
--border-md: #30363d;
|
--border-md: #3a3c41;
|
||||||
--text: #e6edf3;
|
--text: #eceeeb;
|
||||||
--text-2: #8b949e;
|
--text-2: #a6aba0;
|
||||||
--text-3: #484f58;
|
--text-3: #83887e;
|
||||||
--mono: "JetBrains Mono", monospace;
|
--mono: "JetBrains Mono", monospace;
|
||||||
--radius: 6px;
|
--radius: 6px;
|
||||||
--radius-lg: 10px;
|
--radius-lg: 10px;
|
||||||
/* #154-A1 — data-grid tokens: the sheet reads slightly lighter than the
|
/* #154-A1 — data-grid tokens: the sheet reads slightly lighter than the
|
||||||
chrome (toolbar/panels), headers are clearly distinct from cells. */
|
chrome (toolbar/panels), headers are clearly distinct from cells. */
|
||||||
--grid-bg: #161b22;
|
--grid-bg: #1f2023;
|
||||||
--grid-header-bg: #1f2430;
|
--grid-header-bg: #2e3036;
|
||||||
--grid-header-text: #e6edf3;
|
--grid-header-text: #eceeeb;
|
||||||
--grid-border: #3d444d;
|
--grid-border: #33353a;
|
||||||
--grid-zebra: rgba(255, 255, 255, 0.025);
|
--grid-zebra: rgba(255, 255, 255, 0.025);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsigate",
|
"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.",
|
"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",
|
"main": "patch.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
|
|||||||
@@ -129,3 +129,20 @@ def test_rail_mobile_vers_le_vrai_hamburger():
|
|||||||
assert 'matchMedia("(max-width: 768px)")' in html
|
assert 'matchMedia("(max-width: 768px)")' in html
|
||||||
assert '"hamburger-btn"' in html
|
assert '"hamburger-btn"' in html
|
||||||
assert '"sidebar-toggle-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
|
||||||
|
|||||||
Reference in New Issue
Block a user