mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-20 11:00:40 -07:00
feat(ui): implement message queuing during streaming responses (#6049)
Co-authored-by: Jacob Richman <jacob314@gmail.com>
This commit is contained in:
69
packages/cli/src/ui/hooks/useMessageQueue.ts
Normal file
69
packages/cli/src/ui/hooks/useMessageQueue.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2025 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { StreamingState } from '../types.js';
|
||||
|
||||
export interface UseMessageQueueOptions {
|
||||
streamingState: StreamingState;
|
||||
submitQuery: (query: string) => void;
|
||||
}
|
||||
|
||||
export interface UseMessageQueueReturn {
|
||||
messageQueue: string[];
|
||||
addMessage: (message: string) => void;
|
||||
clearQueue: () => void;
|
||||
getQueuedMessagesText: () => string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook for managing message queuing during streaming responses.
|
||||
* Allows users to queue messages while the AI is responding and automatically
|
||||
* sends them when streaming completes.
|
||||
*/
|
||||
export function useMessageQueue({
|
||||
streamingState,
|
||||
submitQuery,
|
||||
}: UseMessageQueueOptions): UseMessageQueueReturn {
|
||||
const [messageQueue, setMessageQueue] = useState<string[]>([]);
|
||||
|
||||
// Add a message to the queue
|
||||
const addMessage = useCallback((message: string) => {
|
||||
const trimmedMessage = message.trim();
|
||||
if (trimmedMessage.length > 0) {
|
||||
setMessageQueue((prev) => [...prev, trimmedMessage]);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// Clear the entire queue
|
||||
const clearQueue = useCallback(() => {
|
||||
setMessageQueue([]);
|
||||
}, []);
|
||||
|
||||
// Get all queued messages as a single text string
|
||||
const getQueuedMessagesText = useCallback(() => {
|
||||
if (messageQueue.length === 0) return '';
|
||||
return messageQueue.join('\n\n');
|
||||
}, [messageQueue]);
|
||||
|
||||
// Process queued messages when streaming becomes idle
|
||||
useEffect(() => {
|
||||
if (streamingState === StreamingState.Idle && messageQueue.length > 0) {
|
||||
// Combine all messages with double newlines for clarity
|
||||
const combinedMessage = messageQueue.join('\n\n');
|
||||
// Clear the queue and submit
|
||||
setMessageQueue([]);
|
||||
submitQuery(combinedMessage);
|
||||
}
|
||||
}, [streamingState, messageQueue, submitQuery]);
|
||||
|
||||
return {
|
||||
messageQueue,
|
||||
addMessage,
|
||||
clearQueue,
|
||||
getQueuedMessagesText,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user