refactor(core): adopt CoreToolCallStatus enum for type safety (#18998)

This commit is contained in:
Jerop Kipruto
2026-02-13 11:27:20 -05:00
committed by GitHub
parent d0c6a56c65
commit 60be42f095
22 changed files with 631 additions and 431 deletions
@@ -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),
);