/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { expect, describe, it, beforeEach, afterEach } from 'vitest'; import { TestRig, type } from './test-helper.js'; describe('Interactive Mode', () => { let rig: TestRig; beforeEach(() => { rig = new TestRig(); }); afterEach(async () => { await rig.cleanup(); }); it.skipIf(process.platform === 'win32')( 'should trigger chat compression with /compress command', async () => { await rig.setup('interactive-compress-test', { settings: { security: { auth: { selectedType: 'openai', }, }, }, }); const { ptyProcess } = rig.runInteractive(); let fullOutput = ''; ptyProcess.onData((data) => (fullOutput += data)); // Wait for the app to be ready const isReady = await rig.waitForText('Type your message', 15000); expect( isReady, 'CLI did not start up in interactive mode correctly', ).toBe(true); const longPrompt = 'Dont do anything except returning a 1000 token long paragragh with the at the end to indicate end of response. This is a moderately long sentence.'; await type(ptyProcess, longPrompt); await type(ptyProcess, '\r'); await rig.waitForText('einstein', 25000); await type(ptyProcess, '/compress'); // A small delay to allow React to re-render the command list. await new Promise((resolve) => setTimeout(resolve, 100)); await type(ptyProcess, '\r'); const foundEvent = await rig.waitForTelemetryEvent( 'chat_compression', 90000, ); expect(foundEvent, 'chat_compression telemetry event was not found').toBe( true, ); }, ); it.skip('should handle compression failure on token inflation', async () => { await rig.setup('interactive-compress-test', { settings: { security: { auth: { selectedType: 'openai', }, }, }, }); const { ptyProcess } = rig.runInteractive(); let fullOutput = ''; ptyProcess.onData((data) => (fullOutput += data)); // Wait for the app to be ready const isReady = await rig.waitForText('Type your message', 25000); expect(isReady, 'CLI did not start up in interactive mode correctly').toBe( true, ); await type(ptyProcess, '/compress'); await new Promise((resolve) => setTimeout(resolve, 1000)); await type(ptyProcess, '\r'); const foundEvent = await rig.waitForTelemetryEvent( 'chat_compression', 90000, ); expect(foundEvent).toBe(true); const compressionFailed = await rig.waitForText( 'Nothing to compress.', 25000, ); expect(compressionFailed).toBe(true); }); });