-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Expand file tree
/
Copy pathuseMessageQueue.ts
More file actions
100 lines (90 loc) · 2.58 KB
/
useMessageQueue.ts
File metadata and controls
100 lines (90 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* @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 {
isConfigInitialized: boolean;
streamingState: StreamingState;
submitQuery: (query: string) => void;
isMcpReady: boolean;
isCompressing?: boolean;
}
export interface UseMessageQueueReturn {
messageQueue: string[];
addMessage: (message: string) => void;
clearQueue: () => void;
getQueuedMessagesText: () => string;
popAllMessages: () => string | undefined;
}
/**
* 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({
isConfigInitialized,
streamingState,
submitQuery,
isMcpReady,
isCompressing = false,
}: 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]);
// Pop all messages from the queue and return them as a single string
const popAllMessages = useCallback(() => {
if (messageQueue.length === 0) {
return undefined;
}
const allMessages = messageQueue.join('\n\n');
setMessageQueue([]);
return allMessages;
}, [messageQueue]);
// Process queued messages when streaming becomes idle
useEffect(() => {
if (
isConfigInitialized &&
streamingState === StreamingState.Idle &&
!isCompressing &&
isMcpReady &&
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);
}
}, [
isConfigInitialized,
streamingState,
isMcpReady,
messageQueue,
submitQuery,
isCompressing,
]);
return {
messageQueue,
addMessage,
clearQueue,
getQueuedMessagesText,
popAllMessages,
};
}