rpi-cli 0.21.1

Terminal coding-agent CLI (the `rpi` binary) built on the rpi-* library crates
Documentation
#[tokio::test]
async fn native_tool_result_with_null_details_roundtrips() {
    let temp = tempfile::tempdir().unwrap();
    use rpi_harness::session::{experimental_native::ExperimentalNativeRepo, types::*};
    let repo = ExperimentalNativeRepo::new(temp.path().to_owned())
        .await
        .unwrap();
    let s = repo.create(&SessionCreateOptions::default()).await.unwrap();
    let mut message: rpi_agent::AgentMessage=serde_json::from_value(serde_json::json!({"kind":"tool_result","role":"toolResult","toolCallId":"fixture-tool","toolName":"read","content":[{"type":"text","text":"tool result from native fixture"}],"details":null,"isError":false,"timestamp":42})).unwrap();
    if let rpi_agent::AgentMessage::ToolResult(result) = &mut message {
        result.details = Some(serde_json::Value::Null);
    }
    let expected = message.clone();
    s.append_entry(
        ProvisionedEntry {
            id: "tool-result".into(),
            kind: ProvisionedKind::Message {
                message,
                terminate: None,
            },
        },
        "main",
    )
    .await
    .unwrap();
    let Entry::Message(entry) = s.get_entry("tool-result").await.unwrap().unwrap() else {
        panic!("not message")
    };
    assert_eq!(entry.message, expected);
}