2026-07-11 13:16:10 +07:00
|
|
|
use serde_json::{json, Value};
|
|
|
|
|
use anyhow::{Result, anyhow};
|
|
|
|
|
use super::Tool;
|
|
|
|
|
use super::ToolCtx;
|
|
|
|
|
|
|
|
|
|
pub struct WorkflowRun;
|
|
|
|
|
|
|
|
|
|
impl Tool for WorkflowRun {
|
|
|
|
|
fn name(&self) -> &'static str {
|
|
|
|
|
"workflow_run"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn description(&self) -> &'static str {
|
|
|
|
|
"Execute a workflow script by delegating to the workflow engine"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn parameters(&self) -> Value {
|
|
|
|
|
json!({
|
|
|
|
|
"type": "object",
|
|
|
|
|
"properties": {
|
|
|
|
|
"script": {
|
|
|
|
|
"type": "string",
|
|
|
|
|
"description": "Workflow script content or path to a workflow file"
|
|
|
|
|
},
|
|
|
|
|
"args": {
|
|
|
|
|
"type": "object",
|
|
|
|
|
"description": "Optional arguments passed to the workflow script"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"required": ["script"]
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn run(&self, _ctx: &ToolCtx, args: &Value) -> Result<String> {
|
2026-07-11 20:21:59 +07:00
|
|
|
let script_str = args.get("script")
|
2026-07-11 13:16:10 +07:00
|
|
|
.and_then(|v| v.as_str())
|
|
|
|
|
.ok_or_else(|| anyhow!("missing required argument: script"))?;
|
2026-07-11 20:21:59 +07:00
|
|
|
|
|
|
|
|
let workflow_script: crate::app::workflow::script::WorkflowScript =
|
|
|
|
|
serde_json::from_str(script_str)
|
|
|
|
|
.map_err(|e| anyhow!("failed to parse workflow script: {}", e))?;
|
|
|
|
|
|
|
|
|
|
let workflow_args: std::collections::HashMap<String, String> = args.get("args")
|
|
|
|
|
.and_then(|v| v.as_object())
|
|
|
|
|
.map(|obj| {
|
|
|
|
|
obj.iter().filter_map(|(k, v)| {
|
|
|
|
|
v.as_str().map(|s| (k.clone(), s.to_string()))
|
|
|
|
|
}).collect()
|
|
|
|
|
})
|
|
|
|
|
.unwrap_or_default();
|
|
|
|
|
|
|
|
|
|
crate::app::workflow::engine::run_workflow(&workflow_script, &workflow_args)
|
2026-07-11 13:16:10 +07:00
|
|
|
}
|
|
|
|
|
}
|