fix(cli): resolve paste issue on Windows terminals. (#15932)

This commit is contained in:
Tommaso Sciortino
2026-01-05 14:46:23 -08:00
committed by GitHub
parent fd7b6bf40a
commit 8f0324d868
15 changed files with 224 additions and 115 deletions
@@ -23,6 +23,8 @@ vi.mock('@google/gemini-cli-core', () => ({
disableKittyKeyboardProtocol: vi.fn(),
enableModifyOtherKeys: vi.fn(),
disableModifyOtherKeys: vi.fn(),
enableBracketedPasteMode: vi.fn(),
disableBracketedPasteMode: vi.fn(),
}));
describe('TerminalCapabilityManager', () => {
@@ -264,4 +266,46 @@ describe('TerminalCapabilityManager', () => {
expect(manager.isModifyOtherKeysEnabled()).toBe(true);
});
});
describe('bracketed paste detection', () => {
it('should detect bracketed paste support (mode set)', async () => {
const manager = TerminalCapabilityManager.getInstance();
const promise = manager.detectCapabilities();
// Simulate bracketed paste response: \x1b[?2004;1$y
stdin.emit('data', Buffer.from('\x1b[?2004;1$y'));
// Complete detection with DA1
stdin.emit('data', Buffer.from('\x1b[?62c'));
await promise;
expect(manager.isBracketedPasteSupported()).toBe(true);
expect(manager.isBracketedPasteEnabled()).toBe(true);
});
it('should detect bracketed paste support (mode reset)', async () => {
const manager = TerminalCapabilityManager.getInstance();
const promise = manager.detectCapabilities();
// Simulate bracketed paste response: \x1b[?2004;2$y
stdin.emit('data', Buffer.from('\x1b[?2004;2$y'));
// Complete detection with DA1
stdin.emit('data', Buffer.from('\x1b[?62c'));
await promise;
expect(manager.isBracketedPasteSupported()).toBe(true);
expect(manager.isBracketedPasteEnabled()).toBe(true);
});
it('should not enable bracketed paste if not supported', async () => {
const manager = TerminalCapabilityManager.getInstance();
const promise = manager.detectCapabilities();
// Complete detection with DA1 only
stdin.emit('data', Buffer.from('\x1b[?62c'));
await promise;
expect(manager.isBracketedPasteSupported()).toBe(false);
expect(manager.isBracketedPasteEnabled()).toBe(false);
});
});
});