haematite-cli 0.21.7

The haematite command: serve a store, its door and Studio, answer MCP, query with jq, and host the store's assistant seat
Documentation
use serde_json::{Value, json};
use tokio::io::{AsyncBufReadExt as _, AsyncWriteExt as _, BufReader};

#[tokio::test]
async fn round4_1_front_answers_each_lys_request_before_eof() -> anyhow::Result<()> {
    let (client, server) = tokio::io::duplex(1024);
    let (read, write) = tokio::io::split(server);
    let serving = tokio::spawn(super::serve(
        BufReader::new(read),
        write,
        4096,
        "seat-session".into(),
    ));
    let mut client = BufReader::new(client);
    for (id, method, params) in [
        (
            "lys-initialize",
            "initialize",
            json!({"protocolVersion":1,"clientCapabilities":{},"clientInfo":{"name":"lys","version":"fixture"}}),
        ),
        (
            "lys-seat-session",
            "session/new",
            json!({"cwd":"/tmp","mcpServers":[]}),
        ),
    ] {
        let mut request =
            serde_json::to_vec(&json!({"jsonrpc":"2.0","id":id,"method":method,"params":params}))?;
        request.push(b'\n');
        client.get_mut().write_all(&request).await?;
        let mut line = String::new();
        client.read_line(&mut line).await?;
        let response: Value = serde_json::from_str(&line)?;
        assert_eq!(response["id"], id);
        assert!(response.get("error").is_none());
        if method == "initialize" {
            let answer: agent_client_protocol_schema::v1::InitializeResponse =
                serde_json::from_value(response["result"].clone())?;
            assert_eq!(
                answer.protocol_version,
                agent_client_protocol_schema::ProtocolVersion::V1
            );
        } else {
            let answer: agent_client_protocol_schema::v1::NewSessionResponse =
                serde_json::from_value(response["result"].clone())?;
            assert_eq!(answer.session_id.to_string(), "seat-session");
        }
    }
    client.get_mut().shutdown().await?;
    serving.await??;
    Ok(())
}