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
@@ -17,6 +17,7 @@ import {
type ToolCallRequestInfo,
type ToolCallResponseInfo,
} from '../scheduler/types.js';
import { CoreToolCallStatus } from '../scheduler/types.js';
import { MockTool } from '../test-utils/mock-tool.js';
describe('Circular Reference Handling', () => {
@@ -62,7 +63,7 @@ describe('Circular Reference Handling', () => {
const tool = new MockTool({ name: 'mock-tool' });
const mockCompletedToolCall: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: mockRequest,
response: mockResponse,
tool,
@@ -112,7 +113,7 @@ describe('Circular Reference Handling', () => {
const tool = new MockTool({ name: 'mock-tool' });
const mockCompletedToolCall: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: mockRequest,
response: mockResponse,
tool,
+14 -13
View File
@@ -12,6 +12,7 @@ import type {
ErroredToolCall,
} from '../index.js';
import {
CoreToolCallStatus,
AuthType,
EditTool,
GeminiClient,
@@ -1070,7 +1071,7 @@ describe('loggers', () => {
it('should log a tool call with all fields', () => {
const tool = new EditTool(mockConfig, createMockMessageBus());
const call: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: {
name: 'test-function',
args: {
@@ -1188,7 +1189,7 @@ describe('loggers', () => {
it('should merge data from response into metadata', () => {
const call: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: {
name: 'ask_user',
args: { questions: [] },
@@ -1234,7 +1235,7 @@ describe('loggers', () => {
it('should log a tool call with a reject decision', () => {
const call: ErroredToolCall = {
status: 'error',
status: CoreToolCallStatus.Error,
request: {
name: 'test-function',
args: {
@@ -1312,7 +1313,7 @@ describe('loggers', () => {
it('should log a tool call with a modify decision', () => {
const call: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: {
name: 'test-function',
args: {
@@ -1392,7 +1393,7 @@ describe('loggers', () => {
it('should log a tool call without a decision', () => {
const call: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: {
name: 'test-function',
args: {
@@ -1472,7 +1473,7 @@ describe('loggers', () => {
it('should log a failed tool call with an error', () => {
const errorMessage = 'test-error';
const call: ErroredToolCall = {
status: 'error',
status: CoreToolCallStatus.Error,
request: {
name: 'test-function',
args: {
@@ -1573,7 +1574,7 @@ describe('loggers', () => {
);
const call: CompletedToolCall = {
status: 'success',
status: CoreToolCallStatus.Success,
request: {
name: 'mock_mcp_tool',
args: { arg1: 'value1', arg2: 2 },
@@ -1890,7 +1891,7 @@ describe('loggers', () => {
'testing-id',
'0.1.0',
'git',
'success',
CoreToolCallStatus.Success,
);
await logExtensionInstallEvent(mockConfig, event);
@@ -1911,7 +1912,7 @@ describe('loggers', () => {
extension_name: 'testing',
extension_version: '0.1.0',
extension_source: 'git',
status: 'success',
status: CoreToolCallStatus.Success,
},
});
});
@@ -1943,7 +1944,7 @@ describe('loggers', () => {
'0.1.0',
'0.1.1',
'git',
'success',
CoreToolCallStatus.Success,
);
await logExtensionUpdateEvent(mockConfig, event);
@@ -1965,7 +1966,7 @@ describe('loggers', () => {
extension_version: '0.1.0',
extension_previous_version: '0.1.1',
extension_source: 'git',
status: 'success',
status: CoreToolCallStatus.Success,
},
});
});
@@ -1993,7 +1994,7 @@ describe('loggers', () => {
'testing',
'testing-hash',
'testing-id',
'success',
CoreToolCallStatus.Success,
);
await logExtensionUninstall(mockConfig, event);
@@ -2012,7 +2013,7 @@ describe('loggers', () => {
'event.timestamp': '2025-01-01T00:00:00.000Z',
interactive: false,
extension_name: 'testing',
status: 'success',
status: CoreToolCallStatus.Success,
},
});
});
+16 -15
View File
@@ -14,6 +14,7 @@ import type { Config } from '../config/config.js';
import type { ApprovalMode } from '../policy/types.js';
import type { CompletedToolCall } from '../core/coreToolScheduler.js';
import { CoreToolCallStatus } from '../scheduler/types.js';
import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
import { AuthType } from '../core/contentGenerator.js';
import type { LogAttributes, LogRecord } from '@opentelemetry/api-logs';
@@ -271,7 +272,7 @@ export class ToolCallEvent implements BaseTelemetryEvent {
this.function_name = call.request.name;
this.function_args = call.request.args;
this.duration_ms = call.durationMs ?? 0;
this.success = call.status === 'success';
this.success = call.status === CoreToolCallStatus.Success;
this.decision = call.outcome
? getDecisionFromOutcome(call.outcome)
: undefined;
@@ -296,7 +297,7 @@ export class ToolCallEvent implements BaseTelemetryEvent {
);
if (
call.status === 'success' &&
call.status === CoreToolCallStatus.Success &&
typeof call.response.resultDisplay === 'object' &&
call.response.resultDisplay !== null &&
fileDiff
@@ -317,7 +318,7 @@ export class ToolCallEvent implements BaseTelemetryEvent {
}
}
if (call.status === 'success' && call.response.data) {
if (call.status === CoreToolCallStatus.Success && call.response.data) {
this.metadata = { ...this.metadata, ...call.response.data };
}
} else {
@@ -352,7 +353,7 @@ export class ToolCallEvent implements BaseTelemetryEvent {
};
if (this.error) {
attributes['error'] = this.error;
attributes[CoreToolCallStatus.Error] = this.error;
attributes['error.message'] = this.error;
if (this.error_type) {
attributes['error_type'] = this.error_type;
@@ -891,8 +892,8 @@ export function makeSlashCommandEvent({
}
export enum SlashCommandStatus {
SUCCESS = 'success',
ERROR = 'error',
SUCCESS = CoreToolCallStatus.Success,
ERROR = CoreToolCallStatus.Error,
}
export const EVENT_REWIND = 'gemini_cli.rewind';
@@ -1294,7 +1295,7 @@ export class ExtensionInstallEvent implements BaseTelemetryEvent {
extension_id: string;
extension_version: string;
extension_source: string;
status: 'success' | 'error';
status: CoreToolCallStatus.Success | CoreToolCallStatus.Error;
constructor(
extension_name: string,
@@ -1302,7 +1303,7 @@ export class ExtensionInstallEvent implements BaseTelemetryEvent {
extension_id: string,
extension_version: string,
extension_source: string,
status: 'success' | 'error',
status: CoreToolCallStatus.Success | CoreToolCallStatus.Error,
) {
this['event.name'] = 'extension_install';
this['event.timestamp'] = new Date().toISOString();
@@ -1428,13 +1429,13 @@ export class ExtensionUninstallEvent implements BaseTelemetryEvent {
extension_name: string;
hashed_extension_name: string;
extension_id: string;
status: 'success' | 'error';
status: CoreToolCallStatus.Success | CoreToolCallStatus.Error;
constructor(
extension_name: string,
hashed_extension_name: string,
extension_id: string,
status: 'success' | 'error',
status: CoreToolCallStatus.Success | CoreToolCallStatus.Error,
) {
this['event.name'] = 'extension_uninstall';
this['event.timestamp'] = new Date().toISOString();
@@ -1469,7 +1470,7 @@ export class ExtensionUpdateEvent implements BaseTelemetryEvent {
extension_previous_version: string;
extension_version: string;
extension_source: string;
status: 'success' | 'error';
status: CoreToolCallStatus.Success | CoreToolCallStatus.Error;
constructor(
extension_name: string,
@@ -1478,7 +1479,7 @@ export class ExtensionUpdateEvent implements BaseTelemetryEvent {
extension_version: string,
extension_previous_version: string,
extension_source: string,
status: 'success' | 'error',
status: CoreToolCallStatus.Success | CoreToolCallStatus.Error,
) {
this['event.name'] = 'extension_update';
this['event.timestamp'] = new Date().toISOString();
@@ -1721,9 +1722,9 @@ export const EVENT_EDIT_CORRECTION = 'gemini_cli.edit_correction';
export class EditCorrectionEvent implements BaseTelemetryEvent {
'event.name': 'edit_correction';
'event.timestamp': string;
correction: 'success' | 'failure';
correction: CoreToolCallStatus.Success | 'failure';
constructor(correction: 'success' | 'failure') {
constructor(correction: CoreToolCallStatus.Success | 'failure') {
this['event.name'] = 'edit_correction';
this['event.timestamp'] = new Date().toISOString();
this.correction = correction;
@@ -2098,7 +2099,7 @@ export class HookCallEvent implements BaseTelemetryEvent {
if (this.error) {
// Always log errors
attributes['error'] = this.error;
attributes[CoreToolCallStatus.Error] = this.error;
}
return attributes;