vios_app 0.1.1

Small JSON vaults: Argon2id + AES-GCM, with optional AAD binding.
Documentation
// ๐Ÿš€ VIOS Sovereign Launcher UI

use eframe::egui::{self, CentralPanel, Context, Grid, TextEdit};
use rfd::FileDialog;
use std::collections::HashMap;
use std::fs;
use std::process::Command;

#[derive(Default)]
pub struct MyApp {
    pub vault_preview: String,
    pub metadata: HashMap<String, String>,
}

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &Context, _frame: &mut eframe::Frame) {
        CentralPanel::default().show(ctx, |ui| {
            ui.heading("๐Ÿ” VIOS Sovereign Launcher");
            ui.label("Launch a tool or preview a .vault file with Echo metadata.");

            ui.separator();
            ui.heading("๐Ÿ“ฆ Vault Integrity + Licensing");
            ui.horizontal(|ui| {
                self.tool_button(ui, "๐Ÿ“„ VaultSeal Verify", "vaultseal_verify");
                self.tool_button(ui, "๐Ÿ“œ Vault Certifier", "vault_certifier");
                self.tool_button(ui, "โœ… Validate Vault", "validate_vault");
            });

            ui.separator();
            ui.heading("๐Ÿงฌ Emotional Engine");
            ui.horizontal(|ui| {
                self.tool_button(ui, "๐Ÿง  REEM Viewer", "reem_viewer");
                self.tool_button(ui, "๐Ÿ”Š Test Whisper", "test_whisper");
                self.tool_button(ui, "โ™ป๏ธ Loop Classifier", "test_whisper_loop");
                self.tool_button(ui, "๐Ÿงช Congruence Test", "test_congruence");
            });

            ui.separator();
            ui.heading("๐ŸŒ Consent Tools");
            ui.horizontal(|ui| {
                self.tool_button(ui, "๐Ÿ—ฃ๏ธ EchoReview", "echoreview");
                self.tool_button(ui, "๐Ÿš€ Fleet Control", "vaultfleet");
                self.tool_button(ui, "๐Ÿ“ฅ VaultClaim", "vaultclaim");
                self.tool_button(ui, "๐Ÿ“ VaultDocu", "vaultdocu");
            });

            ui.separator();
            ui.heading("๐Ÿ“‚ Vault Preview");
            if ui.button("๐Ÿ” Load .vault File").clicked() {
                if let Some(path) = FileDialog::new()
                    .add_filter("Vault files", &["vault"])
                    .pick_file()
                {
                    match fs::read_to_string(&path) {
                        Ok(content) => {
                            self.vault_preview = content.clone();
                            self.extract_metadata(&content);
                        }
                        Err(e) => {
                            self.vault_preview = format!("โŒ Failed to read file: {e}");
                            self.metadata.clear();
                        }
                    }
                }
            }

            ui.add(
                TextEdit::multiline(&mut self.vault_preview)
                    .desired_rows(10)
                    .lock_focus(true),
            );

            if !self.metadata.is_empty() {
                ui.separator();
                ui.heading("๐Ÿง  Echo Metadata");
                Grid::new("metadata_grid")
                    .num_columns(2)
                    .striped(true)
                    .show(ui, |ui| {
                        for (key, value) in &self.metadata {
                            ui.label(format!("๐Ÿ”น {key}"));
                            ui.label(value);
                            ui.end_row();
                        }
                    });
            }
        });
    }
}

impl MyApp {
    fn launch(&self, bin_name: &str) {
        let status = Command::new("cargo")
            .args(["run", "--bin", bin_name])
            .status()
            .expect("โŒ Failed to launch binary");
        if !status.success() {
            eprintln!("Subprocess exited with {:?}", status.code());
        }
    }

    fn tool_button(&self, ui: &mut egui::Ui, label: &str, bin: &str) {
        if ui.button(label).clicked() {
            self.launch(bin);
        }
    }

    fn extract_metadata(&mut self, contents: &str) {
        self.metadata.clear();
        for line in contents.lines() {
            if let Some((key, value)) = line.split_once(":") {
                self.metadata
                    .insert(key.trim().to_string(), value.trim().to_string());
            }
        }
    }
}

// โœ… Inject logic from bottom safely into fn main()
fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions::default();
    eframe::run_native(
        "VIOS Sovereign Launcher",
        options,
        Box::new(|_cc| Box::new(MyApp::default())),
    )
}