mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-04-27 05:24:34 -07:00
refactor(core): adopt CoreToolCallStatus enum for type safety (#18998)
This commit is contained in:
@@ -27,6 +27,7 @@ import type {
|
||||
AnyToolInvocation,
|
||||
} from '@google/gemini-cli-core';
|
||||
import {
|
||||
CoreToolCallStatus,
|
||||
ApprovalMode,
|
||||
AuthType,
|
||||
GeminiEventType as ServerGeminiEventType,
|
||||
@@ -343,14 +344,14 @@ describe('useGeminiStream', () => {
|
||||
mockCancelAllToolCalls(...args);
|
||||
lastToolCalls = lastToolCalls.map((tc) => {
|
||||
if (
|
||||
tc.status === 'awaiting_approval' ||
|
||||
tc.status === 'executing' ||
|
||||
tc.status === 'scheduled' ||
|
||||
tc.status === 'validating'
|
||||
tc.status === CoreToolCallStatus.AwaitingApproval ||
|
||||
tc.status === CoreToolCallStatus.Executing ||
|
||||
tc.status === CoreToolCallStatus.Scheduled ||
|
||||
tc.status === CoreToolCallStatus.Validating
|
||||
) {
|
||||
return {
|
||||
...tc,
|
||||
status: 'cancelled',
|
||||
status: CoreToolCallStatus.Cancelled,
|
||||
response: {
|
||||
callId: tc.request.callId,
|
||||
responseParts: [],
|
||||
@@ -406,7 +407,8 @@ describe('useGeminiStream', () => {
|
||||
toolName: string,
|
||||
callId: string,
|
||||
confirmationType: 'edit' | 'info',
|
||||
status: TrackedToolCall['status'] = 'awaiting_approval',
|
||||
status: TrackedToolCall['status'] = CoreToolCallStatus.AwaitingApproval,
|
||||
mockOnConfirm: Mock = vi.fn(),
|
||||
): TrackedWaitingToolCall => ({
|
||||
request: {
|
||||
callId,
|
||||
@@ -415,7 +417,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
status: status as 'awaiting_approval',
|
||||
status: status as CoreToolCallStatus.AwaitingApproval,
|
||||
responseSubmittedToGemini: false,
|
||||
confirmationDetails:
|
||||
confirmationType === 'edit'
|
||||
@@ -427,11 +429,13 @@ describe('useGeminiStream', () => {
|
||||
fileDiff: 'fake diff',
|
||||
originalContent: 'old',
|
||||
newContent: 'new',
|
||||
onConfirm: mockOnConfirm,
|
||||
}
|
||||
: {
|
||||
type: 'info',
|
||||
title: `${toolName} confirmation`,
|
||||
prompt: `Execute ${toolName}?`,
|
||||
onConfirm: mockOnConfirm,
|
||||
},
|
||||
tool: {
|
||||
name: toolName,
|
||||
@@ -500,7 +504,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
status: 'success',
|
||||
status: CoreToolCallStatus.Success,
|
||||
responseSubmittedToGemini: false,
|
||||
response: {
|
||||
callId: 'call1',
|
||||
@@ -528,7 +532,7 @@ describe('useGeminiStream', () => {
|
||||
args: {},
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
status: 'executing',
|
||||
status: CoreToolCallStatus.Executing,
|
||||
responseSubmittedToGemini: false,
|
||||
tool: {
|
||||
name: 'tool2',
|
||||
@@ -566,7 +570,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-2',
|
||||
},
|
||||
status: 'success',
|
||||
status: CoreToolCallStatus.Success,
|
||||
responseSubmittedToGemini: false,
|
||||
response: {
|
||||
callId: 'call1',
|
||||
@@ -588,7 +592,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-2',
|
||||
},
|
||||
status: 'error',
|
||||
status: CoreToolCallStatus.Error,
|
||||
responseSubmittedToGemini: false,
|
||||
response: {
|
||||
callId: 'call2',
|
||||
@@ -675,10 +679,10 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-3',
|
||||
},
|
||||
status: 'cancelled',
|
||||
status: CoreToolCallStatus.Cancelled,
|
||||
response: {
|
||||
callId: '1',
|
||||
responseParts: [{ text: 'cancelled' }],
|
||||
responseParts: [{ text: CoreToolCallStatus.Cancelled }],
|
||||
errorType: undefined, // FIX: Added missing property
|
||||
},
|
||||
responseSubmittedToGemini: false,
|
||||
@@ -744,7 +748,7 @@ describe('useGeminiStream', () => {
|
||||
expect(mockMarkToolsAsSubmitted).toHaveBeenCalledWith(['1']);
|
||||
expect(client.addHistory).toHaveBeenCalledWith({
|
||||
role: 'user',
|
||||
parts: [{ text: 'cancelled' }],
|
||||
parts: [{ text: CoreToolCallStatus.Cancelled }],
|
||||
});
|
||||
// Ensure we do NOT call back to the API
|
||||
expect(mockSendMessageStream).not.toHaveBeenCalled();
|
||||
@@ -761,7 +765,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-stop',
|
||||
},
|
||||
status: 'error',
|
||||
status: CoreToolCallStatus.Error,
|
||||
response: {
|
||||
callId: 'stop-call',
|
||||
responseParts: [{ text: 'error occurred' }],
|
||||
@@ -825,7 +829,7 @@ describe('useGeminiStream', () => {
|
||||
invocation: {
|
||||
getDescription: () => `Mock description`,
|
||||
} as unknown as AnyToolInvocation,
|
||||
status: 'cancelled',
|
||||
status: CoreToolCallStatus.Cancelled,
|
||||
response: {
|
||||
callId: 'cancel-1',
|
||||
responseParts: [
|
||||
@@ -854,7 +858,7 @@ describe('useGeminiStream', () => {
|
||||
invocation: {
|
||||
getDescription: () => `Mock description`,
|
||||
} as unknown as AnyToolInvocation,
|
||||
status: 'cancelled',
|
||||
status: CoreToolCallStatus.Cancelled,
|
||||
response: {
|
||||
callId: 'cancel-2',
|
||||
responseParts: [
|
||||
@@ -954,7 +958,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-4',
|
||||
},
|
||||
status: 'executing',
|
||||
status: CoreToolCallStatus.Executing,
|
||||
responseSubmittedToGemini: false,
|
||||
tool: {
|
||||
name: 'tool1',
|
||||
@@ -972,7 +976,7 @@ describe('useGeminiStream', () => {
|
||||
const completedToolCalls: TrackedToolCall[] = [
|
||||
{
|
||||
...(initialToolCalls[0] as TrackedExecutingToolCall),
|
||||
status: 'success',
|
||||
status: CoreToolCallStatus.Success,
|
||||
response: {
|
||||
callId: 'call1',
|
||||
responseParts: toolCallResponseParts,
|
||||
@@ -1278,7 +1282,7 @@ describe('useGeminiStream', () => {
|
||||
const toolCalls: TrackedToolCall[] = [
|
||||
{
|
||||
request: { callId: 'call1', name: 'tool1', args: {} },
|
||||
status: 'executing',
|
||||
status: CoreToolCallStatus.Executing,
|
||||
responseSubmittedToGemini: false,
|
||||
tool: {
|
||||
name: 'tool1',
|
||||
@@ -1318,7 +1322,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
status: 'awaiting_approval',
|
||||
status: CoreToolCallStatus.AwaitingApproval,
|
||||
responseSubmittedToGemini: false,
|
||||
tool: {
|
||||
name: 'some_tool',
|
||||
@@ -1630,7 +1634,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: true,
|
||||
prompt_id: 'prompt-id-6',
|
||||
},
|
||||
status: 'success',
|
||||
status: CoreToolCallStatus.Success,
|
||||
responseSubmittedToGemini: false,
|
||||
response: {
|
||||
callId: 'save-mem-call-1',
|
||||
@@ -1875,7 +1879,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
status: 'awaiting_approval',
|
||||
status: CoreToolCallStatus.AwaitingApproval,
|
||||
responseSubmittedToGemini: false,
|
||||
// No confirmationDetails
|
||||
tool: {
|
||||
@@ -1900,8 +1904,15 @@ describe('useGeminiStream', () => {
|
||||
});
|
||||
|
||||
it('should only process tool calls with awaiting_approval status', async () => {
|
||||
const mockOnConfirmAwaiting = vi.fn().mockResolvedValue(undefined);
|
||||
const mixedStatusToolCalls: TrackedToolCall[] = [
|
||||
createMockToolCall('replace', 'call1', 'edit'),
|
||||
createMockToolCall(
|
||||
'replace',
|
||||
'call1',
|
||||
'edit',
|
||||
CoreToolCallStatus.AwaitingApproval,
|
||||
mockOnConfirmAwaiting,
|
||||
),
|
||||
{
|
||||
request: {
|
||||
callId: 'call2',
|
||||
@@ -1910,7 +1921,7 @@ describe('useGeminiStream', () => {
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
status: 'executing',
|
||||
status: CoreToolCallStatus.Executing,
|
||||
responseSubmittedToGemini: false,
|
||||
tool: {
|
||||
name: 'write_file',
|
||||
@@ -2206,7 +2217,7 @@ describe('useGeminiStream', () => {
|
||||
// were added to history during the await scheduleToolCalls(...) block.
|
||||
const tools = requests.map((r: any) => ({
|
||||
request: r,
|
||||
status: 'success',
|
||||
status: CoreToolCallStatus.Success,
|
||||
tool: { displayName: r.name, name: r.name },
|
||||
invocation: { getDescription: () => 'desc' },
|
||||
response: { responseParts: [], resultDisplay: 'done' },
|
||||
@@ -2681,7 +2692,7 @@ describe('useGeminiStream', () => {
|
||||
const newToolCalls: TrackedToolCall[] = [
|
||||
{
|
||||
request: { callId: 'call1', name: 'tool1', args: {} },
|
||||
status: 'executing',
|
||||
status: CoreToolCallStatus.Executing,
|
||||
tool: {
|
||||
name: 'tool1',
|
||||
displayName: 'tool1',
|
||||
@@ -2809,7 +2820,7 @@ describe('useGeminiStream', () => {
|
||||
await waitFor(() => {
|
||||
expect(mockAddItem).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
type: 'error',
|
||||
type: CoreToolCallStatus.Error,
|
||||
}),
|
||||
expect.any(Number),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user