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 crate::door::assistant_test_support::{records, *};
use serde_json::json;

#[test]
fn r4_14_native_page_refusal_halves_until_escaped_records_fit() -> Result {
    let f = Fixture::new(json!({"events_after_bytes":10_000}))?;
    let items = (1..=8)
        .map(|seq| {
            let mut value = item(seq);
            value["text"] = json!("\"".repeat(400));
            value
        })
        .collect();
    let store = records::with_frame(&f, records::rows(items), 4096, |_| Ok(()))?;
    let mut stream =
        Stream::open(f.answer("GET", "/events?conversation=conversation", &json!({})))?;
    stream.event()?;
    for seq in 1..=8 {
        let event = stream.event()?;
        assert!(
            event.contains(&format!("id: conversation:{seq}\n")),
            "{event}"
        );
    }
    stream.close()?;
    let calls = store.finish()?;
    let limits: Vec<_> = calls
        .iter()
        .filter(|r| r["operation"]["method"] == "documents.list")
        .filter_map(|r| r["operation"]["params"]["limit"].as_u64())
        .collect();
    assert!(limits.starts_with(&[64, 32, 16, 8, 4, 2]), "{limits:?}");
    assert_eq!(
        calls
            .iter()
            .filter(|r| r["operation"]["method"] == "session.pass")
            .count(),
        1
    );
    Ok(())
}

#[test]
fn r4_06_single_record_over_the_native_frame_is_named() -> Result {
    let f = Fixture::new(json!({"events_after_bytes":10_000}))?;
    let mut value = item(1);
    value["text"] = json!("\"".repeat(2300));
    let store = records::with_frame(&f, records::rows(vec![value]), 4096, |_| Ok(()))?;
    let mut stream =
        Stream::open(f.answer("GET", "/events?conversation=conversation", &json!({})))?;
    stream.event()?;
    let event = stream.event()?;
    assert!(
        event.contains("assistant_record_item_too_large") && event.contains("max_frame=4096"),
        "{event}"
    );
    stream.close()?;
    store.finish()?;
    Ok(())
}