@machina.ai/cell-cli 1.64.0-rc3 → 1.66.0-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/package.json +4 -4
- package/dist/src/acp/acpSession.js +9 -13
- package/dist/src/acp/acpSession.js.map +1 -1
- package/dist/src/acp/acpSession.test.js +88 -0
- package/dist/src/acp/acpSession.test.js.map +1 -1
- package/dist/src/commands/mcp/add.js +14 -6
- package/dist/src/commands/mcp/add.js.map +1 -1
- package/dist/src/commands/mcp/add.test.js +61 -0
- package/dist/src/commands/mcp/add.test.js.map +1 -1
- package/dist/src/commands/mcp/remove.js +14 -1
- package/dist/src/commands/mcp/remove.js.map +1 -1
- package/dist/src/commands/mcp/remove.test.js +63 -0
- package/dist/src/commands/mcp/remove.test.js.map +1 -1
- package/dist/src/config/config.js +5 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +1 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/envDefaults.d.ts +20 -0
- package/dist/src/config/envDefaults.js +29 -0
- package/dist/src/config/envDefaults.js.map +1 -0
- package/dist/src/config/envDefaults.test.d.ts +6 -0
- package/dist/src/config/envDefaults.test.js +23 -0
- package/dist/src/config/envDefaults.test.js.map +1 -0
- package/dist/src/config/extension-manager.js +13 -4
- package/dist/src/config/extension-manager.js.map +1 -1
- package/dist/src/config/extension.test.js +117 -0
- package/dist/src/config/extension.test.js.map +1 -1
- package/dist/src/config/extensions/github.test.js +34 -0
- package/dist/src/config/extensions/github.test.js.map +1 -1
- package/dist/src/config/extensions/github_fetch.js +110 -18
- package/dist/src/config/extensions/github_fetch.js.map +1 -1
- package/dist/src/config/extensions/github_fetch.test.js +251 -36
- package/dist/src/config/extensions/github_fetch.test.js.map +1 -1
- package/dist/src/config/settings.d.ts +1 -0
- package/dist/src/config/settings.js +148 -58
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +300 -0
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +1 -1
- package/dist/src/config/settingsSchema.js +6 -1
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/gemini.test.js +69 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/interactiveCli.js +8 -3
- package/dist/src/interactiveCli.js.map +1 -1
- package/dist/src/services/CommandService.js +1 -1
- package/dist/src/services/CommandService.js.map +1 -1
- package/dist/src/services/CommandService.test.js +18 -1
- package/dist/src/services/CommandService.test.js.map +1 -1
- package/dist/src/services/SlashCommandConflictHandler.d.ts +1 -0
- package/dist/src/services/SlashCommandConflictHandler.js +18 -2
- package/dist/src/services/SlashCommandConflictHandler.js.map +1 -1
- package/dist/src/services/SlashCommandConflictHandler.test.js +85 -8
- package/dist/src/services/SlashCommandConflictHandler.test.js.map +1 -1
- package/dist/src/ui/AppContainer.js +254 -12
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +362 -6
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.js +21 -5
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +83 -0
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/useAuth.js +7 -1
- package/dist/src/ui/auth/useAuth.js.map +1 -1
- package/dist/src/ui/auth/useAuth.test.js +9 -0
- package/dist/src/ui/auth/useAuth.test.js.map +1 -1
- package/dist/src/ui/commands/marketplaceCommand.js +92 -4
- package/dist/src/ui/commands/marketplaceCommand.js.map +1 -1
- package/dist/src/ui/commands/marketplaceCommand.test.js +98 -1
- package/dist/src/ui/commands/marketplaceCommand.test.js.map +1 -1
- package/dist/src/ui/components/AsciiArt.d.ts +6 -6
- package/dist/src/ui/components/AsciiArt.js +6 -6
- package/dist/src/ui/components/CliSpinner.d.ts +3 -2
- package/dist/src/ui/components/CliSpinner.js +27 -3
- package/dist/src/ui/components/CliSpinner.js.map +1 -1
- package/dist/src/ui/components/CliSpinner.test.js +42 -3
- package/dist/src/ui/components/CliSpinner.test.js.map +1 -1
- package/dist/src/ui/components/Composer.js +3 -3
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +39 -1
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js +5 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.test.js +19 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +1 -1
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.js +9 -2
- package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
- package/dist/src/ui/components/GeminiSpinner.d.ts +1 -1
- package/dist/src/ui/components/GeminiSpinner.js +18 -7
- package/dist/src/ui/components/GeminiSpinner.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +5 -2
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +21 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.d.ts +1 -1
- package/dist/src/ui/components/LoadingIndicator.js +4 -2
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +47 -9
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/MainContent.test.js +87 -1
- package/dist/src/ui/components/MainContent.test.js.map +1 -1
- package/dist/src/ui/components/MemoryUsageDisplay.js +8 -4
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +11 -5
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +18 -14
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/StatusRow.d.ts +7 -6
- package/dist/src/ui/components/StatusRow.js +24 -10
- package/dist/src/ui/components/StatusRow.js.map +1 -1
- package/dist/src/ui/components/ValidationDialog.js +13 -6
- package/dist/src/ui/components/ValidationDialog.js.map +1 -1
- package/dist/src/ui/components/ValidationDialog.test.js +40 -0
- package/dist/src/ui/components/ValidationDialog.test.js.map +1 -1
- package/dist/src/ui/components/messages/DenseToolMessage.js +17 -12
- package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/DenseToolMessage.test.js +71 -0
- package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.js +14 -11
- package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js +32 -0
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.js +8 -2
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +23 -1
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
- package/dist/src/ui/contexts/ToolActionsContext.js +7 -1
- package/dist/src/ui/contexts/ToolActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/ToolActionsContext.test.js +54 -1
- package/dist/src/ui/contexts/ToolActionsContext.test.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.d.ts +2 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +15 -15
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAgentStream.d.ts +9 -2
- package/dist/src/ui/hooks/useAgentStream.js +173 -8
- package/dist/src/ui/hooks/useAgentStream.js.map +1 -1
- package/dist/src/ui/hooks/useAgentStream.test.js +104 -1
- package/dist/src/ui/hooks/useAgentStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +174 -59
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +230 -3
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +3 -3
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +23 -4
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.js +10 -6
- package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +49 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
- package/dist/src/ui/key/keyBindings.js +19 -6
- package/dist/src/ui/key/keyBindings.js.map +1 -1
- package/dist/src/ui/key/keyBindings.test.js +106 -0
- package/dist/src/ui/key/keyBindings.test.js.map +1 -1
- package/dist/src/ui/utils/formatters.d.ts +2 -0
- package/dist/src/ui/utils/formatters.js +13 -5
- package/dist/src/ui/utils/formatters.js.map +1 -1
- package/dist/src/ui/utils/formatters.test.js +18 -0
- package/dist/src/ui/utils/formatters.test.js.map +1 -1
- package/dist/src/utils/activityLogger.js +109 -33
- package/dist/src/utils/activityLogger.js.map +1 -1
- package/dist/src/utils/activityLogger.test.js +441 -0
- package/dist/src/utils/activityLogger.test.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.d.ts +4 -1
- package/dist/src/utils/handleAutoUpdate.js +45 -3
- package/dist/src/utils/handleAutoUpdate.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.test.js +280 -2
- package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
- package/dist/src/utils/nodeVersion.d.ts +11 -0
- package/dist/src/utils/nodeVersion.js +42 -0
- package/dist/src/utils/nodeVersion.js.map +1 -0
- package/dist/src/utils/nodeVersion.test.d.ts +6 -0
- package/dist/src/utils/nodeVersion.test.js +35 -0
- package/dist/src/utils/nodeVersion.test.js.map +1 -0
- package/dist/src/utils/processUtils.d.ts +23 -0
- package/dist/src/utils/processUtils.js +72 -0
- package/dist/src/utils/processUtils.js.map +1 -1
- package/dist/src/utils/processUtils.test.js +95 -1
- package/dist/src/utils/processUtils.test.js.map +1 -1
- package/dist/src/utils/relaunch.js +8 -6
- package/dist/src/utils/relaunch.js.map +1 -1
- package/dist/src/utils/relaunch.test.js +107 -1
- package/dist/src/utils/relaunch.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgentStream.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useAgentStream.test.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,gBAAgB;AAEhB,MAAM,uBAAuB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC/D,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;IAC5C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAC5C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,MAAM,cAAc,EAA2B,CAAC;IAC/D,OAAO;QACL,GAAG,MAAM;QACT,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;SACxB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,oBAAoB;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAgentStream.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useAgentStream.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ export declare const useGeminiStream: (geminiClient: GeminiClient, history: Hist
|
|
|
23
23
|
initError: string | null;
|
|
24
24
|
pendingHistoryItems: HistoryItemWithoutId[];
|
|
25
25
|
thought: ThoughtSummary | null;
|
|
26
|
-
cancelOngoingRequest: (clearBuffer?: boolean) => void
|
|
26
|
+
cancelOngoingRequest: (clearBuffer?: boolean) => Promise<void>;
|
|
27
27
|
pendingToolCalls: TrackedToolCall[];
|
|
28
28
|
handleApprovalModeChange: (newApprovalMode: ApprovalMode) => Promise<void>;
|
|
29
29
|
activePtyId: number | undefined;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
7
|
-
import { GeminiEventType as ServerGeminiEventType, getErrorMessage, isNodeError, isAuthenticationError, MessageSenderType, logUserPrompt, GitService, UserPromptEvent, uiTelemetryService, DEFAULT_GEMINI_FLASH_MODEL, logConversationFinishedEvent, ConversationFinishedEvent, ApprovalMode, parseAndFormatApiError, ToolConfirmationOutcome, MessageBusType, promptIdContext, tokenLimit, debugLogger, runInDevTraceSpan, EDIT_TOOL_NAMES, SHELL_TOOL_NAME, hasRedirection, processRestorableToolCalls, recordToolCallInteractions, ToolErrorType, ValidationRequiredError, coreEvents, CoreEvent, CoreToolCallStatus, buildUserSteeringHintPrompt, GeminiCliOperation, getPlanModeExitMessage, isBackgroundExecutionData,
|
|
7
|
+
import { GeminiEventType as ServerGeminiEventType, getErrorMessage, isNodeError, isAuthenticationError, MessageSenderType, logUserPrompt, GitService, UserPromptEvent, uiTelemetryService, DEFAULT_GEMINI_FLASH_MODEL, logConversationFinishedEvent, ConversationFinishedEvent, ApprovalMode, parseAndFormatApiError, ToolConfirmationOutcome, MessageBusType, promptIdContext, tokenLimit, debugLogger, runInDevTraceSpan, EDIT_TOOL_NAMES, SHELL_TOOL_NAME, hasRedirection, processRestorableToolCalls, recordToolCallInteractions, ToolErrorType, ValidationRequiredError, coreEvents, CoreEvent, CoreToolCallStatus, buildUserSteeringHintPrompt, GeminiCliOperation, getPlanModeExitMessage, isBackgroundExecutionData, ACTIVATE_SKILL_TOOL_NAME, isRenderedInHistory, buildToolVisibilityContext, UPDATE_TOPIC_TOOL_NAME, UPDATE_TOPIC_DISPLAY_NAME, THINKING_ONLY_COMPRESS_SUGGESTION, MAX_TOKENS_EXCEEDED_SUGGESTION, SAFETY_BLOCKED_MESSAGE, RECITATION_BLOCKED_MESSAGE, OTHER_BLOCKED_MESSAGE, TRUE_EMPTY_RESPONSE_MESSAGE, } from '@google/gemini-cli-core';
|
|
8
8
|
import { FinishReason } from '@google/genai';
|
|
9
9
|
import { StreamingState, MessageType, mapCoreStatusToDisplayStatus, ToolCallStatus, } from '../types.js';
|
|
10
10
|
import { isAtCommand, isSlashCommand } from '../utils/commandUtils.js';
|
|
@@ -24,6 +24,7 @@ import { promises as fs } from 'node:fs';
|
|
|
24
24
|
import path from 'node:path';
|
|
25
25
|
import { useSessionStats } from '../contexts/SessionContext.js';
|
|
26
26
|
import { useKeypress } from './useKeypress.js';
|
|
27
|
+
import { createCancelledToolCall } from './useAgentStream.js';
|
|
27
28
|
const isTopicTool = (name) => name === UPDATE_TOPIC_TOOL_NAME || name === UPDATE_TOPIC_DISPLAY_NAME;
|
|
28
29
|
var StreamProcessingStatus;
|
|
29
30
|
(function (StreamProcessingStatus) {
|
|
@@ -31,6 +32,11 @@ var StreamProcessingStatus;
|
|
|
31
32
|
StreamProcessingStatus[StreamProcessingStatus["UserCancelled"] = 1] = "UserCancelled";
|
|
32
33
|
StreamProcessingStatus[StreamProcessingStatus["Error"] = 2] = "Error";
|
|
33
34
|
})(StreamProcessingStatus || (StreamProcessingStatus = {}));
|
|
35
|
+
var CancellationState;
|
|
36
|
+
(function (CancellationState) {
|
|
37
|
+
CancellationState["Idle"] = "idle";
|
|
38
|
+
CancellationState["Cancelling"] = "cancelling";
|
|
39
|
+
})(CancellationState || (CancellationState = {}));
|
|
34
40
|
const SUPPRESSED_TOOL_ERRORS_NOTE = 'Some internal tool attempts failed before this final error. Press F12 for diagnostics, or run /settings and change "Error Verbosity" to full for details.';
|
|
35
41
|
const LOW_VERBOSITY_FAILURE_NOTE = 'This request failed. Press F12 for diagnostics, or run /settings and change "Error Verbosity" to full for full details.';
|
|
36
42
|
function getBackgroundedToolInfo(toolCall) {
|
|
@@ -101,6 +107,10 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
101
107
|
const lowVerbosityFailureNoteShownRef = useRef(false);
|
|
102
108
|
const abortControllerRef = useRef(null);
|
|
103
109
|
const turnCancelledRef = useRef(false);
|
|
110
|
+
const pendingToolCallRequestsRef = useRef([]);
|
|
111
|
+
const activeSchedulePromiseRef = useRef(null);
|
|
112
|
+
const cancellationStateRef = useRef(CancellationState.Idle);
|
|
113
|
+
const cancelPromiseRef = useRef(Promise.resolve());
|
|
104
114
|
const activeQueryIdRef = useRef(null);
|
|
105
115
|
const previousApprovalModeRef = useRef(config.getApprovalMode());
|
|
106
116
|
const [isResponding, isRespondingRef, setIsResponding] = useStateAndRef(false);
|
|
@@ -131,6 +141,7 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
131
141
|
}, [isRespondingRef]);
|
|
132
142
|
const [toolCalls, scheduleToolCalls, markToolsAsSubmitted, setToolCallsForDisplay, cancelAllToolCalls, lastToolOutputTime,] = useToolScheduler(async (completedToolCallsFromScheduler) => {
|
|
133
143
|
// This onComplete is called when ALL scheduled tools for a given batch are done.
|
|
144
|
+
pendingToolCallRequestsRef.current = [];
|
|
134
145
|
if (completedToolCallsFromScheduler.length > 0) {
|
|
135
146
|
// Add only the tools that haven't been pushed to history yet.
|
|
136
147
|
const toolsToPush = completedToolCallsFromScheduler.filter((tc) => !pushedToolCallIdsRef.current.has(tc.request.callId));
|
|
@@ -160,13 +171,23 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
160
171
|
setToolCallsForDisplay([]);
|
|
161
172
|
// Record tool calls with full metadata before sending responses.
|
|
162
173
|
try {
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
174
|
+
const client = geminiClient ?? config.getGeminiClient();
|
|
175
|
+
const currentModel = client?.getCurrentSequenceModel?.() ?? config.getModel();
|
|
176
|
+
const normalizedCompletedCalls = completedToolCallsFromScheduler.map((tc) => {
|
|
177
|
+
if (tc.status === CoreToolCallStatus.Cancelled &&
|
|
178
|
+
(!tc.response?.responseParts ||
|
|
179
|
+
tc.response.responseParts.length === 0)) {
|
|
180
|
+
return {
|
|
181
|
+
...tc,
|
|
182
|
+
response: createCancelledToolCall(tc.request, tc.tool, tc.invocation).response,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return tc;
|
|
186
|
+
});
|
|
187
|
+
client
|
|
188
|
+
?.getChat?.()
|
|
189
|
+
?.recordCompletedToolCalls(currentModel, normalizedCompletedCalls);
|
|
190
|
+
await recordToolCallInteractions(config, normalizedCompletedCalls);
|
|
170
191
|
}
|
|
171
192
|
catch (error) {
|
|
172
193
|
debugLogger.warn(`Error recording completed tool call information: ${error}`);
|
|
@@ -209,44 +230,20 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
209
230
|
]);
|
|
210
231
|
// Push completed tools to history as they finish
|
|
211
232
|
useEffect(() => {
|
|
233
|
+
const isFinished = (tc) => tc.status === 'success' ||
|
|
234
|
+
tc.status === 'error' ||
|
|
235
|
+
tc.status === 'cancelled';
|
|
212
236
|
const toolsToPush = [];
|
|
213
|
-
for (
|
|
214
|
-
const tc = toolCalls[i];
|
|
237
|
+
for (const tc of toolCalls) {
|
|
215
238
|
if (pushedToolCallIdsRef.current.has(tc.request.callId))
|
|
216
239
|
continue;
|
|
217
|
-
if (tc
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
// refactored to emit structured `ToolBatch` or `Turn` objects, and this layer
|
|
225
|
-
// should simply render those semantic boundaries.
|
|
226
|
-
// If this is an agent tool, look ahead to ensure all subsequent
|
|
227
|
-
// contiguous agents in the same batch are also finished before pushing.
|
|
228
|
-
const isAgent = tc.tool?.kind === Kind.Agent;
|
|
229
|
-
if (isAgent) {
|
|
230
|
-
let contigAgentsComplete = true;
|
|
231
|
-
for (let j = i + 1; j < toolCalls.length; j++) {
|
|
232
|
-
const nextTc = toolCalls[j];
|
|
233
|
-
if (nextTc.tool?.kind === Kind.Agent) {
|
|
234
|
-
if (nextTc.status !== 'success' &&
|
|
235
|
-
nextTc.status !== 'error' &&
|
|
236
|
-
nextTc.status !== 'cancelled') {
|
|
237
|
-
contigAgentsComplete = false;
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
// End of the contiguous agent block
|
|
243
|
-
break;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
if (!contigAgentsComplete) {
|
|
247
|
-
// Wait for the entire contiguous block of agents to finish
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
240
|
+
if (isFinished(tc)) {
|
|
241
|
+
// Calls that share a group ID are presented together, so wait until
|
|
242
|
+
// every call in the group has finished before pushing any of them.
|
|
243
|
+
const { groupId } = tc.request;
|
|
244
|
+
if (groupId !== undefined &&
|
|
245
|
+
toolCalls.some((other) => other.request.groupId === groupId && !isFinished(other))) {
|
|
246
|
+
break;
|
|
250
247
|
}
|
|
251
248
|
toolsToPush.push(tc);
|
|
252
249
|
}
|
|
@@ -260,22 +257,18 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
260
257
|
const isFirstInThisPush = isFirstToolInGroupRef.current;
|
|
261
258
|
const isCompactModeEnabled = settings.merged.ui?.compactToolOutput === true;
|
|
262
259
|
const groups = [];
|
|
263
|
-
let
|
|
260
|
+
let currentGroupId;
|
|
264
261
|
for (const tc of toolsToPush) {
|
|
265
262
|
newPushed.add(tc.request.callId);
|
|
266
|
-
|
|
267
|
-
|
|
263
|
+
// Calls that share a group ID are adjacent and go into one history item.
|
|
264
|
+
const { groupId } = tc.request;
|
|
265
|
+
if (groupId !== undefined && groupId === currentGroupId) {
|
|
266
|
+
groups[groups.length - 1].push(tc);
|
|
268
267
|
}
|
|
269
268
|
else {
|
|
270
|
-
if (currentGroup.length > 0) {
|
|
271
|
-
groups.push(currentGroup);
|
|
272
|
-
currentGroup = [];
|
|
273
|
-
}
|
|
274
269
|
groups.push([tc]);
|
|
275
270
|
}
|
|
276
|
-
|
|
277
|
-
if (currentGroup.length > 0) {
|
|
278
|
-
groups.push(currentGroup);
|
|
271
|
+
currentGroupId = groupId;
|
|
279
272
|
}
|
|
280
273
|
for (let i = 0; i < groups.length; i++) {
|
|
281
274
|
const group = groups[i];
|
|
@@ -480,17 +473,27 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
480
473
|
}, userMessageTimestamp);
|
|
481
474
|
lowVerbosityFailureNoteShownRef.current = true;
|
|
482
475
|
}, [addItem, config, isLowErrorVerbosity]);
|
|
483
|
-
const cancelOngoingRequest = useCallback((clearBuffer = true) => {
|
|
476
|
+
const cancelOngoingRequest = useCallback(async (clearBuffer = true) => {
|
|
484
477
|
// If we are already cancelled, do nothing
|
|
485
478
|
if (turnCancelledRef.current) {
|
|
486
479
|
if (clearBuffer) {
|
|
487
480
|
onCancelSubmit(false, true);
|
|
488
481
|
}
|
|
482
|
+
if (cancellationStateRef.current === CancellationState.Cancelling) {
|
|
483
|
+
try {
|
|
484
|
+
await cancelPromiseRef.current;
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
debugLogger.warn(`Error awaiting schedulePromise on cancel: ${error}`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
489
490
|
return;
|
|
490
491
|
}
|
|
491
|
-
const hasActiveTools =
|
|
492
|
-
tc.status === CoreToolCallStatus.
|
|
493
|
-
|
|
492
|
+
const hasActiveTools = pendingToolCallRequestsRef.current.length > 0 ||
|
|
493
|
+
toolCalls.some((tc) => tc.status === CoreToolCallStatus.Executing ||
|
|
494
|
+
tc.status === CoreToolCallStatus.Scheduled ||
|
|
495
|
+
tc.status === CoreToolCallStatus.Validating ||
|
|
496
|
+
tc.status === CoreToolCallStatus.AwaitingApproval);
|
|
494
497
|
// If we are not responding, not waiting for confirmation, and have no active tools,
|
|
495
498
|
// there is nothing to abort.
|
|
496
499
|
if (streamingState === StreamingState.Idle &&
|
|
@@ -517,6 +520,76 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
517
520
|
abortControllerRef.current.abort();
|
|
518
521
|
// 2. Call the imperative cancel to clear the queue of pending tools.
|
|
519
522
|
cancelAllToolCalls(abortControllerRef.current.signal);
|
|
523
|
+
// 3. Immediately synthesize and record filler/cancelled functionResponses in
|
|
524
|
+
// session history so that even if the process exits or a tool hangs, the
|
|
525
|
+
// session log does not end with an unanswered model functionCall turn.
|
|
526
|
+
try {
|
|
527
|
+
const client = geminiClient ?? config.getGeminiClient?.();
|
|
528
|
+
const chat = client?.getChat?.();
|
|
529
|
+
if (chat) {
|
|
530
|
+
const seenCallIds = new Set();
|
|
531
|
+
const synthesizedCalls = [];
|
|
532
|
+
for (const tc of toolCalls) {
|
|
533
|
+
if (tc.request.isClientInitiated) {
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
const isAlreadySubmitted = (tc.status === CoreToolCallStatus.Success ||
|
|
537
|
+
tc.status === CoreToolCallStatus.Error ||
|
|
538
|
+
tc.status === CoreToolCallStatus.Cancelled) &&
|
|
539
|
+
tc
|
|
540
|
+
.responseSubmittedToGemini;
|
|
541
|
+
if (isAlreadySubmitted) {
|
|
542
|
+
seenCallIds.add(tc.request.callId);
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
seenCallIds.add(tc.request.callId);
|
|
546
|
+
if ((tc.status === CoreToolCallStatus.Success ||
|
|
547
|
+
tc.status === CoreToolCallStatus.Error ||
|
|
548
|
+
tc.status === CoreToolCallStatus.Cancelled) &&
|
|
549
|
+
(tc.response?.responseParts?.length ?? 0) > 0) {
|
|
550
|
+
synthesizedCalls.push(tc);
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
synthesizedCalls.push(createCancelledToolCall(tc.request, tc.tool, 'invocation' in tc ? tc.invocation : undefined));
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
for (const req of pendingToolCallRequestsRef.current) {
|
|
557
|
+
if (req.isClientInitiated || seenCallIds.has(req.callId)) {
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
seenCallIds.add(req.callId);
|
|
561
|
+
synthesizedCalls.push(createCancelledToolCall(req));
|
|
562
|
+
}
|
|
563
|
+
const clientHistory = client?.getHistory?.() ?? [];
|
|
564
|
+
const lastTurn = clientHistory.at(-1);
|
|
565
|
+
if (lastTurn?.role === 'model' && Array.isArray(lastTurn.parts)) {
|
|
566
|
+
let index = 0;
|
|
567
|
+
for (const part of lastTurn.parts) {
|
|
568
|
+
const fc = part.functionCall;
|
|
569
|
+
if (fc?.name) {
|
|
570
|
+
const callId = fc.id ?? `${fc.name}-${Date.now()}-${index++}`;
|
|
571
|
+
if (!seenCallIds.has(callId)) {
|
|
572
|
+
seenCallIds.add(callId);
|
|
573
|
+
synthesizedCalls.push(createCancelledToolCall({
|
|
574
|
+
callId,
|
|
575
|
+
name: fc.name,
|
|
576
|
+
args: fc.args ?? {},
|
|
577
|
+
isClientInitiated: false,
|
|
578
|
+
prompt_id: lastPromptIdRef.current ?? '',
|
|
579
|
+
}));
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
if (synthesizedCalls.length > 0) {
|
|
585
|
+
const currentModel = client?.getCurrentSequenceModel?.() ?? config.getModel?.() ?? '';
|
|
586
|
+
chat.recordCompletedToolCalls(currentModel, synthesizedCalls);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
catch (error) {
|
|
591
|
+
debugLogger.warn(`Error recording cancelled tool calls on abort: ${error}`);
|
|
592
|
+
}
|
|
520
593
|
if (pendingHistoryItemRef.current) {
|
|
521
594
|
// If it is a shell command, we update the status to Canceled and clear the output
|
|
522
595
|
// to avoid artifacts, then add it to history immediately.
|
|
@@ -560,6 +633,34 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
560
633
|
}
|
|
561
634
|
onCancelSubmit(false, clearBuffer);
|
|
562
635
|
setShellInputFocused(false);
|
|
636
|
+
const schedulePromise = activeSchedulePromiseRef.current;
|
|
637
|
+
if (schedulePromise) {
|
|
638
|
+
cancellationStateRef.current = CancellationState.Cancelling;
|
|
639
|
+
const cancelTask = (async () => {
|
|
640
|
+
let timeoutId;
|
|
641
|
+
try {
|
|
642
|
+
await Promise.race([
|
|
643
|
+
Promise.resolve(schedulePromise).catch(() => { }),
|
|
644
|
+
new Promise((resolve) => {
|
|
645
|
+
timeoutId = setTimeout(resolve, 1000);
|
|
646
|
+
}),
|
|
647
|
+
]);
|
|
648
|
+
}
|
|
649
|
+
finally {
|
|
650
|
+
if (timeoutId !== undefined) {
|
|
651
|
+
clearTimeout(timeoutId);
|
|
652
|
+
}
|
|
653
|
+
cancellationStateRef.current = CancellationState.Idle;
|
|
654
|
+
}
|
|
655
|
+
})();
|
|
656
|
+
cancelPromiseRef.current = cancelTask;
|
|
657
|
+
try {
|
|
658
|
+
await cancelTask;
|
|
659
|
+
}
|
|
660
|
+
catch (error) {
|
|
661
|
+
debugLogger.warn(`Error awaiting schedulePromise on cancel: ${error}`);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
563
664
|
}, [
|
|
564
665
|
streamingState,
|
|
565
666
|
addItem,
|
|
@@ -572,10 +673,12 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
572
673
|
toolCalls,
|
|
573
674
|
activeShellPtyId,
|
|
574
675
|
setIsResponding,
|
|
676
|
+
geminiClient,
|
|
677
|
+
config,
|
|
575
678
|
]);
|
|
576
679
|
useKeypress((key) => {
|
|
577
680
|
if (key.name === 'escape' && !isShellFocused) {
|
|
578
|
-
cancelOngoingRequest(false);
|
|
681
|
+
void cancelOngoingRequest(false);
|
|
579
682
|
return true;
|
|
580
683
|
}
|
|
581
684
|
return false;
|
|
@@ -1009,6 +1112,7 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
1009
1112
|
break;
|
|
1010
1113
|
case ServerGeminiEventType.ToolCallRequest:
|
|
1011
1114
|
toolCallRequests.push(event.value);
|
|
1115
|
+
pendingToolCallRequestsRef.current.push(event.value);
|
|
1012
1116
|
break;
|
|
1013
1117
|
case ServerGeminiEventType.UserCancelled:
|
|
1014
1118
|
handleUserCancelledEvent(userMessageTimestamp);
|
|
@@ -1067,7 +1171,17 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
1067
1171
|
addItem(pendingHistoryItemRef.current, userMessageTimestamp);
|
|
1068
1172
|
setPendingHistoryItem(null);
|
|
1069
1173
|
}
|
|
1070
|
-
|
|
1174
|
+
const schedulePromise = Promise.resolve(scheduleToolCalls(toolCallRequests, signal));
|
|
1175
|
+
activeSchedulePromiseRef.current = schedulePromise;
|
|
1176
|
+
try {
|
|
1177
|
+
await schedulePromise;
|
|
1178
|
+
}
|
|
1179
|
+
finally {
|
|
1180
|
+
if (activeSchedulePromiseRef.current === schedulePromise) {
|
|
1181
|
+
activeSchedulePromiseRef.current = null;
|
|
1182
|
+
}
|
|
1183
|
+
pendingToolCallRequestsRef.current = [];
|
|
1184
|
+
}
|
|
1071
1185
|
}
|
|
1072
1186
|
else {
|
|
1073
1187
|
const hasVisibleText = geminiMessageBuffer.trim().length > 0;
|
|
@@ -1120,6 +1234,7 @@ export const useGeminiStream = (geminiClient, history, addItem, config, settings
|
|
|
1120
1234
|
const userMessageTimestamp = Date.now();
|
|
1121
1235
|
// Reset quota error flag when starting a new query (not a continuation)
|
|
1122
1236
|
if (!options?.isContinuation) {
|
|
1237
|
+
pendingToolCallRequestsRef.current = [];
|
|
1123
1238
|
autoNudgeAttemptCountRef.current = 0;
|
|
1124
1239
|
setModelSwitchedFromQuotaError(false);
|
|
1125
1240
|
config.setQuotaErrorOccurred(false);
|