codetether-agent 4.5.7

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
mod message;
mod tool;

use super::payloads::CodexReasoningPayload;
use super::title::extract_reasoning_text;
use crate::provider::{ContentPart, Message, Role};
use anyhow::Result;
use serde_json::Value;

pub(crate) fn parse_response_item(
    payload: Value,
    first_user_text: &mut Option<String>,
) -> Result<Option<Message>> {
    let Some(item_type) = payload.get("type").and_then(Value::as_str) else {
        return Ok(None);
    };

    match item_type {
        "message" => message::parse_message_item(payload, first_user_text),
        "function_call" => tool::parse_function_call_item(payload),
        "function_call_output" => tool::parse_function_output_item(payload),
        "reasoning" => parse_reasoning_item(payload),
        _ => Ok(None),
    }
}

fn parse_reasoning_item(payload: Value) -> Result<Option<Message>> {
    let payload: CodexReasoningPayload = serde_json::from_value(payload)?;
    Ok(extract_reasoning_text(&payload).map(|text| Message {
        role: Role::Assistant,
        content: vec![ContentPart::Thinking { text }],
    }))
}