vv-agent 0.8.0

VectorVein agent runtime, SDK, CLI, tools, and workspace backends
Documentation
use serde_json::{json, Value};

use crate::tools::common::tool_result;
use crate::types::{
    AgentStatus, SubTaskOutcome, ToolDirective, ToolExecutionResult, ToolResultStatus,
};

pub(super) fn format_single_sync_result(outcome: SubTaskOutcome) -> ToolExecutionResult {
    let mut payload = outcome.to_value();
    if outcome.status == AgentStatus::Completed {
        return success(payload);
    }
    let error_code = outcome
        .error_code
        .as_deref()
        .filter(|error_code| !error_code.trim().is_empty())
        .unwrap_or_else(|| {
            if outcome.status == AgentStatus::WaitUser {
                "sub_task_wait_user"
            } else {
                "sub_task_failed"
            }
        });
    payload["error_code"] = Value::String(error_code.to_string());
    error(payload, error_code)
}

pub(super) fn all_batch_tasks_failed(payload: Value) -> ToolExecutionResult {
    error(
        json!({
            "ok": false,
            "error": "All batch sub-tasks failed",
            "error_code": "create_sub_task_batch_failed",
            "details": payload,
        }),
        "create_sub_task_batch_failed",
    )
}

pub(super) fn success(payload: Value) -> ToolExecutionResult {
    tool_result(
        ToolResultStatus::Success,
        payload,
        None,
        ToolDirective::Continue,
    )
}

pub(super) fn error_message(message: impl Into<String>, error_code: &str) -> ToolExecutionResult {
    error(
        json!({
            "ok": false,
            "error": message.into(),
            "error_code": error_code,
        }),
        error_code,
    )
}

pub(super) fn error(payload: Value, error_code: &str) -> ToolExecutionResult {
    tool_result(
        ToolResultStatus::Error,
        payload,
        Some(error_code),
        ToolDirective::Continue,
    )
}