From 5bf698cc509e73c04128958474d01e5f5e2a1116 Mon Sep 17 00:00:00 2001
From: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Date: Wed, 1 Oct 2025 12:35:24 -0400
Subject: [PATCH] Include Session ID appropriately in UI (#4901)
---
ui/desktop/src/App.tsx | 20 ++++++++++++++++---
ui/desktop/src/components/BaseChat.tsx | 2 +-
ui/desktop/src/components/ChatInput.tsx | 2 +-
.../context_management/ContextManager.tsx | 18 +++++++++++------
.../__tests__/ContextManager.test.tsx | 18 +++++++++--------
.../components/context_management/index.ts | 4 +++-
6 files changed, 44 insertions(+), 20 deletions(-)
diff --git a/ui/desktop/src/App.tsx b/ui/desktop/src/App.tsx
index 12aa2fe3..0c59d961 100644
--- a/ui/desktop/src/App.tsx
+++ b/ui/desktop/src/App.tsx
@@ -357,10 +357,12 @@ export function AppInner() {
if (loadingHub) {
(async () => {
try {
- await loadCurrentChat({
+ const loadedChat = await loadCurrentChat({
setAgentWaitingMessage,
setIsExtensionsLoading,
});
+ // Update the chat state with the loaded session to ensure sessionId is available globally
+ setChat(loadedChat);
} catch (e) {
if (e instanceof NoProviderOrModelError) {
// the onboarding flow will trigger
@@ -370,7 +372,7 @@ export function AppInner() {
}
})();
}
- }, [resetChat, loadCurrentChat, setAgentWaitingMessage, navigate, loadingHub]);
+ }, [resetChat, loadCurrentChat, setAgentWaitingMessage, navigate, loadingHub, setChat]);
useEffect(() => {
const handleOpenSharedSession = async (_event: IpcRendererEvent, ...args: unknown[]) => {
@@ -582,7 +584,19 @@ export function AppInner() {
}
/>
} />
- } />
+
+
+
+ }
+ />
} />
} />
} />
diff --git a/ui/desktop/src/components/BaseChat.tsx b/ui/desktop/src/components/BaseChat.tsx
index 66aeb5cf..e267ffab 100644
--- a/ui/desktop/src/components/BaseChat.tsx
+++ b/ui/desktop/src/components/BaseChat.tsx
@@ -441,7 +441,7 @@ function BaseChatContent({
onClick={async () => {
clearError();
- await handleManualCompaction(messages, setMessages, append);
+ await handleManualCompaction(messages, setMessages, append, chat.sessionId);
}}
>
Summarize Conversation
diff --git a/ui/desktop/src/components/ChatInput.tsx b/ui/desktop/src/components/ChatInput.tsx
index aff49368..2ed48b1d 100644
--- a/ui/desktop/src/components/ChatInput.tsx
+++ b/ui/desktop/src/components/ChatInput.tsx
@@ -568,7 +568,7 @@ export default function ChatInput({
// Hide the alert popup by dispatching a custom event that the popover can listen to
// Importantly, this leaves the alert so the dot still shows up, but hides the popover
window.dispatchEvent(new CustomEvent('hide-alert-popover'));
- handleManualCompaction(messages, setMessages, append);
+ handleManualCompaction(messages, setMessages, append, sessionId || '');
},
compactIcon: ,
autoCompactThreshold: autoCompactThreshold,
diff --git a/ui/desktop/src/components/context_management/ContextManager.tsx b/ui/desktop/src/components/context_management/ContextManager.tsx
index f95e396c..4d5ad9d9 100644
--- a/ui/desktop/src/components/context_management/ContextManager.tsx
+++ b/ui/desktop/src/components/context_management/ContextManager.tsx
@@ -12,12 +12,14 @@ interface ContextManagerActions {
handleAutoCompaction: (
messages: Message[],
setMessages: (messages: Message[]) => void,
- append: (message: Message) => void
+ append: (message: Message) => void,
+ sessionId: string
) => Promise;
handleManualCompaction: (
messages: Message[],
setMessages: (messages: Message[]) => void,
- append?: (message: Message) => void
+ append?: (message: Message) => void,
+ sessionId?: string
) => Promise;
hasCompactionMarker: (message: Message) => boolean;
}
@@ -37,6 +39,7 @@ export const ContextManagerProvider: React.FC<{ children: React.ReactNode }> = (
messages: Message[],
setMessages: (messages: Message[]) => void,
append: (message: Message) => void,
+ sessionId: string,
isManual: boolean = false
) => {
setIsCompacting(true);
@@ -47,6 +50,7 @@ export const ContextManagerProvider: React.FC<{ children: React.ReactNode }> = (
const summaryResponse = await manageContextFromBackend({
messages: messages,
manageAction: 'summarize',
+ sessionId: sessionId,
});
// Convert API messages to frontend messages
@@ -100,9 +104,10 @@ export const ContextManagerProvider: React.FC<{ children: React.ReactNode }> = (
async (
messages: Message[],
setMessages: (messages: Message[]) => void,
- append: (message: Message) => void
+ append: (message: Message) => void,
+ sessionId: string
) => {
- await performCompaction(messages, setMessages, append, false);
+ await performCompaction(messages, setMessages, append, sessionId, false);
},
[performCompaction]
);
@@ -111,9 +116,10 @@ export const ContextManagerProvider: React.FC<{ children: React.ReactNode }> = (
async (
messages: Message[],
setMessages: (messages: Message[]) => void,
- append?: (message: Message) => void
+ append?: (message: Message) => void,
+ sessionId?: string
) => {
- await performCompaction(messages, setMessages, append || (() => {}), true);
+ await performCompaction(messages, setMessages, append || (() => {}), sessionId || '', true);
},
[performCompaction]
);
diff --git a/ui/desktop/src/components/context_management/__tests__/ContextManager.test.tsx b/ui/desktop/src/components/context_management/__tests__/ContextManager.test.tsx
index 453d8cfa..1ef01070 100644
--- a/ui/desktop/src/components/context_management/__tests__/ContextManager.test.tsx
+++ b/ui/desktop/src/components/context_management/__tests__/ContextManager.test.tsx
@@ -166,12 +166,13 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend);
+ await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend, 'test-session-id');
});
expect(mockManageContextFromBackend).toHaveBeenCalledWith({
messages: mockMessages,
manageAction: 'summarize',
+ sessionId: 'test-session-id',
});
// Verify conversion calls with correct parameters
@@ -225,7 +226,7 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend);
+ await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend, "test-session-id");
});
expect(result.current.compactionError).toBe('Backend error');
@@ -256,7 +257,7 @@ describe('ContextManager', () => {
// Start compaction
act(() => {
- result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend);
+ result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend, "test-session-id");
});
// Should be compacting
@@ -306,7 +307,7 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleAutoCompaction(messages, mockSetMessages, mockAppend);
+ await result.current.handleAutoCompaction(messages, mockSetMessages, mockAppend, "test-session-id");
});
// No server messages -> setMessages called with empty list
@@ -369,12 +370,13 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleManualCompaction(mockMessages, mockSetMessages, mockAppend);
+ await result.current.handleManualCompaction(mockMessages, mockSetMessages, mockAppend, 'test-session-id');
});
expect(mockManageContextFromBackend).toHaveBeenCalledWith({
messages: mockMessages,
manageAction: 'summarize',
+ sessionId: 'test-session-id',
});
// Verify all three messages are set
@@ -481,7 +483,7 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleManualCompaction(mockMessages, mockSetMessages, mockAppend);
+ await result.current.handleManualCompaction(mockMessages, mockSetMessages, mockAppend, 'test-session-id');
});
// Verify all three messages are set
@@ -508,7 +510,7 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend);
+ await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend, "test-session-id");
});
expect(result.current.compactionError).toBe('Unknown error during compaction');
@@ -539,7 +541,7 @@ describe('ContextManager', () => {
const { result } = renderContextManager();
await act(async () => {
- await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend);
+ await result.current.handleAutoCompaction(mockMessages, mockSetMessages, mockAppend, "test-session-id");
});
// Should complete without error even if content is not text
diff --git a/ui/desktop/src/components/context_management/index.ts b/ui/desktop/src/components/context_management/index.ts
index 68ddbb8c..c54d95eb 100644
--- a/ui/desktop/src/components/context_management/index.ts
+++ b/ui/desktop/src/components/context_management/index.ts
@@ -18,12 +18,14 @@ import { generateId } from 'ai';
export async function manageContextFromBackend({
messages,
manageAction,
+ sessionId,
}: {
messages: FrontendMessage[];
manageAction: 'truncation' | 'summarize';
+ sessionId: string;
}): Promise {
try {
- const contextManagementRequest = { manageAction, messages };
+ const contextManagementRequest = { manageAction, messages, sessionId };
// Cast to the API-expected type
const result = await manageContext({