Files
letta-code/src/cli/helpers/messageQueueBridge.ts
2026-02-04 22:45:16 -08:00

64 lines
1.6 KiB
TypeScript

/**
* 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;
}