diff options
| author | soryu <soryu@soryu.co> | 2026-01-23 23:52:35 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2026-01-23 23:52:35 +0000 |
| commit | 579c983d3efb8f1414ffb45b9e031f741cce5f76 (patch) | |
| tree | 1a0060f19a4f4eea8fb9cff9eb52a46cedcdc152 /makima/src/bin | |
| parent | f6f0790217d4098ffb6d2b3df08b0cf83ff61727 (diff) | |
| download | soryu-579c983d3efb8f1414ffb45b9e031f741cce5f76.tar.gz soryu-579c983d3efb8f1414ffb45b9e031f741cce5f76.zip | |
Add resume to daemon tasks
Diffstat (limited to 'makima/src/bin')
| -rw-r--r-- | makima/src/bin/makima.rs | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/makima/src/bin/makima.rs b/makima/src/bin/makima.rs index 1a307d1..96dc252 100644 --- a/makima/src/bin/makima.rs +++ b/makima/src/bin/makima.rs @@ -165,7 +165,7 @@ async fn run_daemon( "[3/5] Opening local database: {}", config.local_db.path.display() ); - let _local_db = LocalDb::open(&config.local_db.path)?; + let local_db = Arc::new(std::sync::Mutex::new(LocalDb::open(&config.local_db.path)?)); eprintln!(" Database opened"); // Initialize worktree directories @@ -244,8 +244,14 @@ async fn run_daemon( checkpoint_patches: config.process.checkpoint_patches.clone(), }; - // Create task manager - let task_manager = Arc::new(TaskManager::new(task_config, ws_tx.clone())); + // Create task manager with local database for crash recovery + let task_manager = Arc::new(TaskManager::new(task_config, ws_tx.clone(), local_db)); + + // Recover any orphaned tasks from previous daemon run + let recovered = task_manager.recover_orphaned_tasks().await; + if !recovered.is_empty() { + eprintln!(" Recovered {} orphaned tasks with intact worktrees", recovered.len()); + } // Spawn command handler let task_manager_clone = task_manager.clone(); @@ -260,6 +266,22 @@ async fn run_daemon( tracing::info!("Command handler stopped"); }); + // Spawn periodic worktree health check (every 60 seconds) + let health_check_manager = task_manager.clone(); + tokio::spawn(async move { + let mut interval = tokio::time::interval(std::time::Duration::from_secs(60)); + loop { + interval.tick().await; + let affected = health_check_manager.check_worktree_health().await; + if !affected.is_empty() { + tracing::info!( + count = affected.len(), + "Worktree health check detected missing worktrees - tasks marked for retry" + ); + } + } + }); + // Handle shutdown signals let shutdown_signal = async { tokio::signal::ctrl_c() |
