feat(core): Refresh agents after loading an extension. (#17355)

This commit is contained in:
joshualitt
2026-01-22 16:22:22 -08:00
committed by GitHub
parent a1f5d39029
commit 678c58634b
2 changed files with 12 additions and 0 deletions
@@ -36,6 +36,7 @@ describe('SimpleExtensionLoader', () => {
typeof GeminiClient.prototype.setTools typeof GeminiClient.prototype.setTools
>; >;
let mockHookSystemInit: MockInstance; let mockHookSystemInit: MockInstance;
let mockAgentRegistryReload: MockInstance;
const activeExtension: GeminiCLIExtension = { const activeExtension: GeminiCLIExtension = {
name: 'test-extension', name: 'test-extension',
@@ -63,6 +64,7 @@ describe('SimpleExtensionLoader', () => {
extensionReloadingEnabled = false; extensionReloadingEnabled = false;
mockGeminiClientSetTools = vi.fn(); mockGeminiClientSetTools = vi.fn();
mockHookSystemInit = vi.fn(); mockHookSystemInit = vi.fn();
mockAgentRegistryReload = vi.fn();
mockConfig = { mockConfig = {
getMcpClientManager: () => mockMcpClientManager, getMcpClientManager: () => mockMcpClientManager,
getEnableExtensionReloading: () => extensionReloadingEnabled, getEnableExtensionReloading: () => extensionReloadingEnabled,
@@ -73,6 +75,9 @@ describe('SimpleExtensionLoader', () => {
getHookSystem: () => ({ getHookSystem: () => ({
initialize: mockHookSystemInit, initialize: mockHookSystemInit,
}), }),
getAgentRegistry: () => ({
reload: mockAgentRegistryReload,
}),
} as unknown as Config; } as unknown as Config;
}); });
@@ -132,15 +137,18 @@ describe('SimpleExtensionLoader', () => {
expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce();
expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce();
expect(mockGeminiClientSetTools).toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).toHaveBeenCalledOnce();
expect(mockAgentRegistryReload).toHaveBeenCalledOnce();
} else { } else {
expect(mockMcpClientManager.startExtension).not.toHaveBeenCalled(); expect(mockMcpClientManager.startExtension).not.toHaveBeenCalled();
expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled(); expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled();
expect(mockHookSystemInit).not.toHaveBeenCalled(); expect(mockHookSystemInit).not.toHaveBeenCalled();
expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce();
expect(mockAgentRegistryReload).not.toHaveBeenCalled();
} }
mockRefreshServerHierarchicalMemory.mockClear(); mockRefreshServerHierarchicalMemory.mockClear();
mockHookSystemInit.mockClear(); mockHookSystemInit.mockClear();
mockGeminiClientSetTools.mockClear(); mockGeminiClientSetTools.mockClear();
mockAgentRegistryReload.mockClear();
await loader.unloadExtension(activeExtension); await loader.unloadExtension(activeExtension);
if (reloadingEnabled) { if (reloadingEnabled) {
@@ -150,11 +158,13 @@ describe('SimpleExtensionLoader', () => {
expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce();
expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce();
expect(mockGeminiClientSetTools).toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).toHaveBeenCalledOnce();
expect(mockAgentRegistryReload).toHaveBeenCalledOnce();
} else { } else {
expect(mockMcpClientManager.stopExtension).not.toHaveBeenCalled(); expect(mockMcpClientManager.stopExtension).not.toHaveBeenCalled();
expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled(); expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled();
expect(mockHookSystemInit).not.toHaveBeenCalled(); expect(mockHookSystemInit).not.toHaveBeenCalled();
expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce();
expect(mockAgentRegistryReload).not.toHaveBeenCalled();
} }
}); });
@@ -175,6 +185,7 @@ describe('SimpleExtensionLoader', () => {
]); ]);
expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce();
expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce();
expect(mockAgentRegistryReload).toHaveBeenCalledOnce();
}, },
); );
}, },
@@ -112,6 +112,7 @@ export abstract class ExtensionLoader {
// cache, we want to only do it once. // cache, we want to only do it once.
await refreshServerHierarchicalMemory(this.config); await refreshServerHierarchicalMemory(this.config);
await this.config.getHookSystem()?.initialize(); await this.config.getHookSystem()?.initialize();
await this.config.getAgentRegistry().reload();
} }
} }