ai-dispatch 11.2.0

Multi-AI CLI team orchestrator
// Tests for OpenCode tool-call event parsing.
// Covers metadata.full preservation for long tool arguments.

use super::*;

#[test]
fn tool_call_args_over_cap_are_recoverable_from_metadata_full() {
    let args = format!("{{\"command\":\"{}\"}}", "cargo test --workspace ".repeat(8));
    let event = parse_json_event(
        AgentKind::OpenCode,
        AgentKind::OpenCode,
        None,
        &TaskId("t-tool".to_string()),
        &serde_json::json!({"type": "tool_call", "name": "bash", "arguments": args}),
        Local::now(),
    )
    .expect("tool_call events should parse");

    let expected_full = format!("bash: {args}");
    assert_eq!(event.event_kind, EventKind::Test);
    assert_eq!(event.detail.len(), super::super::truncate::EVENT_DETAIL_MAX);
    assert!(event.detail.ends_with("..."));
    assert_eq!(event.full_detail(), expected_full);
    assert_eq!(
        event.metadata.as_ref().and_then(|m| m["full"].as_str()),
        Some(expected_full.as_str())
    );
}

#[test]
fn tool_call_args_under_cap_keep_plain_detail() {
    let event = parse_json_event(
        AgentKind::OpenCode,
        AgentKind::OpenCode,
        None,
        &TaskId("t-tool".to_string()),
        &serde_json::json!({"type": "tool_call", "name": "read", "arguments": "src/main.rs"}),
        Local::now(),
    )
    .expect("tool_call events should parse");

    assert_eq!(event.detail, "read: src/main.rs");
    assert!(event.metadata.is_none());
}

#[test]
fn parses_step_finish_token_event() {
    let task_id = TaskId("t-step".to_string());
    let event = parse_json_event(
        AgentKind::OpenCode,
        AgentKind::OpenCode,
        None,
        &task_id,
        &serde_json::json!({
            "type": "step_finish",
            "part": {
                "tokens": {
                    "total": 16125,
                    "input": 14040,
                    "output": 2,
                    "reasoning": 0
                },
                "cost": 0.0
            }
        }),
        Local::now(),
    )
    .expect("step_finish events should parse");

    assert_eq!(event.event_kind, EventKind::Completion);
    assert_eq!(event.detail, "tokens: 14040 in + 2 out = 16125");
    assert_eq!(
        event.metadata,
        Some(serde_json::json!({
            "tokens": 16125,
            "input_tokens": 14040,
            "output_tokens": 2,
            "cost_usd": 0.0,
            "usage_is_delta": true
        }))
    );
}