diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index c503bda7ba..5b257ed6f5 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -40,6 +40,28 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => { return { ...actual, recordSlowRender: vi.fn(), + writeToStdout: vi.fn((...args) => + process.stdout.write( + ...(args as Parameters), + ), + ), + patchStdio: vi.fn(() => () => {}), + createInkStdio: vi.fn(() => ({ + stdout: { + write: vi.fn((...args) => + process.stdout.write( + ...(args as Parameters), + ), + ), + columns: 80, + rows: 24, + on: vi.fn(), + removeListener: vi.fn(), + }, + stderr: { + write: vi.fn(), + }, + })), }; }); @@ -149,35 +171,6 @@ vi.mock('./ui/utils/mouse.js', () => ({ isIncompleteMouseSequence: vi.fn(), })); -vi.mock('./utils/stdio.js', async (importOriginal) => { - const actual = await importOriginal(); - return { - ...actual, - writeToStdout: vi.fn((...args) => - process.stdout.write( - ...(args as Parameters), - ), - ), - patchStdio: vi.fn(() => () => {}), - createInkStdio: vi.fn(() => ({ - stdout: { - write: vi.fn((...args) => - process.stdout.write( - ...(args as Parameters), - ), - ), - columns: 80, - rows: 24, - on: vi.fn(), - removeListener: vi.fn(), - }, - stderr: { - write: vi.fn(), - }, - })), - }; -}); - describe('gemini.tsx main function', () => { let originalEnvGeminiSandbox: string | undefined; let originalEnvSandbox: string | undefined; diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index 7d8a4684aa..15617fa9a8 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -49,6 +49,10 @@ import { recordSlowRender, coreEvents, CoreEvent, + createInkStdio, + patchStdio, + writeToStdout, + writeToStderr, } from '@google/gemini-cli-core'; import { initializeApp, @@ -85,12 +89,6 @@ import { disableMouseEvents, enableMouseEvents } from './ui/utils/mouse.js'; import { ScrollProvider } from './ui/contexts/ScrollProvider.js'; import ansiEscapes from 'ansi-escapes'; import { isAlternateBufferEnabled } from './ui/hooks/useAlternateBuffer.js'; -import { - createInkStdio, - patchStdio, - writeToStderr, - writeToStdout, -} from './utils/stdio.js'; import { profiler } from './ui/components/DebugProfiler.js'; diff --git a/packages/cli/src/ui/AppContainer.test.tsx b/packages/cli/src/ui/AppContainer.test.tsx index 8ea2296b3e..43a0de7c92 100644 --- a/packages/cli/src/ui/AppContainer.test.tsx +++ b/packages/cli/src/ui/AppContainer.test.tsx @@ -54,6 +54,21 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => { ...actual, coreEvents: mockCoreEvents, IdeClient: mockIdeClient, + writeToStdout: vi.fn((...args) => + process.stdout.write( + ...(args as Parameters), + ), + ), + writeToStderr: vi.fn((...args) => + process.stderr.write( + ...(args as Parameters), + ), + ), + patchStdio: vi.fn(() => () => {}), + createInkStdio: vi.fn(() => ({ + stdout: process.stdout, + stderr: process.stderr, + })), }; }); import type { LoadedSettings } from '../config/settings.js'; @@ -126,19 +141,6 @@ vi.mock('./utils/mouse.js', () => ({ enableMouseEvents: vi.fn(), disableMouseEvents: vi.fn(), })); -vi.mock('../utils/stdio.js', () => ({ - writeToStdout: vi.fn((...args) => - process.stdout.write(...(args as Parameters)), - ), - writeToStderr: vi.fn((...args) => - process.stderr.write(...(args as Parameters)), - ), - patchStdio: vi.fn(() => () => {}), - createInkStdio: vi.fn(() => ({ - stdout: process.stdout, - stderr: process.stderr, - })), -})); import { useHistory } from './hooks/useHistoryManager.js'; import { useThemeCommand } from './hooks/useThemeCommand.js'; @@ -163,10 +165,9 @@ import { useLoadingIndicator } from './hooks/useLoadingIndicator.js'; import { useKeypress, type Key } from './hooks/useKeypress.js'; import { measureElement } from 'ink'; import { useTerminalSize } from './hooks/useTerminalSize.js'; -import { ShellExecutionService } from '@google/gemini-cli-core'; +import { ShellExecutionService, writeToStdout } from '@google/gemini-cli-core'; import { type ExtensionManager } from '../config/extension-manager.js'; import { enableMouseEvents, disableMouseEvents } from './utils/mouse.js'; -import { writeToStdout } from '../utils/stdio.js'; describe('AppContainer State Management', () => { let mockConfig: Config; diff --git a/packages/cli/src/ui/AppContainer.tsx b/packages/cli/src/ui/AppContainer.tsx index 4b2bac8868..1ae809a96e 100644 --- a/packages/cli/src/ui/AppContainer.tsx +++ b/packages/cli/src/ui/AppContainer.tsx @@ -110,7 +110,7 @@ import { disableMouseEvents, enableMouseEvents } from './utils/mouse.js'; import { useAlternateBuffer } from './hooks/useAlternateBuffer.js'; import { useSettings } from './contexts/SettingsContext.js'; import { enableSupportedProtocol } from './utils/kittyProtocolDetector.js'; -import { writeToStdout } from '../utils/stdio.js'; +import { writeToStdout } from '@google/gemini-cli-core'; const WARNING_PROMPT_DURATION_MS = 1000; const QUEUE_ERROR_DISPLAY_DURATION_MS = 3000; diff --git a/packages/cli/src/ui/hooks/useBracketedPaste.ts b/packages/cli/src/ui/hooks/useBracketedPaste.ts index 3a9382c110..b8a763af42 100644 --- a/packages/cli/src/ui/hooks/useBracketedPaste.ts +++ b/packages/cli/src/ui/hooks/useBracketedPaste.ts @@ -5,7 +5,7 @@ */ import { useEffect } from 'react'; -import { writeToStdout } from '../../utils/stdio.js'; +import { writeToStdout } from '@google/gemini-cli-core'; const ENABLE_BRACKETED_PASTE = '\x1b[?2004h'; const DISABLE_BRACKETED_PASTE = '\x1b[?2004l'; diff --git a/packages/cli/src/ui/utils/mouse.ts b/packages/cli/src/ui/utils/mouse.ts index e12aa5927c..e5f2cd8241 100644 --- a/packages/cli/src/ui/utils/mouse.ts +++ b/packages/cli/src/ui/utils/mouse.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { writeToStdout } from '../../utils/stdio.js'; +import { writeToStdout } from '@google/gemini-cli-core'; import { SGR_MOUSE_REGEX, X11_MOUSE_REGEX, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index fe34a98cac..ad227b8db7 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -144,3 +144,6 @@ export * from './test-utils/index.js'; // Export hook types export * from './hooks/types.js'; + +// Export stdio utils +export * from './utils/stdio.js'; diff --git a/packages/cli/src/utils/stdio.test.ts b/packages/core/src/utils/stdio.test.ts similarity index 94% rename from packages/cli/src/utils/stdio.test.ts rename to packages/core/src/utils/stdio.test.ts index f6fb0d5535..2c1a74fecc 100644 --- a/packages/cli/src/utils/stdio.test.ts +++ b/packages/core/src/utils/stdio.test.ts @@ -6,9 +6,9 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { patchStdio, createInkStdio } from './stdio.js'; -import { coreEvents } from '@google/gemini-cli-core'; +import { coreEvents } from './events.js'; -vi.mock('@google/gemini-cli-core', () => ({ +vi.mock('./events.js', () => ({ coreEvents: { emitOutput: vi.fn(), }, diff --git a/packages/cli/src/utils/stdio.ts b/packages/core/src/utils/stdio.ts similarity index 98% rename from packages/cli/src/utils/stdio.ts rename to packages/core/src/utils/stdio.ts index fec66deb6c..74b5361160 100644 --- a/packages/cli/src/utils/stdio.ts +++ b/packages/core/src/utils/stdio.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { coreEvents } from '@google/gemini-cli-core'; +import { coreEvents } from './events.js'; // Capture the original stdout and stderr write methods before any monkey patching occurs. const originalStdoutWrite = process.stdout.write.bind(process.stdout);