diff --git a/crates/server/src/routes/task_attempts.rs b/crates/server/src/routes/task_attempts.rs index a62c1312..71f65c23 100644 --- a/crates/server/src/routes/task_attempts.rs +++ b/crates/server/src/routes/task_attempts.rs @@ -148,6 +148,12 @@ pub async fn follow_up( ) -> Result>, ApiError> { tracing::info!("{:?}", task_attempt); + // Ensure worktree exists (recreate if needed for cold task support) + deployment + .container() + .ensure_container_exists(&task_attempt) + .await?; + // Get session_id with simple query let session_id = ExecutionProcess::find_latest_session_id_by_task_attempt( &deployment.db().pool, diff --git a/crates/services/src/services/container.rs b/crates/services/src/services/container.rs index e6dad90f..a43c9c17 100644 --- a/crates/services/src/services/container.rs +++ b/crates/services/src/services/container.rs @@ -295,6 +295,14 @@ pub trait ContainerService { } }; + if let Err(err) = self.ensure_container_exists(&task_attempt).await { + tracing::warn!( + "Failed to recreate worktree before log normalization for task attempt {}: {}", + task_attempt.id, + err + ); + } + let current_dir = self.task_attempt_to_current_dir(&task_attempt); let executor_action = if let Ok(executor_action) = process.executor_action() {