warble-cli 0.15.2

Warble CLI — compile profiles, dispatch to the Claude Code or Vercel target, render dashboards, emit manifests, run eval.
Documentation
use serde::Deserialize;
use sha2::{Digest, Sha256};
use std::io::Read;

const MAX_REQUEST_BYTES: u64 = 2 * 1024 * 1024;

#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct Request {
    version: u32,
    context: serde_json::Value,
    preconditions: serde_json::Value,
}

pub fn run() -> Result<(), String> {
    let mut input = Vec::new();
    std::io::stdin()
        .take(MAX_REQUEST_BYTES + 1)
        .read_to_end(&mut input)
        .map_err(|_| "cannot read context verification request".to_string())?;
    if input.len() as u64 > MAX_REQUEST_BYTES {
        return Err("context verification request is too large".into());
    }
    let request: Request = serde_json::from_slice(&input)
        .map_err(|_| "invalid context verification request".to_string())?;
    if request.version != 1 {
        return Err("unsupported context verification version".into());
    }
    let context = warble::PreparedContext::from_json(&request.context.to_string())
        .map_err(|_| "invalid prepared context".to_string())?;
    warble::verify_context_preconditions(&request.preconditions, &context)
        .map_err(|error| error.to_string())?;
    println!(
        "{}",
        serde_json::json!({
            "version": 1,
            "status": "pass",
            "request_sha256": format!("{:x}", Sha256::digest(&input)),
        })
    );
    Ok(())
}