lonca-client 0.2.1

Client of the Lonca daemon socket: protocol types, framing, daemon checks and the human session file
Documentation

lonca-client

A client of the Lonca daemon socket, for harnesses and runners: what a program that starts agents on Lonca, or speaks to the daemon for them, depends on.

Only what a client needs: the protocol's request and response types and its number (PROTOCOL), the socket client with the checks that make sure the daemon is on the other end (trust), framing, timeouts and typed errors (client), and the human session file (session). No store, no policy evaluation, no daemon: a client is never a second writer.

use std::path::Path;
use std::time::Duration;

use lonca_client::{Client, PROTOCOL};
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // $LONCA_SOCKET, else $LONCA_HOME/lonca.sock, else ~/.lonca/lonca.sock.
    let home = std::env::var("HOME")?;
    let socket = Path::new(&home).join(".lonca/lonca.sock");

    // Checks that the daemon this machine trusts is on the other end
    // before anything is sent: a token goes nowhere unverified.
    let mut client = Client::connect(&socket)?;
    client.set_timeout(Some(Duration::from_secs(30)))?;

    let ping = client.call("ping", json!({}))?;
    if ping["protocol"] != PROTOCOL {
        return Err("a daemon of another protocol".into());
    }

    // An agent's token, from the workspace `lonca session start` made.
    let token = std::fs::read_to_string("/work/claude-1/.lonca/session")?;
    client.token = Some(token.trim().to_owned());
    client.repo = Some("demo".into());
    let status = client.call("status", json!({}))?;
    println!("{status:#}");
    Ok(())
}

Every method, its credential and its shapes are in the daemon protocol; running agents on Lonca is in the runners guide.

Versions: a change of PROTOCOL is a major version of this crate (while it is 0.x, a minor one). Fields added to a shape are not a change of the number. Pin an exact version and read the release notes when you move. The version is the workspace's: every Lonca crate has the same one.