pushkin-daemon 0.2.1

Warm-path daemon for the pushkin write-gate
Documentation
//! The UDS wire protocol (spec §4.3): newline-delimited JSON, one request
//! and one response per line. The check response carries the SAME uniform
//! result JSON as the cold path (§8.3) — the daemon is a transport, never
//! a second brain. `deny_unknown_fields` on ingest (charter N2); versioned
//! so a stale daemon and a newer shim fail loudly, not weirdly.

use pushkin_core::envelope::CheckResult;
use serde::{Deserialize, Serialize};

pub const PROTOCOL_VERSION: u32 = 1;

#[derive(Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase", tag = "kind")]
pub enum Request {
    #[serde(rename_all = "camelCase")]
    Check {
        v: u32,
        file_path: String,
        content: String,
    },
    Ping {
        v: u32,
    },
    Shutdown {
        v: u32,
    },
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct DaemonInfo {
    pub pid: u32,
    pub version: String,
    /// True on private-socket daemons spawned for non-canonical binaries
    /// (spec §8.4): they answer checks but refuse wire mutations.
    pub read_only: bool,
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase", tag = "kind")]
pub enum Response {
    #[serde(rename_all = "camelCase")]
    Check {
        result: CheckResult,
    },
    #[serde(rename_all = "camelCase")]
    Pong {
        info: DaemonInfo,
    },
    ShuttingDown,
    #[serde(rename_all = "camelCase")]
    Error {
        message: String,
    },
}