summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/hooks/useGeminiStream.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/hooks/useGeminiStream.ts')
-rw-r--r--packages/cli/src/ui/hooks/useGeminiStream.ts88
1 files changed, 37 insertions, 51 deletions
diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts
index ddd7c185..3d24ede7 100644
--- a/packages/cli/src/ui/hooks/useGeminiStream.ts
+++ b/packages/cli/src/ui/hooks/useGeminiStream.ts
@@ -111,17 +111,21 @@ export const useGeminiStream = (
const [toolCalls, scheduleToolCalls, markToolsAsSubmitted] =
useReactToolScheduler(
- (completedToolCallsFromScheduler) => {
+ async (completedToolCallsFromScheduler) => {
// This onComplete is called when ALL scheduled tools for a given batch are done.
if (completedToolCallsFromScheduler.length > 0) {
// Add the final state of these tools to the history for display.
- // The new useEffect will handle submitting their responses.
addItem(
mapTrackedToolCallsToDisplay(
completedToolCallsFromScheduler as TrackedToolCall[],
),
Date.now(),
);
+
+ // Handle tool response submission immediately when tools complete
+ await handleCompletedTools(
+ completedToolCallsFromScheduler as TrackedToolCall[],
+ );
}
},
config,
@@ -570,40 +574,33 @@ export const useGeminiStream = (
],
);
- /**
- * Automatically submits responses for completed tool calls.
- * This effect runs when `toolCalls` or `isResponding` changes.
- * It ensures that tool responses are sent back to Gemini only when
- * all processing for a given set of tools is finished and Gemini
- * is not already generating a response.
- */
- useEffect(() => {
- const run = async () => {
+ const handleCompletedTools = useCallback(
+ async (completedToolCallsFromScheduler: TrackedToolCall[]) => {
if (isResponding) {
return;
}
- const completedAndReadyToSubmitTools = toolCalls.filter(
- (
- tc: TrackedToolCall,
- ): tc is TrackedCompletedToolCall | TrackedCancelledToolCall => {
- const isTerminalState =
- tc.status === 'success' ||
- tc.status === 'error' ||
- tc.status === 'cancelled';
+ const completedAndReadyToSubmitTools =
+ completedToolCallsFromScheduler.filter(
+ (
+ tc: TrackedToolCall,
+ ): tc is TrackedCompletedToolCall | TrackedCancelledToolCall => {
+ const isTerminalState =
+ tc.status === 'success' ||
+ tc.status === 'error' ||
+ tc.status === 'cancelled';
- if (isTerminalState) {
- const completedOrCancelledCall = tc as
- | TrackedCompletedToolCall
- | TrackedCancelledToolCall;
- return (
- !completedOrCancelledCall.responseSubmittedToGemini &&
- completedOrCancelledCall.response?.responseParts !== undefined
- );
- }
- return false;
- },
- );
+ if (isTerminalState) {
+ const completedOrCancelledCall = tc as
+ | TrackedCompletedToolCall
+ | TrackedCancelledToolCall;
+ return (
+ completedOrCancelledCall.response?.responseParts !== undefined
+ );
+ }
+ return false;
+ },
+ );
// Finalize any client-initiated tools as soon as they are done.
const clientTools = completedAndReadyToSubmitTools.filter(
@@ -630,15 +627,6 @@ export const useGeminiStream = (
);
}
- // Only proceed with submitting to Gemini if ALL tools are complete.
- const allToolsAreComplete =
- toolCalls.length > 0 &&
- toolCalls.length === completedAndReadyToSubmitTools.length;
-
- if (!allToolsAreComplete) {
- return;
- }
-
const geminiTools = completedAndReadyToSubmitTools.filter(
(t) => !t.request.isClientInitiated,
);
@@ -693,17 +681,15 @@ export const useGeminiStream = (
submitQuery(mergePartListUnions(responsesToSend), {
isContinuation: true,
});
- };
- void run();
- }, [
- toolCalls,
- isResponding,
- submitQuery,
- markToolsAsSubmitted,
- addItem,
- geminiClient,
- performMemoryRefresh,
- ]);
+ },
+ [
+ isResponding,
+ submitQuery,
+ markToolsAsSubmitted,
+ geminiClient,
+ performMemoryRefresh,
+ ],
+ );
const pendingHistoryItems = [
pendingHistoryItemRef.current,