refactor: implement DelegateToAgentTool with discriminated union (#14769)

This commit is contained in:
Abhi
2025-12-10 16:14:13 -05:00
committed by GitHub
parent d4506e0fc0
commit 91b15fc9dc
12 changed files with 544 additions and 45 deletions
+19 -15
View File
@@ -138,8 +138,12 @@ vi.mock('../agents/registry.js', () => {
return { AgentRegistry: AgentRegistryMock };
});
vi.mock('../agents/subagent-tool-wrapper.js', () => ({
SubagentToolWrapper: vi.fn(),
vi.mock('../agents/delegate-to-agent-tool.js', () => ({
DelegateToAgentTool: vi.fn(),
}));
vi.mock('../resources/resource-registry.js', () => ({
ResourceRegistry: vi.fn(),
}));
const mockCoreEvents = vi.hoisted(() => ({
@@ -842,11 +846,11 @@ describe('Server Config (config.ts)', () => {
mockAgentDefinition,
);
const SubagentToolWrapperMock = (
(await vi.importMock('../agents/subagent-tool-wrapper.js')) as {
SubagentToolWrapper: Mock;
const DelegateToAgentToolMock = (
(await vi.importMock('../agents/delegate-to-agent-tool.js')) as {
DelegateToAgentTool: Mock;
}
).SubagentToolWrapper;
).DelegateToAgentTool;
await config.initialize();
@@ -856,16 +860,16 @@ describe('Server Config (config.ts)', () => {
}
).ToolRegistry.prototype.registerTool;
expect(SubagentToolWrapperMock).toHaveBeenCalledTimes(1);
expect(SubagentToolWrapperMock).toHaveBeenCalledWith(
mockAgentDefinition,
expect(DelegateToAgentToolMock).toHaveBeenCalledTimes(1);
expect(DelegateToAgentToolMock).toHaveBeenCalledWith(
expect.anything(), // AgentRegistry
config,
undefined,
);
const calls = registerToolMock.mock.calls;
const registeredWrappers = calls.filter(
(call) => call[0] instanceof SubagentToolWrapperMock,
(call) => call[0] instanceof DelegateToAgentToolMock,
);
expect(registeredWrappers).toHaveLength(1);
});
@@ -877,15 +881,15 @@ describe('Server Config (config.ts)', () => {
};
const config = new Config(params);
const SubagentToolWrapperMock = (
(await vi.importMock('../agents/subagent-tool-wrapper.js')) as {
SubagentToolWrapper: Mock;
const DelegateToAgentToolMock = (
(await vi.importMock('../agents/delegate-to-agent-tool.js')) as {
DelegateToAgentTool: Mock;
}
).SubagentToolWrapper;
).DelegateToAgentTool;
await config.initialize();
expect(SubagentToolWrapperMock).not.toHaveBeenCalled();
expect(DelegateToAgentToolMock).not.toHaveBeenCalled();
});
it('should not set default codebase investigator model in config (defaults in registry)', () => {
+19 -20
View File
@@ -84,7 +84,8 @@ import { getCodeAssistServer } from '../code_assist/codeAssist.js';
import type { Experiments } from '../code_assist/experiments/experiments.js';
import { AgentRegistry } from '../agents/registry.js';
import { setGlobalProxy } from '../utils/fetch.js';
import { SubagentToolWrapper } from '../agents/subagent-tool-wrapper.js';
import { DelegateToAgentTool } from '../agents/delegate-to-agent-tool.js';
import { DELEGATE_TO_AGENT_TOOL_NAME } from '../tools/tool-names.js';
import { getExperiments } from '../code_assist/experiments/experiments.js';
import { ExperimentFlags } from '../code_assist/experiments/flagNames.js';
import { debugLogger } from '../utils/debugLogger.js';
@@ -1571,26 +1572,24 @@ export class Config {
}
// Register Subagents as Tools
if (this.getCodebaseInvestigatorSettings().enabled) {
const definition = this.agentRegistry.getDefinition(
'codebase_investigator',
);
if (definition) {
// We must respect the main allowed/exclude lists for agents too.
const allowedTools = this.getAllowedTools();
// Register DelegateToAgentTool if agents are enabled
if (
this.isAgentsEnabled() ||
this.getCodebaseInvestigatorSettings().enabled
) {
// Check if the delegate tool itself is allowed (if allowedTools is set)
const allowedTools = this.getAllowedTools();
const isAllowed =
!allowedTools || allowedTools.includes(DELEGATE_TO_AGENT_TOOL_NAME);
const isAllowed =
!allowedTools || allowedTools.includes(definition.name);
if (isAllowed) {
const messageBusEnabled = this.getEnableMessageBusIntegration();
const wrapper = new SubagentToolWrapper(
definition,
this,
messageBusEnabled ? this.getMessageBus() : undefined,
);
registry.registerTool(wrapper);
}
if (isAllowed) {
const messageBusEnabled = this.getEnableMessageBusIntegration();
const delegateTool = new DelegateToAgentTool(
this.agentRegistry,
this,
messageBusEnabled ? this.getMessageBus() : undefined,
);
registry.registerTool(delegateTool);
}
}