rsclaw 2026.5.1

AI Agent Engine Compatible with OpenClaw
Documentation
use anyhow::Result;

use super::config_json::{load_config_json, set_nested_value};
use super::style::*;
use crate::{
    cli::{HeartbeatCommand, SystemCommand},
    config,
};

pub async fn cmd_system(sub: SystemCommand) -> Result<()> {
    match sub {
        SystemCommand::Event => {
            banner(&format!("rsclaw system event v{}", option_env!("RSCLAW_BUILD_VERSION").unwrap_or("dev")));
            kv("stream", &dim("/api/v1/stream (SSE)"));
            println!(
                "  {}",
                dim("Use `rsclaw gateway start` and connect to the SSE endpoint")
            );
        }
        SystemCommand::Presence => {
            banner(&format!("rsclaw system presence v{}", option_env!("RSCLAW_BUILD_VERSION").unwrap_or("dev")));
            let hb_file = config::loader::base_dir().join("var/data/heartbeat.json");
            if hb_file.exists() {
                let raw = std::fs::read_to_string(&hb_file)?;
                if let Ok(v) = serde_json::from_str::<serde_json::Value>(&raw) {
                    let ts = v["lastSeen"].as_str().unwrap_or("unknown");
                    kv("last seen", &bold(ts));
                    return Ok(());
                }
            }
            warn_msg("no heartbeat data found");
        }
        SystemCommand::Heartbeat(sub) => match sub {
            HeartbeatCommand::Last => {
                let hb_file = config::loader::base_dir().join("var/data/heartbeat.json");
                if hb_file.exists() {
                    let raw = std::fs::read_to_string(&hb_file)?;
                    if let Ok(v) = serde_json::from_str::<serde_json::Value>(&raw) {
                        let ts = v["lastSeen"].as_str().unwrap_or("unknown");
                        kv("last heartbeat", &bold(ts));
                        return Ok(());
                    }
                }
                warn_msg("no heartbeat data");
            }
            HeartbeatCommand::Enable => {
                let (path, mut val) = load_config_json()?;
                set_nested_value(&mut val, "system.heartbeat.enabled", true.into())?;
                std::fs::write(&path, serde_json::to_string_pretty(&val)?)?;
                ok("heartbeat enabled");
            }
            HeartbeatCommand::Disable => {
                let (path, mut val) = load_config_json()?;
                set_nested_value(&mut val, "system.heartbeat.enabled", false.into())?;
                std::fs::write(&path, serde_json::to_string_pretty(&val)?)?;
                ok("heartbeat disabled");
            }
        },
    }
    Ok(())
}