limit-cli 0.0.46

AI-powered terminal coding assistant with TUI. Multi-provider LLM support, session persistence, and built-in tools.
Documentation
use super::super::args::ArgsExt;
use super::super::client::BrowserClient;
use super::super::client_ext::{InteractionExt, QueryExt};
use super::super::response::ok_msg;
use limit_agent::error::AgentError;
use serde_json::Value;

pub async fn click(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "click")?;
    client.click(selector).await?;
    Ok(ok_msg(format!("Clicked element: {}", selector)))
}

pub async fn fill(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "fill")?;
    let text = args.get_str("text", "fill")?;
    client.fill(selector, text).await?;
    Ok(ok_msg(format!("Filled element {} with text", selector)))
}

pub async fn type_(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "type")?;
    let text = args.get_str("text", "type")?;
    client.type_text(selector, text).await?;
    Ok(ok_msg(format!("Typed text into element: {}", selector)))
}

pub async fn press(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let key = args.get_str("key", "press")?;
    client.press(key).await?;
    Ok(ok_msg(format!("Pressed key: {}", key)))
}

pub async fn hover(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "hover")?;
    client.hover(selector).await?;
    Ok(ok_msg(format!("Hovered over element: {}", selector)))
}

pub async fn select(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "select")?;
    let value = args.get_str("value", "select")?;
    client.select_option(selector, value).await?;
    Ok(ok_msg(format!(
        "Selected option '{}' in element: {}",
        value, selector
    )))
}

pub async fn dblclick(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "dblclick")?;
    client.dblclick(selector).await?;
    Ok(ok_msg(format!("Double-clicked element: {}", selector)))
}

pub async fn focus(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "focus")?;
    client.focus(selector).await?;
    Ok(ok_msg(format!("Focused element: {}", selector)))
}

pub async fn check(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "check")?;
    client.check(selector).await?;
    Ok(ok_msg(format!("Checked element: {}", selector)))
}

pub async fn uncheck(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "uncheck")?;
    client.uncheck(selector).await?;
    Ok(ok_msg(format!("Unchecked element: {}", selector)))
}

pub async fn scrollintoview(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "scrollintoview")?;
    client.scrollintoview(selector).await?;
    Ok(ok_msg(format!("Scrolled element into view: {}", selector)))
}

pub async fn drag(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let source = args.get_str("source", "drag")?;
    let target = args.get_str("target", "drag")?;
    client.drag(source, target).await?;
    Ok(ok_msg(format!("Dragged from {} to {}", source, target)))
}

pub async fn upload(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let selector = args.get_str("selector", "upload")?;
    let files = args
        .get("files")
        .and_then(|v| v.as_array())
        .ok_or_else(|| {
            AgentError::ToolError("Missing 'files' argument for upload action".to_string())
        })?;

    let file_paths: Vec<&str> = files.iter().filter_map(|f| f.as_str()).collect();

    if file_paths.is_empty() {
        return Err(AgentError::ToolError(
            "At least one file path required".to_string(),
        ));
    }

    client.upload(selector, &file_paths).await?;
    Ok(ok_msg(format!(
        "Uploaded {} file(s) to {}",
        file_paths.len(),
        selector
    )))
}

pub async fn pdf(client: &BrowserClient, args: &Value) -> Result<Value, AgentError> {
    let path = args.get_str("path", "pdf")?;
    client.pdf(path).await?;
    Ok(ok_msg(format!("Saved page as PDF: {}", path)))
}