diff --git a/docs/get-started/configuration.md b/docs/get-started/configuration.md index ecc31d609b..7a433caf8a 100644 --- a/docs/get-started/configuration.md +++ b/docs/get-started/configuration.md @@ -232,7 +232,7 @@ their corresponding top-level category object in your `settings.json` file. - **`ui.useAlternateBuffer`** (boolean): - **Description:** Use an alternate screen buffer for the UI, preserving shell history. - - **Default:** `false` + - **Default:** `true` - **Requires restart:** Yes - **`ui.customWittyPhrases`** (array): diff --git a/integration-tests/extensions-reload.test.ts b/integration-tests/extensions-reload.test.ts index d28097f2c0..10a06b1bab 100644 --- a/integration-tests/extensions-reload.test.ts +++ b/integration-tests/extensions-reload.test.ts @@ -84,8 +84,11 @@ describe('extension reloading', () => { await run.expectText('- hello'); // Update the extension, expect the list to update, and mcp servers as well. - await run.sendText('/extensions update test-extension'); - await run.type('\r'); + await run.sendKeys('/extensions update test-extension'); + await run.expectText('/extensions update test-extension'); + await run.sendKeys('\r'); + await new Promise((resolve) => setTimeout(resolve, 500)); + await run.sendKeys('\r'); await run.expectText( ` * test-server (remote): http://localhost:${portB}/mcp`, ); diff --git a/integration-tests/test-helper.ts b/integration-tests/test-helper.ts index a202caf9ee..507ffbccfd 100644 --- a/integration-tests/test-helper.ts +++ b/integration-tests/test-helper.ts @@ -192,7 +192,12 @@ export class InteractiveRun { timeout, 200, ); - expect(found, `Did not find expected text: "${text}"`).toBe(true); + expect( + found, + `Did not find expected text: "${text}". Output was:\n${stripAnsi( + this.output, + )}`, + ).toBe(true); } // This types slowly to make sure command is correct, but only work for short @@ -1004,7 +1009,7 @@ export class TestRig { const options: pty.IPtyForkOptions = { name: 'xterm-color', cols: 80, - rows: 24, + rows: 80, cwd: this.testDir!, env: Object.fromEntries( Object.entries(env).filter(([, v]) => v !== undefined), diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index 0a715906de..5f070d1a26 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -497,7 +497,7 @@ const SETTINGS_SCHEMA = { label: 'Use Alternate Screen Buffer', category: 'UI', requiresRestart: true, - default: false, + default: true, description: 'Use an alternate screen buffer for the UI, preserving shell history.', showInDialog: true, diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index ffa5996630..ecb117de4c 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -529,6 +529,7 @@ describe('startInteractiveUI', () => { // Verify render options expect(options).toEqual({ + alternateBuffer: true, exitOnCtrlC: false, isScreenReaderEnabled: false, onRender: expect.any(Function), diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index 4d96c64daf..c9225bbf69 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -76,6 +76,7 @@ import { requestConsentNonInteractive } from './config/extensions/consent.js'; 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'; const SLOW_RENDER_MS = 200; @@ -170,7 +171,8 @@ export async function startInteractiveUI( process.stdout.write('\x1b[?7l'); } - const mouseEventsEnabled = settings.merged.ui?.useAlternateBuffer === true; + const useAlternateBuffer = isAlternateBufferEnabled(settings); + const mouseEventsEnabled = useAlternateBuffer; if (mouseEventsEnabled) { enableMouseEvents(); } @@ -236,7 +238,7 @@ export async function startInteractiveUI( recordSlowRender(config, renderTime); } }, - alternateBuffer: settings.merged.ui?.useAlternateBuffer, + alternateBuffer: useAlternateBuffer, }, ); @@ -437,7 +439,7 @@ export async function main() { // input showing up in the output. process.stdin.setRawMode(true); - if (settings.merged.ui?.useAlternateBuffer) { + if (isAlternateBufferEnabled(settings)) { process.stdout.write(ansiEscapes.enterAlternativeScreen); // Ink will cleanup so there is no need for us to manually cleanup. diff --git a/packages/cli/src/ui/components/__snapshots__/AlternateBufferQuittingDisplay.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/AlternateBufferQuittingDisplay.test.tsx.snap index a46007c568..e9d55cc795 100644 --- a/packages/cli/src/ui/components/__snapshots__/AlternateBufferQuittingDisplay.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/AlternateBufferQuittingDisplay.test.tsx.snap @@ -16,16 +16,16 @@ Tips for getting started: 2. Be specific for the best results. 3. Create GEMINI.md files to customize your interactions with Gemini. 4. /help for more information. -╭──────────────────────────────────────────────────────────────────────────────╮ -│ ✓ tool1 Description for tool 1 │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────╯ -╭──────────────────────────────────────────────────────────────────────────────╮ -│ ✓ tool2 Description for tool 2 │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────╯ -╭──────────────────────────────────────────────────────────────────────────────╮ -│ o tool3 Description for tool 3 │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────╯" +╭─────────────────────────────────────────────────────────────────────────────╮ +│ ✓ tool1 Description for tool 1 │ +│ │ +╰─────────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────────────────────────────────────────────────────╮ +│ ✓ tool2 Description for tool 2 │ +│ │ +╰─────────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────────────────────────────────────────────────────╮ +│ o tool3 Description for tool 3 │ +│ │ +╰─────────────────────────────────────────────────────────────────────────────╯" `; diff --git a/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap index 292e3b9bc3..83c0fb0dba 100644 --- a/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap +++ b/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap @@ -1,11 +1,11 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`