vv-agent 0.4.6

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

use crate::types::ToolExecutionResult;

use super::request::ListFilesRequest;
use super::types::ListFilesOutcome;

pub(super) fn render_list_files(
    outcome: ListFilesOutcome,
    request: &ListFilesRequest,
) -> ToolExecutionResult {
    let returned_count = outcome.files.len();
    let mut payload = json!({
        "files": outcome.files,
        "count": outcome.count,
        "returned_count": returned_count,
        "truncated": outcome.truncated,
        "max_results": request.max_results,
    });
    if outcome.count > returned_count {
        payload["remaining_count"] = Value::Number((outcome.count - returned_count).into());
    }
    if outcome.scan_limited {
        payload["count_is_estimate"] = Value::Bool(true);
        payload["scan_limit"] = Value::Number(request.scan_limit.into());
        payload["message"] = Value::String(
            "Listing stopped early due to scan limit. Narrow `path`/`glob` or increase `scan_limit` for more complete results."
                .to_string(),
        );
    }
    if !outcome.ignored_roots.is_empty() {
        payload["ignored_roots"] = Value::Array(
            outcome
                .ignored_roots
                .into_iter()
                .map(|path| json!({"path": path}))
                .collect(),
        );
        let ignored_message =
            "Common dependency/cache directories are summarized by default. List those directories explicitly when needed.";
        payload["message"] = Value::String(
            payload
                .get("message")
                .and_then(Value::as_str)
                .map(|message| format!("{message} {ignored_message}"))
                .unwrap_or_else(|| ignored_message.to_string()),
        );
    }
    ToolExecutionResult::success("", payload.to_string())
}