/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { Box, Text } from 'ink'; import type { CompressionProps } from '../../types.js'; import Spinner from 'ink-spinner'; import { Colors } from '../../colors.js'; import { SCREEN_READER_MODEL_PREFIX } from '../../textConstants.js'; import { CompressionStatus } from '@vybestack/llxprt-code-core'; import { getSpinnerType } from '../../contexts/UnicodeRenderingContext.js'; export interface CompressionDisplayProps { compression: CompressionProps; } /* * Compression messages appear when the /compress command is run, and show a loading spinner * while compression is in progress, followed up by some compression stats. */ export const CompressionMessage: React.FC = ({ compression, }: CompressionDisplayProps): React.JSX.Element => { const { isPending, originalTokenCount, newTokenCount, compressionStatus } = compression; const originalTokens = originalTokenCount ?? 0; const newTokens = newTokenCount ?? 0; const getCompressionText = () => { if (isPending) { return 'Compressing chat history'; } switch (compressionStatus) { case CompressionStatus.COMPRESSED: return `Chat history compressed from ${originalTokens} to ${newTokens} tokens.`; case CompressionStatus.COMPRESSION_FAILED_INFLATED_TOKEN_COUNT: // For smaller histories (< 50k tokens), compression overhead likely exceeds benefits if (originalTokens < 50000) { return 'Compression was not beneficial for this history size.'; } // For larger histories where compression should work but didn't, // this suggests an issue with the compression process itself return 'Chat history compression did not reduce size. This may indicate issues with the compression prompt.'; case CompressionStatus.COMPRESSION_FAILED_TOKEN_COUNT_ERROR: return 'Could not compress chat history due to a token counting error.'; case CompressionStatus.COMPRESSION_FAILED_EMPTY_SUMMARY: return 'Chat history compression failed: the model returned an empty summary.'; case CompressionStatus.ALREADY_COMPRESSED: return 'Chat history was already recently compressed. No further reduction possible.'; case CompressionStatus.COMPRESSION_FAILED: return 'Compression attempt failed. All compression strategies encountered errors.'; case CompressionStatus.NOOP: return 'Nothing to compress.'; default: return ''; } }; const text = getCompressionText(); return ( {compression.isPending ? ( ) : ( )} {text} ); };