diff --git a/apps/web/src/app/(authenticated)/usage/Messages.tsx b/apps/web/src/app/(authenticated)/usage/Messages.tsx index 07329aff16..ba48eaac5c 100644 --- a/apps/web/src/app/(authenticated)/usage/Messages.tsx +++ b/apps/web/src/app/(authenticated)/usage/Messages.tsx @@ -9,6 +9,28 @@ type MessagesProps = { messages: Message[]; }; +type QuestionData = { + question: string; + suggestions: string[]; +}; + +const parseQuestionData = (text: string): QuestionData | null => { + try { + const parsed = JSON.parse(text); + + if (parsed?.question && Array.isArray(parsed.suggest)) { + return { + question: parsed.question, + suggestions: parsed.suggest, + }; + } + } catch { + // Not valid JSON + } + + return null; +}; + export const Messages = ({ messages }: MessagesProps) => { const conversation = useMemo( () => @@ -20,31 +42,68 @@ export const Messages = ({ messages }: MessagesProps) => { return (
- {conversation.map((message) => ( -
-
-
-
{message.name}
-
·
-
{message.timestamp}
+ {conversation.map((message) => { + const isQuestion = message.type === 'ask' && message.ask === 'followup'; + const isCommand = message.type === 'ask' && message.ask === 'command'; + const questionData = + isQuestion && message.text ? parseQuestionData(message.text) : null; + + return ( +
+
+
+
{message.name}
+
·
+
{message.timestamp}
+
+ {message.mode && ( +
+ {message.mode} +
+ )}
- {message.mode && ( -
- {message.mode} + + {isQuestion && questionData ? ( +
+ {questionData.question && ( +
+ {questionData.question} +
+ )} + {questionData.suggestions && + questionData.suggestions.length > 0 && ( +
+ {questionData.suggestions.map((suggestion, index) => ( +
+ {suggestion} +
+ ))} +
+ )} +
+ ) : isCommand ? ( +
+
+ {message.text} +
+
+ ) : ( +
+ {message.text}
)}
-
- {message.text} -
-
- ))} + ); + })}
); }; @@ -59,10 +118,22 @@ const decorate = ({ message, index }: { message: Message; index: number }) => { return { ...message, role, name, timestamp }; }; -const isVisible = (message: Message) => - (message.ask === 'text' || - message.say === 'text' || - message.say === 'completion_result' || - message.say === 'user_feedback') && - typeof message.text === 'string' && - message.text.length > 0; +const isVisible = (message: Message) => { + // Always show followup and command messages regardless of text content + if ( + message.type === 'ask' && + (message.ask === 'followup' || message.ask === 'command') + ) { + return true; + } + + // For other message types, require non-empty text + return ( + (message.ask === 'text' || + message.say === 'text' || + message.say === 'completion_result' || + message.say === 'user_feedback') && + typeof message.text === 'string' && + message.text.length > 0 + ); +};