shelley: ui: remove spinning animation from bash tool emoji

Philip Zeyliger and Shelley created

Prompt: Get rid of the spinning hammer in shelley bash tool stuff. Just get rid of the animation
Co-authored-by: Shelley <shelley@exe.dev>

Change summary

ui/src/App.tsx                           |  5 +
ui/src/components/ConversationDrawer.tsx | 12 ++
ui/src/generated-types.ts                | 82 +++++++++++++-------------
ui/src/styles.css                        |  1 
4 files changed, 54 insertions(+), 46 deletions(-)

Detailed changes

ui/src/App.tsx 🔗

@@ -68,7 +68,10 @@ function App() {
   const [loading, setLoading] = useState(true);
   const [error, setError] = useState<string | null>(null);
   const [subagentUpdate, setSubagentUpdate] = useState<Conversation | null>(null);
-  const [subagentStateUpdate, setSubagentStateUpdate] = useState<{ conversation_id: string; working: boolean } | null>(null);
+  const [subagentStateUpdate, setSubagentStateUpdate] = useState<{
+    conversation_id: string;
+    working: boolean;
+  } | null>(null);
   const initialSlugResolved = useRef(false);
 
   // Resolve initial slug from URL - uses the captured initialSlugFromUrl

ui/src/components/ConversationDrawer.tsx 🔗

@@ -88,7 +88,9 @@ function ConversationDrawer({
       setSubagents((prev) => {
         // Find which parent contains this subagent
         for (const [parentId, subs] of Object.entries(prev)) {
-          const subIndex = subs.findIndex((s) => s.conversation_id === subagentStateUpdate.conversation_id);
+          const subIndex = subs.findIndex(
+            (s) => s.conversation_id === subagentStateUpdate.conversation_id,
+          );
           if (subIndex >= 0) {
             const updated = [...subs];
             updated[subIndex] = { ...updated[subIndex], working: subagentStateUpdate.working };
@@ -485,7 +487,9 @@ function ConversationDrawer({
                                     padding: "0.125rem 0.25rem",
                                   }}
                                   title={isExpanded ? "Hide subagents" : "Show subagents"}
-                                  aria-label={isExpanded ? "Collapse subagents" : "Expand subagents"}
+                                  aria-label={
+                                    isExpanded ? "Collapse subagents" : "Expand subagents"
+                                  }
                                 >
                                   <span style={{ fontWeight: 500 }}>
                                     {conversationSubagents.length}
@@ -580,7 +584,9 @@ function ConversationDrawer({
                               }}
                             >
                               <div style={{ flex: 1, minWidth: 0 }}>
-                                <div style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}>
+                                <div
+                                  style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}
+                                >
                                   <div style={{ flex: 1, minWidth: 0 }}>
                                     <div className="conversation-title">
                                       {sub.slug || sub.conversation_id}

ui/src/generated-types.ts 🔗

@@ -4,61 +4,61 @@
 // DO NOT EDIT. This file is automatically generated.
 
 export interface Conversation {
-	conversation_id: string;
-	slug: string | null;
-	user_initiated: boolean;
-	created_at: string;
-	updated_at: string;
-	cwd: string | null;
-	archived: boolean;
-	parent_conversation_id: string | null;
+  conversation_id: string;
+  slug: string | null;
+  user_initiated: boolean;
+  created_at: string;
+  updated_at: string;
+  cwd: string | null;
+  archived: boolean;
+  parent_conversation_id: string | null;
 }
 
 export interface Usage {
-	input_tokens: number;
-	cache_creation_input_tokens: number;
-	cache_read_input_tokens: number;
-	output_tokens: number;
-	cost_usd: number;
-	model?: string;
-	start_time?: string | null;
-	end_time?: string | null;
+  input_tokens: number;
+  cache_creation_input_tokens: number;
+  cache_read_input_tokens: number;
+  output_tokens: number;
+  cost_usd: number;
+  model?: string;
+  start_time?: string | null;
+  end_time?: string | null;
 }
 
 export interface ApiMessageForTS {
-	message_id: string;
-	conversation_id: string;
-	sequence_id: number;
-	type: string;
-	llm_data?: string | null;
-	user_data?: string | null;
-	usage_data?: string | null;
-	created_at: string;
-	display_data?: string | null;
-	end_of_turn?: boolean | null;
+  message_id: string;
+  conversation_id: string;
+  sequence_id: number;
+  type: string;
+  llm_data?: string | null;
+  user_data?: string | null;
+  usage_data?: string | null;
+  created_at: string;
+  display_data?: string | null;
+  end_of_turn?: boolean | null;
 }
 
 export interface ConversationStateForTS {
-	conversation_id: string;
-	working: boolean;
+  conversation_id: string;
+  working: boolean;
 }
 
 export interface StreamResponseForTS {
-	messages: ApiMessageForTS[] | null;
-	conversation: Conversation;
-	conversation_state?: ConversationStateForTS | null;
+  messages: ApiMessageForTS[] | null;
+  conversation: Conversation;
+  conversation_state?: ConversationStateForTS | null;
 }
 
 export interface ConversationWithStateForTS {
-	conversation_id: string;
-	slug: string | null;
-	user_initiated: boolean;
-	created_at: string;
-	updated_at: string;
-	cwd: string | null;
-	archived: boolean;
-	parent_conversation_id: string | null;
-	working: boolean;
+  conversation_id: string;
+  slug: string | null;
+  user_initiated: boolean;
+  created_at: string;
+  updated_at: string;
+  cwd: string | null;
+  archived: boolean;
+  parent_conversation_id: string | null;
+  working: boolean;
 }
 
-export type MessageType = 'user' | 'agent' | 'tool' | 'error' | 'system' | 'gitinfo';
+export type MessageType = "user" | "agent" | "tool" | "error" | "system" | "gitinfo";

ui/src/styles.css 🔗

@@ -992,7 +992,6 @@ button {
 }
 
 .bash-tool-emoji.running {
-  animation: rotate 1s linear infinite;
 }
 
 .bash-tool-command {