feat(policy): support subagent-specific policies in TOML (#21431)

This commit is contained in:
AK
2026-03-09 12:22:46 -07:00
committed by GitHub
parent a17691f0fc
commit 527074b50a
10 changed files with 56 additions and 3 deletions
@@ -27,6 +27,7 @@ describe('agent-scheduler', () => {
mockMessageBus = {} as Mocked<MessageBus>;
mockToolRegistry = {
getTool: vi.fn(),
getMessageBus: vi.fn().mockReturnValue(mockMessageBus),
} as unknown as Mocked<ToolRegistry>;
mockConfig = {
getMessageBus: vi.fn().mockReturnValue(mockMessageBus),
+2 -1
View File
@@ -57,10 +57,11 @@ export async function scheduleAgentTools(
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const agentConfig: Config = Object.create(config);
agentConfig.getToolRegistry = () => toolRegistry;
agentConfig.getMessageBus = () => toolRegistry.getMessageBus();
const scheduler = new Scheduler({
config: agentConfig,
messageBus: config.getMessageBus(),
messageBus: toolRegistry.getMessageBus(),
getPreferredEditor: getPreferredEditor ?? (() => undefined),
schedulerId,
parentCallId,
+19 -1
View File
@@ -19,6 +19,7 @@ import { ToolRegistry } from '../tools/tool-registry.js';
import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
import { CompressionStatus } from '../core/turn.js';
import { type ToolCallRequestInfo } from '../scheduler/types.js';
import { type Message } from '../confirmation-bus/types.js';
import { ChatCompressionService } from '../services/chatCompressionService.js';
import { getDirectoryContextString } from '../utils/environmentContext.js';
import { promptIdContext } from '../utils/promptIdContext.js';
@@ -113,10 +114,27 @@ export class LocalAgentExecutor<TOutput extends z.ZodTypeAny> {
runtimeContext: Config,
onActivity?: ActivityCallback,
): Promise<LocalAgentExecutor<TOutput>> {
const parentMessageBus = runtimeContext.getMessageBus();
// Create an override object to inject the subagent name into tool confirmation requests
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
const subagentMessageBus = Object.create(
parentMessageBus,
) as typeof parentMessageBus;
subagentMessageBus.publish = async (message: Message) => {
if (message.type === 'tool-confirmation-request') {
return parentMessageBus.publish({
...message,
subagent: definition.name,
});
}
return parentMessageBus.publish(message);
};
// Create an isolated tool registry for this agent instance.
const agentToolRegistry = new ToolRegistry(
runtimeContext,
runtimeContext.getMessageBus(),
subagentMessageBus,
);
const parentToolRegistry = runtimeContext.getToolRegistry();
const allAgentNames = new Set(