mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-30 15:04:16 -07:00
feat: implement AfterTool tail tool calls (#18486)
This commit is contained in:
@@ -76,12 +76,16 @@ export class HookEventHandler {
|
||||
toolName: string,
|
||||
toolInput: Record<string, unknown>,
|
||||
mcpContext?: McpToolContext,
|
||||
originalRequestName?: string,
|
||||
): Promise<AggregatedHookResult> {
|
||||
const input: BeforeToolInput = {
|
||||
...this.createBaseInput(HookEventName.BeforeTool),
|
||||
tool_name: toolName,
|
||||
tool_input: toolInput,
|
||||
...(mcpContext && { mcp_context: mcpContext }),
|
||||
...(originalRequestName && {
|
||||
original_request_name: originalRequestName,
|
||||
}),
|
||||
};
|
||||
|
||||
const context: HookEventContext = { toolName };
|
||||
@@ -97,6 +101,7 @@ export class HookEventHandler {
|
||||
toolInput: Record<string, unknown>,
|
||||
toolResponse: Record<string, unknown>,
|
||||
mcpContext?: McpToolContext,
|
||||
originalRequestName?: string,
|
||||
): Promise<AggregatedHookResult> {
|
||||
const input: AfterToolInput = {
|
||||
...this.createBaseInput(HookEventName.AfterTool),
|
||||
@@ -104,6 +109,9 @@ export class HookEventHandler {
|
||||
tool_input: toolInput,
|
||||
tool_response: toolResponse,
|
||||
...(mcpContext && { mcp_context: mcpContext }),
|
||||
...(originalRequestName && {
|
||||
original_request_name: originalRequestName,
|
||||
}),
|
||||
};
|
||||
|
||||
const context: HookEventContext = { toolName };
|
||||
|
||||
@@ -368,12 +368,14 @@ export class HookSystem {
|
||||
toolName: string,
|
||||
toolInput: Record<string, unknown>,
|
||||
mcpContext?: McpToolContext,
|
||||
originalRequestName?: string,
|
||||
): Promise<DefaultHookOutput | undefined> {
|
||||
try {
|
||||
const result = await this.hookEventHandler.fireBeforeToolEvent(
|
||||
toolName,
|
||||
toolInput,
|
||||
mcpContext,
|
||||
originalRequestName,
|
||||
);
|
||||
return result.finalOutput;
|
||||
} catch (error) {
|
||||
@@ -391,6 +393,7 @@ export class HookSystem {
|
||||
error: unknown;
|
||||
},
|
||||
mcpContext?: McpToolContext,
|
||||
originalRequestName?: string,
|
||||
): Promise<DefaultHookOutput | undefined> {
|
||||
try {
|
||||
const result = await this.hookEventHandler.fireAfterToolEvent(
|
||||
@@ -398,6 +401,7 @@ export class HookSystem {
|
||||
toolInput,
|
||||
toolResponse as Record<string, unknown>,
|
||||
mcpContext,
|
||||
originalRequestName,
|
||||
);
|
||||
return result.finalOutput;
|
||||
} catch (error) {
|
||||
|
||||
@@ -253,6 +253,33 @@ export class DefaultHookOutput implements HookOutput {
|
||||
shouldClearContext(): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Optional request to execute another tool immediately after this one.
|
||||
* The result of this tail call will replace the original tool's response.
|
||||
*/
|
||||
getTailToolCallRequest():
|
||||
| {
|
||||
name: string;
|
||||
args: Record<string, unknown>;
|
||||
}
|
||||
| undefined {
|
||||
if (
|
||||
this.hookSpecificOutput &&
|
||||
'tailToolCallRequest' in this.hookSpecificOutput
|
||||
) {
|
||||
const request = this.hookSpecificOutput['tailToolCallRequest'];
|
||||
if (
|
||||
typeof request === 'object' &&
|
||||
request !== null &&
|
||||
!Array.isArray(request)
|
||||
) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
||||
return request as { name: string; args: Record<string, unknown> };
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -430,6 +457,7 @@ export interface BeforeToolInput extends HookInput {
|
||||
tool_name: string;
|
||||
tool_input: Record<string, unknown>;
|
||||
mcp_context?: McpToolContext; // Only present for MCP tools
|
||||
original_request_name?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -450,6 +478,7 @@ export interface AfterToolInput extends HookInput {
|
||||
tool_input: Record<string, unknown>;
|
||||
tool_response: Record<string, unknown>;
|
||||
mcp_context?: McpToolContext; // Only present for MCP tools
|
||||
original_request_name?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -459,6 +488,14 @@ export interface AfterToolOutput extends HookOutput {
|
||||
hookSpecificOutput?: {
|
||||
hookEventName: 'AfterTool';
|
||||
additionalContext?: string;
|
||||
/**
|
||||
* Optional request to execute another tool immediately after this one.
|
||||
* The result of this tail call will replace the original tool's response.
|
||||
*/
|
||||
tailToolCallRequest?: {
|
||||
name: string;
|
||||
args: Record<string, unknown>;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user