feat: enhance UI with commit pulsing animation and improved copy icon

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: s80fdaac660ea645ek
diff --git a/loop/server/loophttp.go b/loop/server/loophttp.go
index 94cbb78..ede1644 100644
--- a/loop/server/loophttp.go
+++ b/loop/server/loophttp.go
@@ -1381,7 +1381,10 @@
 	}
 
 	// Detect git changes to push and notify user
-	s.agent.DetectGitChanges(r.Context())
+	if err = s.agent.DetectGitChanges(r.Context()); err != nil {
+		http.Error(w, fmt.Sprintf("Error detecting git changes: %v", err), http.StatusInternalServerError)
+		return
+	}
 
 	// Return simple success response
 	w.WriteHeader(http.StatusOK)
diff --git a/loop/server/loophttp_test.go b/loop/server/loophttp_test.go
index e3d144b..949a95a 100644
--- a/loop/server/loophttp_test.go
+++ b/loop/server/loophttp_test.go
@@ -242,7 +242,7 @@
 func (m *mockAgent) SuggestReprompt(ctx context.Context) (string, error) { return "", nil }
 func (m *mockAgent) IsInContainer() bool                                 { return false }
 func (m *mockAgent) FirstMessageIndex() int                              { return 0 }
-func (m *mockAgent) DetectGitChanges(ctx context.Context)                {} // TestSSEStream tests the SSE stream endpoint
+func (m *mockAgent) DetectGitChanges(ctx context.Context) error          { return nil } // TestSSEStream tests the SSE stream endpoint
 func TestSSEStream(t *testing.T) {
 	// Create a mock agent with initial messages
 	mockAgent := &mockAgent{