Reload gemini memory on extension load/unload + memory refresh refactor (#12651)

This commit is contained in:
Jacob MacDonald
2025-11-07 09:07:25 -08:00
committed by GitHub
parent ef4030331a
commit 47603ef8e1
15 changed files with 276 additions and 259 deletions
@@ -13,6 +13,7 @@ import {
loadGlobalMemory,
loadEnvironmentMemory,
loadJitSubdirectoryMemory,
refreshServerHierarchicalMemory,
} from './memoryDiscovery.js';
import {
setGeminiMdFilename,
@@ -20,8 +21,10 @@ import {
} from '../tools/memoryTool.js';
import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
import { GEMINI_DIR } from './paths.js';
import type { GeminiCLIExtension } from '../config/config.js';
import { Config, type GeminiCLIExtension } from '../config/config.js';
import { Storage } from '../config/storage.js';
import { SimpleExtensionLoader } from './extensionLoader.js';
import { CoreEvent, coreEvents } from './events.js';
vi.mock('os', async (importOriginal) => {
const actualOs = await importOriginal<typeof os>();
@@ -876,4 +879,58 @@ included directory memory
expect(result.files.find((f) => f.path === outerMemory)).toBeUndefined();
});
});
it('refreshServerHierarchicalMemory should refresh memory and update config', async () => {
const extensionLoader = new SimpleExtensionLoader([]);
const config = new Config({
sessionId: '1',
targetDir: cwd,
cwd,
debugMode: false,
model: 'fake-model',
extensionLoader,
});
const result = await loadServerHierarchicalMemory(
config.getWorkingDir(),
config.shouldLoadMemoryFromIncludeDirectories()
? config.getWorkspaceContext().getDirectories()
: [],
config.getDebugMode(),
config.getFileService(),
config.getExtensionLoader(),
config.isTrustedFolder(),
config.getImportFormat(),
);
expect(result.fileCount).equals(0);
// Now add an extension with a memory file
const extensionsDir = new Storage(homedir).getExtensionsDir();
const extensionPath = path.join(extensionsDir, 'new-extension');
const contextFilePath = path.join(extensionPath, 'CustomContext.md');
await fsPromises.mkdir(extensionPath, { recursive: true });
await fsPromises.writeFile(contextFilePath, 'Really cool custom context!');
await extensionLoader.loadExtension({
name: 'new-extension',
isActive: true,
contextFiles: [contextFilePath],
version: '1.0.0',
id: '1234',
path: extensionPath,
});
const mockEventListener = vi.fn();
coreEvents.on(CoreEvent.MemoryChanged, mockEventListener);
const refreshResult = await refreshServerHierarchicalMemory(config);
expect(refreshResult.fileCount).equals(1);
expect(config.getGeminiMdFileCount()).equals(refreshResult.fileCount);
expect(refreshResult.memoryContent).toContain(
'Really cool custom context!',
);
expect(config.getUserMemory()).equals(refreshResult.memoryContent);
expect(refreshResult.filePaths[0]).toContain(
path.join(extensionPath, 'CustomContext.md'),
);
expect(config.getGeminiMdFilePaths()).equals(refreshResult.filePaths);
expect(mockEventListener).toHaveBeenCalledExactlyOnceWith(refreshResult);
});
});