diff --git a/desktop/src/components/chat/MessageList.tsx b/desktop/src/components/chat/MessageList.tsx
index 76754e0d..abd74ca9 100644
--- a/desktop/src/components/chat/MessageList.tsx
+++ b/desktop/src/components/chat/MessageList.tsx
@@ -1,5 +1,5 @@
import { useRef, useEffect, useMemo, memo, useState, useCallback, useLayoutEffect, type ReactNode } from 'react'
-import { ArrowDown, BookMarked, Settings, Target } from 'lucide-react'
+import { ArrowDown, BookMarked, ChevronDown, ChevronRight, Settings, Target } from 'lucide-react'
import { ApiError } from '../../api/client'
import { sessionsApi, type SessionTurnCheckpoint } from '../../api/sessions'
import { useChatStore } from '../../stores/chatStore'
@@ -151,6 +151,7 @@ function ChatSelectionMenu({
function GoalEventCard({ message }: { message: GoalEvent }) {
const t = useTranslation()
+ const [expanded, setExpanded] = useState(true)
const titleKey = `chat.goalEvent.${message.action === 'status' ? 'statusTitle' : message.action}` as TranslationKey
const title = t(titleKey) === titleKey ? t('chat.goalEvent.message') : t(titleKey)
const metaDetails = [
@@ -160,35 +161,60 @@ function GoalEventCard({ message }: { message: GoalEvent }) {
].filter((detail): detail is string => detail !== null)
return (
-
-
-
-
-
-
-
{title}
- {message.objective ? (
-
- {t('chat.goalEvent.objective', { value: message.objective })}
-
- ) : message.message ? (
-
- {message.message}
-
- ) : null}
- {metaDetails.length > 0 && (
-
- {metaDetails.map((detail) => (
-
- {detail}
-
- ))}
-
+
+
+
+
+
+ {title}
+
+ {message.status ? (
+
+
+ {message.status}
+
+ ) : null}
+
+
+ {expanded ? (
+
+
+ {message.objective ? (
+
+ {t('chat.goalEvent.objective', { value: message.objective })}
+
+ ) : message.message ? (
+
+ {message.message}
+
+ ) : null}
+ {metaDetails.length > 0 && (
+
+ {metaDetails.map((detail) => (
+
+ {detail}
+
+ ))}
+
+ )}
+
+
+ ) : null}
)
diff --git a/desktop/src/pages/ActiveSession.tsx b/desktop/src/pages/ActiveSession.tsx
index bcc83ba1..9c835163 100644
--- a/desktop/src/pages/ActiveSession.tsx
+++ b/desktop/src/pages/ActiveSession.tsx
@@ -218,6 +218,7 @@ function GoalStatusPanel({
: isRunning && goal.status !== 'complete'
? t('chat.activeGoal.running')
: t('chat.activeGoal.active')
+ const hasMeta = Boolean(goal.budget || goal.continuations || goal.elapsed)
return (
-
-
-
+
+
+
-
-
-
- {t('chat.activeGoal.title')}
-
-
-
- {stateLabel}
-
- {goal.objective && (
-
- {goal.objective}
+
+ {t('chat.activeGoal.title')}
+
+
+
+ {stateLabel}
+
+ {goal.objective && (
+
+ {goal.objective}
+
+ )}
+ {hasMeta && (
+
+ {goal.budget && (
+
+ {t('chat.activeGoal.budget', { value: goal.budget })}
+
+ )}
+ {goal.continuations && (
+
+ {t('chat.activeGoal.continuations', { value: goal.continuations })}
+
+ )}
+ {goal.elapsed && (
+
+ {t('chat.activeGoal.elapsed', { value: goal.elapsed })}
)}
- {(goal.budget || goal.continuations || goal.elapsed) && (
-
- {goal.budget && (
-
- {t('chat.activeGoal.budget', { value: goal.budget })}
-
- )}
- {goal.continuations && (
-
- {t('chat.activeGoal.continuations', { value: goal.continuations })}
-
- )}
- {goal.elapsed && (
-
- {t('chat.activeGoal.elapsed', { value: goal.elapsed })}
-
- )}
-
- )}
-
+ )}
+ {hasMeta && goal.budget ? (
+
+ {t('chat.activeGoal.budget', { value: goal.budget })}
+
+ ) : null}
)