Wire up original_commit_hash in archive and restore flows

Richard Feldman created

persist_worktree_state:
- Read HEAD SHA before creating WIP commits as original_commit_hash
- Pass it to create_archived_worktree

restore_worktree_via_git:
- Pre-restore: verify original_commit_hash exists via resolve_commit;
  abort with user-facing error if the git history is gone
- Worktree-already-exists: check for .git file to detect if path is a
  real git worktree; if not, call repair_worktrees to adopt it
- Resilient WIP resets: track success of mixed and soft resets
  independently; if either fails, fall back to mixed reset directly to
  original_commit_hash
- Post-reset HEAD verification: confirm HEAD landed at
  original_commit_hash after all resets
- Branch restoration: after switching, verify branch points at
  original_commit_hash; if it doesn't, reset and create a fresh branch

Change summary

crates/agent_ui/src/thread_worktree_archive.rs | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

Detailed changes

crates/agent_ui/src/thread_worktree_archive.rs 🔗

@@ -1041,7 +1041,11 @@ pub async fn restore_worktree_via_git(
 
     let soft_reset_ok = if mixed_reset_ok {
         let rx = wt_repo.update(cx, |repo, cx| {
-            repo.reset(row.original_commit_hash.clone(), ResetMode::Soft, cx)
+            repo.reset(
+                row.original_commit_hash.clone(),
+                ResetMode::Soft,
+                cx,
+            )
         });
         match rx.await {
             Ok(Ok(())) => true,
@@ -1067,7 +1071,11 @@ pub async fn restore_worktree_via_git(
             row.original_commit_hash
         );
         let rx = wt_repo.update(cx, |repo, cx| {
-            repo.reset(row.original_commit_hash.clone(), ResetMode::Mixed, cx)
+            repo.reset(
+                row.original_commit_hash.clone(),
+                ResetMode::Mixed,
+                cx,
+            )
         });
         match rx.await {
             Ok(Ok(())) => {}
@@ -1126,7 +1134,11 @@ pub async fn restore_worktree_via_git(
                     row.original_commit_hash
                 );
                 let rx = wt_repo.update(cx, |repo, cx| {
-                    repo.reset(row.original_commit_hash.clone(), ResetMode::Mixed, cx)
+                    repo.reset(
+                        row.original_commit_hash.clone(),
+                        ResetMode::Mixed,
+                        cx,
+                    )
                 });
                 let _ = rx.await;
                 // Delete the old branch and create fresh