in packages/core/src/core/coreToolScheduler.ts [244:382]
private setStatusInternal(
targetCallId: string,
status: 'success',
response: ToolCallResponseInfo,
): void;
private setStatusInternal(
targetCallId: string,
status: 'awaiting_approval',
confirmationDetails: ToolCallConfirmationDetails,
): void;
private setStatusInternal(
targetCallId: string,
status: 'error',
response: ToolCallResponseInfo,
): void;
private setStatusInternal(
targetCallId: string,
status: 'cancelled',
reason: string,
): void;
private setStatusInternal(
targetCallId: string,
status: 'executing' | 'scheduled' | 'validating',
): void;
private setStatusInternal(
targetCallId: string,
newStatus: Status,
auxiliaryData?: unknown,
): void {
this.toolCalls = this.toolCalls.map((currentCall) => {
if (
currentCall.request.callId !== targetCallId ||
currentCall.status === 'success' ||
currentCall.status === 'error' ||
currentCall.status === 'cancelled'
) {
return currentCall;
}
// currentCall is a non-terminal state here and should have startTime and tool.
const existingStartTime = currentCall.startTime;
const toolInstance = currentCall.tool;
const outcome = currentCall.outcome;
switch (newStatus) {
case 'success': {
const durationMs = existingStartTime
? Date.now() - existingStartTime
: undefined;
return {
request: currentCall.request,
tool: toolInstance,
status: 'success',
response: auxiliaryData as ToolCallResponseInfo,
durationMs,
outcome,
} as SuccessfulToolCall;
}
case 'error': {
const durationMs = existingStartTime
? Date.now() - existingStartTime
: undefined;
return {
request: currentCall.request,
status: 'error',
response: auxiliaryData as ToolCallResponseInfo,
durationMs,
outcome,
} as ErroredToolCall;
}
case 'awaiting_approval':
return {
request: currentCall.request,
tool: toolInstance,
status: 'awaiting_approval',
confirmationDetails: auxiliaryData as ToolCallConfirmationDetails,
startTime: existingStartTime,
outcome,
} as WaitingToolCall;
case 'scheduled':
return {
request: currentCall.request,
tool: toolInstance,
status: 'scheduled',
startTime: existingStartTime,
outcome,
} as ScheduledToolCall;
case 'cancelled': {
const durationMs = existingStartTime
? Date.now() - existingStartTime
: undefined;
return {
request: currentCall.request,
tool: toolInstance,
status: 'cancelled',
response: {
callId: currentCall.request.callId,
responseParts: {
functionResponse: {
id: currentCall.request.callId,
name: currentCall.request.name,
response: {
error: `[Operation Cancelled] Reason: ${auxiliaryData}`,
},
},
},
resultDisplay: undefined,
error: undefined,
},
durationMs,
outcome,
} as CancelledToolCall;
}
case 'validating':
return {
request: currentCall.request,
tool: toolInstance,
status: 'validating',
startTime: existingStartTime,
outcome,
} as ValidatingToolCall;
case 'executing':
return {
request: currentCall.request,
tool: toolInstance,
status: 'executing',
startTime: existingStartTime,
outcome,
} as ExecutingToolCall;
default: {
const exhaustiveCheck: never = newStatus;
return exhaustiveCheck;
}
}
});
this.notifyToolCallsUpdate();
this.checkAndNotifyCompletion();
}