/** * Agent Message Queue - Handles message queuing for busy agents * * Problem: When an agent process is busy, incoming @mentions are silently dropped. * Solution: Queue messages per agent, automatically drain when agent becomes idle. * * Features: * - Per-agent FIFO queue * - Max 5 messages per agent (oldest dropped when full) * - 20-minute TTL (expired messages skipped) * - Auto-drain on agent 'idle' event * * Sprint 3 F7 */ import type { AgentRuntimeProcess } from './runtime-process.js'; /** * Message context (from multi-agent-slack.ts or multi-agent-discord.ts) */ export interface MessageContext { channelId: string; channelName?: string; userId?: string; userName?: string; messageId?: string; threadId?: string; files?: Array<{ url: string; name: string; type: string; }>; } /** * Queued message waiting for agent availability */ export interface QueuedMessage { /** Full prompt to send to agent */ prompt: string; /** Channel ID for response */ channelId: string; /** Thread timestamp (Slack) or message ID (Discord) */ threadTs?: string; /** Message source platform */ source: 'slack' | 'discord'; /** When message was enqueued (timestamp) */ enqueuedAt: number; /** Full message context */ context?: MessageContext; /** Discord message ID for emoji queue tracking (⏳→✅) */ discordMessageId?: string; /** Retry count for busy-agent re-queue */ retryCount?: number; } /** * Agent Message Queue Manager * * Manages per-agent message queues and automatic draining. */ export declare class AgentMessageQueue { private queues; /** Per-agent drain lock to prevent concurrent drain() calls (idle event + tryDrainNow race) */ private draining; /** * Enqueue a message for a busy agent * * @param agentId - Agent identifier * @param message - Message to queue */ enqueue(agentId: string, message: QueuedMessage): void; /** * Drain queued messages for an agent * * Called when agent becomes idle. Processes next message in queue. * * @param agentId - Agent identifier * @param process - Agent process to send message to * @param sendCallback - Callback to handle sending response to platform */ drain(agentId: string, process: AgentRuntimeProcess, sendCallback: (agentId: string, message: QueuedMessage, response: string) => Promise): Promise; private _drainInternal; /** * Get current queue size for an agent * * @param agentId - Agent identifier * @returns Number of queued messages */ getQueueSize(agentId: string): number; /** * Clear expired messages from all queues * * Should be called periodically (e.g., every minute). */ clearExpired(): void; /** * Get all agent IDs with queued messages * * @returns Array of agent IDs */ getAgentIds(): string[]; /** * Clear all queues (for testing) */ clearAll(): void; } //# sourceMappingURL=agent-message-queue.d.ts.map