# Utilisation de ks-config ## Rôle de la crate `ks-config` fournit les types, validations et chargeurs des configurations Khadhroony Solana partagées. Un consommateur peut utiliser les defaults des documents spécialisés ou fournir une composition qui remplace seulement les sélections nécessaires. `ks-config` ne connaît pas la liste des futurs workers ou applications. ## Charger les defaults partagés ```rust let config = match ks_config::read_default_shared_app_config_with_environment( std::path::Path::new("."), ) { Ok(value) => value, Err(error) => return Err(error), }; ``` Le chargeur combine les `default_profile` indépendants de transport, listeners, store, wallet et execution. Il ne suppose pas que ces profils portent tous le même nom. ## Charger une composition de binaire ```rust let composed = match ks_config::read_composed_app_config_with_environment( std::path::Path::new("config/kb-app-demo-desktop.default.config.json"), std::path::Path::new("."), ) { Ok(value) => value, Err(error) => return Err(error), }; let config = composed.app_config; ``` Le chargeur : 1. charge l'environnement du workspace ; 2. valide la composition ; 3. résout les six chemins spécialisés ; 4. charge et valide transport, listeners, store, wallet et execution ; 5. vérifie l'existence du profil logging référencé sans créer de dépendance `ks-config -> ks-logging` ; 6. applique les overrides ou les `default_profile` ; 7. reconstruit le contrat runtime `AppConfig/ProfileConfig` ; 8. applique les invariants croisés existants. Le document logging est ensuite chargé par `ks-logging`, qui possède son type runtime. ## Transport et defaults WebSocket ```rust let transport = match ks_config::read_transport_json_file_with_environment( std::path::Path::new("config/transport.config.json"), std::path::Path::new("."), ) { Ok(value) => value, Err(error) => return Err(error), }; let profile = match ks_config::default_transport_profile(&transport) { Ok(value) => value, Err(error) => return Err(error), }; ``` Les endpoints WebSocket source sélectionnent une classe `ws_endpoint_defaults`; les `overrides` propres à l'endpoint sont appliqués avant de produire `TransportProfileConfig`. ## Listeners `default_listeners_profile` ou `listeners_profile` sélectionnent un ensemble de subscriptions. `resolved_listener_config` le convertit vers le contrat runtime transitoire `ListenerConfig`. ## Store `store.config.json` possède les paramètres de backend et les profils PostgreSQL/SQLite. Les helpers principaux sont `read_store_json_file_with_environment`, `default_store_profile` et `store_profile`. ## Wallet `wallet.config.json` porte `wallets_directory` hors profils. Chaque profil définit un chemin relatif, le cluster, l'alias et la politique temporaire/persistante. `resolved_wallet_profile` construit le chemin runtime final. Les autorisations de soumission ne font plus partie du wallet. ## Exécution `execution.config.json` possède simulation, confirmation, limites et `*_send_enabled`. Les helpers sont `read_execution_json_file_with_environment`, `default_execution_profile` et `execution_profile`. ## Chargement de l'environnement ```rust let report = match ks_config::load_workspace_environment(std::path::Path::new(".")) { Ok(value) => value, Err(error) => return Err(error), }; ``` Par défaut, `ks-config` sélectionne `.env`; `KS_ENV_FILE` permet d'en choisir un autre sans écraser les variables déjà présentes dans le processus. Les valeurs globales peuvent être remplacées, notamment : ```text KS_LOGS_DIRECTORY KS_WALLETS_DIRECTORY ``` ## Contrat runtime résolu `AppConfig` et `ProfileConfig` restent provisoirement le contrat runtime commun afin de ne pas casser tous les consommateurs pendant les splits successifs. Ils ne correspondent plus à un fichier source `app.config.json`. Le schéma de ce contrat est `config/schemas/resolved.app.config.schema.json`. Les fixtures correspondantes sont sous `test-fixtures/config/`. ## Frontière TypeScript Les bindings TS-RS générés depuis `ks-config` ne sont pas importés directement par le frontend desktop actuel. Ils sont donc considérés comme transitoires jusqu'à la prochaine prerelease, qui introduira les DTO publics/diagnostiques et supprimera les exports TypeScript non justifiés des crates généralistes.