mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-12 15:10:59 -07:00
fix: persist and restore workspace directories on session resume (#17454)
Co-authored-by: Jacob Richman <jacob314@gmail.com>
This commit is contained in:
@@ -67,6 +67,9 @@ describe('directoryCommand', () => {
|
||||
isRestrictiveSandbox: vi.fn().mockReturnValue(false),
|
||||
getGeminiClient: vi.fn().mockReturnValue({
|
||||
addDirectoryContext: vi.fn(),
|
||||
getChatRecordingService: vi.fn().mockReturnValue({
|
||||
recordDirectories: vi.fn(),
|
||||
}),
|
||||
}),
|
||||
getWorkingDir: () => path.resolve('/test/dir'),
|
||||
shouldLoadMemoryFromIncludeDirectories: () => false,
|
||||
|
||||
@@ -57,6 +57,13 @@ async function finishAddingDirectories(
|
||||
const gemini = config.getGeminiClient();
|
||||
if (gemini) {
|
||||
await gemini.addDirectoryContext();
|
||||
|
||||
// Persist directories to session file for resume support
|
||||
const chatRecordingService = gemini.getChatRecordingService();
|
||||
const workspaceContext = config.getWorkspaceContext();
|
||||
chatRecordingService?.recordDirectories(
|
||||
workspaceContext.getDirectories(),
|
||||
);
|
||||
}
|
||||
addItem({
|
||||
type: MessageType.INFO,
|
||||
|
||||
@@ -177,6 +177,84 @@ describe('useSessionResume', () => {
|
||||
expect(mockRefreshStatic).toHaveBeenCalledTimes(1);
|
||||
expect(mockGeminiClient.resumeChat).toHaveBeenCalledWith([], resumedData);
|
||||
});
|
||||
|
||||
it('should restore directories from resumed session data', async () => {
|
||||
const mockAddDirectories = vi
|
||||
.fn()
|
||||
.mockReturnValue({ added: [], failed: [] });
|
||||
const mockWorkspaceContext = {
|
||||
addDirectories: mockAddDirectories,
|
||||
};
|
||||
const configWithWorkspace = {
|
||||
...mockConfig,
|
||||
getWorkspaceContext: vi.fn().mockReturnValue(mockWorkspaceContext),
|
||||
};
|
||||
|
||||
const { result } = renderHook(() =>
|
||||
useSessionResume({
|
||||
...getDefaultProps(),
|
||||
config: configWithWorkspace as unknown as Config,
|
||||
}),
|
||||
);
|
||||
|
||||
const resumedData: ResumedSessionData = {
|
||||
conversation: {
|
||||
sessionId: 'test-123',
|
||||
projectHash: 'project-123',
|
||||
startTime: '2025-01-01T00:00:00Z',
|
||||
lastUpdated: '2025-01-01T01:00:00Z',
|
||||
messages: [] as MessageRecord[],
|
||||
directories: ['/restored/dir1', '/restored/dir2'],
|
||||
},
|
||||
filePath: '/path/to/session.json',
|
||||
};
|
||||
|
||||
await act(async () => {
|
||||
await result.current.loadHistoryForResume([], [], resumedData);
|
||||
});
|
||||
|
||||
expect(configWithWorkspace.getWorkspaceContext).toHaveBeenCalled();
|
||||
expect(mockAddDirectories).toHaveBeenCalledWith([
|
||||
'/restored/dir1',
|
||||
'/restored/dir2',
|
||||
]);
|
||||
});
|
||||
|
||||
it('should not call addDirectories when no directories in resumed session', async () => {
|
||||
const mockAddDirectories = vi.fn();
|
||||
const mockWorkspaceContext = {
|
||||
addDirectories: mockAddDirectories,
|
||||
};
|
||||
const configWithWorkspace = {
|
||||
...mockConfig,
|
||||
getWorkspaceContext: vi.fn().mockReturnValue(mockWorkspaceContext),
|
||||
};
|
||||
|
||||
const { result } = renderHook(() =>
|
||||
useSessionResume({
|
||||
...getDefaultProps(),
|
||||
config: configWithWorkspace as unknown as Config,
|
||||
}),
|
||||
);
|
||||
|
||||
const resumedData: ResumedSessionData = {
|
||||
conversation: {
|
||||
sessionId: 'test-123',
|
||||
projectHash: 'project-123',
|
||||
startTime: '2025-01-01T00:00:00Z',
|
||||
lastUpdated: '2025-01-01T01:00:00Z',
|
||||
messages: [] as MessageRecord[],
|
||||
// No directories field
|
||||
},
|
||||
filePath: '/path/to/session.json',
|
||||
};
|
||||
|
||||
await act(async () => {
|
||||
await result.current.loadHistoryForResume([], [], resumedData);
|
||||
});
|
||||
|
||||
expect(mockAddDirectories).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('callback stability', () => {
|
||||
|
||||
@@ -71,6 +71,17 @@ export function useSessionResume({
|
||||
});
|
||||
refreshStaticRef.current(); // Force Static component to re-render with the updated history.
|
||||
|
||||
// Restore directories from the resumed session
|
||||
if (
|
||||
resumedData.conversation.directories &&
|
||||
resumedData.conversation.directories.length > 0
|
||||
) {
|
||||
const workspaceContext = config.getWorkspaceContext();
|
||||
// Add back any directories that were saved in the session
|
||||
// but filter out ones that no longer exist
|
||||
workspaceContext.addDirectories(resumedData.conversation.directories);
|
||||
}
|
||||
|
||||
// Give the history to the Gemini client.
|
||||
await config.getGeminiClient()?.resumeChat(clientHistory, resumedData);
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user