adk-computer-use 2.0.0

ADK-Rust graph, auth, and wire contracts for computer-use-mcp
Documentation
use adk_computer_use::{ComputerUseEvaluator, SessionEvent};
use adk_eval::ToolUse;
use serde_json::json;

fn event(
    sequence: u64,
    event_type: &str,
    action_id: &str,
    payload: serde_json::Value,
) -> SessionEvent {
    SessionEvent {
        schema_version: 1,
        event_id: format!("event-{sequence}"),
        sequence,
        session_id: "session".into(),
        action_id: Some(action_id.into()),
        event_type: event_type.into(),
        at: "2026-07-13T10:00:00Z".into(),
        principal_id: Some("principal".into()),
        payload,
    }
}

#[test]
fn evaluator_accepts_one_leased_verified_commit() {
    let events = vec![
        event(
            1,
            "action.started",
            "a",
            json!({ "tool": "write_clipboard", "mode": "background", "leaseId": "lease" }),
        ),
        event(2, "action.verified", "a", json!({ "verified": true })),
        event(3, "action.committed", "a", json!({ "receiptId": "receipt" })),
    ];
    let expected = vec![ToolUse::new("write_clipboard").with_args(json!({
        "actionId": "a", "mode": "background",
    }))];
    let result = ComputerUseEvaluator::default().evaluate(&expected, &events);
    assert!(result.passed, "{:?}", result.violations);
    assert_eq!(result.mutations, 1);
}

#[test]
fn evaluator_rejects_duplicate_unleased_unverified_mutation() {
    let events = vec![
        event(
            1,
            "action.started",
            "a",
            json!({ "tool": "left_click", "mode": "foreground", "leaseId": null }),
        ),
        event(
            2,
            "action.started",
            "a",
            json!({ "tool": "left_click", "mode": "foreground", "leaseId": null }),
        ),
        event(3, "action.committed", "a", json!({ "receiptId": "receipt" })),
    ];
    let result = ComputerUseEvaluator::default().evaluate(&[], &events);
    assert!(!result.passed);
    assert!(result.violations.iter().any(|value| value.starts_with("duplicate_mutation")));
    assert!(result.violations.iter().any(|value| value.starts_with("commit_without_verification")));
}