mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-17 17:41:24 -07:00
fix(cli): restore 'Modify with editor' option in external terminals (#17621)
This commit is contained in:
@@ -177,4 +177,44 @@ describe('ToolActionsContext', () => {
|
||||
throw new Error('Expected onConfirm to be present');
|
||||
}
|
||||
});
|
||||
|
||||
it('updates isDiffingEnabled when IdeClient status changes', async () => {
|
||||
let statusListener: () => void = () => {};
|
||||
const mockIdeClient = {
|
||||
isDiffingEnabled: vi.fn().mockReturnValue(false),
|
||||
addStatusChangeListener: vi.fn().mockImplementation((listener) => {
|
||||
statusListener = listener;
|
||||
}),
|
||||
removeStatusChangeListener: vi.fn(),
|
||||
} as unknown as IdeClient;
|
||||
|
||||
vi.mocked(IdeClient.getInstance).mockResolvedValue(mockIdeClient);
|
||||
vi.mocked(mockConfig.getIdeMode).mockReturnValue(true);
|
||||
|
||||
const { result } = renderHook(() => useToolActions(), { wrapper });
|
||||
|
||||
// Wait for initialization
|
||||
await act(async () => {
|
||||
await vi.waitFor(() => expect(IdeClient.getInstance).toHaveBeenCalled());
|
||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||
});
|
||||
|
||||
expect(result.current.isDiffingEnabled).toBe(false);
|
||||
|
||||
// Simulate connection change
|
||||
vi.mocked(mockIdeClient.isDiffingEnabled).mockReturnValue(true);
|
||||
await act(async () => {
|
||||
statusListener();
|
||||
});
|
||||
|
||||
expect(result.current.isDiffingEnabled).toBe(true);
|
||||
|
||||
// Simulate disconnection
|
||||
vi.mocked(mockIdeClient.isDiffingEnabled).mockReturnValue(false);
|
||||
await act(async () => {
|
||||
statusListener();
|
||||
});
|
||||
|
||||
expect(result.current.isDiffingEnabled).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -30,6 +30,7 @@ interface ToolActionsContextValue {
|
||||
payload?: ToolConfirmationPayload,
|
||||
) => Promise<void>;
|
||||
cancel: (callId: string) => Promise<void>;
|
||||
isDiffingEnabled: boolean;
|
||||
}
|
||||
|
||||
const ToolActionsContext = createContext<ToolActionsContextValue | null>(null);
|
||||
@@ -55,12 +56,28 @@ export const ToolActionsProvider: React.FC<ToolActionsProviderProps> = (
|
||||
|
||||
// Hoist IdeClient logic here to keep UI pure
|
||||
const [ideClient, setIdeClient] = useState<IdeClient | null>(null);
|
||||
const [isDiffingEnabled, setIsDiffingEnabled] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
let isMounted = true;
|
||||
if (config.getIdeMode()) {
|
||||
IdeClient.getInstance()
|
||||
.then((client) => {
|
||||
if (isMounted) setIdeClient(client);
|
||||
if (!isMounted) return;
|
||||
setIdeClient(client);
|
||||
setIsDiffingEnabled(client.isDiffingEnabled());
|
||||
|
||||
const handleStatusChange = () => {
|
||||
if (isMounted) {
|
||||
setIsDiffingEnabled(client.isDiffingEnabled());
|
||||
}
|
||||
};
|
||||
|
||||
client.addStatusChangeListener(handleStatusChange);
|
||||
// Return a cleanup function for the listener
|
||||
return () => {
|
||||
client.removeStatusChangeListener(handleStatusChange);
|
||||
};
|
||||
})
|
||||
.catch((error) => {
|
||||
debugLogger.error('Failed to get IdeClient instance:', error);
|
||||
@@ -88,12 +105,12 @@ export const ToolActionsProvider: React.FC<ToolActionsProviderProps> = (
|
||||
// 1. Handle Side Effects (IDE Diff)
|
||||
if (
|
||||
details?.type === 'edit' &&
|
||||
ideClient?.isDiffingEnabled() &&
|
||||
isDiffingEnabled &&
|
||||
'filePath' in details // Check for safety
|
||||
) {
|
||||
const cliOutcome =
|
||||
outcome === ToolConfirmationOutcome.Cancel ? 'rejected' : 'accepted';
|
||||
await ideClient.resolveDiffFromCli(details.filePath, cliOutcome);
|
||||
await ideClient?.resolveDiffFromCli(details.filePath, cliOutcome);
|
||||
}
|
||||
|
||||
// 2. Dispatch
|
||||
@@ -125,7 +142,7 @@ export const ToolActionsProvider: React.FC<ToolActionsProviderProps> = (
|
||||
|
||||
debugLogger.warn(`ToolActions: No confirmation mechanism for ${callId}`);
|
||||
},
|
||||
[config, ideClient, toolCalls],
|
||||
[config, ideClient, toolCalls, isDiffingEnabled],
|
||||
);
|
||||
|
||||
const cancel = useCallback(
|
||||
@@ -136,7 +153,7 @@ export const ToolActionsProvider: React.FC<ToolActionsProviderProps> = (
|
||||
);
|
||||
|
||||
return (
|
||||
<ToolActionsContext.Provider value={{ confirm, cancel }}>
|
||||
<ToolActionsContext.Provider value={{ confirm, cancel, isDiffingEnabled }}>
|
||||
{children}
|
||||
</ToolActionsContext.Provider>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user