From 29ec8e53f2acf56fe4a2cd02d352144c697a6afc Mon Sep 17 00:00:00 2001 From: soryu Date: Mon, 16 Feb 2026 15:09:52 +0000 Subject: Fix bugs with restoring/continuing from tasks --- makima/src/daemon/task/manager.rs | 65 +++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 12 deletions(-) (limited to 'makima/src/daemon/task') diff --git a/makima/src/daemon/task/manager.rs b/makima/src/daemon/task/manager.rs index 9dc342e..b382507 100644 --- a/makima/src/daemon/task/manager.rs +++ b/makima/src/daemon/task/manager.rs @@ -4508,24 +4508,65 @@ impl TaskManagerInner { ); worktree_info } - Err(e) => { - return Err(DaemonError::Task(TaskError::SetupFailed( - format!("Cannot continue from task {}: worktree copy failed ({}), branch not found ({}), patch restore failed ({})", from_task_id, copy_err, branch_err, e) - ))); + Err(patch_err) => { + tracing::warn!( + task_id = %task_id, + from_task_id = %from_task_id, + error = %patch_err, + "Patch restore failed — falling back to fresh worktree" + ); + let msg = DaemonMessage::task_output( + task_id, + format!("Patch restore failed, starting fresh from {}\n", branch), + false, + ); + let _ = self.ws_tx.send(msg).await; + + self.worktree_manager + .create_worktree(&source_repo, task_id, &task_name, &branch) + .await + .map_err(|e| DaemonError::Task(TaskError::SetupFailed(e.to_string())))? } } } - Err(e) => { - return Err(DaemonError::Task(TaskError::SetupFailed( - format!("Cannot continue from task {}: worktree copy failed ({}), branch not found ({}), patch decode failed ({})", from_task_id, copy_err, branch_err, e) - ))); + Err(decode_err) => { + tracing::warn!( + task_id = %task_id, + from_task_id = %from_task_id, + error = %decode_err, + "Patch decode failed — falling back to fresh worktree" + ); + let msg = DaemonMessage::task_output( + task_id, + format!("Patch decode failed, starting fresh from {}\n", branch), + false, + ); + let _ = self.ws_tx.send(msg).await; + + self.worktree_manager + .create_worktree(&source_repo, task_id, &task_name, &branch) + .await + .map_err(|e| DaemonError::Task(TaskError::SetupFailed(e.to_string())))? } } } else { - // Step 4: No fallback available - return Err(DaemonError::Task(TaskError::SetupFailed( - format!("Cannot continue from task {}: worktree copy failed ({}), branch not found ({}), no patch data available", from_task_id, copy_err, branch_err) - ))); + // Step 4: Fall back to fresh worktree from base branch + tracing::warn!( + task_id = %task_id, + from_task_id = %from_task_id, + "All continue_from fallbacks failed — creating fresh worktree from base branch" + ); + let msg = DaemonMessage::task_output( + task_id, + format!("Source task worktree unavailable, starting fresh from {}\n", branch), + false, + ); + let _ = self.ws_tx.send(msg).await; + + self.worktree_manager + .create_worktree(&source_repo, task_id, &task_name, &branch) + .await + .map_err(|e| DaemonError::Task(TaskError::SetupFailed(e.to_string())))? } } } -- cgit v1.2.3