diff --git a/packages/cli/src/ui/components/messages/ThinkingMessage.test.tsx b/packages/cli/src/ui/components/messages/ThinkingMessage.test.tsx index 6f92487064..582776bb82 100644 --- a/packages/cli/src/ui/components/messages/ThinkingMessage.test.tsx +++ b/packages/cli/src/ui/components/messages/ThinkingMessage.test.tsx @@ -35,6 +35,20 @@ describe('ThinkingMessage', () => { expect(lastFrame()).toContain('(1)'); }); + it('renders thought content', () => { + const { lastFrame } = render( + , + ); + + expect(lastFrame()).toContain('Planning'); + expect(lastFrame()).toContain('I am planning the solution.'); + }); + it('renders empty state gracefully', () => { const { lastFrame } = render( , diff --git a/packages/cli/src/ui/components/messages/ThinkingMessage.tsx b/packages/cli/src/ui/components/messages/ThinkingMessage.tsx index a2eda6c375..99e789f1c0 100644 --- a/packages/cli/src/ui/components/messages/ThinkingMessage.tsx +++ b/packages/cli/src/ui/components/messages/ThinkingMessage.tsx @@ -23,11 +23,24 @@ export const ThinkingMessage: React.FC = ({ width={terminalWidth} paddingX={1} marginBottom={1} + flexDirection="column" > - - - Thinking - - ({thoughts.length}) + + + + Thinking + + ({thoughts.length}) + + {thoughts.map((thought, index) => ( + + {thought.subject && ( + + {thought.subject} + + )} + {thought.description || ' '} + + ))} ); diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts index 7791541fea..7202aa76dc 100644 --- a/packages/cli/src/ui/hooks/useGeminiStream.ts +++ b/packages/cli/src/ui/hooks/useGeminiStream.ts @@ -119,7 +119,9 @@ export const useGeminiStream = ( const activeQueryIdRef = useRef(null); const [isResponding, setIsResponding] = useState(false); const [thought, setThought] = useState(null); - const thoughtsBufferRef = useRef([]); + const [thoughtsBuffer, thoughtsBufferRef, setThoughtsBuffer] = useStateAndRef< + ThoughtSummary[] + >([]); const [pendingHistoryItem, pendingHistoryItemRef, setPendingHistoryItem] = useStateAndRef(null); @@ -136,10 +138,10 @@ export const useGeminiStream = ( } as HistoryItemThinking, userMessageTimestamp, ); - thoughtsBufferRef.current = []; + setThoughtsBuffer([]); } }, - [addItem, settings], + [addItem, settings, setThoughtsBuffer, thoughtsBufferRef], ); const processedMemoryToolsRef = useRef>(new Set()); @@ -828,7 +830,7 @@ export const useGeminiStream = ( switch (event.type) { case ServerGeminiEventType.Thought: setThought(event.value); - thoughtsBufferRef.current.push(event.value); + setThoughtsBuffer((prev) => [...prev, event.value]); break; case ServerGeminiEventType.Content: geminiMessageBuffer = handleContentEvent( @@ -908,6 +910,7 @@ export const useGeminiStream = ( handleCitationEvent, handleChatModelEvent, flushThoughts, + setThoughtsBuffer, ], ); const submitQuery = useCallback( @@ -1085,6 +1088,7 @@ export const useGeminiStream = ( config, startNewPrompt, getPromptCount, + thoughtsBufferRef, ], ); @@ -1282,12 +1286,24 @@ export const useGeminiStream = ( ], ); + const pendingThinkingItem = useMemo(() => { + if (settings.merged.ui?.showInlineThinking && thoughtsBuffer.length > 0) { + return { + type: 'thinking', + thoughts: thoughtsBuffer, + } as HistoryItemWithoutId; + } + return null; + }, [settings.merged.ui?.showInlineThinking, thoughtsBuffer]); + const pendingHistoryItems = useMemo( () => - [pendingHistoryItem, pendingToolCallGroupDisplay].filter( - (i) => i !== undefined && i !== null, - ), - [pendingHistoryItem, pendingToolCallGroupDisplay], + [ + pendingThinkingItem, + pendingHistoryItem, + pendingToolCallGroupDisplay, + ].filter((i) => i !== undefined && i !== null), + [pendingThinkingItem, pendingHistoryItem, pendingToolCallGroupDisplay], ); useEffect(() => { diff --git a/scripts/generate-git-commit-info.js b/scripts/generate-git-commit-info.js index 75c8bb97ba..dda65bede5 100644 --- a/scripts/generate-git-commit-info.js +++ b/scripts/generate-git-commit-info.js @@ -57,7 +57,7 @@ try { const fileContent = `/** * @license - * Copyright ${new Date().getFullYear()} Google LLC + * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */