mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-11 14:40:52 -07:00
fix(cli): support legacy onConfirm callback in ToolActionsContext (#19369)
This commit is contained in:
@@ -15,6 +15,7 @@ import {
|
|||||||
MessageBusType,
|
MessageBusType,
|
||||||
IdeClient,
|
IdeClient,
|
||||||
CoreToolCallStatus,
|
CoreToolCallStatus,
|
||||||
|
type SerializableConfirmationDetails,
|
||||||
} from '@google/gemini-cli-core';
|
} from '@google/gemini-cli-core';
|
||||||
import { type IndividualToolCallDisplay } from '../types.js';
|
import { type IndividualToolCallDisplay } from '../types.js';
|
||||||
|
|
||||||
@@ -182,4 +183,44 @@ describe('ToolActionsContext', () => {
|
|||||||
|
|
||||||
expect(result.current.isDiffingEnabled).toBe(false);
|
expect(result.current.isDiffingEnabled).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('calls local onConfirm for tools without correlationId', async () => {
|
||||||
|
const mockOnConfirm = vi.fn().mockResolvedValue(undefined);
|
||||||
|
const legacyTool: IndividualToolCallDisplay = {
|
||||||
|
callId: 'legacy-call',
|
||||||
|
name: 'legacy-tool',
|
||||||
|
description: 'desc',
|
||||||
|
status: CoreToolCallStatus.AwaitingApproval,
|
||||||
|
resultDisplay: undefined,
|
||||||
|
confirmationDetails: {
|
||||||
|
type: 'exec',
|
||||||
|
title: 'exec',
|
||||||
|
command: 'ls',
|
||||||
|
rootCommand: 'ls',
|
||||||
|
rootCommands: ['ls'],
|
||||||
|
onConfirm: mockOnConfirm,
|
||||||
|
} as unknown as SerializableConfirmationDetails,
|
||||||
|
};
|
||||||
|
|
||||||
|
const { result } = renderHook(() => useToolActions(), {
|
||||||
|
wrapper: ({ children }) => (
|
||||||
|
<ToolActionsProvider config={mockConfig} toolCalls={[legacyTool]}>
|
||||||
|
{children}
|
||||||
|
</ToolActionsProvider>
|
||||||
|
),
|
||||||
|
});
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await result.current.confirm(
|
||||||
|
'legacy-call',
|
||||||
|
ToolConfirmationOutcome.ProceedOnce,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(mockOnConfirm).toHaveBeenCalledWith(
|
||||||
|
ToolConfirmationOutcome.ProceedOnce,
|
||||||
|
undefined,
|
||||||
|
);
|
||||||
|
expect(mockMessageBus.publish).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,10 +18,28 @@ import {
|
|||||||
MessageBusType,
|
MessageBusType,
|
||||||
type Config,
|
type Config,
|
||||||
type ToolConfirmationPayload,
|
type ToolConfirmationPayload,
|
||||||
|
type SerializableConfirmationDetails,
|
||||||
debugLogger,
|
debugLogger,
|
||||||
} from '@google/gemini-cli-core';
|
} from '@google/gemini-cli-core';
|
||||||
import type { IndividualToolCallDisplay } from '../types.js';
|
import type { IndividualToolCallDisplay } from '../types.js';
|
||||||
|
|
||||||
|
type LegacyConfirmationDetails = SerializableConfirmationDetails & {
|
||||||
|
onConfirm: (
|
||||||
|
outcome: ToolConfirmationOutcome,
|
||||||
|
payload?: ToolConfirmationPayload,
|
||||||
|
) => Promise<void>;
|
||||||
|
};
|
||||||
|
|
||||||
|
function hasLegacyCallback(
|
||||||
|
details: SerializableConfirmationDetails | undefined,
|
||||||
|
): details is LegacyConfirmationDetails {
|
||||||
|
return (
|
||||||
|
!!details &&
|
||||||
|
'onConfirm' in details &&
|
||||||
|
typeof details.onConfirm === 'function'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
interface ToolActionsContextValue {
|
interface ToolActionsContextValue {
|
||||||
confirm: (
|
confirm: (
|
||||||
callId: string,
|
callId: string,
|
||||||
@@ -125,7 +143,15 @@ export const ToolActionsProvider: React.FC<ToolActionsProviderProps> = (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
debugLogger.warn(`ToolActions: No correlationId for ${callId}`);
|
// 3. Fallback: Legacy Callback
|
||||||
|
if (hasLegacyCallback(details)) {
|
||||||
|
await details.onConfirm(outcome, payload);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
debugLogger.warn(
|
||||||
|
`ToolActions: No correlationId or callback for ${callId}`,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
[config, ideClient, toolCalls, isDiffingEnabled],
|
[config, ideClient, toolCalls, isDiffingEnabled],
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user