diff options
| -rw-r--r-- | makima/src/bin/makima.rs | 59 | ||||
| -rw-r--r-- | makima/src/daemon/cli/supervisor.rs | 6 |
2 files changed, 60 insertions, 5 deletions
diff --git a/makima/src/bin/makima.rs b/makima/src/bin/makima.rs index f0db69c..1a307d1 100644 --- a/makima/src/bin/makima.rs +++ b/makima/src/bin/makima.rs @@ -335,11 +335,62 @@ async fn run_supervisor( SupervisorCommand::Wait(args) => { let client = ApiClient::new(args.common.api_url, args.common.api_key)?; eprintln!( - "Waiting for task {} (timeout: {}s)...", - args.task_id, args.timeout + "Waiting for task {} (timeout: {}s, poll interval: {}s)...", + args.task_id, args.timeout, args.poll_interval ); - let result = client.supervisor_wait(args.task_id, args.timeout).await?; - println!("{}", serde_json::to_string(&result.0)?); + + let start_time = std::time::Instant::now(); + let timeout_duration = std::time::Duration::from_secs(args.timeout as u64); + let poll_interval = std::time::Duration::from_secs(args.poll_interval); + let server_wait_timeout = 30i32; // Short timeout for server-side wait + + loop { + // Check if we've exceeded the total timeout + let remaining = timeout_duration.saturating_sub(start_time.elapsed()); + if remaining.is_zero() { + eprintln!("Timeout reached after {}s", args.timeout); + let result = client.supervisor_get_task(args.task_id).await?; + println!("{}", serde_json::to_string(&result.0)?); + break; + } + + // Try server-side wait with short timeout + let wait_timeout = std::cmp::min(server_wait_timeout, remaining.as_secs() as i32); + + match client.supervisor_wait(args.task_id, wait_timeout).await { + Ok(result) => { + if let Some(completed) = result.0.get("completed").and_then(|c| c.as_bool()) { + if completed { + println!("{}", serde_json::to_string(&result.0)?); + break; + } + } + // Not completed yet, continue loop + eprintln!("Task still running (elapsed: {:?})", start_time.elapsed()); + } + Err(e) => { + eprintln!("Warning: Server wait failed: {}. Falling back to polling...", e); + // Fall back to simple status poll + if let Ok(result) = client.supervisor_get_task(args.task_id).await { + if let Some(status) = result.0.get("status").and_then(|s| s.as_str()) { + if status == "done" || status == "failed" || status == "merged" { + let wait_response = serde_json::json!({ + "taskId": args.task_id, + "status": status, + "completed": true, + "outputSummary": result.0.get("progressSummary") + }); + println!("{}", serde_json::to_string(&wait_response)?); + break; + } + } + } + } + } + + // Small delay before retrying + tokio::time::sleep(poll_interval).await; + } } SupervisorCommand::ReadFile(args) => { let client = ApiClient::new(args.common.api_url, args.common.api_key)?; diff --git a/makima/src/daemon/cli/supervisor.rs b/makima/src/daemon/cli/supervisor.rs index 7e17135..3bc8525 100644 --- a/makima/src/daemon/cli/supervisor.rs +++ b/makima/src/daemon/cli/supervisor.rs @@ -60,9 +60,13 @@ pub struct WaitArgs { #[arg(index = 1)] pub task_id: Uuid, - /// Timeout in seconds + /// Timeout in seconds (total wait time) #[arg(index = 2, default_value = "300")] pub timeout: i32, + + /// Polling interval in seconds (how often to check task status via client-side polling) + #[arg(long, default_value = "5")] + pub poll_interval: u64, } /// Arguments for read-file command. |
