webui: fix IDLE/WORKING indicator to ignore system messages

Fix bug where IDLE/WORKING status indicator in top-right incorrectly used
system messages (like commit detection) to determine agent state instead
of only considering user and agent messages.

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: s7aecd377d88b46f8k
diff --git a/webui/src/web-components/sketch-app-shell.ts b/webui/src/web-components/sketch-app-shell.ts
index 0f0177c..f545b82 100644
--- a/webui/src/web-components/sketch-app-shell.ts
+++ b/webui/src/web-components/sketch-app-shell.ts
@@ -998,6 +998,19 @@
     this._windowFocused = false;
   }
 
+  // Get the last user or agent message (ignore system messages like commit, error, etc.)
+  // For example, when Sketch notices a new commit, it'll send a message,
+  // but it's still idle!
+  private getLastUserOrAgentMessage(): AgentMessage | null {
+    for (let i = this.messages.length - 1; i >= 0; i--) {
+      const message = this.messages[i];
+      if (message.type === "user" || message.type === "agent") {
+        return message;
+      }
+    }
+    return null;
+  }
+
   // Show notification for message with EndOfTurn=true
   private async showEndOfTurnNotification(
     message: AgentMessage,
@@ -1447,10 +1460,13 @@
             .agentState=${this.containerState?.agent_state}
             .llmCalls=${this.containerState?.outstanding_llm_calls || 0}
             .toolCalls=${this.containerState?.outstanding_tool_calls || []}
-            .isIdle=${this.messages.length > 0
-              ? this.messages[this.messages.length - 1]?.end_of_turn &&
-                !this.messages[this.messages.length - 1]?.parent_conversation_id
-              : true}
+            .isIdle=${(() => {
+              const lastUserOrAgentMessage = this.getLastUserOrAgentMessage();
+              return lastUserOrAgentMessage
+                ? lastUserOrAgentMessage.end_of_turn &&
+                  !lastUserOrAgentMessage.parent_conversation_id
+                : true;
+            })()}
             .isDisconnected=${this.connectionStatus === "disconnected"}
           ></sketch-call-status>