diff --git a/src/components/AppLayout.tsx b/src/components/AppLayout.tsx
index ac7e240..7afaf1f 100644
--- a/src/components/AppLayout.tsx
+++ b/src/components/AppLayout.tsx
@@ -501,7 +501,6 @@ export function AppLayout() {
setScrollToMessageId(undefined)}
diff --git a/src/features/chat/components/ChatHeader.tsx b/src/features/chat/components/ChatHeader.tsx
index 0e4feb0..c3f5d15 100644
--- a/src/features/chat/components/ChatHeader.tsx
+++ b/src/features/chat/components/ChatHeader.tsx
@@ -1,6 +1,5 @@
import { memo, useState, useEffect } from "react";
import {
- Loader2,
MoreHorizontal,
PanelLeft,
Pin,
@@ -35,7 +34,6 @@ const PERMISSION_MODE_LABELS: Record = {
interface ChatHeaderProps {
sidebarOpen: boolean;
- isProcessing: boolean;
model?: string;
sessionId?: string;
totalCost: number;
@@ -53,7 +51,6 @@ interface ChatHeaderProps {
export const ChatHeader = memo(function ChatHeader({
sidebarOpen,
- isProcessing,
model,
sessionId,
totalCost,
@@ -151,13 +148,6 @@ export const ChatHeader = memo(function ChatHeader({
)}
- {isProcessing && (
-
-
- Processing
-
- )}
-
{model && (
{model}
diff --git a/src/features/chat/components/ChatView.tsx b/src/features/chat/components/ChatView.tsx
index 3b17def..173232e 100644
--- a/src/features/chat/components/ChatView.tsx
+++ b/src/features/chat/components/ChatView.tsx
@@ -1,4 +1,5 @@
import { useEffect, useRef, useMemo, useCallback, memo } from "react";
+import { Loader2 } from "lucide-react";
import { ScrollArea } from "@/components/ui/scroll-area";
import type { UIMessage } from "@/types";
import { MessageBubble } from "@/components/MessageBubble";
@@ -7,12 +8,19 @@ import { ToolCall } from "@/features/tools";
interface ChatViewProps {
messages: UIMessage[];
+ isProcessing: boolean;
extraBottomPadding?: boolean;
scrollToMessageId?: string;
onScrolledToMessage?: () => void;
}
-export const ChatView = memo(function ChatView({ messages, extraBottomPadding, scrollToMessageId, onScrolledToMessage }: ChatViewProps) {
+export const ChatView = memo(function ChatView({
+ messages,
+ isProcessing,
+ extraBottomPadding,
+ scrollToMessageId,
+ onScrolledToMessage,
+}: ChatViewProps) {
const bottomRef = useRef(null);
const scrollAreaRef = useRef(null);
const scrollTimerRef = useRef(0);
@@ -92,6 +100,17 @@ export const ChatView = memo(function ChatView({ messages, extraBottomPadding, s
return ids;
}, [messages]);
+ const activePromptId = useMemo(() => {
+ if (!isProcessing) return null;
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
+ const msg = messages[i];
+ if (msg.role !== "user") continue;
+ const hasAssistantAfter = messages.slice(i + 1).some((next) => next.role === "assistant");
+ return hasAssistantAfter ? null : msg.id;
+ }
+ return null;
+ }, [messages, isProcessing]);
+
if (messages.length === 0) {
return (
@@ -123,6 +142,19 @@ export const ChatView = memo(function ChatView({ messages, extraBottomPadding, s
message={msg}
isContinuation={continuationIds.has(msg.id)}
/>
+ {msg.id === activePromptId && (
+
+ )}
);
})}