Skip to main content

sqlite_graphrag/commands/
daemon.rs

1use crate::constants::DAEMON_IDLE_SHUTDOWN_SECS;
2use crate::errors::AppError;
3use crate::output;
4use crate::paths::AppPaths;
5
6#[derive(clap::Args)]
7pub struct DaemonArgs {
8    #[arg(long, default_value_t = DAEMON_IDLE_SHUTDOWN_SECS)]
9    pub idle_shutdown_secs: u64,
10    #[arg(long)]
11    pub ping: bool,
12    #[arg(long)]
13    pub stop: bool,
14    #[arg(long, help = "No-op; JSON is always emitted on stdout")]
15    pub json: bool,
16    #[arg(long, env = "SQLITE_GRAPHRAG_DB_PATH")]
17    pub db: Option<String>,
18}
19
20pub fn run(args: DaemonArgs) -> Result<(), AppError> {
21    let _ = args.json;
22    let paths = AppPaths::resolve(args.db.as_deref())?;
23    paths.ensure_dirs()?;
24
25    if args.ping {
26        let response = crate::daemon::try_ping(&paths.models)?
27            .ok_or_else(|| AppError::NotFound("daemon not running".to_string()))?;
28        output::emit_json(&response)?;
29        return Ok(());
30    }
31
32    if args.stop {
33        let response = crate::daemon::try_shutdown(&paths.models)?
34            .ok_or_else(|| AppError::NotFound("daemon not running".to_string()))?;
35        output::emit_json(&response)?;
36        return Ok(());
37    }
38
39    crate::daemon::run(&paths.models, args.idle_shutdown_secs)
40}