diff --git a/ui/desktop/src/components/context_management/ChatContextManager.tsx b/ui/desktop/src/components/context_management/ChatContextManager.tsx index 9e8e666b8591..f883c872b48d 100644 --- a/ui/desktop/src/components/context_management/ChatContextManager.tsx +++ b/ui/desktop/src/components/context_management/ChatContextManager.tsx @@ -188,6 +188,7 @@ export const ChatContextManagerProvider: React.FC<{ children: React.ReactNode }> ...msg, display: true, sendToLLM: false, + isAncestor: true, })); // Append new ancestor messages to existing ones @@ -198,6 +199,7 @@ export const ChatContextManagerProvider: React.FC<{ children: React.ReactNode }> ...msg, display: true, sendToLLM: false, + isAncestor: true, })); setAncestorMessages(newAncestorMessages); diff --git a/ui/desktop/src/hooks/useChat.ts b/ui/desktop/src/hooks/useChat.ts index 7db74e5a6e65..45a81ecd3bf0 100644 --- a/ui/desktop/src/hooks/useChat.ts +++ b/ui/desktop/src/hooks/useChat.ts @@ -37,6 +37,7 @@ export const useChat = ({ setIsLoadingSession, setView, setPairChat }: UseChatAr id: sessionDetails.session_id, title: sessionDetails.metadata?.description || `ID: ${sessionDetails.session_id}`, messages: sessionDetails.messages, + ancestorMessages: sessionDetails.ancestorMessages || [], messageHistoryIndex: sessionDetails.messages.length, recipeConfig: null, // Sessions don't have recipes by default }; diff --git a/ui/desktop/src/hooks/useChatEngine.ts b/ui/desktop/src/hooks/useChatEngine.ts index 8d29f9866666..3551369b8885 100644 --- a/ui/desktop/src/hooks/useChatEngine.ts +++ b/ui/desktop/src/hooks/useChatEngine.ts @@ -44,7 +44,9 @@ export const useChatEngine = ({ }: UseChatEngineProps) => { const [lastInteractionTime, setLastInteractionTime] = useState(Date.now()); const [sessionTokenCount, setSessionTokenCount] = useState(0); - const [ancestorMessages, setAncestorMessages] = useState([]); + const [ancestorMessages, setAncestorMessages] = useState( + Array.isArray(chat.ancestorMessages) ? chat.ancestorMessages : [] + ); const [sessionInputTokens, setSessionInputTokens] = useState(0); const [sessionOutputTokens, setSessionOutputTokens] = useState(0); const [localInputTokens, setLocalInputTokens] = useState(0); @@ -96,7 +98,7 @@ export const useChatEngine = ({ } = useMessageStream({ api: getApiUrl('/reply'), id: chat.id, - initialMessages: chat.messages, + initialMessages: [...(chat.ancestorMessages || []), ...chat.messages], body: { session_id: chat.id, session_working_dir: window.appConfig.get('GOOSE_WORKING_DIR') }, onFinish: async (_message, _reason) => { stopPowerSaveBlocker(); @@ -377,7 +379,8 @@ export const useChatEngine = ({ }, [stop, messages, _setInput, setMessages, stopPowerSaveBlocker, enableLocalStorage]); const filteredMessages = useMemo(() => { - return [...ancestorMessages, ...messages].filter((message) => message.display ?? true); + const allMessages = [...ancestorMessages, ...messages]; + return allMessages.filter((message) => message.display ?? true); }, [ancestorMessages, messages]); // Generate command history from filtered messages diff --git a/ui/desktop/src/sessions.ts b/ui/desktop/src/sessions.ts index 749f8bc73cf0..32108d7f0c04 100644 --- a/ui/desktop/src/sessions.ts +++ b/ui/desktop/src/sessions.ts @@ -41,6 +41,7 @@ export interface SessionDetails { session_id: string; metadata: SessionMetadata; messages: Message[]; + ancestorMessages?: Message[]; } /** @@ -113,13 +114,21 @@ export async function fetchSessionDetails(sessionId: string): Promise + convertApiMessageToFrontendMessage(message, true, true) + ); + + const ancestorMessages = allMessages.filter(msg => msg.isAncestor === true); + const regularMessages = allMessages.filter(msg => msg.isAncestor !== true); + + const validAncestorMessages = Array.isArray(ancestorMessages) ? ancestorMessages : []; + // Convert the SessionHistoryResponse to a SessionDetails object return { session_id: response.data.sessionId, metadata: ensureWorkingDir(response.data.metadata), - messages: response.data.messages.map((message) => - convertApiMessageToFrontendMessage(message, true, true) - ), // slight diffs between backend and frontend Message obj + messages: regularMessages, + ancestorMessages: validAncestorMessages, }; } catch (error) { console.error(`Error fetching session details for ${sessionId}:`, error); diff --git a/ui/desktop/src/types/chat.ts b/ui/desktop/src/types/chat.ts index ac0367590b02..be0249cf4c01 100644 --- a/ui/desktop/src/types/chat.ts +++ b/ui/desktop/src/types/chat.ts @@ -6,6 +6,7 @@ export interface ChatType { title: string; messageHistoryIndex: number; messages: Message[]; + ancestorMessages?: Message[]; recipeConfig?: Recipe | null; // Add recipe configuration to chat state recipeParameters?: Record | null; // Add recipe parameters to chat state } diff --git a/ui/desktop/src/types/message.ts b/ui/desktop/src/types/message.ts index 3c45bc75d7ad..ce93261f57f4 100644 --- a/ui/desktop/src/types/message.ts +++ b/ui/desktop/src/types/message.ts @@ -110,6 +110,7 @@ export interface Message { content: MessageContent[]; display?: boolean; sendToLLM?: boolean; + isAncestor?: boolean; } // Helper functions to create messages