From 678c58634b208b78e0be3bfa99142c650abb024e Mon Sep 17 00:00:00 2001 From: joshualitt Date: Thu, 22 Jan 2026 16:22:22 -0800 Subject: [PATCH] feat(core): Refresh agents after loading an extension. (#17355) --- packages/core/src/utils/extensionLoader.test.ts | 11 +++++++++++ packages/core/src/utils/extensionLoader.ts | 1 + 2 files changed, 12 insertions(+) diff --git a/packages/core/src/utils/extensionLoader.test.ts b/packages/core/src/utils/extensionLoader.test.ts index 4ec6f3641b..351dc19067 100644 --- a/packages/core/src/utils/extensionLoader.test.ts +++ b/packages/core/src/utils/extensionLoader.test.ts @@ -36,6 +36,7 @@ describe('SimpleExtensionLoader', () => { typeof GeminiClient.prototype.setTools >; let mockHookSystemInit: MockInstance; + let mockAgentRegistryReload: MockInstance; const activeExtension: GeminiCLIExtension = { name: 'test-extension', @@ -63,6 +64,7 @@ describe('SimpleExtensionLoader', () => { extensionReloadingEnabled = false; mockGeminiClientSetTools = vi.fn(); mockHookSystemInit = vi.fn(); + mockAgentRegistryReload = vi.fn(); mockConfig = { getMcpClientManager: () => mockMcpClientManager, getEnableExtensionReloading: () => extensionReloadingEnabled, @@ -73,6 +75,9 @@ describe('SimpleExtensionLoader', () => { getHookSystem: () => ({ initialize: mockHookSystemInit, }), + getAgentRegistry: () => ({ + reload: mockAgentRegistryReload, + }), } as unknown as Config; }); @@ -132,15 +137,18 @@ describe('SimpleExtensionLoader', () => { expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).toHaveBeenCalledOnce(); + expect(mockAgentRegistryReload).toHaveBeenCalledOnce(); } else { expect(mockMcpClientManager.startExtension).not.toHaveBeenCalled(); expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled(); expect(mockHookSystemInit).not.toHaveBeenCalled(); expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce(); + expect(mockAgentRegistryReload).not.toHaveBeenCalled(); } mockRefreshServerHierarchicalMemory.mockClear(); mockHookSystemInit.mockClear(); mockGeminiClientSetTools.mockClear(); + mockAgentRegistryReload.mockClear(); await loader.unloadExtension(activeExtension); if (reloadingEnabled) { @@ -150,11 +158,13 @@ describe('SimpleExtensionLoader', () => { expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce(); expect(mockGeminiClientSetTools).toHaveBeenCalledOnce(); + expect(mockAgentRegistryReload).toHaveBeenCalledOnce(); } else { expect(mockMcpClientManager.stopExtension).not.toHaveBeenCalled(); expect(mockRefreshServerHierarchicalMemory).not.toHaveBeenCalled(); expect(mockHookSystemInit).not.toHaveBeenCalled(); expect(mockGeminiClientSetTools).not.toHaveBeenCalledOnce(); + expect(mockAgentRegistryReload).not.toHaveBeenCalled(); } }); @@ -175,6 +185,7 @@ describe('SimpleExtensionLoader', () => { ]); expect(mockRefreshServerHierarchicalMemory).toHaveBeenCalledOnce(); expect(mockHookSystemInit).toHaveBeenCalledOnce(); + expect(mockAgentRegistryReload).toHaveBeenCalledOnce(); }, ); }, diff --git a/packages/core/src/utils/extensionLoader.ts b/packages/core/src/utils/extensionLoader.ts index 45ad37bfcc..61091ed405 100644 --- a/packages/core/src/utils/extensionLoader.ts +++ b/packages/core/src/utils/extensionLoader.ts @@ -112,6 +112,7 @@ export abstract class ExtensionLoader { // cache, we want to only do it once. await refreshServerHierarchicalMemory(this.config); await this.config.getHookSystem()?.initialize(); + await this.config.getAgentRegistry().reload(); } }