mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-07-12 19:10:55 -07:00
Disallow Object.create() and reflect. (#22408)
This commit is contained in:
committed by
GitHub
parent
b5f6417574
commit
e3fdc290d0
@@ -262,4 +262,90 @@ describe('MessageBus', () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('derive', () => {
|
||||
it('should receive responses from parent bus on derived bus', async () => {
|
||||
vi.spyOn(policyEngine, 'check').mockResolvedValue({
|
||||
decision: PolicyDecision.ASK_USER,
|
||||
});
|
||||
|
||||
const subagentName = 'test-subagent';
|
||||
const subagentBus = messageBus.derive(subagentName);
|
||||
|
||||
const request: Omit<ToolConfirmationRequest, 'correlationId'> = {
|
||||
type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
|
||||
toolCall: { name: 'test-tool', args: {} },
|
||||
};
|
||||
|
||||
const requestPromise = subagentBus.request<
|
||||
ToolConfirmationRequest,
|
||||
ToolConfirmationResponse
|
||||
>(request, MessageBusType.TOOL_CONFIRMATION_RESPONSE, 2000);
|
||||
|
||||
// Wait for request on root bus and respond
|
||||
await new Promise<void>((resolve) => {
|
||||
messageBus.subscribe<ToolConfirmationRequest>(
|
||||
MessageBusType.TOOL_CONFIRMATION_REQUEST,
|
||||
(msg) => {
|
||||
if (msg.subagent === subagentName) {
|
||||
void messageBus.publish({
|
||||
type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
|
||||
correlationId: msg.correlationId,
|
||||
confirmed: true,
|
||||
});
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
await expect(requestPromise).resolves.toEqual(
|
||||
expect.objectContaining({
|
||||
type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
|
||||
confirmed: true,
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
it('should correctly chain subagent names for nested subagents', async () => {
|
||||
vi.spyOn(policyEngine, 'check').mockResolvedValue({
|
||||
decision: PolicyDecision.ASK_USER,
|
||||
});
|
||||
|
||||
const subagentBus1 = messageBus.derive('agent1');
|
||||
const subagentBus2 = subagentBus1.derive('agent2');
|
||||
|
||||
const request: Omit<ToolConfirmationRequest, 'correlationId'> = {
|
||||
type: MessageBusType.TOOL_CONFIRMATION_REQUEST,
|
||||
toolCall: { name: 'test-tool', args: {} },
|
||||
};
|
||||
|
||||
const requestPromise = subagentBus2.request<
|
||||
ToolConfirmationRequest,
|
||||
ToolConfirmationResponse
|
||||
>(request, MessageBusType.TOOL_CONFIRMATION_RESPONSE, 2000);
|
||||
|
||||
await new Promise<void>((resolve) => {
|
||||
messageBus.subscribe<ToolConfirmationRequest>(
|
||||
MessageBusType.TOOL_CONFIRMATION_REQUEST,
|
||||
(msg) => {
|
||||
if (msg.subagent === 'agent1/agent2') {
|
||||
void messageBus.publish({
|
||||
type: MessageBusType.TOOL_CONFIRMATION_RESPONSE,
|
||||
correlationId: msg.correlationId,
|
||||
confirmed: true,
|
||||
});
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
await expect(requestPromise).resolves.toEqual(
|
||||
expect.objectContaining({
|
||||
confirmed: true,
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -40,6 +40,37 @@ export class MessageBus extends EventEmitter {
|
||||
this.emit(message.type, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Derives a child message bus scoped to a specific subagent.
|
||||
*/
|
||||
derive(subagentName: string): MessageBus {
|
||||
const bus = new MessageBus(this.policyEngine, this.debug);
|
||||
|
||||
bus.publish = async (message: Message) => {
|
||||
if (message.type === MessageBusType.TOOL_CONFIRMATION_REQUEST) {
|
||||
return this.publish({
|
||||
...message,
|
||||
subagent: message.subagent
|
||||
? `${subagentName}/${message.subagent}`
|
||||
: subagentName,
|
||||
});
|
||||
}
|
||||
return this.publish(message);
|
||||
};
|
||||
|
||||
// Delegate subscription methods to the parent bus
|
||||
bus.subscribe = this.subscribe.bind(this);
|
||||
bus.unsubscribe = this.unsubscribe.bind(this);
|
||||
bus.on = this.on.bind(this);
|
||||
bus.off = this.off.bind(this);
|
||||
bus.emit = this.emit.bind(this);
|
||||
bus.once = this.once.bind(this);
|
||||
bus.removeListener = this.removeListener.bind(this);
|
||||
bus.listenerCount = this.listenerCount.bind(this);
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
||||
async publish(message: Message): Promise<void> {
|
||||
if (this.debug) {
|
||||
debugLogger.debug(`[MESSAGE_BUS] publish: ${safeJsonStringify(message)}`);
|
||||
|
||||
Reference in New Issue
Block a user