tail-fin-daemon 0.5.0

Long-running browser-session daemon for tail-fin (tfd binary). Keeps Chrome tabs warm across invocations via a Unix-socket protocol; registers Site implementations through a runtime Arc<dyn Site> registry.
Documentation
use clap::Subcommand;
use night_fury_daemon_core::cli::make_req;
use night_fury_daemon_core::{client, spawn};
use serde_json::json;

use super::{acquire_then_exec, ExecArgs};

#[derive(Subcommand)]
pub enum GrokCmd {
    /// Ask Grok a question
    Ask {
        prompt: String,
        #[arg(long, default_value_t = 30)]
        timeout: u64,
    },
    /// List recent conversations
    Conversations,
}

pub async fn run(
    cmd: GrokCmd,
    socket: &str,
    host: &str,
    session: Option<String>,
) -> anyhow::Result<()> {
    let (cmd_name, params) = match cmd {
        GrokCmd::Ask { prompt, timeout } => {
            ("grok.ask", json!({"prompt": prompt, "timeout": timeout}))
        }
        GrokCmd::Conversations => ("grok.conversations", json!({})),
    };

    if let Some(sid) = session {
        spawn::ensure_daemon(socket).await?;
        let req = make_req(cmd_name, Some(&sid), params);
        let resp = client::send(socket, &req).await?;
        super::print_and_check(&resp);
        return Ok(());
    }

    let args = ExecArgs {
        site: "grok",
        host,
        cmd: cmd_name,
        params,
    };
    acquire_then_exec(socket, args).await
}