harn-serve 0.10.122

Shared outbound workflow server core for Harn adapters
use super::*;

#[tokio::test(flavor = "current_thread")]
async fn tool_call_update_serializes_producer_data_under_harn_meta() {
    let payload = collect_notifications(vec![AgentEvent::ToolCallUpdate {
        session_id: "session-1".to_string(),
        tool_call_id: "tool-8".to_string(),
        tool_name: "edit".to_string(),
        status: ToolCallStatus::Completed,
        raw_output: Some(serde_json::json!({"ok": true})),
        error: None,
        duration_ms: None,
        execution_duration_ms: None,
        error_category: None,
        mutation_status: ToolMutationStatus::Applied,
        changed_paths: Some(vec!["src/lib.rs".to_string(), "tests/lib.rs".to_string()]),
        data: Some(serde_json::json!({
            "command_status": "succeeded",
            "run_outcome": {"exit_code": 0}
        })),
        executor: Some(ToolExecutor::HostBridge),
        parsing: None,
        raw_input: None,
        raw_input_partial: None,
        audit: None,
    }])
    .await
    .pop()
    .expect("ACP update");

    let harn_meta = update_harn_meta(&payload);
    assert_eq!(harn_meta["mutationStatus"], "applied");
    assert_eq!(
        harn_meta["changedPaths"],
        serde_json::json!(["src/lib.rs", "tests/lib.rs"])
    );
    assert_eq!(
        harn_meta["data"],
        serde_json::json!({
            "command_status": "succeeded",
            "run_outcome": {"exit_code": 0}
        })
    );
    assert!(payload["params"]["update"].get("changedPaths").is_none());
    assert!(payload["params"]["update"].get("data").is_none());
}