mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-06-12 20:37:08 -07:00
docs(changelog): update for v0.42.0-preview.1
This commit is contained in:
committed by
github-actions[bot]
parent
e039fcdf2a
commit
65893ee03f
@@ -141,9 +141,8 @@ async function run() {
|
||||
// --- Heavy Child Process ---
|
||||
// Now we can safely import everything.
|
||||
const { main } = await import('./src/gemini.js');
|
||||
const { FatalError, writeToStderr } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { FatalError, writeToStderr } =
|
||||
await import('@google/gemini-cli-core');
|
||||
const { runExitCleanup } = await import('./src/utils/cleanup.js');
|
||||
|
||||
main().catch(async (error: unknown) => {
|
||||
|
||||
@@ -566,9 +566,8 @@ describe('Session', () => {
|
||||
});
|
||||
|
||||
it('should send sessionUpdate when approval mode changes', async () => {
|
||||
const { coreEvents, CoreEvent, ApprovalMode } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { coreEvents, CoreEvent, ApprovalMode } =
|
||||
await import('@google/gemini-cli-core');
|
||||
|
||||
coreEvents.emit(CoreEvent.ApprovalModeChanged, {
|
||||
sessionId: 'session-1',
|
||||
|
||||
@@ -20,9 +20,8 @@ import { ExtensionManager } from '../../config/extension-manager.js';
|
||||
import { loadSettings, type LoadedSettings } from '../../config/settings.js';
|
||||
|
||||
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
||||
const { mockCoreDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { mockCoreDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
const actual =
|
||||
await importOriginal<typeof import('@google/gemini-cli-core')>();
|
||||
const mocked = mockCoreDebugLogger(actual, { stripAnsi: true });
|
||||
|
||||
@@ -11,9 +11,8 @@ import { ExtensionManager } from '../../config/extension-manager.js';
|
||||
import { loadSettings, type LoadedSettings } from '../../config/settings.js';
|
||||
|
||||
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
||||
const { mockCoreDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { mockCoreDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
const actual =
|
||||
await importOriginal<typeof import('@google/gemini-cli-core')>();
|
||||
const mocked = mockCoreDebugLogger(actual, { stripAnsi: false });
|
||||
|
||||
@@ -16,9 +16,8 @@ import { getLogFilePath } from './constants.js';
|
||||
import { logsCommand, readLastLines } from './logs.js';
|
||||
|
||||
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
||||
const { mockCoreDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { mockCoreDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return mockCoreDebugLogger(
|
||||
await importOriginal<typeof import('@google/gemini-cli-core')>(),
|
||||
{
|
||||
|
||||
@@ -16,9 +16,8 @@ const mockReadServerProcessInfo = vi.hoisted(() => vi.fn());
|
||||
const mockResolveGemmaConfig = vi.hoisted(() => vi.fn());
|
||||
|
||||
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
||||
const { mockCoreDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { mockCoreDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return mockCoreDebugLogger(
|
||||
await importOriginal<typeof import('@google/gemini-cli-core')>(),
|
||||
{
|
||||
|
||||
@@ -14,9 +14,8 @@ import {
|
||||
} from '../../config/settings.js';
|
||||
|
||||
const { emitConsoleLog, debugLogger } = await vi.hoisted(async () => {
|
||||
const { createMockDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { createMockDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return createMockDebugLogger({ stripAnsi: true });
|
||||
});
|
||||
|
||||
|
||||
@@ -13,9 +13,8 @@ import {
|
||||
} from '../../config/settings.js';
|
||||
|
||||
const { emitConsoleLog, debugLogger } = await vi.hoisted(async () => {
|
||||
const { createMockDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { createMockDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return createMockDebugLogger({ stripAnsi: true });
|
||||
});
|
||||
|
||||
|
||||
@@ -20,9 +20,8 @@ vi.mock('../../config/extensions/consent.js', () => ({
|
||||
}));
|
||||
|
||||
const { debugLogger, emitConsoleLog } = await vi.hoisted(async () => {
|
||||
const { createMockDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { createMockDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return createMockDebugLogger({ stripAnsi: true });
|
||||
});
|
||||
|
||||
|
||||
@@ -16,9 +16,8 @@ vi.mock('../../utils/skillUtils.js', () => ({
|
||||
}));
|
||||
|
||||
const { debugLogger } = await vi.hoisted(async () => {
|
||||
const { createMockDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { createMockDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return createMockDebugLogger({ stripAnsi: false });
|
||||
});
|
||||
|
||||
|
||||
@@ -20,9 +20,8 @@ import { loadCliConfig } from '../../config/config.js';
|
||||
import chalk from 'chalk';
|
||||
|
||||
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
||||
const { mockCoreDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { mockCoreDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return mockCoreDebugLogger(
|
||||
await importOriginal<typeof import('@google/gemini-cli-core')>(),
|
||||
{
|
||||
|
||||
@@ -13,9 +13,8 @@ vi.mock('../../utils/skillUtils.js', () => ({
|
||||
}));
|
||||
|
||||
const { debugLogger, emitConsoleLog } = await vi.hoisted(async () => {
|
||||
const { createMockDebugLogger } = await import(
|
||||
'../../test-utils/mockDebugLogger.js'
|
||||
);
|
||||
const { createMockDebugLogger } =
|
||||
await import('../../test-utils/mockDebugLogger.js');
|
||||
return createMockDebugLogger({ stripAnsi: true });
|
||||
});
|
||||
|
||||
|
||||
@@ -300,9 +300,8 @@ System using model: \${MODEL_NAME}
|
||||
});
|
||||
expect(extension.skills![0].body).toContain('Value is: first');
|
||||
|
||||
const { updateSetting, ExtensionSettingScope } = await import(
|
||||
'./extensions/extensionSettings.js'
|
||||
);
|
||||
const { updateSetting, ExtensionSettingScope } =
|
||||
await import('./extensions/extensionSettings.js');
|
||||
const extensionConfig =
|
||||
await extensionManager.loadExtensionConfig(extensionPath);
|
||||
|
||||
|
||||
@@ -334,8 +334,8 @@ Would you like to attempt to install via "git clone" instead?`,
|
||||
const previousSkills = previous?.skills ?? [];
|
||||
const isMigrating = Boolean(
|
||||
previous &&
|
||||
previous.installMetadata &&
|
||||
previous.installMetadata.source !== installMetadata.source,
|
||||
previous.installMetadata &&
|
||||
previous.installMetadata.source !== installMetadata.source,
|
||||
);
|
||||
|
||||
await maybeRequestConsentOrFail(
|
||||
|
||||
@@ -938,9 +938,8 @@ describe('gemini.tsx main function kitty protocol', () => {
|
||||
});
|
||||
|
||||
it.skip('should log error when cleanupExpiredSessions fails', async () => {
|
||||
const { cleanupExpiredSessions } = await import(
|
||||
'./utils/sessionCleanup.js'
|
||||
);
|
||||
const { cleanupExpiredSessions } =
|
||||
await import('./utils/sessionCleanup.js');
|
||||
vi.mocked(cleanupExpiredSessions).mockRejectedValue(
|
||||
new Error('Cleanup failed'),
|
||||
);
|
||||
|
||||
@@ -552,9 +552,8 @@ export async function main() {
|
||||
adminControlsListner.setConfig(config);
|
||||
|
||||
if (config.isInteractive() && settings.merged.general.devtools) {
|
||||
const { setupInitialActivityLogger } = await import(
|
||||
'./utils/devtoolsService.js'
|
||||
);
|
||||
const { setupInitialActivityLogger } =
|
||||
await import('./utils/devtoolsService.js');
|
||||
setupInitialActivityLogger(config);
|
||||
}
|
||||
|
||||
|
||||
@@ -201,9 +201,8 @@ describe('gemini.tsx main function cleanup', () => {
|
||||
});
|
||||
|
||||
it.skip('should log error when cleanupExpiredSessions fails', async () => {
|
||||
const { loadCliConfig, parseArguments } = await import(
|
||||
'./config/config.js'
|
||||
);
|
||||
const { loadCliConfig, parseArguments } =
|
||||
await import('./config/config.js');
|
||||
const { loadSettings } = await import('./config/settings.js');
|
||||
cleanupMockState.shouldThrow = true;
|
||||
cleanupMockState.called = false;
|
||||
@@ -272,9 +271,8 @@ describe('gemini.tsx main function cleanup', () => {
|
||||
});
|
||||
|
||||
it('should register SessionEnd hook exactly once in non-interactive mode', async () => {
|
||||
const { loadCliConfig, parseArguments } = await import(
|
||||
'./config/config.js'
|
||||
);
|
||||
const { loadCliConfig, parseArguments } =
|
||||
await import('./config/config.js');
|
||||
const { registerCleanup } = await import('./utils/cleanup.js');
|
||||
|
||||
const mockHookSystem = {
|
||||
@@ -310,9 +308,8 @@ describe('gemini.tsx main function cleanup', () => {
|
||||
it('should not register ConsolePatcher cleanup in ACP mode', async () => {
|
||||
const { registerCleanup } = await import('./utils/cleanup.js');
|
||||
const { ConsolePatcher } = await import('./ui/utils/ConsolePatcher.js');
|
||||
const { loadCliConfig, parseArguments } = await import(
|
||||
'./config/config.js'
|
||||
);
|
||||
const { loadCliConfig, parseArguments } =
|
||||
await import('./config/config.js');
|
||||
const { loadSettings } = await import('./config/settings.js');
|
||||
|
||||
vi.mocked(parseArguments).mockResolvedValue({
|
||||
@@ -364,9 +361,8 @@ describe('gemini.tsx main function cleanup', () => {
|
||||
it('should register ConsolePatcher cleanup in non-ACP mode', async () => {
|
||||
const { registerCleanup } = await import('./utils/cleanup.js');
|
||||
const { ConsolePatcher } = await import('./ui/utils/ConsolePatcher.js');
|
||||
const { loadCliConfig, parseArguments } = await import(
|
||||
'./config/config.js'
|
||||
);
|
||||
const { loadCliConfig, parseArguments } =
|
||||
await import('./config/config.js');
|
||||
const { loadSettings } = await import('./config/settings.js');
|
||||
|
||||
vi.mocked(parseArguments).mockResolvedValue({
|
||||
|
||||
@@ -215,9 +215,8 @@ describe('runNonInteractive', () => {
|
||||
computeMergedSettings: vi.fn(),
|
||||
} as unknown as LoadedSettings;
|
||||
|
||||
const { handleAtCommand } = await import(
|
||||
'./ui/hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { handleAtCommand } =
|
||||
await import('./ui/hooks/atCommandProcessor.js');
|
||||
vi.mocked(handleAtCommand).mockImplementation(async ({ query }) => ({
|
||||
processedQuery: [{ text: query }],
|
||||
}));
|
||||
@@ -636,9 +635,8 @@ describe('runNonInteractive', () => {
|
||||
|
||||
it('should preprocess @include commands before sending to the model', async () => {
|
||||
// 1. Mock the imported atCommandProcessor
|
||||
const { handleAtCommand } = await import(
|
||||
'./ui/hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { handleAtCommand } =
|
||||
await import('./ui/hooks/atCommandProcessor.js');
|
||||
const mockHandleAtCommand = vi.mocked(handleAtCommand);
|
||||
|
||||
// 2. Define the raw input and the expected processed output
|
||||
@@ -991,9 +989,8 @@ describe('runNonInteractive', () => {
|
||||
});
|
||||
|
||||
it('should handle slash commands', async () => {
|
||||
const nonInteractiveCliCommands = await import(
|
||||
'./nonInteractiveCliCommands.js'
|
||||
);
|
||||
const nonInteractiveCliCommands =
|
||||
await import('./nonInteractiveCliCommands.js');
|
||||
const handleSlashCommandSpy = vi.spyOn(
|
||||
nonInteractiveCliCommands,
|
||||
'handleSlashCommand',
|
||||
@@ -1271,13 +1268,11 @@ describe('runNonInteractive', () => {
|
||||
|
||||
it('should instantiate CommandService with correct loaders for slash commands', async () => {
|
||||
// This test indirectly checks that handleSlashCommand is using the right loaders.
|
||||
const { FileCommandLoader } = await import(
|
||||
'./services/FileCommandLoader.js'
|
||||
);
|
||||
const { FileCommandLoader } =
|
||||
await import('./services/FileCommandLoader.js');
|
||||
const { McpPromptLoader } = await import('./services/McpPromptLoader.js');
|
||||
const { BuiltinCommandLoader } = await import(
|
||||
'./services/BuiltinCommandLoader.js'
|
||||
);
|
||||
const { BuiltinCommandLoader } =
|
||||
await import('./services/BuiltinCommandLoader.js');
|
||||
mockGetCommands.mockReturnValue([]); // No commands found, so it will fall through
|
||||
const events: ServerGeminiStreamEvent[] = [
|
||||
{ type: GeminiEventType.Content, value: 'Acknowledged' },
|
||||
|
||||
@@ -84,9 +84,8 @@ export async function runNonInteractive(
|
||||
});
|
||||
|
||||
if (process.env['GEMINI_CLI_ACTIVITY_LOG_TARGET']) {
|
||||
const { setupInitialActivityLogger } = await import(
|
||||
'./utils/devtoolsService.js'
|
||||
);
|
||||
const { setupInitialActivityLogger } =
|
||||
await import('./utils/devtoolsService.js');
|
||||
setupInitialActivityLogger(config);
|
||||
}
|
||||
|
||||
|
||||
@@ -221,9 +221,8 @@ describe('runNonInteractive', () => {
|
||||
computeMergedSettings: vi.fn(),
|
||||
} as unknown as LoadedSettings;
|
||||
|
||||
const { handleAtCommand } = await import(
|
||||
'./ui/hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { handleAtCommand } =
|
||||
await import('./ui/hooks/atCommandProcessor.js');
|
||||
vi.mocked(handleAtCommand).mockImplementation(async ({ query }) => ({
|
||||
processedQuery: [{ text: query }],
|
||||
}));
|
||||
@@ -690,9 +689,8 @@ describe('runNonInteractive', () => {
|
||||
|
||||
it('should preprocess @include commands before sending to the model', async () => {
|
||||
// 1. Mock the imported atCommandProcessor
|
||||
const { handleAtCommand } = await import(
|
||||
'./ui/hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { handleAtCommand } =
|
||||
await import('./ui/hooks/atCommandProcessor.js');
|
||||
const mockHandleAtCommand = vi.mocked(handleAtCommand);
|
||||
|
||||
// 2. Define the raw input and the expected processed output
|
||||
@@ -1118,9 +1116,8 @@ describe('runNonInteractive', () => {
|
||||
});
|
||||
|
||||
it('should handle slash commands', async () => {
|
||||
const nonInteractiveCliCommands = await import(
|
||||
'./nonInteractiveCliCommands.js'
|
||||
);
|
||||
const nonInteractiveCliCommands =
|
||||
await import('./nonInteractiveCliCommands.js');
|
||||
const handleSlashCommandSpy = vi.spyOn(
|
||||
nonInteractiveCliCommands,
|
||||
'handleSlashCommand',
|
||||
@@ -1440,13 +1437,11 @@ describe('runNonInteractive', () => {
|
||||
|
||||
it('should instantiate CommandService with correct loaders for slash commands', async () => {
|
||||
// This test indirectly checks that handleSlashCommand is using the right loaders.
|
||||
const { FileCommandLoader } = await import(
|
||||
'./services/FileCommandLoader.js'
|
||||
);
|
||||
const { FileCommandLoader } =
|
||||
await import('./services/FileCommandLoader.js');
|
||||
const { McpPromptLoader } = await import('./services/McpPromptLoader.js');
|
||||
const { BuiltinCommandLoader } = await import(
|
||||
'./services/BuiltinCommandLoader.js'
|
||||
);
|
||||
const { BuiltinCommandLoader } =
|
||||
await import('./services/BuiltinCommandLoader.js');
|
||||
mockGetCommands.mockReturnValue([]); // No commands found, so it will fall through
|
||||
const events: ServerGeminiStreamEvent[] = [
|
||||
{ type: GeminiEventType.Content, value: 'Acknowledged' },
|
||||
|
||||
@@ -84,9 +84,8 @@ export async function runNonInteractive({
|
||||
});
|
||||
|
||||
if (process.env['GEMINI_CLI_ACTIVITY_LOG_TARGET']) {
|
||||
const { setupInitialActivityLogger } = await import(
|
||||
'./utils/devtoolsService.js'
|
||||
);
|
||||
const { setupInitialActivityLogger } =
|
||||
await import('./utils/devtoolsService.js');
|
||||
setupInitialActivityLogger(config);
|
||||
}
|
||||
|
||||
|
||||
@@ -91,9 +91,8 @@ vi.mock('../ui/contexts/StreamingContext.js', async (importOriginal) => {
|
||||
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
||||
const original =
|
||||
await importOriginal<typeof import('@google/gemini-cli-core')>();
|
||||
const { MockShellExecutionService: MockService } = await import(
|
||||
'./MockShellExecutionService.js'
|
||||
);
|
||||
const { MockShellExecutionService: MockService } =
|
||||
await import('./MockShellExecutionService.js');
|
||||
// Register the real execution logic so MockShellExecutionService can fall back to it
|
||||
MockService.setOriginalImplementation(original.ShellExecutionService.execute);
|
||||
|
||||
|
||||
@@ -3134,9 +3134,8 @@ describe('AppContainer State Management', () => {
|
||||
|
||||
describe('Submission Handling', () => {
|
||||
it('resets expansion state on submission when not in alternate buffer', async () => {
|
||||
const { checkPermissions } = await import(
|
||||
'./hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { checkPermissions } =
|
||||
await import('./hooks/atCommandProcessor.js');
|
||||
vi.mocked(checkPermissions).mockResolvedValue([]);
|
||||
|
||||
const { unmount } = await act(async () =>
|
||||
@@ -3164,9 +3163,8 @@ describe('AppContainer State Management', () => {
|
||||
});
|
||||
|
||||
it('resets expansion state on submission when in alternate buffer without clearing terminal', async () => {
|
||||
const { checkPermissions } = await import(
|
||||
'./hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { checkPermissions } =
|
||||
await import('./hooks/atCommandProcessor.js');
|
||||
vi.mocked(checkPermissions).mockResolvedValue([]);
|
||||
|
||||
vi.spyOn(mockConfig, 'getUseTerminalBuffer').mockReturnValue(false);
|
||||
@@ -3448,9 +3446,8 @@ describe('AppContainer State Management', () => {
|
||||
|
||||
describe('Permission Handling', () => {
|
||||
it('shows permission dialog when checkPermissions returns paths', async () => {
|
||||
const { checkPermissions } = await import(
|
||||
'./hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { checkPermissions } =
|
||||
await import('./hooks/atCommandProcessor.js');
|
||||
vi.mocked(checkPermissions).mockResolvedValue(['/test/file.txt']);
|
||||
|
||||
const { unmount } = await act(async () => renderAppContainer());
|
||||
@@ -3471,9 +3468,8 @@ describe('AppContainer State Management', () => {
|
||||
it.each([true, false])(
|
||||
'handles permissions when allowed is %s',
|
||||
async (allowed) => {
|
||||
const { checkPermissions } = await import(
|
||||
'./hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { checkPermissions } =
|
||||
await import('./hooks/atCommandProcessor.js');
|
||||
vi.mocked(checkPermissions).mockResolvedValue(['/test/file.txt']);
|
||||
const addReadOnlyPathSpy = vi.spyOn(
|
||||
mockConfig.getWorkspaceContext(),
|
||||
@@ -3579,9 +3575,8 @@ describe('AppContainer State Management', () => {
|
||||
|
||||
describe('Compression Queuing', () => {
|
||||
beforeEach(async () => {
|
||||
const { checkPermissions } = await import(
|
||||
'./hooks/atCommandProcessor.js'
|
||||
);
|
||||
const { checkPermissions } =
|
||||
await import('./hooks/atCommandProcessor.js');
|
||||
vi.mocked(checkPermissions).mockResolvedValue([]);
|
||||
|
||||
vi.spyOn(mockConfig, 'isModelSteeringEnabled').mockReturnValue(true);
|
||||
|
||||
@@ -1644,9 +1644,9 @@ Logging in with Google... Restarting Gemini CLI to continue.
|
||||
}, []);
|
||||
const shouldShowIdePrompt = Boolean(
|
||||
currentIDE &&
|
||||
!config.getIdeMode() &&
|
||||
!settings.merged.ide.hasSeenNudge &&
|
||||
!idePromptAnswered,
|
||||
!config.getIdeMode() &&
|
||||
!settings.merged.ide.hasSeenNudge &&
|
||||
!idePromptAnswered,
|
||||
);
|
||||
|
||||
const [showErrorDetails, setShowErrorDetails] = useState<boolean>(false);
|
||||
@@ -1927,9 +1927,8 @@ Logging in with Google... Restarting Gemini CLI to continue.
|
||||
if (keyMatchers[Command.SHOW_ERROR_DETAILS](key)) {
|
||||
if (settings.merged.general.devtools) {
|
||||
void (async () => {
|
||||
const { toggleDevToolsPanel } = await import(
|
||||
'../utils/devtoolsService.js'
|
||||
);
|
||||
const { toggleDevToolsPanel } =
|
||||
await import('../utils/devtoolsService.js');
|
||||
await toggleDevToolsPanel(
|
||||
config,
|
||||
showErrorDetails,
|
||||
|
||||
@@ -78,9 +78,8 @@ describe('authCommand', () => {
|
||||
const logoutCommand = authCommand.subCommands?.[1];
|
||||
expect(logoutCommand?.name).toBe('signout');
|
||||
|
||||
const { clearCachedCredentialFile } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { clearCachedCredentialFile } =
|
||||
await import('@google/gemini-cli-core');
|
||||
|
||||
await logoutCommand!.action!(mockContext, '');
|
||||
|
||||
|
||||
@@ -1139,9 +1139,8 @@ describe('extensionsCommand', () => {
|
||||
const prompts = (await import('prompts')).default;
|
||||
vi.mocked(prompts).mockResolvedValue({ overwrite: true });
|
||||
|
||||
const { getScopedEnvContents } = await import(
|
||||
'../../config/extensions/extensionSettings.js'
|
||||
);
|
||||
const { getScopedEnvContents } =
|
||||
await import('../../config/extensions/extensionSettings.js');
|
||||
vi.mocked(getScopedEnvContents).mockResolvedValue({});
|
||||
});
|
||||
|
||||
|
||||
@@ -635,9 +635,8 @@ describe('MainContent', () => {
|
||||
});
|
||||
|
||||
it('renders a ToolConfirmationQueue without an extra line when preceded by hidden tools', async () => {
|
||||
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } =
|
||||
await import('@google/gemini-cli-core');
|
||||
const hiddenToolCalls = [
|
||||
{
|
||||
callId: 'tool-hidden',
|
||||
@@ -713,9 +712,8 @@ describe('MainContent', () => {
|
||||
});
|
||||
|
||||
it('renders a spurious line when a tool group has only hidden tools and borderBottom true', async () => {
|
||||
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { ApprovalMode, WRITE_FILE_DISPLAY_NAME } =
|
||||
await import('@google/gemini-cli-core');
|
||||
const uiState = {
|
||||
...defaultMockUiState,
|
||||
history: [{ id: 1, type: 'user', text: 'Apply plan' }],
|
||||
|
||||
@@ -11,8 +11,10 @@ import { MaxSizedBox, type MaxSizedBoxProps } from './MaxSizedBox.js';
|
||||
// outputs that will get truncated further MaxSizedBox anyway.
|
||||
const MAXIMUM_RESULT_DISPLAY_CHARACTERS = 20000;
|
||||
|
||||
export interface SlicingMaxSizedBoxProps<T>
|
||||
extends Omit<MaxSizedBoxProps, 'children'> {
|
||||
export interface SlicingMaxSizedBoxProps<T> extends Omit<
|
||||
MaxSizedBoxProps,
|
||||
'children'
|
||||
> {
|
||||
data: T;
|
||||
maxLines?: number;
|
||||
isAlternateBuffer?: boolean;
|
||||
|
||||
@@ -153,15 +153,15 @@ const inScreen = (): boolean =>
|
||||
const isSSH = (): boolean =>
|
||||
Boolean(
|
||||
process.env['SSH_TTY'] ||
|
||||
process.env['SSH_CONNECTION'] ||
|
||||
process.env['SSH_CLIENT'],
|
||||
process.env['SSH_CONNECTION'] ||
|
||||
process.env['SSH_CLIENT'],
|
||||
);
|
||||
|
||||
const isWSL = (): boolean =>
|
||||
Boolean(
|
||||
process.env['WSL_DISTRO_NAME'] ||
|
||||
process.env['WSLENV'] ||
|
||||
process.env['WSL_INTEROP'],
|
||||
process.env['WSLENV'] ||
|
||||
process.env['WSL_INTEROP'],
|
||||
);
|
||||
|
||||
const isWindowsTerminal = (): boolean =>
|
||||
|
||||
@@ -220,9 +220,8 @@ describe('rewindFileOps', () => {
|
||||
});
|
||||
|
||||
it('reverts exact match', async () => {
|
||||
const { getFileDiffFromResultDisplay } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { getFileDiffFromResultDisplay } =
|
||||
await import('@google/gemini-cli-core');
|
||||
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
|
||||
filePath: '/abs/path/test.ts',
|
||||
fileName: 'test.ts',
|
||||
@@ -270,9 +269,8 @@ describe('rewindFileOps', () => {
|
||||
});
|
||||
|
||||
it('deletes new file on revert', async () => {
|
||||
const { getFileDiffFromResultDisplay } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { getFileDiffFromResultDisplay } =
|
||||
await import('@google/gemini-cli-core');
|
||||
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
|
||||
filePath: '/abs/path/new.ts',
|
||||
fileName: 'new.ts',
|
||||
@@ -317,9 +315,8 @@ describe('rewindFileOps', () => {
|
||||
});
|
||||
|
||||
it('handles smart revert (patching) successfully', async () => {
|
||||
const { getFileDiffFromResultDisplay } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { getFileDiffFromResultDisplay } =
|
||||
await import('@google/gemini-cli-core');
|
||||
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
|
||||
filePath: '/abs/path/test.ts',
|
||||
fileName: 'test.ts',
|
||||
@@ -369,9 +366,8 @@ describe('rewindFileOps', () => {
|
||||
});
|
||||
|
||||
it('emits warning on smart revert failure', async () => {
|
||||
const { getFileDiffFromResultDisplay } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { getFileDiffFromResultDisplay } =
|
||||
await import('@google/gemini-cli-core');
|
||||
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
|
||||
filePath: '/abs/path/test.ts',
|
||||
fileName: 'test.ts',
|
||||
@@ -421,9 +417,8 @@ describe('rewindFileOps', () => {
|
||||
});
|
||||
|
||||
it('emits error if fs.readFile fails with a generic error', async () => {
|
||||
const { getFileDiffFromResultDisplay } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { getFileDiffFromResultDisplay } =
|
||||
await import('@google/gemini-cli-core');
|
||||
vi.mocked(getFileDiffFromResultDisplay).mockReturnValue({
|
||||
filePath: '/abs/path/test.ts',
|
||||
fileName: 'test.ts',
|
||||
|
||||
@@ -17,8 +17,10 @@ export type AgentActionStatus = 'success' | 'no-op' | 'error';
|
||||
/**
|
||||
* Metadata representing the result of an agent settings operation.
|
||||
*/
|
||||
export interface AgentActionResult
|
||||
extends Omit<FeatureActionResult, 'featureName'> {
|
||||
export interface AgentActionResult extends Omit<
|
||||
FeatureActionResult,
|
||||
'featureName'
|
||||
> {
|
||||
agentName: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -207,9 +207,8 @@ export async function toggleDevToolsPanel(
|
||||
}
|
||||
|
||||
try {
|
||||
const { openBrowserSecurely, shouldLaunchBrowser } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { openBrowserSecurely, shouldLaunchBrowser } =
|
||||
await import('@google/gemini-cli-core');
|
||||
const url = await startDevToolsServer(config);
|
||||
if (shouldLaunchBrowser()) {
|
||||
try {
|
||||
|
||||
@@ -20,8 +20,10 @@ export type SkillActionStatus = 'success' | 'no-op' | 'error';
|
||||
/**
|
||||
* Metadata representing the result of a skill settings operation.
|
||||
*/
|
||||
export interface SkillActionResult
|
||||
extends Omit<FeatureActionResult, 'featureName'> {
|
||||
export interface SkillActionResult extends Omit<
|
||||
FeatureActionResult,
|
||||
'featureName'
|
||||
> {
|
||||
skillName: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -194,9 +194,8 @@ describe('getUserStartupWarnings', () => {
|
||||
|
||||
describe('folder trust check', () => {
|
||||
it('should throw FatalUntrustedWorkspaceError when untrusted in headless mode', async () => {
|
||||
const { isHeadlessMode, FatalUntrustedWorkspaceError } = await import(
|
||||
'@google/gemini-cli-core'
|
||||
);
|
||||
const { isHeadlessMode, FatalUntrustedWorkspaceError } =
|
||||
await import('@google/gemini-cli-core');
|
||||
vi.mocked(isFolderTrustEnabled).mockReturnValue(true);
|
||||
vi.mocked(isWorkspaceTrusted).mockImplementation(() => {
|
||||
throw new FatalUntrustedWorkspaceError(
|
||||
|
||||
Reference in New Issue
Block a user