From f87f67d895d5924da1470d481c6e6b747103f50c Mon Sep 17 00:00:00 2001 From: Nate Kelley Date: Wed, 24 Sep 2025 21:48:17 -0600 Subject: [PATCH] add some reasoning trigger --- apps/web/src/hooks/useDocumentTitle.tsx | 6 ++++ .../useAutoRedirectStreaming.ts | 35 +++++++++++++++---- .../ChatLayoutContext/useChatStreaming.tsx | 8 +++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/apps/web/src/hooks/useDocumentTitle.tsx b/apps/web/src/hooks/useDocumentTitle.tsx index 1433af351..b44f447cf 100644 --- a/apps/web/src/hooks/useDocumentTitle.tsx +++ b/apps/web/src/hooks/useDocumentTitle.tsx @@ -8,3 +8,9 @@ export const useDocumentTitle = (title: string | undefined) => { }, 25); }, [title]); }; + +export const updateDocumentTitle = (callback: (currentTitle: string) => string) => { + const currentTitle = document.title; + const newTitle = callback(currentTitle); + document.title = newTitle; +}; diff --git a/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useAutoRedirectStreaming.ts b/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useAutoRedirectStreaming.ts index 14f79d480..fd0ca8f88 100644 --- a/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useAutoRedirectStreaming.ts +++ b/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useAutoRedirectStreaming.ts @@ -1,5 +1,5 @@ -import { useLocation, useNavigate } from '@tanstack/react-router'; -import { useEffect, useLayoutEffect, useRef } from 'react'; +import { useNavigate } from '@tanstack/react-router'; +import { useEffect, useLayoutEffect, useRef, useState } from 'react'; import type { BusterChatResponseMessage_file } from '@/api/asset_interfaces/chat'; import { useGetChatMessageMemoized } from '@/api/buster_rest/chats'; import { useIsVersionChanged } from '@/context/AppVersion/useAppVersion'; @@ -10,6 +10,7 @@ import { useGetChatMessageIsFinishedReasoning, useGetChatMessageLastReasoningMessageId, } from '@/context/Chats/useGetChatMessage'; +import { useWindowFocus } from '@/hooks/useWindowFocus'; import { assetParamsToRoute } from '@/lib/assets/assetParamsToRoute'; export const useAutoRedirectStreaming = ({ @@ -31,6 +32,7 @@ export const useAutoRedirectStreaming = ({ const previousIsCompletedStream = useRef(isStreamFinished); const hasLoadedChat = useHasLoadedChat({ chatId: chatId || '' }); const hasReasoning = !!lastReasoningMessageId; + const [triggerAutoNavigate, setTriggerAutoNavigate] = useState(0); useLayoutEffect(() => { previousIsCompletedStream.current = isStreamFinished; @@ -42,6 +44,8 @@ export const useAutoRedirectStreaming = ({ return; } + console.log('triggerAutoNavigate', triggerAutoNavigate); + const chatMessage = getChatMessageMemoized(lastMessageId); const firstFileId = chatMessage?.response_message_ids?.find((id) => { const responseMessage = chatMessage?.response_messages[id]; @@ -49,7 +53,11 @@ export const useAutoRedirectStreaming = ({ }); //this will happen if it is streaming and has a file in the response - if (!isStreamFinished && firstFileId) { + // or if the chat is completed and has a file in the response + if ( + (!isStreamFinished && firstFileId) || + (isStreamFinished && firstFileId && previousIsCompletedStream.current === false) + ) { const firstFile = chatMessage?.response_messages[firstFileId] as | BusterChatResponseMessage_file | undefined; @@ -64,6 +72,8 @@ export const useAutoRedirectStreaming = ({ navigate({ ...linkProps, replace: true, reloadDocument: versionChanged }); } + + previousIsCompletedStream.current = true; } //this will trigger when the chat is streaming and is has not completed yet (new chat) @@ -86,8 +96,6 @@ export const useAutoRedirectStreaming = ({ previousIsCompletedStream.current === false && !firstFileId ) { - //no file is found, so we need to collapse the chat - navigate({ to: '/app/chats/$chatId', params: { @@ -96,12 +104,27 @@ export const useAutoRedirectStreaming = ({ replace: true, reloadDocument: versionChanged, }); + previousIsCompletedStream.current = true; } - }, [isStreamFinished, hasReasoning, hasResponseFile, chatId, lastMessageId, isFinishedReasoning]); //only use these values to trigger the useEffect + }, [ + isStreamFinished, + hasReasoning, + hasResponseFile, + chatId, + lastMessageId, + isFinishedReasoning, + triggerAutoNavigate, + ]); //only use these values to trigger the useEffect useEffect(() => { if (!isStreamFinished && versionChanged) { window.location.reload(); } }, [isStreamFinished, versionChanged]); + + useWindowFocus(() => { + if (isStreamFinished && previousIsCompletedStream.current === false) { + setTriggerAutoNavigate((prev) => prev + 1); + } + }); }; diff --git a/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useChatStreaming.tsx b/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useChatStreaming.tsx index f84ec3be9..4badaae96 100644 --- a/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useChatStreaming.tsx +++ b/apps/web/src/layouts/ChatLayout/ChatLayoutContext/useChatStreaming.tsx @@ -11,6 +11,7 @@ import { import { chatQueryKeys } from '@/api/query_keys/chat'; import { metricsQueryKeys } from '@/api/query_keys/metric'; import { useBlackboxMessage } from '@/context/BlackBox/useBlackboxMessage'; +import { updateDocumentTitle, useDocumentTitle } from '@/hooks/useDocumentTitle'; import { useMemoizedFn } from '@/hooks/useMemoizedFn'; import { useMount } from '@/hooks/useMount'; import { updateChatToIChat } from '@/lib/chat'; @@ -135,13 +136,20 @@ export const useChatStreaming = ({ }); useEffect(() => { + const REASONING_TITLE = 'Reasoning... | '; if (isStreamingMessage) { const message = getChatMessageMemoized(messageId); if (message) { checkBlackBoxMessage(message); } + updateDocumentTitle((currentTitle) => { + return `${REASONING_TITLE}${currentTitle}`; + }); } else { removeBlackBoxMessage(messageId); + updateDocumentTitle((currentTitle) => { + return currentTitle.replace(REASONING_TITLE, ''); + }); } }, [isStreamingMessage]);