Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions packages/cli/src/config/extension-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import {
coreEvents,
applyAdminAllowlist,
getAdminBlockedMcpServersMessage,
CoreToolCallStatus,
} from '@google/gemini-cli-core';
import { maybeRequestConsentOrFail } from './extensions/consent.js';
import { resolveEnvVarsInObject } from '../utils/envVarResolver.js';
Expand Down Expand Up @@ -383,7 +384,7 @@ Would you like to attempt to install via "git clone" instead?`,
newExtensionConfig.version,
previousExtensionConfig.version,
installMetadata.type,
'success',
CoreToolCallStatus.Success,
),
);
} else {
Expand All @@ -395,7 +396,7 @@ Would you like to attempt to install via "git clone" instead?`,
getExtensionId(newExtensionConfig, installMetadata),
newExtensionConfig.version,
installMetadata.type,
'success',
CoreToolCallStatus.Success,
),
);
await this.enableExtension(
Expand Down Expand Up @@ -433,7 +434,7 @@ Would you like to attempt to install via "git clone" instead?`,
newExtensionConfig?.version ?? '',
previousExtensionConfig.version,
installMetadata.type,
'error',
CoreToolCallStatus.Error,
),
);
} else {
Expand All @@ -445,7 +446,7 @@ Would you like to attempt to install via "git clone" instead?`,
extensionId ?? '',
newExtensionConfig?.version ?? '',
installMetadata.type,
'error',
CoreToolCallStatus.Error,
),
);
}
Expand Down Expand Up @@ -491,7 +492,7 @@ Would you like to attempt to install via "git clone" instead?`,
extension.name,
hashValue(extension.name),
extension.id,
'success',
CoreToolCallStatus.Success,
),
);
}
Expand Down
37 changes: 19 additions & 18 deletions packages/cli/src/ui/hooks/toolMapping.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
type ExecutingToolCall,
type WaitingToolCall,
type CancelledToolCall,
CoreToolCallStatus,
} from '@google/gemini-cli-core';
import { ToolCallStatus } from '../types.js';

Expand All @@ -28,13 +29,13 @@ describe('toolMapping', () => {

describe('mapCoreStatusToDisplayStatus', () => {
it.each([
['validating', ToolCallStatus.Pending],
['awaiting_approval', ToolCallStatus.Confirming],
['executing', ToolCallStatus.Executing],
['success', ToolCallStatus.Success],
['cancelled', ToolCallStatus.Canceled],
['error', ToolCallStatus.Error],
['scheduled', ToolCallStatus.Pending],
[CoreToolCallStatus.Validating, ToolCallStatus.Pending],
[CoreToolCallStatus.AwaitingApproval, ToolCallStatus.Confirming],
[CoreToolCallStatus.Executing, ToolCallStatus.Executing],
[CoreToolCallStatus.Success, ToolCallStatus.Success],
[CoreToolCallStatus.Cancelled, ToolCallStatus.Canceled],
[CoreToolCallStatus.Error, ToolCallStatus.Error],
[CoreToolCallStatus.Scheduled, ToolCallStatus.Pending],
] as const)('maps %s to %s', (coreStatus, expectedDisplayStatus) => {
expect(mapCoreStatusToDisplayStatus(coreStatus)).toBe(
expectedDisplayStatus,
Expand Down Expand Up @@ -77,7 +78,7 @@ describe('toolMapping', () => {

it('handles a single tool call input', () => {
const toolCall: ScheduledToolCall = {
status: 'scheduled',
status: CoreToolCallStatus.Scheduled,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -91,13 +92,13 @@ describe('toolMapping', () => {

it('handles an array of tool calls', () => {
const toolCall1: ScheduledToolCall = {
status: 'scheduled',
status: CoreToolCallStatus.Scheduled,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
};
const toolCall2: ScheduledToolCall = {
status: 'scheduled',
status: CoreToolCallStatus.Scheduled,
request: { ...mockRequest, callId: 'call-2' },
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -111,7 +112,7 @@ describe('toolMapping', () => {

it('maps successful tool call properties correctly', () => {
const toolCall: SuccessfulToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand Down Expand Up @@ -139,7 +140,7 @@ describe('toolMapping', () => {

it('maps executing tool call properties correctly with live output and ptyId', () => {
const toolCall: ExecutingToolCall = {
status: 'executing',
status: CoreToolCallStatus.Executing,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -166,7 +167,7 @@ describe('toolMapping', () => {
};

const toolCall: WaitingToolCall = {
status: 'awaiting_approval',
status: CoreToolCallStatus.AwaitingApproval,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -193,7 +194,7 @@ describe('toolMapping', () => {
};

const toolCall: WaitingToolCall = {
status: 'awaiting_approval',
status: CoreToolCallStatus.AwaitingApproval,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -211,7 +212,7 @@ describe('toolMapping', () => {
it('maps error tool call missing tool definition', () => {
// e.g. "TOOL_NOT_REGISTERED" errors
const toolCall: ToolCall = {
status: 'error',
status: CoreToolCallStatus.Error,
request: mockRequest, // name: 'test_tool'
response: { ...mockResponse, resultDisplay: 'Tool not found' },
// notice: no `tool` or `invocation` defined here
Expand All @@ -229,7 +230,7 @@ describe('toolMapping', () => {

it('maps cancelled tool call properties correctly', () => {
const toolCall: CancelledToolCall = {
status: 'cancelled',
status: CoreToolCallStatus.Cancelled,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -248,7 +249,7 @@ describe('toolMapping', () => {

it('propagates borderTop and borderBottom options correctly', () => {
const toolCall: ScheduledToolCall = {
status: 'scheduled',
status: CoreToolCallStatus.Scheduled,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand All @@ -264,7 +265,7 @@ describe('toolMapping', () => {

it('sets resultDisplay to undefined for pre-execution statuses', () => {
const toolCall: ScheduledToolCall = {
status: 'scheduled',
status: CoreToolCallStatus.Scheduled,
request: mockRequest,
tool: mockTool,
invocation: mockInvocation,
Expand Down
34 changes: 17 additions & 17 deletions packages/cli/src/ui/hooks/toolMapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,32 @@ import {
type SerializableConfirmationDetails,
type ToolResultDisplay,
debugLogger,
CoreToolCallStatus,
checkExhaustive,
} from '@google/gemini-cli-core';
import {
ToolCallStatus,
type HistoryItemToolGroup,
type IndividualToolCallDisplay,
} from '../types.js';

import { checkExhaustive } from '@google/gemini-cli-core';

export function mapCoreStatusToDisplayStatus(
coreStatus: CoreStatus,
): ToolCallStatus {
switch (coreStatus) {
case 'validating':
case CoreToolCallStatus.Validating:
return ToolCallStatus.Pending;
case 'awaiting_approval':
case CoreToolCallStatus.AwaitingApproval:
return ToolCallStatus.Confirming;
case 'executing':
case CoreToolCallStatus.Executing:
return ToolCallStatus.Executing;
case 'success':
case CoreToolCallStatus.Success:
return ToolCallStatus.Success;
case 'cancelled':
case CoreToolCallStatus.Cancelled:
return ToolCallStatus.Canceled;
case 'error':
case CoreToolCallStatus.Error:
return ToolCallStatus.Error;
case 'scheduled':
case CoreToolCallStatus.Scheduled:
return ToolCallStatus.Pending;
default:
return checkExhaustive(coreStatus);
Expand All @@ -60,7 +60,7 @@ export function mapToDisplay(

const displayName = call.tool?.displayName ?? call.request.name;

if (call.status === 'error') {
if (call.status === CoreToolCallStatus.Error) {
description = JSON.stringify(call.request.args);
} else {
description = call.invocation.getDescription();
Expand All @@ -82,25 +82,25 @@ export function mapToDisplay(
let correlationId: string | undefined = undefined;

switch (call.status) {
case 'success':
case CoreToolCallStatus.Success:
resultDisplay = call.response.resultDisplay;
outputFile = call.response.outputFile;
break;
case 'error':
case 'cancelled':
case CoreToolCallStatus.Error:
case CoreToolCallStatus.Cancelled:
resultDisplay = call.response.resultDisplay;
break;
case 'awaiting_approval':
case CoreToolCallStatus.AwaitingApproval:
correlationId = call.correlationId;
// Pass through details. Context handles dispatch (callback vs bus).
confirmationDetails = call.confirmationDetails;
break;
case 'executing':
case CoreToolCallStatus.Executing:
resultDisplay = call.liveOutput;
ptyId = call.pid;
break;
case 'scheduled':
case 'validating':
case CoreToolCallStatus.Scheduled:
case CoreToolCallStatus.Validating:
break;
default: {
const exhaustiveCheck: never = call;
Expand Down
Loading
Loading