feat: add background task notification system (#827)
Co-authored-by: Letta <noreply@letta.com>
This commit is contained in:
63
src/cli/helpers/messageQueueBridge.ts
Normal file
63
src/cli/helpers/messageQueueBridge.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* Message Queue Bridge
|
||||
*
|
||||
* Allows non-React code (like Task.ts) to add messages to the messageQueue.
|
||||
* The queue adder function is set by App.tsx on mount.
|
||||
*
|
||||
* This enables background tasks to queue their notification XML directly
|
||||
* into messageQueue, where the existing dequeue logic handles auto-firing.
|
||||
*/
|
||||
|
||||
export type QueuedMessage = {
|
||||
kind: "user" | "task_notification";
|
||||
text: string;
|
||||
};
|
||||
|
||||
type QueueAdder = (message: QueuedMessage) => void;
|
||||
|
||||
let queueAdder: QueueAdder | null = null;
|
||||
const pendingMessages: QueuedMessage[] = [];
|
||||
const MAX_PENDING_MESSAGES = 10;
|
||||
|
||||
/**
|
||||
* Set the queue adder function. Called by App.tsx on mount.
|
||||
*/
|
||||
export function setMessageQueueAdder(fn: QueueAdder | null): void {
|
||||
queueAdder = fn;
|
||||
if (queueAdder && pendingMessages.length > 0) {
|
||||
for (const message of pendingMessages) {
|
||||
queueAdder(message);
|
||||
}
|
||||
pendingMessages.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a message to the messageQueue.
|
||||
* Called from Task.ts when a background task completes.
|
||||
* If queue adder not set (App not mounted), message is dropped.
|
||||
*/
|
||||
export function addToMessageQueue(message: QueuedMessage): void {
|
||||
if (queueAdder) {
|
||||
queueAdder(message);
|
||||
return;
|
||||
}
|
||||
if (pendingMessages.length >= MAX_PENDING_MESSAGES) {
|
||||
pendingMessages.shift();
|
||||
}
|
||||
pendingMessages.push(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the queue bridge is connected.
|
||||
*/
|
||||
export function isQueueBridgeConnected(): boolean {
|
||||
return queueAdder !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear any pending messages (for testing).
|
||||
*/
|
||||
export function clearPendingMessages(): void {
|
||||
pendingMessages.length = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user