diff --git a/vibn-frontend/components/vibn-chat/chat-panel.tsx b/vibn-frontend/components/vibn-chat/chat-panel.tsx
index 321e5743..2bddaddc 100644
--- a/vibn-frontend/components/vibn-chat/chat-panel.tsx
+++ b/vibn-frontend/components/vibn-chat/chat-panel.tsx
@@ -546,7 +546,7 @@ const MessageBubble = React.memo(function MessageBubble({
}}
>
{!isUser && msg.timeline && msg.timeline.length > 0 && (
-
+
)}
{/*
Render the legacy bottom content bubble ONLY when:
@@ -600,7 +600,7 @@ const MessageBubble = React.memo(function MessageBubble({
* name with a ×N counter. The flow visually mirrors what actually
* happened: thought → tools → thought → tools → ... → final summary.
*/
-function Timeline({ entries }: { entries: TimelineEntry[] }) {
+function Timeline({ entries, isActiveStream }: { entries: TimelineEntry[], isActiveStream?: boolean }) {
// Walk the entries and emit a renderable list. Adjacent same-category
// tool entries get bundled into a TimelineToolGroup; thought and
// text entries pass through as-is.
@@ -634,11 +634,12 @@ function Timeline({ entries }: { entries: TimelineEntry[] }) {
return (
{items.map((item, i) => {
+ const isLast = i === items.length - 1;
if (item.kind === "thought") {
- return ;
+ return ;
}
if (item.kind === "text") {
- return ;
+ return ;
}
if (item.kind === "toolGroup") {
return (
@@ -660,7 +661,7 @@ function Timeline({ entries }: { entries: TimelineEntry[] }) {
* bubble so each round of multi-tool-loop output reads as a discrete
* step instead of concatenating into a wall of text.
*/
-function TimelineText({ text }: { text: string }) {
+function TimelineText({ text, isStreaming }: { text: string; isStreaming?: boolean }) {
const proseWrap: React.CSSProperties = {
overflowWrap: "anywhere",
wordBreak: "break-word",
@@ -684,7 +685,7 @@ function TimelineText({ text }: { text: string }) {
` : ""),
}}
/>