eoka-cli 0.4.1

Browser automation CLI for AI agents and pentesting
use super::*;

impl Handler {
    pub(super) async fn handle_agent(&mut self, cmd: &str, args: &Value) -> Response {
        let result: anyhow::Result<Value> = async {
            let state = self
                .state
                .as_ref()
                .ok_or_else(|| anyhow::anyhow!("Open a browser page first"))?;
            let page = state
                .current_tab()
                .ok_or_else(|| anyhow::anyhow!("Open a tab first"))?
                .page
                .clone();
            match cmd {
                "agent_observe" => Ok(serde_json::to_value(
                    self.agent
                        .observe(&state.browser, &page, serde_json::from_value(args.clone())?)
                        .await?,
                )?),
                "agent_step" => Ok(serde_json::to_value(
                    self.agent
                        .step(
                            &state.browser,
                            &page,
                            &self.operations,
                            serde_json::from_value(args.clone())?,
                        )
                        .await?,
                )?),
                _ => anyhow::bail!("Unknown agent tool"),
            }
        }
        .await;
        if let Some(tab) = self
            .state
            .as_mut()
            .and_then(|state| state.current_tab_mut())
        {
            tab.snapshot_refs = self.agent.references(tab.page.target_id());
        }
        match result {
            Ok(value) => Response::ok(value),
            Err(error) => Response::err_detail(
                eoka_protocol::ErrorDetail::new("agent_error", format!("{error:#}"))
                    .retryable(false),
            ),
        }
    }
}