use car_multi::{AgentRunner, SharedInfra};
use car_workflow::{PausedWorkflow, Workflow, WorkflowEngine};
use std::collections::HashMap;
use std::sync::Arc;
pub async fn run_workflow(
workflow_json: &str,
runner: Arc<dyn AgentRunner>,
) -> Result<String, String> {
let workflow: Workflow =
serde_json::from_str(workflow_json).map_err(|e| format!("invalid workflow JSON: {}", e))?;
let infra = SharedInfra::new();
let engine = WorkflowEngine::new(runner, infra);
let result = engine
.run(&workflow)
.await
.map_err(|e| format!("workflow error: {}", e))?;
serde_json::to_string(&result).map_err(|e| e.to_string())
}
pub async fn resume_workflow(
paused_json: &str,
input_json: &str,
runner: Arc<dyn AgentRunner>,
) -> Result<String, String> {
let paused: PausedWorkflow = serde_json::from_str(paused_json)
.map_err(|e| format!("invalid paused checkpoint JSON: {}", e))?;
let input: HashMap<String, serde_json::Value> = serde_json::from_str(input_json)
.map_err(|e| format!("invalid approval input JSON: {}", e))?;
let infra = SharedInfra::new();
let engine = WorkflowEngine::new(runner, infra);
let result = engine
.resume(paused, input)
.await
.map_err(|e| format!("workflow resume error: {}", e))?;
serde_json::to_string(&result).map_err(|e| e.to_string())
}
pub fn verify_workflow(workflow_json: &str) -> Result<String, String> {
let workflow: Workflow =
serde_json::from_str(workflow_json).map_err(|e| format!("invalid workflow JSON: {}", e))?;
let report = car_workflow::verify_workflow(&workflow);
let json = serde_json::json!({
"valid": report.valid,
"has_cycles": report.has_cycles,
"reachable_stages": report.reachable_stages,
"unreachable_stages": report.unreachable_stages,
"issues": report.issues.iter().map(|i| format!("{:?}", i)).collect::<Vec<_>>(),
"semantic": car_workflow::semantic_issues(&workflow),
});
Ok(json.to_string())
}