# lonca-client
A client of the [Lonca](https://selcukgural.github.io/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.
```rust,no_run
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](https://selcukgural.github.io/lonca/docs/protocol);
running agents on Lonca is in
[the runners guide](https://selcukgural.github.io/lonca/docs/guide/runners).
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](https://selcukgural.github.io/lonca/docs/release-notes)
when you move. The version is the workspace's: every Lonca crate has the
same one.
- Repository: <https://github.com/selcukgural/lonca>
- Licence: Apache-2.0 ([LICENSE](https://github.com/selcukgural/lonca/blob/main/LICENSE))