From d7185905d830701cc0280ba7b5e760fc7b2b0e77 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sun, 16 Aug 2026 17:38:23 +0200 Subject: [PATCH] v0.1.4-pre.015 --- Cargo.toml | 4 +- config/std.logging.json | 146 ++--- crates/ksp-app-config-desk/README.md | 10 +- crates/ksp-app-config-desk/TODO.md | 6 +- crates/ksp-app-config-desk/USAGE.md | 10 +- crates/ksp-app-config-desk/frontend/main.html | 215 ++++-- .../frontend/ts/logging.ts | 613 +++++++++++++++--- .../ksp-app-config-desk/frontend/ts/main.ts | 4 +- crates/ksp-app-config-desk/src/lib.rs | 4 +- .../ksp-app-config-desk/src/logging_editor.rs | 123 +++- crates/ksp-app-config-desk/src/tauri.rs | 15 +- .../unit_tests/logging_editor.rs | 71 +- crates/ksp-config-lib/src/management.rs | 7 +- crates/ksp-config-lib/tests/public_api.rs | 8 +- .../ksp-config-lib/unit_tests/management.rs | 11 +- deltas/0.1.4/pre.015.md | 114 ++++ docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md | 68 +- 17 files changed, 1124 insertions(+), 305 deletions(-) create mode 100644 deltas/0.1.4/pre.015.md diff --git a/Cargo.toml b/Cargo.toml index b14edab..01b69db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 83 +# version: 84 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib"] [workspace.package] -version = "0.1.4-pre.14" +version = "0.1.4-pre.15" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/config/std.logging.json b/config/std.logging.json index e45584d..bf0b4b6 100644 --- a/config/std.logging.json +++ b/config/std.logging.json @@ -1,79 +1,77 @@ { - "format_version": 1, - "logs_directory": "${KSP_LOGS_DIRECTORY:-logs}", - "default_profile": "local_dev", - "profiles": [ + "default_profile": "local_dev", + "format_version": 1, + "logs_directory": "${KSP_LOGS_DIRECTORY:-logs}", + "profiles": [ + { + "console": { + "ansi": true, + "enabled": true, + "filter": { + "domains": [ + "*" + ], + "level": "debug", + "targets": [ + "*" + ] + }, + "format": "compact", + "output": "stderr" + }, + "default_filter": "info", + "files": [ { - "profile_id": "local_dev", - "default_filter": "warn", - "span_events": "new_and_close", - "console": { - "enabled": true, - "output": "stderr", - "ansi": true, - "format": "compact", - "filter": { - "level": "debug", - "targets": [ - "*" - ], - "domains": [ - "*" - ] - } - }, - "files": [ - { - "output_id": "file.all.debug", - "enabled": true, - "path": "debug/ksp-debug.log", - "rotation": "daily", - "format": "human", - "ansi": false, - "filter": { - "level": "debug", - "targets": [ - "*" - ], - "domains": [ - "*" - ] - } - }, - { - "output_id": "file.config.error", - "enabled": true, - "path": "config/ksp-config-errors.jsonl", - "rotation": "daily", - "format": "json", - "ansi": false, - "filter": { - "level": "error", - "targets": [ - "ksp-config-lib" - ], - "domains": [ - "config" - ] - } - } + "ansi": false, + "enabled": true, + "filter": { + "domains": [ + "*" ], - "target_filters": [ - { - "target_prefix": "ksp-config-lib", - "level": "trace" - }, - { - "target_prefix": "ksp-logging-lib", - "level": "debug" - }, - { - "target_prefix": "ksp-app-config-desk", - "level": "debug" - } - ] + "level": "debug", + "targets": [ + "*" + ] + }, + "format": "human", + "output_id": "file.all.debug", + "path": "debug/ksp-debug.log", + "rotation": "daily" + }, + { + "ansi": false, + "enabled": true, + "filter": { + "domains": [ + "config" + ], + "level": "error", + "targets": [ + "ksp-config-lib" + ] + }, + "format": "json", + "output_id": "file.config.error", + "path": "config/ksp-config-errors.jsonl", + "rotation": "daily" } - ] - - + ], + "profile_id": "local_dev", + "span_events": "off", + "target_filters": [ + { + "level": "trace", + "target_prefix": "ksp-config-lib" + }, + { + "level": "debug", + "target_prefix": "ksp-logging-lib" + }, + { + "level": "debug", + "target_prefix": "ksp-app-config-desk" + } + ] + } + ] } diff --git a/crates/ksp-app-config-desk/README.md b/crates/ksp-app-config-desk/README.md index dbb2183..9243906 100644 --- a/crates/ksp-app-config-desk/README.md +++ b/crates/ksp-app-config-desk/README.md @@ -1,5 +1,5 @@ - + # `ksp-app-config-desk` @@ -29,7 +29,7 @@ Le gabarit desktop actif fournit maintenant : - le panneau Documents générique alimenté par le registre `ksp-config-lib`, avec diagnostics backend et réparation validée ; - le panneau Profils générique pour `default_profile`, sélection explicite, vues global/profil/effective sûre et provenance ; - le panneau Environnement alimenté uniquement par `ConfigManagement`, avec rapport desired/effective sûr, source/shadowing, management atomique `.env` et reveal Secret privilégié/transitoire ; -- le panneau Logging en lecture typée, alimenté par `ConfigManagement::load_logging_document()` et projetant profils, console, fichiers, filtres, targets et domains sans parsing frontend ; +- le panneau Logging typé, alimenté par `ConfigManagement::load_logging_document()` / `save_logging_document()`, avec brouillon éditable, profils, console, fichiers, filtres, targets et domains sans parsing JSON frontend ; - `tauri-plugin-tracing` côté Rust et `@fltsci/tauri-plugin-tracing` côté frontend ; - les ports dédiés `1430` pour Vite HTTP et `1431` pour le WebSocket de développement ; - la destination frontend externe commune à Tauri et Vite; @@ -132,7 +132,7 @@ KSP_DESK_SPLASH_FADE_MS=300 Après la readiness frontend, Rust émet `fade_in`, attend la durée minimale, émet `fade_out`, attend la durée de fade puis `tw_main.rs` affiche/focalise `main` avant destruction du splash. Le backend journalise en `debug` les valeurs résolues, leur provenance (`process`, `dotenv` ou `fallback`), chaque attente réellement observée et la durée totale. Avec `12000/3000`, la durée backend attendue entre readiness et activation de `main` est donc d'environ `15000 ms`. Une valeur splash invalide ne bloque pas le manager : des timings de fallback sûrs restent en mémoire afin que la future surface `.env` puisse permettre la réparation. -Le shell principal expose les cinq routes de référence `Vue d'ensemble`, `Documents`, `Profils`, `Environnement / .env` et `Logging`. Le logo porte déjà l'identité KSP ; le texte du header suit donc la forme `Config Desk — ` au lieu de répéter `KSP`. Les quelques commandes principales restent des pills/tabs à droite ; un dropdown sera préféré lorsqu'une application possède trop de commandes pour conserver ce format lisible. La route Logging expose maintenant la lecture typée du document et de ses profils ; les mutations/persistence et le hot reload restent réservés aux prereleases suivantes. +Le shell principal expose les cinq routes de référence `Vue d'ensemble`, `Documents`, `Profils`, `Environnement / .env` et `Logging`. Le logo porte déjà l'identité KSP ; le texte du header suit donc la forme `Config Desk — ` au lieu de répéter `KSP`. Les quelques commandes principales restent des pills/tabs à droite ; un dropdown sera préféré lorsqu'une application possède trop de commandes pour conserver ce format lisible. La route Logging expose maintenant un brouillon typé éditable et sa persistence atomique ; le hot reload runtime reste réservé à `pre.016`. ## Panneau Profils @@ -141,11 +141,11 @@ La vue **Profils** inspecte les documents validés qui exposent le contrat stand L'inspection expose le profil par défaut ou une sélection explicite, les vues source `globals` et `profile`, ainsi que l'effective après résolution environnementale. Cette dernière est toujours sérialisée depuis `ResolvedConfigJson::safe_value()` afin qu'une substitution Secret soit redacted. La provenance top-level distingue `global` / `profile`; la provenance environnement n'expose que JSON Pointer, nom de variable, source `process`/`.env`/fallback et sensibilité, jamais la valeur résolue. -## Panneau Logging — lecture typée +## Panneau Logging — édition typée et persistence La vue **Logging** charge le document standard exclusivement avec `ConfigManagement::load_logging_document()`. Rust mappe ensuite les types publics `LoggingConfigDocument`, `LoggingProfileConfig`, `LoggingConsoleConfig`, `LoggingFileConfig`, `LoggingOutputFilterConfig` et `LoggingTargetFilterConfig` vers des DTO TS-RS dédiés. Le frontend ne parse donc ni le JSON source ni son schema. -La tranche de lecture expose `format_version`, `logs_directory`, `default_profile`, tous les profils, la console, les fichiers persistants, les filtres locaux, les target overrides et les listes de targets/domains. La sélection d'un profil ne modifie rien : `pre.014` est strictement read-only. Les mutations typées et la persistence via `save_logging_document()` appartiennent à `pre.015`. +Le panneau expose `format_version`, `logs_directory`, `default_profile`, tous les profils, la console, les fichiers persistants, les filtres locaux, les target overrides et les listes de targets/domains. En `pre.015`, le frontend maintient un brouillon typé : create/clone/rename/delete de profils, 0/1/N file sinks et target filters restent locaux jusqu'à **Sauvegarder**. Le backend reconstruit les types publics Config et appelle `ConfigManagement::save_logging_document()`, qui valide la totalité du candidat avant remplacement atomique. Le runtime actif n'est pas reconfiguré avant `pre.016`. ## Traçabilité frontend diff --git a/crates/ksp-app-config-desk/TODO.md b/crates/ksp-app-config-desk/TODO.md index 2bd511c..4cd5472 100644 --- a/crates/ksp-app-config-desk/TODO.md +++ b/crates/ksp-app-config-desk/TODO.md @@ -1,13 +1,13 @@ - + # TODO `ksp-app-config-desk` -Le gabarit frontend, le bootstrap Config/Logging, `AppState`, le `LoggingGuard` durable, les premiers DTO TS-RS, le bridge frontend logging KSP, le lifecycle `splash -> main`, les panneaux Documents, Profils/provenance et Environnement avec management `.env`/reveal Secret privilégié, ainsi que la lecture typée du document Logging sont maintenant présents. +Le gabarit frontend, le bootstrap Config/Logging, `AppState`, le `LoggingGuard` durable, les premiers DTO TS-RS, le bridge frontend logging KSP, le lifecycle `splash -> main`, les panneaux Documents, Profils/provenance et Environnement avec management `.env`/reveal Secret privilégié, ainsi que l'édition typée/persistence atomique du document Logging sont maintenant présents. Les prochaines tranches doivent encore : -- ajouter les mutations/persistence du Logging editor puis son hot reload et son panneau de test ; +- ajouter le hot reload du Logging editor puis son panneau de test ; - faire évoluer le runtime Logging vers des fichiers applicatifs uniques par lancement (`app-name..`) ; - ramener le target applicatif de `debug` à `info` ou `warn` avant clôture de la release ; - démontrer le hot reload Logging et le panneau de test de routage ; diff --git a/crates/ksp-app-config-desk/USAGE.md b/crates/ksp-app-config-desk/USAGE.md index 0532379..331cdf6 100644 --- a/crates/ksp-app-config-desk/USAGE.md +++ b/crates/ksp-app-config-desk/USAGE.md @@ -1,11 +1,11 @@ - + # Utilisation de `ksp-app-config-desk` ## État actuel -Le gabarit Rust/Tauri et le frontend Vite/TypeScript/SCSS sont présents. Le backend initialise Config, le runtime Logging et `AppState`. Les panneaux Documents, Profils et Environnement/`.env` sont fonctionnels, y compris les mutations `.env` create/update/remove et les reveals Secrets privilégiés. Logging expose maintenant son document/profils/sinks/filtres en lecture typée ; les mutations et le hot reload restent à compléter. +Le gabarit Rust/Tauri et le frontend Vite/TypeScript/SCSS sont présents. Le backend initialise Config, le runtime Logging et `AppState`. Les panneaux Documents, Profils et Environnement/`.env` sont fonctionnels, y compris les mutations `.env` create/update/remove et les reveals Secrets privilégiés. Logging expose maintenant un brouillon typé éditable et une persistence atomique ; seul le hot reload runtime reste à compléter. La fenêtre `splash` est visible au démarrage. Après readiness du frontend et temporisation résolue par Config, l'application effectue le fade-out, affiche/focalise `main` puis détruit `splash`. La fenêtre principale expose immédiatement la navigation monofenêtre de référence. @@ -131,7 +131,7 @@ Environnement / .env Logging ``` -Les cinq vues sont maintenant fonctionnelles en lecture. Logging charge le contrat typé `std.logging.json`; ses mutations et son hot reload restent désactivés jusqu'aux tranches dédiées. Le header affiche `Config Desk — ` : le logo fournit déjà l'identité KSP. Les commandes principales peu nombreuses utilisent des pills/tabs alignées à droite ; une application plus chargée devra préférer un dropdown. Chaque clic de tab est tracé en `trace`, l'activation utilisateur significative reste tracée en `debug`, et chaque remplacement/rendu de section en `trace`. Les appels Tauri partagés utilisent `frontend/ts/invoke.ts`, qui journalise le début et la fin d'une commande sans journaliser ses arguments. +Les cinq vues sont fonctionnelles. Logging charge le contrat typé `std.logging.json`, permet de modifier son brouillon puis de le persister via Config ; son hot reload runtime reste désactivé jusqu'à `pre.016`. Le header affiche `Config Desk — ` : le logo fournit déjà l'identité KSP. Les commandes principales peu nombreuses utilisent des pills/tabs alignées à droite ; une application plus chargée devra préférer un dropdown. Chaque clic de tab est tracé en `trace`, l'activation utilisateur significative reste tracée en `debug`, et chaque remplacement/rendu de section en `trace`. Les appels Tauri partagés utilisent `frontend/ts/invoke.ts`, qui journalise le début et la fin d'une commande sans journaliser ses arguments. ## Asset font du splash @@ -200,7 +200,7 @@ Le bouton **Supprimer** ouvre un modal Bootstrap indiquant la variable ciblée. Pour valider le shadowing, lancer ponctuellement l'application avec `KSP_LOGS_DIRECTORY` fourni par le process puis modifier la même variable dans `.env` depuis le panneau. Le résultat attendu est `source_changed=true`, `effective_changed=false`, `shadowed_by_process_environment=true`, `reload_required=false`. Le process hérité reste prioritaire et n'est jamais modifié par Config Desk. -## Panneau Logging — lecture typée +## Panneau Logging — édition typée La vue **Logging** appelle `get_logging_document`. Le backend charge le document avec `ConfigManagement::load_logging_document()` et expose : @@ -210,5 +210,5 @@ La vue **Logging** appelle `get_logging_document`. Le backend charge le document - tous les fichiers (`output_id`, path, rotation, format, ANSI et filtre) ; - tous les `target_filters` globaux. -Le sélecteur **Profil inspecté** ne modifie pas le document. **Rafraîchir** relit la source typée. Aucun bouton de sauvegarde n'est présent en `pre.014`; les opérations create/clone/rename/delete, `default_profile` et persistence sont volontairement reportées à `pre.015`. +Le sélecteur **Profil édité** travaille sur un brouillon local. `logs_directory`, `default_profile`, profils, console, file sinks, filtres et target overrides sont modifiables. **Créer**, **Cloner**, **Renommer** et **Supprimer** agissent d'abord sur le brouillon ; la suppression de profil est confirmée par modal Bootstrap. **Sauvegarder** envoie un candidat typé à `save_logging_document`, qui reconstruit les contrats Config et persiste atomiquement après validation. **Recharger** resynchronise depuis la source et demande confirmation si le brouillon contient des changements non sauvegardés. Le runtime Logging actif ne change pas dans `pre.015`. diff --git a/crates/ksp-app-config-desk/frontend/main.html b/crates/ksp-app-config-desk/frontend/main.html index ea3c7ad..859a160 100644 --- a/crates/ksp-app-config-desk/frontend/main.html +++ b/crates/ksp-app-config-desk/frontend/main.html @@ -1,5 +1,5 @@ - + @@ -300,110 +300,144 @@ @@ -417,6 +451,43 @@ + + + +