@elqnt/chat 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../hooks/use-chat.ts","../transport/types.ts","../transport/sse.ts","../models/chat-models.ts"],"sourcesContent":["/**\n * @elqnt/chat\n *\n * Platform-agnostic chat SDK for React and React Native.\n * Uses POST + SSE for reliable real-time communication.\n *\n * @example Basic Usage\n * ```tsx\n * import { useChat } from \"@elqnt/chat/hooks\";\n *\n * function ChatComponent() {\n * const { connect, sendMessage, messages, isConnected } = useChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * userId: \"user-456\",\n * });\n *\n * useEffect(() => {\n * connect();\n * return () => disconnect();\n * }, []);\n *\n * return <ChatUI messages={messages} onSend={sendMessage} />;\n * }\n * ```\n *\n * @example With Custom Transport (React Native)\n * ```tsx\n * import { useChat } from \"@elqnt/chat/hooks\";\n * import { createFetchSSETransport } from \"@elqnt/chat/transport\";\n *\n * const transport = createFetchSSETransport();\n *\n * function App() {\n * const chat = useChat({\n * baseUrl: \"...\",\n * orgId: \"...\",\n * userId: \"...\",\n * transport,\n * });\n * }\n * ```\n *\n * ## Exports\n *\n * - `@elqnt/chat/hooks` - React hooks (useChat)\n * - `@elqnt/chat/api` - Low-level API functions\n * - `@elqnt/chat/models` - TypeScript types\n * - `@elqnt/chat/transport` - Transport adapters (SSE, fetch-SSE, WhatsApp)\n *\n * @packageDocumentation\n */\n\n// Re-export everything for convenience\nexport * from \"./hooks\";\nexport * from \"./models\";\n","\"use client\";\n\n/**\n * useChat Hook\n *\n * A unified React hook for chat functionality with support for\n * multiple transport types (SSE, fetch-based SSE, custom transports).\n *\n * @example Basic usage\n * ```tsx\n * function ChatComponent() {\n * const {\n * connect,\n * sendMessage,\n * messages,\n * isConnected,\n * } = useChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * userId: \"user-456\",\n * });\n *\n * useEffect(() => {\n * connect();\n * return () => disconnect();\n * }, []);\n *\n * return (\n * <div>\n * {messages.map(msg => <Message key={msg.id} {...msg} />)}\n * <input onSubmit={(content) => sendMessage(content)} />\n * </div>\n * );\n * }\n * ```\n *\n * @example With custom transport\n * ```tsx\n * import { createFetchSSETransport } from \"@elqnt/chat/transport\";\n *\n * const transport = createFetchSSETransport();\n *\n * function App() {\n * const chat = useChat({\n * baseUrl: \"...\",\n * orgId: \"...\",\n * userId: \"...\",\n * transport,\n * });\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Chat, ChatEvent, ChatMessage } from \"../models\";\nimport type {\n ChatTransport,\n TransportState,\n TransportError,\n ConnectionMetrics,\n RetryConfig,\n Unsubscribe,\n} from \"../transport/types\";\nimport { createSSETransport } from \"../transport/sse\";\n\n/**\n * Chat hook options\n */\nexport interface UseChatOptions {\n /** Base URL for the chat server (e.g., \"https://api.example.com/chat\") */\n baseUrl: string;\n /** Organization ID */\n orgId: string;\n /** User ID */\n userId: string;\n /** Client type for routing */\n clientType?: \"customer\" | \"humanAgent\" | \"observer\";\n /** Transport instance or type */\n transport?: ChatTransport | \"sse\" | \"sse-fetch\";\n /** Callback for all incoming events */\n onMessage?: (event: ChatEvent) => void;\n /** Callback for errors */\n onError?: (error: TransportError) => void;\n /** Callback when connection state changes */\n onConnectionChange?: (state: TransportState) => void;\n /** Auto-connect on mount */\n autoConnect?: boolean;\n /** Retry configuration */\n retryConfig?: RetryConfig;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Chat hook return type\n */\nexport interface UseChatReturn {\n // Connection\n /** Connect to the chat server */\n connect: () => Promise<void>;\n /** Disconnect from the server */\n disconnect: () => void;\n /** Current connection state */\n connectionState: TransportState;\n /** Whether currently connected */\n isConnected: boolean;\n\n // Chat operations\n /** Start a new chat session */\n startChat: (metadata?: Record<string, unknown>) => Promise<string>;\n /** Load an existing chat */\n loadChat: (chatKey: string) => Promise<void>;\n /** Send a text message */\n sendMessage: (content: string, attachments?: unknown[]) => Promise<void>;\n /** End the current chat */\n endChat: (reason?: string) => Promise<void>;\n\n // Typing indicators\n /** Signal that user is typing */\n startTyping: () => void;\n /** Signal that user stopped typing */\n stopTyping: () => void;\n\n // State\n /** Current chat object */\n currentChat: Chat | null;\n /** Current chat key */\n chatKey: string | null;\n /** Chat messages */\n messages: ChatMessage[];\n /** Current error */\n error: TransportError | null;\n /** Connection metrics */\n metrics: ConnectionMetrics;\n\n // Event subscription\n /** Subscribe to specific event type */\n on: (eventType: string, handler: (event: ChatEvent) => void) => Unsubscribe;\n /** Clear current error */\n clearError: () => void;\n}\n\n/**\n * Default transport factory\n */\nfunction getDefaultTransport(\n type: \"sse\" | \"sse-fetch\" | undefined,\n debug: boolean\n): ChatTransport {\n // For now, always use SSE. In the future, detect environment\n // and use fetch-based SSE for React Native\n return createSSETransport({ debug });\n}\n\n/**\n * useChat Hook\n *\n * Platform-agnostic chat hook with SSE transport support.\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const {\n baseUrl,\n orgId,\n userId,\n clientType = \"customer\",\n transport: transportOption,\n onMessage,\n onError,\n onConnectionChange,\n autoConnect = false,\n retryConfig,\n debug = false,\n } = options;\n\n // State\n const [connectionState, setConnectionState] = useState<TransportState>(\"disconnected\");\n const [currentChat, setCurrentChat] = useState<Chat | null>(null);\n const [chatKey, setChatKey] = useState<string | null>(null);\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [error, setError] = useState<TransportError | null>(null);\n const [metrics, setMetrics] = useState<ConnectionMetrics>({\n latency: 0,\n messagesSent: 0,\n messagesReceived: 0,\n messagesQueued: 0,\n reconnectCount: 0,\n });\n\n // Refs\n const transportRef = useRef<ChatTransport | null>(null);\n const mountedRef = useRef(false);\n const onMessageRef = useRef(onMessage);\n const onErrorRef = useRef(onError);\n const chatCreationResolverRef = useRef<{\n resolve: (chatKey: string) => void;\n reject: (error: Error) => void;\n } | null>(null);\n const typingTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Update callback refs\n useEffect(() => {\n onMessageRef.current = onMessage;\n onErrorRef.current = onError;\n }, [onMessage, onError]);\n\n // Initialize transport\n useEffect(() => {\n if (typeof transportOption === \"object\") {\n transportRef.current = transportOption;\n } else {\n transportRef.current = getDefaultTransport(\n transportOption as \"sse\" | \"sse-fetch\" | undefined,\n debug\n );\n }\n }, [transportOption, debug]);\n\n // Handle incoming events\n const handleEvent = useCallback((event: ChatEvent) => {\n if (!mountedRef.current) return;\n\n // Update metrics\n setMetrics((prev) => ({\n ...prev,\n messagesReceived: prev.messagesReceived + 1,\n lastMessageAt: Date.now(),\n }));\n\n // Handle specific event types\n switch (event.type) {\n case \"new_chat_created\":\n const newChatKey = event.data?.chatKey as string;\n if (newChatKey) {\n setChatKey(newChatKey);\n if (chatCreationResolverRef.current) {\n chatCreationResolverRef.current.resolve(newChatKey);\n chatCreationResolverRef.current = null;\n }\n }\n break;\n\n case \"load_chat_response\":\n const chat = event.data?.chat as Chat;\n if (chat) {\n setCurrentChat(chat);\n setChatKey(chat.key);\n setMessages(chat.messages || []);\n }\n break;\n\n case \"message\":\n if (event.message) {\n setMessages((prev) => [...prev, event.message!]);\n }\n break;\n\n case \"chat_ended\":\n setCurrentChat(null);\n setChatKey(null);\n break;\n\n case \"error\":\n const errorMsg = event.data?.message as string;\n if (errorMsg) {\n const transportError: TransportError = {\n code: \"NETWORK_ERROR\",\n message: errorMsg,\n retryable: true,\n timestamp: Date.now(),\n };\n setError(transportError);\n onErrorRef.current?.(transportError);\n }\n break;\n }\n\n // Call user's onMessage handler\n onMessageRef.current?.(event);\n }, []);\n\n // Connect to the chat server\n const connect = useCallback(async (): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n if (!orgId) {\n const err: TransportError = {\n code: \"CONNECTION_FAILED\",\n message: \"orgId is required\",\n retryable: false,\n timestamp: Date.now(),\n };\n setError(err);\n throw err;\n }\n\n setConnectionState(\"connecting\");\n\n try {\n // Subscribe to events before connecting\n const unsubscribe = transport.onMessage(handleEvent);\n\n await transport.connect({\n baseUrl,\n orgId,\n userId,\n clientType,\n chatKey: chatKey || undefined,\n debug,\n });\n\n setConnectionState(\"connected\");\n setError(null);\n setMetrics(transport.getMetrics());\n onConnectionChange?.(\"connected\");\n\n // Return cleanup in case caller wants it\n return;\n } catch (err) {\n const transportError = err as TransportError;\n setConnectionState(\"disconnected\");\n setError(transportError);\n onErrorRef.current?.(transportError);\n throw err;\n }\n }, [baseUrl, orgId, userId, clientType, chatKey, debug, handleEvent, onConnectionChange]);\n\n // Disconnect from the server\n const disconnect = useCallback((): void => {\n const transport = transportRef.current;\n if (transport) {\n transport.disconnect(true);\n }\n setConnectionState(\"disconnected\");\n onConnectionChange?.(\"disconnected\");\n }, [onConnectionChange]);\n\n // Start a new chat\n const startChat = useCallback(\n async (metadata?: Record<string, unknown>): Promise<string> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n return new Promise((resolve, reject) => {\n chatCreationResolverRef.current = { resolve, reject };\n\n transport\n .send({\n type: \"new_chat\",\n orgId,\n chatKey: \"\",\n userId,\n timestamp: Date.now(),\n data: metadata,\n })\n .catch((err) => {\n chatCreationResolverRef.current = null;\n reject(err);\n });\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (chatCreationResolverRef.current) {\n chatCreationResolverRef.current = null;\n reject(new Error(\"Chat creation timed out\"));\n }\n }, 30000);\n });\n },\n [orgId, userId]\n );\n\n // Load an existing chat\n const loadChat = useCallback(\n async (key: string): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n setChatKey(key);\n\n await transport.send({\n type: \"load_chat\",\n orgId,\n chatKey: key,\n userId,\n timestamp: Date.now(),\n });\n },\n [orgId, userId]\n );\n\n // Send a message\n const sendMessage = useCallback(\n async (content: string, attachments?: unknown[]): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n if (!chatKey) {\n throw new Error(\"No active chat\");\n }\n\n const message: ChatMessage = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n role: \"user\",\n content,\n time: Date.now(),\n status: \"sending\",\n senderId: userId,\n createdAt: Date.now(),\n attachments: attachments as ChatMessage[\"attachments\"],\n };\n\n // Optimistically add message\n setMessages((prev) => [...prev, message]);\n\n await transport.send({\n type: \"message\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n message,\n });\n\n setMetrics((prev) => ({\n ...prev,\n messagesSent: prev.messagesSent + 1,\n }));\n },\n [orgId, chatKey, userId]\n );\n\n // End the current chat\n const endChat = useCallback(\n async (reason?: string): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n if (!chatKey) {\n return;\n }\n\n await transport.send({\n type: \"end_chat\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n data: reason ? { reason } : undefined,\n });\n\n setCurrentChat(null);\n setChatKey(null);\n },\n [orgId, chatKey, userId]\n );\n\n // Start typing indicator\n const startTyping = useCallback((): void => {\n const transport = transportRef.current;\n if (!transport || !chatKey) return;\n\n // Clear existing timeout\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n\n transport\n .send({\n type: \"typing\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n })\n .catch(() => {});\n\n // Auto-stop typing after 3 seconds\n typingTimeoutRef.current = setTimeout(() => {\n stopTyping();\n }, 3000);\n }, [orgId, chatKey, userId]);\n\n // Stop typing indicator\n const stopTyping = useCallback((): void => {\n const transport = transportRef.current;\n if (!transport || !chatKey) return;\n\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n typingTimeoutRef.current = null;\n }\n\n transport\n .send({\n type: \"stopped_typing\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n })\n .catch(() => {});\n }, [orgId, chatKey, userId]);\n\n // Subscribe to specific event type\n const on = useCallback(\n (eventType: string, handler: (event: ChatEvent) => void): Unsubscribe => {\n const transport = transportRef.current;\n if (!transport) {\n return () => {};\n }\n return transport.on(eventType, handler);\n },\n []\n );\n\n // Clear error\n const clearError = useCallback((): void => {\n setError(null);\n transportRef.current?.clearError();\n }, []);\n\n // Mount/unmount lifecycle\n useEffect(() => {\n mountedRef.current = true;\n\n if (autoConnect) {\n connect().catch(() => {});\n }\n\n return () => {\n mountedRef.current = false;\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n disconnect();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Computed state\n const isConnected = connectionState === \"connected\";\n\n return {\n // Connection\n connect,\n disconnect,\n connectionState,\n isConnected,\n\n // Chat operations\n startChat,\n loadChat,\n sendMessage,\n endChat,\n\n // Typing\n startTyping,\n stopTyping,\n\n // State\n currentChat,\n chatKey,\n messages,\n error,\n metrics,\n\n // Events\n on,\n clearError,\n };\n}\n","/**\n * Transport Abstraction Layer Types\n *\n * Platform-agnostic transport interfaces for chat communication.\n * Supports browser SSE, React Native fetch-based SSE, and extensible\n * transports like WhatsApp Business API.\n */\n\nimport type { ChatEvent, ChatMessage } from \"../models\";\n\n/**\n * Transport connection state\n */\nexport type TransportState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\";\n\n/**\n * Transport error with retry information\n */\nexport interface TransportError {\n code:\n | \"CONNECTION_FAILED\"\n | \"PARSE_ERROR\"\n | \"SEND_FAILED\"\n | \"TIMEOUT\"\n | \"NETWORK_ERROR\"\n | \"AUTH_FAILED\";\n message: string;\n retryable: boolean;\n timestamp: number;\n originalError?: unknown;\n}\n\n/**\n * Configuration for transport connection\n */\nexport interface TransportConfig {\n /** Base URL for the chat server */\n baseUrl: string;\n /** Organization ID */\n orgId: string;\n /** User ID for authentication */\n userId: string;\n /** Client type for routing */\n clientType: \"customer\" | \"humanAgent\" | \"observer\";\n /** Optional current chat key for reconnection */\n chatKey?: string;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Retry configuration for connection attempts\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n maxRetries?: number;\n /** Initial retry intervals in milliseconds */\n intervals?: number[];\n /** Multiplier for exponential backoff */\n backoffMultiplier?: number;\n /** Maximum backoff time in milliseconds */\n maxBackoffTime?: number;\n}\n\n/**\n * Connection metrics for monitoring\n */\nexport interface ConnectionMetrics {\n /** Round-trip latency in milliseconds */\n latency: number;\n /** Total messages sent */\n messagesSent: number;\n /** Total messages received */\n messagesReceived: number;\n /** Messages waiting to be sent */\n messagesQueued: number;\n /** Number of reconnection attempts */\n reconnectCount: number;\n /** Last error encountered */\n lastError?: TransportError;\n /** Timestamp when connection was established */\n connectedAt?: number;\n /** Timestamp of last message */\n lastMessageAt?: number;\n /** Current transport type */\n transportType?: string;\n}\n\n/**\n * Event handler function type\n */\nexport type EventHandler<T = ChatEvent> = (event: T) => void;\n\n/**\n * Unsubscribe function returned by event subscription\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Send message options\n */\nexport interface SendMessageOptions {\n /** Message content */\n content: string;\n /** Optional attachments */\n attachments?: unknown[];\n /** Optional message metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Create chat options\n */\nexport interface CreateChatOptions {\n /** Organization ID */\n orgId: string;\n /** User ID */\n userId: string;\n /** Optional chat metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Load chat options\n */\nexport interface LoadChatOptions {\n /** Organization ID */\n orgId: string;\n /** Chat key to load */\n chatKey: string;\n /** User ID */\n userId: string;\n}\n\n/**\n * End chat options\n */\nexport interface EndChatOptions {\n /** Organization ID */\n orgId: string;\n /** Chat key to end */\n chatKey: string;\n /** User ID */\n userId: string;\n /** Optional end reason */\n reason?: string;\n}\n\n/**\n * Core transport interface\n *\n * Implementations must handle:\n * - Connection lifecycle (connect, disconnect, reconnect)\n * - Message sending (POST requests)\n * - Event receiving (SSE stream)\n * - Error handling and recovery\n */\nexport interface ChatTransport {\n /**\n * Connect to the chat server\n * @param config - Transport configuration\n * @returns Promise that resolves when connected\n */\n connect(config: TransportConfig): Promise<void>;\n\n /**\n * Disconnect from the server\n * @param intentional - Whether disconnect was user-initiated\n */\n disconnect(intentional?: boolean): void;\n\n /**\n * Send a chat event to the server\n * @param event - Chat event to send\n */\n send(event: ChatEvent): Promise<void>;\n\n /**\n * Send a message in the current chat\n * @param message - Message to send\n */\n sendMessage(message: ChatMessage): Promise<void>;\n\n /**\n * Subscribe to incoming events\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n onMessage(handler: EventHandler): Unsubscribe;\n\n /**\n * Subscribe to specific event type\n * @param eventType - Type of event to listen for\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on(eventType: string, handler: EventHandler): Unsubscribe;\n\n /**\n * Get current connection state\n */\n getState(): TransportState;\n\n /**\n * Get connection metrics\n */\n getMetrics(): ConnectionMetrics;\n\n /**\n * Get last error\n */\n getError(): TransportError | undefined;\n\n /**\n * Clear error state\n */\n clearError(): void;\n}\n\n/**\n * Transport factory function type\n */\nexport type TransportFactory = (config?: Partial<TransportConfig>) => ChatTransport;\n\n/**\n * Logger interface for transport debugging\n */\nexport interface TransportLogger {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n/**\n * Create a default logger\n * @param debug - Enable debug logging\n */\nexport function createLogger(debug: boolean = false): TransportLogger {\n return {\n debug: debug ? console.log.bind(console, \"[chat]\") : () => {},\n info: console.info.bind(console, \"[chat]\"),\n warn: console.warn.bind(console, \"[chat]\"),\n error: console.error.bind(console, \"[chat]\"),\n };\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 10,\n intervals: [1000, 2000, 5000],\n backoffMultiplier: 1.5,\n maxBackoffTime: 30000,\n};\n\n/**\n * Calculate retry interval with exponential backoff\n * @param retryCount - Current retry attempt number\n * @param config - Retry configuration\n */\nexport function calculateRetryInterval(\n retryCount: number,\n config: RetryConfig = DEFAULT_RETRY_CONFIG\n): number {\n const {\n intervals = DEFAULT_RETRY_CONFIG.intervals,\n backoffMultiplier = DEFAULT_RETRY_CONFIG.backoffMultiplier,\n maxBackoffTime = DEFAULT_RETRY_CONFIG.maxBackoffTime,\n } = config;\n\n if (retryCount < intervals.length) {\n return intervals[retryCount];\n }\n\n const baseInterval = intervals[intervals.length - 1] || 5000;\n const backoffTime =\n baseInterval * Math.pow(backoffMultiplier, retryCount - intervals.length + 1);\n return Math.min(backoffTime, maxBackoffTime);\n}\n","/**\n * SSE Transport (Browser)\n *\n * Uses native EventSource for receiving server events and fetch POST for sending.\n * This is the default transport for browser environments.\n *\n * @example\n * ```typescript\n * import { createSSETransport } from \"@elqnt/chat/transport\";\n *\n * const transport = createSSETransport();\n * await transport.connect({ baseUrl, orgId, userId, clientType: \"customer\" });\n * ```\n */\n\nimport type { ChatEvent, ChatMessage } from \"../models\";\nimport type {\n ChatTransport,\n TransportConfig,\n TransportState,\n TransportError,\n ConnectionMetrics,\n EventHandler,\n Unsubscribe,\n RetryConfig,\n TransportLogger,\n} from \"./types\";\nimport { createLogger, calculateRetryInterval, DEFAULT_RETRY_CONFIG } from \"./types\";\n\n/**\n * SSE Transport options\n */\nexport interface SSETransportOptions {\n /** Retry configuration */\n retryConfig?: RetryConfig;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom logger */\n logger?: TransportLogger;\n}\n\n/**\n * Create an SSE transport for browser environments\n */\nexport function createSSETransport(options: SSETransportOptions = {}): ChatTransport {\n const {\n retryConfig = DEFAULT_RETRY_CONFIG,\n debug = false,\n logger = createLogger(debug),\n } = options;\n\n // Internal state\n let eventSource: EventSource | undefined;\n let config: TransportConfig | undefined;\n let state: TransportState = \"disconnected\";\n let error: TransportError | undefined;\n let retryCount = 0;\n let reconnectTimeout: ReturnType<typeof setTimeout> | undefined;\n let intentionalDisconnect = false;\n\n // Metrics\n const metrics: ConnectionMetrics = {\n latency: 0,\n messagesSent: 0,\n messagesReceived: 0,\n messagesQueued: 0,\n reconnectCount: 0,\n transportType: \"sse\",\n };\n\n // Event handlers\n const globalHandlers = new Set<EventHandler>();\n const typeHandlers = new Map<string, Set<EventHandler>>();\n\n // Helper to emit events\n function emit(event: ChatEvent): void {\n // Update metrics\n metrics.messagesReceived++;\n metrics.lastMessageAt = Date.now();\n\n // Call global handlers\n globalHandlers.forEach((handler) => {\n try {\n handler(event);\n } catch (err) {\n logger.error(\"Error in message handler:\", err);\n }\n });\n\n // Call type-specific handlers\n const handlers = typeHandlers.get(event.type);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(event);\n } catch (err) {\n logger.error(`Error in ${event.type} handler:`, err);\n }\n });\n }\n }\n\n // REST API helper\n async function sendRest(endpoint: string, body: Record<string, unknown>): Promise<unknown> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n const url = `${config.baseUrl}/${endpoint}`;\n logger.debug(`POST ${endpoint}`, body);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`API error: ${response.status} - ${errorText}`);\n }\n\n return response.json();\n }\n\n // Handle SSE message\n function handleMessage(event: MessageEvent): void {\n if (!event.data || event.data === \"\") return;\n\n try {\n const data = JSON.parse(event.data) as ChatEvent;\n logger.debug(\"Received:\", data.type);\n emit(data);\n } catch (err) {\n logger.error(\"Failed to parse SSE message:\", err);\n }\n }\n\n // Setup SSE event listeners\n function setupEventListeners(es: EventSource): void {\n // Generic message handler\n es.addEventListener(\"message\", handleMessage);\n\n // Add handlers for known event types\n const eventTypes = [\n \"reconnected\", \"typing\", \"stopped_typing\", \"waiting\",\n \"waiting_for_agent\", \"human_agent_joined\", \"human_agent_left\",\n \"chat_ended\", \"chat_updated\", \"load_chat_response\",\n \"new_chat_created\", \"show_csat_survey\", \"csat_response\",\n \"user_suggested_actions\", \"agent_execution_started\",\n \"agent_execution_ended\", \"agent_context_update\",\n \"plan_pending_approval\", \"step_started\", \"step_completed\",\n \"step_failed\", \"plan_completed\", \"skills_changed\", \"summary_update\",\n ];\n\n eventTypes.forEach((type) => {\n es.addEventListener(type, handleMessage);\n });\n }\n\n // Schedule reconnect\n function scheduleReconnect(): void {\n if (intentionalDisconnect || !config) return;\n\n const maxRetries = retryConfig.maxRetries ?? DEFAULT_RETRY_CONFIG.maxRetries;\n if (retryCount >= maxRetries) {\n logger.error(`Max retries (${maxRetries}) exceeded`);\n error = {\n code: \"CONNECTION_FAILED\",\n message: `Max retries (${maxRetries}) exceeded`,\n retryable: false,\n timestamp: Date.now(),\n };\n return;\n }\n\n const interval = calculateRetryInterval(retryCount, retryConfig);\n retryCount++;\n metrics.reconnectCount++;\n\n logger.info(`Reconnecting in ${interval}ms (attempt ${retryCount})`);\n state = \"reconnecting\";\n\n reconnectTimeout = setTimeout(() => {\n if (config) {\n transport.connect(config).catch((err) => {\n logger.error(\"Reconnect failed:\", err);\n });\n }\n }, interval);\n }\n\n const transport: ChatTransport = {\n async connect(cfg: TransportConfig): Promise<void> {\n config = cfg;\n intentionalDisconnect = false;\n\n // Clean up existing connection\n if (eventSource) {\n eventSource.close();\n eventSource = undefined;\n }\n if (reconnectTimeout) {\n clearTimeout(reconnectTimeout);\n reconnectTimeout = undefined;\n }\n\n state = retryCount > 0 ? \"reconnecting\" : \"connecting\";\n\n return new Promise((resolve, reject) => {\n const connectionStart = Date.now();\n const url = `${cfg.baseUrl}/stream?orgId=${cfg.orgId}&userId=${cfg.userId}&clientType=${cfg.clientType}${cfg.chatKey ? `&chatId=${cfg.chatKey}` : \"\"}`;\n\n logger.debug(\"Connecting to:\", url);\n const es = new EventSource(url);\n\n es.onopen = () => {\n const connectionTime = Date.now() - connectionStart;\n logger.info(`Connected in ${connectionTime}ms`);\n\n state = \"connected\";\n error = undefined;\n retryCount = 0;\n metrics.connectedAt = Date.now();\n metrics.latency = connectionTime;\n\n setupEventListeners(es);\n resolve();\n };\n\n es.onerror = () => {\n if (es.readyState === EventSource.CLOSED) {\n const sseError: TransportError = {\n code: \"CONNECTION_FAILED\",\n message: \"SSE connection failed\",\n retryable: true,\n timestamp: Date.now(),\n };\n error = sseError;\n metrics.lastError = sseError;\n state = \"disconnected\";\n\n if (!intentionalDisconnect) {\n scheduleReconnect();\n }\n\n // Only reject if this is the initial connection attempt\n if (retryCount === 0) {\n reject(sseError);\n }\n }\n };\n\n eventSource = es;\n });\n },\n\n disconnect(intentional = true): void {\n logger.info(\"Disconnecting\", { intentional });\n intentionalDisconnect = intentional;\n\n if (reconnectTimeout) {\n clearTimeout(reconnectTimeout);\n reconnectTimeout = undefined;\n }\n\n if (eventSource) {\n eventSource.close();\n eventSource = undefined;\n }\n\n state = \"disconnected\";\n retryCount = 0;\n },\n\n async send(event: ChatEvent): Promise<void> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n // Map event types to REST endpoints\n switch (event.type) {\n case \"message\":\n await sendRest(\"send\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n message: event.message,\n });\n break;\n\n case \"typing\":\n await sendRest(\"typing\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n typing: true,\n });\n break;\n\n case \"stopped_typing\":\n await sendRest(\"typing\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n typing: false,\n });\n break;\n\n case \"load_chat\":\n await sendRest(\"load\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n });\n break;\n\n case \"new_chat\":\n await sendRest(\"create\", {\n orgId: event.orgId,\n userId: event.userId,\n metadata: event.data,\n });\n break;\n\n case \"end_chat\":\n await sendRest(\"end\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n data: event.data,\n });\n break;\n\n default:\n // Generic event endpoint for other types\n await sendRest(\"event\", {\n type: event.type,\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n data: event.data,\n });\n }\n\n metrics.messagesSent++;\n },\n\n async sendMessage(message: ChatMessage): Promise<void> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n await sendRest(\"send\", {\n orgId: config.orgId,\n chatKey: config.chatKey,\n userId: config.userId,\n message,\n });\n\n metrics.messagesSent++;\n },\n\n onMessage(handler: EventHandler): Unsubscribe {\n globalHandlers.add(handler);\n return () => globalHandlers.delete(handler);\n },\n\n on(eventType: string, handler: EventHandler): Unsubscribe {\n if (!typeHandlers.has(eventType)) {\n typeHandlers.set(eventType, new Set());\n }\n typeHandlers.get(eventType)!.add(handler);\n return () => {\n const handlers = typeHandlers.get(eventType);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n typeHandlers.delete(eventType);\n }\n }\n };\n },\n\n getState(): TransportState {\n return state;\n },\n\n getMetrics(): ConnectionMetrics {\n return { ...metrics };\n },\n\n getError(): TransportError | undefined {\n return error;\n },\n\n clearError(): void {\n error = undefined;\n },\n };\n\n return transport;\n}\n","// Code generated by tygo. DO NOT EDIT.\n// NOTE: @elqnt/kg and @elqnt/docs imports made generic for platform independence.\n// If you need strong typing for these, import the types separately and cast.\n\nimport { Variable } from \"@elqnt/types\";\nimport { ResponseMetadata, ProductNameTS } from \"@elqnt/types\";\n\n/**\n * Generic placeholder for KGNode when @elqnt/kg is not available.\n * Import from @elqnt/kg for full type support.\n */\nexport type KGNode = {\n id: string;\n type: string;\n properties?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/**\n * Generic placeholder for DocumentAnalysisResult when @elqnt/docs is not available.\n * Import from @elqnt/docs for full type support.\n */\nexport type DocumentAnalysisResult = {\n pages?: unknown[];\n content?: string;\n [key: string]: unknown;\n};\n\n//////////\n// source: chat-models.go\n\nexport type ChatStatusTS = 'active' | 'disconnected' | 'abandoned' | 'closed' | 'archived';\nexport type ChatStatus = string;\nexport const ChatStatusActive: ChatStatus = \"active\";\nexport const ChatStatusDisconnected: ChatStatus = \"disconnected\";\nexport const ChatStatusAbandoned: ChatStatus = \"abandoned\";\nexport const ChatStatusClosed: ChatStatus = \"closed\";\nexport const ChatStatusArchived: ChatStatus = \"archived\";\nexport type ChatTypeTS = 'customer_support' | 'public_room' | 'private_room' | 'direct' | 'group';\nexport type ChatType = string;\nexport const ChatTypeCustomerSupport: ChatType = \"customer_support\"; // Existing customer support chats\nexport const ChatTypePublicRoom: ChatType = \"public_room\"; // Public collaboration room\nexport const ChatTypePrivateRoom: ChatType = \"private_room\"; // Private collaboration room\nexport const ChatTypeDirect: ChatType = \"direct\"; // 1-on-1 direct message\nexport const ChatTypeGroup: ChatType = \"group\"; // Group chat/room\nexport interface Chat {\n orgId: string;\n key: string;\n title: string;\n messages: ChatMessage[];\n lastUpdated: number /* int64 */;\n startTime: number /* int64 */;\n users: ChatUser[];\n status: ChatStatusTS;\n aiEngaged: boolean;\n humanAgentEngaged: boolean;\n isWaiting: boolean;\n isWaitingForAgent: boolean;\n callRequested?: boolean;\n callStarted?: boolean;\n userRating?: number /* int */;\n metadata?: { [key: string]: any};\n grading?: ChatGrading;\n flow?: ChatFlow;\n context?: ChatContext;\n csatSent?: boolean;\n csatSentTime?: number /* int64 */;\n csatResponse?: any /* agents.CSATResponse */;\n /**\n * Active skills for this chat session\n */\n activeSkills?: any /* agents.Skill */[];\n /**\n * OpenAI Responses API - stores the last response ID for conversation continuity\n */\n lastResponseId?: string;\n /**\n * AgentContext - reference to structured context stored in separate NATS KV bucket\n * Key format: {agentId}:{chatKey} in bucket agent-contexts-org-{orgId}\n */\n agentContextKey?: string;\n /**\n * Chat Pin\n */\n pinned?: boolean;\n /**\n * Collab-specific fields\n */\n chatType?: ChatTypeTS;\n description?: string;\n}\nexport interface ChatContext {\n memory: { [key: string]: any};\n turnCount: number /* int */;\n lastIntent: string;\n activeTopic: string;\n}\nexport interface ChatFlow {\n flowDefinitionId: string;\n flowInstanceId?: string;\n flowInstanceLastUpdated?: number /* int64 */;\n tools?: ChatTool[];\n}\nexport interface ChatTool {\n name: string;\n description: string;\n type: string; // function, action, data_query etc\n parameters?: { [key: string]: any};\n}\nexport type ChatRoleTS = 'user' | 'ai' | 'event' | 'humanAgent' | 'observer' | 'dataQuery' | 'system' | 'tool';\nexport type ChatRole = string;\nexport const ChatRoleUser: ChatRole = \"user\";\nexport const ChatRoleAI: ChatRole = \"ai\";\nexport const ChatRoleEvent: ChatRole = \"event\";\nexport const ChatRoleHumanAgent: ChatRole = \"humanAgent\";\nexport const ChatRoleObserver: ChatRole = \"observer\";\nexport const ChatRoleDataQuery: ChatRole = \"dataQuery\";\nexport const ChatRoleSystem: ChatRole = \"system\";\nexport const ChatRoleTool: ChatRole = \"tool\";\nexport interface ChatUser {\n id: string;\n role: ChatRoleTS;\n name: string;\n email: string;\n phone?: string;\n authProvider: string;\n authToken: string;\n metadata?: { [key: string]: any};\n}\nexport type AgentStatusTS = 'online' | 'away' | 'busy' | 'offline';\nexport type AgentStatus = string;\nexport const AgentStatusOnline: AgentStatus = \"online\";\nexport const AgentStatusAway: AgentStatus = \"away\";\nexport const AgentStatusBusy: AgentStatus = \"busy\";\nexport const AgentStatusOffline: AgentStatus = \"offline\";\n/**\n * AgentSession represents an active agent session stored in Redis\n */\nexport interface AgentSession {\n agentId: string;\n orgId: string;\n onlineSince: number /* int64 */; // Unix timestamp\n lastActivity: number /* int64 */; // Unix timestamp\n status: AgentStatusTS;\n chatsHandled: number /* int */;\n activeChats: string[]; // Chat keys currently handling\n userAgent?: string;\n ipAddress?: string;\n metadata?: { [key: string]: any};\n}\nexport type ChatEventType = string;\n/**\n * ** user events\n */\nexport const ChatEventTypeUserJoined: ChatEventType = \"user_joined\";\nexport const ChatEventTypeUserLeft: ChatEventType = \"user_left\";\nexport const ChatEventTypeTyping: ChatEventType = \"typing\";\nexport const ChatEventTypeStoppedTyping: ChatEventType = \"stopped_typing\";\nexport const ChatEventTypeRead: ChatEventType = \"read\";\nexport const ChatEventTypeDelivered: ChatEventType = \"delivered\";\nexport const ChatEventTypeReconnected: ChatEventType = \"reconnected\";\nexport const ChatEventTypeError: ChatEventType = \"error\";\nexport const ChatEventTypeWaiting: ChatEventType = \"waiting\";\nexport const ChatEventTypeLoadChat: ChatEventType = \"load_chat\";\nexport const ChatEventTypeLoadChatResponse: ChatEventType = \"load_chat_response\";\nexport const ChatEventTypeMessage: ChatEventType = \"message\";\nexport const ChatEventTypeWaitingForAgent: ChatEventType = \"waiting_for_agent\";\nexport const ChatEventTypeMessageStatusUpdate: ChatEventType = \"message_status_update\";\nexport const ChatEventTypeHumanAgentJoined: ChatEventType = \"human_agent_joined\";\nexport const ChatEventTypeHumanAgentLeft: ChatEventType = \"human_agent_left\";\nexport const ChatEventTypeObserverJoined: ChatEventType = \"observer_joined\";\nexport const ChatEventTypeObserverLeft: ChatEventType = \"observer_left\";\nexport const ChatEventTypeListChats: ChatEventType = \"list_chats\";\nexport const ChatEventTypeChatUpdated: ChatEventType = \"chat_updated\";\nexport const ChatEventTypeChatRemoved: ChatEventType = \"chat_removed\";\nexport const ChatEventTypeSyncMetadata: ChatEventType = \"sync_metadata\";\nexport const ChatEventTypeSyncMetadataResponse: ChatEventType = \"sync_metadata_response\";\nexport const ChatEventTypeSyncUserSession: ChatEventType = \"sync_user_session\";\nexport const ChatEventTypeSyncUserSessionResponse: ChatEventType = \"sync_user_session_response\";\nexport const ChatEventTypeClientAction: ChatEventType = \"client_action\";\nexport const ChatEventTypeClientActionCallback: ChatEventType = \"client_action_callback\";\nexport const ChatEventTypeBlockUser: ChatEventType = \"block_user\";\n/**\n * ** collab room management events\n */\nexport const ChatEventTypeCreateRoom: ChatEventType = \"create_room\";\nexport const ChatEventTypeRoomCreated: ChatEventType = \"room_created\";\nexport const ChatEventTypeJoinRoom: ChatEventType = \"join_room\";\nexport const ChatEventTypeLeaveRoom: ChatEventType = \"leave_room\";\nexport const ChatEventTypeDeleteRoom: ChatEventType = \"delete_room\";\nexport const ChatEventTypeRoomDeleted: ChatEventType = \"room_deleted\";\nexport const ChatEventTypeUpdateRoom: ChatEventType = \"update_room\";\nexport const ChatEventTypeRoomUpdated: ChatEventType = \"room_updated\";\nexport const ChatEventTypeInviteUser: ChatEventType = \"invite_user\";\nexport const ChatEventTypeUserInvited: ChatEventType = \"user_invited\";\nexport const ChatEventTypeRoomUserJoined: ChatEventType = \"room_user_joined\";\nexport const ChatEventTypeRoomUserLeft: ChatEventType = \"room_user_left\";\nexport const ChatEventTypeUserRemoved: ChatEventType = \"user_removed\";\nexport const ChatEventTypeListRooms: ChatEventType = \"list_rooms\";\nexport const ChatEventTypeRoomsResponse: ChatEventType = \"rooms_response\";\n/**\n * ** collab message events\n */\nexport const ChatEventTypeMessageEdited: ChatEventType = \"message_edited\";\nexport const ChatEventTypeMessageDeleted: ChatEventType = \"message_deleted\";\nexport const ChatEventTypeMessageReaction: ChatEventType = \"message_reaction\";\nexport const ChatEventTypeMessageReply: ChatEventType = \"message_reply\";\nexport const ChatEventTypeMentionUser: ChatEventType = \"mention_user\";\nexport const ChatEventTypeMessageEditedResponse: ChatEventType = \"message_edited_response\";\nexport const ChatEventTypeMessageDeletedResponse: ChatEventType = \"message_deleted_response\";\nexport const ChatEventTypeMessageReactionResponse: ChatEventType = \"message_reaction_response\";\n/**\n * ** collab user presence events\n */\nexport const ChatEventTypeUserPresenceStart: ChatEventType = \"user_presence_start\";\nexport const ChatEventTypeUserPresenceEnd: ChatEventType = \"user_presence_end\";\nexport const ChatEventTypeUserStatusChange: ChatEventType = \"user_status_change\";\nexport const ChatEventTypeUserActivity: ChatEventType = \"user_activity\";\nexport const ChatEventTypeUserPresenceChanged: ChatEventType = \"user_presence_changed\";\nexport const ChatEventTypeUserActivityUpdate: ChatEventType = \"user_activity_update\";\nexport const ChatEventTypeGetOnlineUsers: ChatEventType = \"get_online_users\";\nexport const ChatEventTypeOnlineUsersResponse: ChatEventType = \"online_users\";\n/**\n * ** shop assist events\n */\nexport const ChatEventTypeEndChat: ChatEventType = \"end_chat\";\nexport const ChatEventTypeChatEnded: ChatEventType = \"chat_ended\";\n/**\n * ** agent session events\n */\nexport const ChatEventTypeAgentSessionStart: ChatEventType = \"agent_session_start\";\nexport const ChatEventTypeAgentSessionEnd: ChatEventType = \"agent_session_end\";\nexport const ChatEventTypeAgentStatusChange: ChatEventType = \"agent_status_change\";\nexport const ChatEventTypeAgentActivityPing: ChatEventType = \"agent_activity_ping\";\nexport const ChatEventTypeAgentChatAssigned: ChatEventType = \"agent_chat_assigned\";\nexport const ChatEventTypeAgentChatCompleted: ChatEventType = \"agent_chat_completed\";\n/**\n * ** AI agents retrieval events\n */\nexport const ChatEventTypeGetAgents: ChatEventType = \"get_agents\";\nexport const ChatEventTypeGetAgentsResponse: ChatEventType = \"get_agents_response\";\n/**\n * ** CSAT events\n */\nexport const ChatEventTypeCSATRequest: ChatEventType = \"csat_request\"; // Internal: scheduler requests chat to send CSAT\nexport const ChatEventTypeCSATSurvey: ChatEventType = \"show_csat_survey\";\nexport const ChatEventTypeCSATResponse: ChatEventType = \"csat_response\";\n/**\n * ** User Suggested Actions events\n */\nexport const ChatEventTypeUserSuggestedActions: ChatEventType = \"user_suggested_actions\";\nexport const ChatEventTypeUserSuggestedActionSelected: ChatEventType = \"user_suggested_action_selected\";\n/**\n * ** Summary events\n */\nexport const ChatEventTypeSummaryUpdate: ChatEventType = \"summary_update\";\n/**\n * ** Agent Context events\n */\nexport const ChatEventTypeAgentContextUpdate: ChatEventType = \"agent_context_update\";\nexport const ChatEventTypeAgentExecutionStarted: ChatEventType = \"agent_execution_started\";\nexport const ChatEventTypeAgentExecutionEnded: ChatEventType = \"agent_execution_ended\";\nexport const ChatEventTypeLoadAgentContext: ChatEventType = \"load_agent_context\";\nexport const ChatEventTypeLoadAgentContextResponse: ChatEventType = \"load_agent_context_response\";\n/**\n * ** Plan → Approve → Execute events\n */\nexport const ChatEventTypePlanPendingApproval: ChatEventType = \"plan_pending_approval\";\nexport const ChatEventTypePlanApproved: ChatEventType = \"plan_approved\";\nexport const ChatEventTypePlanRejected: ChatEventType = \"plan_rejected\";\nexport const ChatEventTypePlanCompleted: ChatEventType = \"plan_completed\";\nexport const ChatEventTypeStepStarted: ChatEventType = \"step_started\";\nexport const ChatEventTypeStepCompleted: ChatEventType = \"step_completed\";\nexport const ChatEventTypeStepFailed: ChatEventType = \"step_failed\";\n/**\n * ** New Chat events\n */\nexport const ChatEventTypeNewChat: ChatEventType = \"new_chat\";\nexport const ChatEventTypeNewChatCreated: ChatEventType = \"new_chat_created\";\n/**\n * ** Heartbeat events\n */\nexport const ChatEventTypePing: ChatEventType = \"ping\";\nexport const ChatEventTypePong: ChatEventType = \"pong\";\n/**\n * ** Skill activation events\n */\nexport const ChatEventTypeSkillActivate: ChatEventType = \"skill_activate\";\nexport const ChatEventTypeSkillDeactivate: ChatEventType = \"skill_deactivate\";\nexport const ChatEventTypeSkillsChanged: ChatEventType = \"skills_changed\";\n/**\n * ** Attachment processing events (deferred document processing)\n */\nexport const ChatEventTypeAttachmentProcessingStarted: ChatEventType = \"attachment_processing_started\";\nexport const ChatEventTypeAttachmentProcessingProgress: ChatEventType = \"attachment_processing_progress\";\nexport const ChatEventTypeAttachmentProcessingComplete: ChatEventType = \"attachment_processing_complete\";\nexport const ChatEventTypeAttachmentProcessingError: ChatEventType = \"attachment_processing_error\";\nexport const ChatEventTypeRetryAttachment: ChatEventType = \"retry_attachment\";\nexport type ChatEventTypeTS =\n | \"message\"\n | \"user_joined\"\n | \"user_left\"\n | \"typing\"\n | \"stopped_typing\"\n | \"read\"\n | \"delivered\"\n | \"reconnected\"\n | \"error\"\n | \"message_status_update\"\n | \"load_chat\"\n | \"load_chat_response\"\n | \"waiting\"\n | \"waiting_for_agent\"\n | \"human_agent_joined\"\n | \"end_chat\"\n | \"chat_ended\"\n | \"human_agent_left\"\n | \"observer_joined\"\n | \"observer_left\"\n | \"list_chats\"\n | \"chat_updated\"\n | \"chat_removed\"\n | \"sync_metadata\"\n | \"sync_metadata_response\"\n | \"sync_user_session\"\n | \"sync_user_session_response\"\n | \"agent_session_start\"\n | \"agent_session_end\"\n | \"agent_status_change\"\n | \"agent_activity_ping\"\n | \"agent_chat_assigned\"\n | \"agent_chat_completed\"\n | \"client_action\"\n | \"client_action_callback\"\n | \"show_csat_survey\"\n | \"csat_response\"\n | \"user_suggested_actions\"\n | \"user_suggested_action_selected\"\n | \"summary_update\"\n | \"agent_context_update\"\n | \"agent_execution_started\"\n | \"agent_execution_ended\"\n | \"load_agent_context\"\n | \"load_agent_context_response\"\n | \"plan_pending_approval\"\n | \"plan_approved\"\n | \"plan_rejected\"\n | \"plan_completed\"\n | \"step_started\"\n | \"step_completed\"\n | \"step_failed\"\n | \"new_chat\"\n | \"new_chat_created\"\n | \"block_user\"\n | \"ping\"\n | \"pong\"\n | \"create_room\"\n | \"room_created\"\n | \"join_room\"\n | \"leave_room\"\n | \"delete_room\"\n | \"room_deleted\"\n | \"update_room\"\n | \"room_updated\"\n | \"invite_user\"\n | \"user_invited\"\n | \"room_user_joined\"\n | \"room_user_left\"\n | \"user_removed\"\n | \"list_rooms\"\n | \"rooms_response\"\n | \"message_edited\"\n | \"message_deleted\"\n | \"message_reaction\"\n | \"message_reply\"\n | \"mention_user\"\n | \"message_edited_response\"\n | \"message_deleted_response\"\n | \"message_reaction_response\"\n | \"user_presence_start\"\n | \"user_presence_end\"\n | \"user_status_change\"\n | \"user_activity\"\n | \"user_presence_changed\"\n | \"user_activity_update\"\n | \"get_online_users\"\n | \"online_users\"\n | \"get_agents\"\n | \"get_agents_response\"\n | \"skill_activate\"\n | \"skill_deactivate\"\n | \"skills_changed\"\n | \"attachment_processing_started\"\n | \"attachment_processing_progress\"\n | \"attachment_processing_complete\"\n | \"attachment_processing_error\"\n | \"retry_attachment\";\nexport type MessageStatus = string;\nexport const MessageStatusSending: MessageStatus = \"sending\";\nexport const MessageStatusSent: MessageStatus = \"sent\";\nexport const MessageStatusDelivered: MessageStatus = \"delivered\";\nexport const MessageStatusRead: MessageStatus = \"read\";\nexport const MessageStatusFailed: MessageStatus = \"failed\";\nexport type MessageStatusTS =\n | \"sending\"\n | \"sent\"\n | \"delivered\"\n | \"read\"\n | \"failed\";\n/**\n * EmojiReaction represents an emoji reaction to a message\n */\nexport interface EmojiReaction {\n emoji: string;\n count: number /* int */;\n users?: string[]; // List of user IDs who reacted\n}\n/**\n * Location represents geographical coordinates\n */\nexport interface Location {\n latitude: number /* float64 */;\n longitude: number /* float64 */;\n address?: string;\n}\n/**\n * AttachmentFile represents a file within an attachment\n */\nexport interface AttachmentFile {\n type: string;\n url: string;\n thumbnailUrl?: string;\n name?: string;\n size?: number /* int64 */;\n}\nexport type AttachmentType = string;\n/**\n * Attachment types for both user and system attachments\n */\nexport const AttachmentTypeDocument: AttachmentType = \"document\";\nexport const AttachmentTypeDocumentAnalysis: AttachmentType = \"document_analysis\";\nexport const AttachmentTypeImage: AttachmentType = \"image\";\nexport const AttachmentTypeAudio: AttachmentType = \"audio\";\nexport const AttachmentTypeVideo: AttachmentType = \"video\";\nexport const AttachmentTypeLocation: AttachmentType = \"location\";\nexport const AttachmentTypeReferences: AttachmentType = \"references\";\nexport const AttachmentTypeSubsections: AttachmentType = \"subsections\";\nexport const AttachmentTypeArticles: AttachmentType = \"articles\";\nexport const AttachmentTypeRecords: AttachmentType = \"records\";\nexport const AttachmentTypeActions: AttachmentType = \"actions\";\nexport const AttachmentTypeBullets: AttachmentType = \"bullets\";\nexport const AttachmentTypeSticker: AttachmentType = \"sticker\";\nexport const AttachmentTypeData: AttachmentType = \"data\";\nexport const AttachmentTypeKGNodes: AttachmentType = \"kgNodes\";\nexport const AttachmentTypeDocumentSources: AttachmentType = \"document_sources\";\nexport const AttachmentTypeSpreadsheet: AttachmentType = \"spreadsheet\"; // Excel, CSV files\nexport const AttachmentTypeDataFile: AttachmentType = \"data_file\"; // JSON, XML, YAML files\n\nexport type AttachmentTypeTS =\n | \"document\"\n | \"document_analysis\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"location\"\n | \"references\"\n | \"subsections\"\n | \"articles\"\n | \"records\"\n | \"actions\"\n | \"bullets\"\n | \"sticker\"\n | \"data\"\n | \"kgNodes\"\n | \"document_sources\"\n | \"spreadsheet\"\n | \"data_file\";\n\n/**\n * DocumentSource represents an aggregated document source with page references\n * Used to display source cards in chat responses after document search\n */\nexport interface DocumentSource {\n doc_id: string;\n title: string;\n url: string;\n page_numbers: number /* int */[];\n reference_count: number /* int */;\n bounding_regions?: any /* docs.BoundingRegion */[];\n page_infos?: any /* docs.PageInfo */[]; // Page dimensions for coordinate scaling\n}\n/**\n * Attachment represents any type of attachment to a message\n */\nexport interface Attachment {\n type: AttachmentTypeTS;\n documentAnalysis?: DocumentAnalysisResult;\n title?: string;\n url: string;\n files?: AttachmentFile[]; // Associated files\n location?: Location; // Location data if applicable\n data?: { [key: string]: Variable};\n kgNodes?: KGNode[];\n actions?: Action[];\n documentSources?: DocumentSource[];\n /**\n * Smart document processing fields\n */\n fileMetadata?: any /* docs.AttachmentFileMetadata */; // Client-side extracted file metadata\n processing?: any /* docs.ProcessingResult */; // Smart processing result\n}\nexport interface Action {\n id: string;\n title: string;\n icon?: string;\n description?: string;\n onAction?: () => void;\n}\n/**\n * ChatMessage represents the core message structure\n */\nexport interface ChatMessage {\n /**\n * Core fields\n */\n id: string;\n role: ChatRoleTS;\n content: string;\n time: number /* int64 */;\n status: MessageStatusTS;\n /**\n * Sender information\n */\n senderId: string;\n senderName?: string;\n /**\n * Timing\n */\n createdAt: number /* int64 */;\n updatedAt?: number /* int64 */;\n /**\n * Message relations\n */\n replyTo?: string;\n threadId?: string;\n mentions?: string[];\n /**\n * Attachments and reactions\n */\n attachments?: Attachment[];\n reactions?: EmojiReaction[];\n /**\n * Additional data\n */\n variables?: { [key: string]: Variable};\n /**\n * Tool call\n */\n name?: string;\n toolCallId?: string;\n toolCalls?: ToolCall[];\n /**\n * LLM usage\n */\n llmUsage?: LLMUsage;\n}\nexport interface ChatEvent {\n type: ChatEventTypeTS;\n orgId: string;\n chatKey: string;\n userId: string;\n timestamp: number /* int64 */;\n data?: { [key: string]: any};\n message?: ChatMessage;\n}\nexport interface ChatGrading {\n chatKey: string;\n grade: number /* int */;\n topic: string;\n summary: string;\n}\nexport interface ChatSession {\n id: string;\n status: ChatSessionStatus;\n user?: ChatUser;\n activeChatKey?: string;\n preferences?: ChatSessionPreferences;\n lastActivity: number /* int64 */;\n expiresAt: number /* int64 */;\n metadata?: { [key: string]: any};\n}\nexport type ChatSessionStatus = string;\nexport const ChatSessionStatusActive: ChatSessionStatus = \"active\";\nexport const ChatSessionStatusIdle: ChatSessionStatus = \"idle\";\nexport const ChatSessionStatusExpired: ChatSessionStatus = \"expired\";\nexport interface ChatSessionPreferences {\n language: string;\n theme: string;\n notifications: boolean;\n timeZone: string;\n messageDisplay: string; // compact/expanded\n autoTranslate: boolean;\n rateLimits?: ChatRateLimits;\n}\nexport interface ChatRateLimits {\n maxMessagesPerMinute: number /* int */;\n maxTokensPerDay: number /* int */;\n cooldownPeriod: number /* int */; // seconds\n}\n/**\n * ==========================\n * todo: move to common/llm\n */\nexport interface LLMConfig {\n Provider: string;\n Model: string;\n Temperature: number /* float64 */;\n MaxTokens: number /* int */;\n SystemPrompt: string;\n Tools: LLMTool[];\n Memory?: LLMMemoryConfig;\n}\nexport interface LLMMemoryConfig {\n MaxMessages: number /* int */;\n IncludeSystem: boolean;\n WindowSize: number /* int */; // Token window size\n Strategy: string; // e.g., \"sliding\", \"summarize\"\n}\nexport interface LLMTool {\n Name: string;\n Type: string;\n Function: LLMFunction;\n}\nexport interface LLMFunction {\n Name: string;\n Description: string;\n Parameters: any /* types.JSONSchema */;\n}\nexport interface ToolCall {\n Name: string;\n Arguments: { [key: string]: any};\n ID: string;\n Description: string;\n}\nexport interface LLMResponse {\n Content: string;\n ToolCalls: ToolCall[];\n Usage?: LLMUsage;\n ResponseId: string; // OpenAI Responses API - the response ID for conversation continuity\n}\nexport interface LLMUsage {\n inputTokens: number /* int64 */;\n outputTokens: number /* int64 */;\n totalTokens: number /* int64 */;\n}\n/**\n * ChatSummary represents lightweight chat information for caching and listing\n */\nexport interface ChatSummary {\n chatKey: string;\n title: string;\n userId?: string;\n status: ChatStatus;\n lastUpdated: number /* int64 */;\n waitingSince?: number /* int64 */; // Only populated for waiting chats\n pinned?: boolean;\n metadata?: { [key: string]: any};\n}\nexport interface GetChatRequest {\n orgId: string;\n chatKey: string;\n}\nexport interface GetChatResponse {\n chat?: Chat;\n metadata: ResponseMetadata;\n}\nexport interface ChatProductReference {\n id: string;\n title: string;\n price: number /* float64 */;\n image?: string;\n url?: string;\n}\n/**\n * Chat Archival Models\n */\nexport interface ChatArchivalRequest {\n orgId: string;\n chatKey: string;\n chat: Chat;\n}\nexport interface ChatArchivalResponse {\n success: boolean;\n error?: string;\n message?: string;\n}\n/**\n * Agent Session Request/Response Models\n */\nexport interface StartAgentSessionRequest {\n orgId: string;\n agentId: string;\n userAgent?: string;\n ipAddress?: string;\n}\nexport interface StartAgentSessionResponse {\n metadata: ResponseMetadata;\n}\nexport interface EndAgentSessionRequest {\n orgId: string;\n agentId: string;\n}\nexport interface EndAgentSessionResponse {\n metadata: ResponseMetadata;\n}\nexport interface UpdateAgentStatusRequest {\n orgId: string;\n agentId: string;\n status: AgentStatusTS;\n}\nexport interface UpdateAgentStatusResponse {\n metadata: ResponseMetadata;\n}\nexport interface UpdateAgentLastActivityRequest {\n orgId: string;\n agentId: string;\n}\nexport interface UpdateAgentLastActivityResponse {\n metadata: ResponseMetadata;\n}\nexport interface AssignChatToAgentRequest {\n orgId: string;\n agentId: string;\n chatKey: string;\n}\nexport interface AssignChatToAgentResponse {\n metadata: ResponseMetadata;\n}\nexport interface CompleteChatByAgentRequest {\n orgId: string;\n agentId: string;\n chatKey: string;\n}\nexport interface CompleteChatByAgentResponse {\n metadata: ResponseMetadata;\n}\nexport interface GetAgentSessionRequest {\n orgId: string;\n agentId: string;\n}\nexport interface GetAgentSessionResponse {\n session?: AgentSession;\n metadata: ResponseMetadata;\n}\nexport interface GetOnlineAgentsRequest {\n orgId: string;\n}\nexport interface GetOnlineAgentsResponse {\n sessions: AgentSession[];\n metadata: ResponseMetadata;\n}\nexport interface GetOnlineAgentCountRequest {\n orgId: string;\n}\nexport interface GetOnlineAgentCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\n/**\n * Queue-specific chat request/response types\n */\nexport interface GetQueueChatsRequest {\n orgId: string;\n queueId: string;\n}\nexport interface GetQueueChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\nexport interface GetQueueChatCountRequest {\n orgId: string;\n queueId: string;\n}\nexport interface GetQueueChatCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\nexport type UserStatusTS = 'online' | 'away' | 'busy' | 'offline';\nexport type UserStatus = string;\nexport const UserStatusOnline: UserStatus = \"online\";\nexport const UserStatusAway: UserStatus = \"away\";\nexport const UserStatusBusy: UserStatus = \"busy\";\nexport const UserStatusOffline: UserStatus = \"offline\";\n/**\n * UserSession for tracking online users\n */\nexport interface UserSession {\n orgId: string;\n userId: string;\n userName: string;\n status: UserStatusTS;\n onlineSince: number /* int64 */;\n lastActivity: number /* int64 */;\n}\n/**\n * User status update requests\n */\nexport interface UpdateUserStatusRequest {\n orgId: string;\n userId: string;\n status: UserStatusTS;\n}\nexport interface UpdateUserStatusResponse {\n metadata: ResponseMetadata;\n}\n/**\n * Get online users\n */\nexport interface GetOnlineUsersRequest {\n orgId: string;\n}\nexport interface GetOnlineUsersResponse {\n metadata: ResponseMetadata;\n users: UserSession[];\n}\n/**\n * Analytics Trigger Models\n */\nexport interface TriggerAnalyticsScanRequest {\n org_id?: string; // Optional: if empty, scans all orgs\n}\nexport interface TriggerAnalyticsScanResponse {\n metadata: ResponseMetadata;\n chats_archived: number /* int */;\n}\n/**\n * AttachmentProcessingStartedData is sent when attachment processing begins\n */\nexport interface AttachmentProcessingStartedData {\n attachmentId: string;\n fileName: string;\n strategy: string;\n}\n/**\n * AttachmentProcessingProgressData is sent during attachment processing\n */\nexport interface AttachmentProcessingProgressData {\n attachmentId: string;\n percent: number /* int */;\n stage: string;\n message: string;\n}\n/**\n * AttachmentProcessingCompleteData is sent when attachment processing completes\n */\nexport interface AttachmentProcessingCompleteData {\n attachmentId: string;\n result?: any /* docs.ProcessingResult */;\n}\n/**\n * AttachmentProcessingErrorData is sent when attachment processing fails\n */\nexport interface AttachmentProcessingErrorData {\n attachmentId: string;\n error: string;\n retryable: boolean;\n}\n/**\n * RetryAttachmentData is sent by frontend to retry a failed attachment\n */\nexport interface RetryAttachmentData {\n attachmentId: string;\n}\n\n//////////\n// source: chat-stats-models.go\n\n/**\n * Active chat requests/responses\n */\nexport interface GetActiveChatCountRequest {\n orgId: string;\n}\nexport interface GetActiveChatCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\nexport interface GetActiveChatsRequest {\n orgId: string;\n pastHours?: number /* float64 */; // 0 means all, 0.5 means past 30 min, 1 means past hour, etc.\n}\nexport interface GetActiveChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\n/**\n * Waiting for agent requests/responses\n */\nexport interface GetWaitingForAgentChatCountRequest {\n orgId: string;\n}\nexport interface GetWaitingForAgentChatCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\nexport interface GetWaitingForAgentChatsRequest {\n orgId: string;\n}\nexport interface GetWaitingForAgentChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\n/**\n * User chats requests/responses\n */\nexport interface GetUserChatsRequest {\n orgId: string;\n userId: string;\n limit?: number /* int */; // Number of chats to return (default 15)\n offset?: number /* int */; // Number of chats to skip (for pagination)\n}\nexport interface GetUserChatsResponse {\n chats: ChatSummary[];\n total: number /* int */; // Total number of chats for this user\n hasMore: boolean; // Whether there are more chats to load\n metadata: ResponseMetadata;\n}\n/**\n * Daily counter requests/responses\n */\nexport interface GetDailyChatCountRequest {\n orgId: string;\n date: string /* RFC3339 */;\n timezone: string;\n}\nexport interface GetDailyChatCountResponse {\n count: number /* int64 */;\n date: string;\n timezone: string;\n metadata: any /* types.ResponseMetadata */;\n}\n\n//////////\n// source: queue-models.go\n\n\n// Queue types\nexport const QueueTypes = {\n skill: { value: 'skill', label: 'Skill-based', description: 'Route by agent expertise and skills' },\n priority: { value: 'priority', label: 'Priority-based', description: 'Route by customer tier and urgency level' },\n department: { value: 'department', label: 'Department-based', description: 'Route by business function alignment' },\n complexity: { value: 'complexity', label: 'Complexity-based', description: 'Route by issue difficulty assessment' },\n} as const;\n\nexport type QueueTypeTS = keyof typeof QueueTypes;\nexport type QueueTypeOptionTS = typeof QueueTypes[QueueTypeTS];\n\n/**\n * QueueType represents the routing algorithm type\n */\nexport type QueueType = string;\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypeSkill: QueueType = \"skill\";\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypePriority: QueueType = \"priority\";\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypeDepartment: QueueType = \"department\";\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypeComplexity: QueueType = \"complexity\";\n/**\n * AgentQueue represents an individual queue within a queue type\n */\nexport interface AgentQueue {\n id: string /* uuid */;\n orgId: string;\n type: QueueTypeTS; // \"skill\", \"priority\", etc.\n name: string; // 'technical_support', 'sales', etc. (snake_case for metadata matching)\n title: string; // 'Technical Support', 'Sales', etc. (human-readable display name)\n description: string;\n agentIds: string[]; // Agents assigned to this queue\n config: { [key: string]: any}; // Extensible configuration\n isActive: boolean;\n isDefault: boolean; // Default queue for unmatched chats\n createdAt: string /* RFC3339 */;\n updatedAt: string /* RFC3339 */;\n createdBy?: string;\n updatedBy?: string;\n}\n/**\n * GetAgentQueuesFilter represents filtering options for agent queues\n */\nexport interface GetAgentQueuesFilter {\n type?: QueueType;\n isActive?: boolean;\n}\n/**\n * Agent Queue Operations\n */\nexport interface CreateAgentQueueRequest {\n orgId: string;\n type: QueueType; // QueueTypeSkill, QueueTypePriority, etc.\n name: string; // 'technical_support', 'sales', etc. (snake_case)\n title: string; // 'Technical Support', 'Sales', etc. (human-readable)\n description: string;\n agentIds?: string[];\n config?: { [key: string]: any};\n isDefault?: boolean;\n createdBy?: string;\n updatedBy?: string;\n}\nexport interface CreateAgentQueueResponse {\n queue?: AgentQueue;\n metadata: any /* types.ResponseMetadata */;\n}\nexport interface GetAgentQueuesRequest {\n orgId: string;\n type?: QueueType; // Filter by queue type\n isActive?: boolean; // Filter by active status\n}\nexport interface GetAgentQueuesResponse {\n queues: (AgentQueue | undefined)[];\n metadata: any /* types.ResponseMetadata */;\n}\nexport interface UpdateAgentQueueRequest {\n orgId: string;\n id: string;\n type: QueueType; // QueueTypeSkill, QueueTypePriority, etc.\n name: string; // 'technical_support', 'sales', etc. (snake_case)\n title: string; // 'Technical Support', 'Sales', etc. (human-readable)\n description: string;\n agentIds?: string[];\n config?: { [key: string]: any};\n isDefault?: boolean;\n updatedBy?: string;\n}\nexport interface UpdateAgentQueueResponse {\n queue?: AgentQueue;\n metadata: any /* types.ResponseMetadata */;\n}\nexport interface DeleteAgentQueueRequest {\n orgId: string;\n id: string;\n}\nexport interface DeleteAgentQueueResponse {\n metadata: any /* types.ResponseMetadata */;\n}\n/**\n * ChatQueueInfo extends Chat with queue routing information\n */\nexport interface ChatQueueInfo {\n recommendedQueueId?: string /* uuid */;\n recommendedQueueName?: string;\n assignedQueueId?: string /* uuid */;\n assignedQueueName?: string;\n}\n\n//////////\n// source: subjects.go\n\nexport const GetWaitingForAgentChatCountSubject = \"chat.get_waiting_for_agent_chat_count\";\nexport const GetActiveChatCountSubject = \"chat.get_active_chat_count\";\nexport const GetWaitingForAgentChatsSubject = \"chat.get_waiting_for_agent_chats\";\nexport const GetActiveChatsSubject = \"chat.get_active_chats\";\nexport const GetUserChatsSubject = \"chat.get_user_chats\";\nexport const GetChatSubject = \"chat.get_chat\";\n/**\n * Chat Archival Subjects\n */\nexport const ChatArchiveSubjectPattern = \"chat.archive.%s.server\"; // %s = channel/product (e.g., shop-assist, gov-services)\n/**\n * Agent Session Subjects\n */\nexport const StartAgentSessionSubject = \"chat.agent_session.start\";\nexport const EndAgentSessionSubject = \"chat.agent_session.end\";\nexport const UpdateAgentStatusSubject = \"chat.agent_session.update_status\";\nexport const UpdateAgentLastActivitySubject = \"chat.agent_session.update_last_activity\";\nexport const AssignChatToAgentSubject = \"chat.agent_session.assign_chat\";\nexport const CompleteChatByAgentSubject = \"chat.agent_session.complete_chat\";\nexport const GetAgentSessionSubject = \"chat.agent_session.get\";\nexport const GetOnlineAgentsSubject = \"chat.agent_session.get_online_agents\";\nexport const GetOnlineAgentCountSubject = \"chat.agent_session.get_online_agent_count\";\n/**\n * Queue Management Subjects\n */\nexport const CreateAgentQueueSubject = \"chat.agent_queue.create\";\nexport const GetAgentQueuesSubject = \"chat.agent_queue.get\";\nexport const UpdateAgentQueueSubject = \"chat.agent_queue.update\";\nexport const DeleteAgentQueueSubject = \"chat.agent_queue.delete\";\n/**\n * Queue-specific Chat Subjects\n */\nexport const GetQueueChatsSubject = \"chat.queue.get_chats\";\nexport const GetQueueChatCountSubject = \"chat.queue.get_chat_count\";\n/**\n * Daily Counter Subjects\n */\nexport const GetDailyChatCountSubject = \"chat.get_daily_chat_count\";\n/**\n * User Status Subjects\n */\nexport const UpdateUserStatusSubject = \"chat.user.status.update\";\nexport const GetOnlineUsersSubject = \"chat.users.online.get\";\n/**\n * Analytics Trigger Subjects\n */\nexport const TriggerAnalyticsScanSubject = \"chat.analytics.trigger-scan\";\n/**\n * Org Setup Subject\n */\nexport const SetupOrgSubject = \"chat.org.setup\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACqDA,mBAAyD;;;AC6LlD,SAAS,aAAa,QAAiB,OAAwB;AACpE,SAAO;AAAA,IACL,OAAO,QAAQ,QAAQ,IAAI,KAAK,SAAS,QAAQ,IAAI,MAAM;AAAA,IAAC;AAAA,IAC5D,MAAM,QAAQ,KAAK,KAAK,SAAS,QAAQ;AAAA,IACzC,MAAM,QAAQ,KAAK,KAAK,SAAS,QAAQ;AAAA,IACzC,OAAO,QAAQ,MAAM,KAAK,SAAS,QAAQ;AAAA,EAC7C;AACF;AAKO,IAAM,uBAA8C;AAAA,EACzD,YAAY;AAAA,EACZ,WAAW,CAAC,KAAM,KAAM,GAAI;AAAA,EAC5B,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;AAOO,SAAS,uBACd,YACA,SAAsB,sBACd;AACR,QAAM;AAAA,IACJ,YAAY,qBAAqB;AAAA,IACjC,oBAAoB,qBAAqB;AAAA,IACzC,iBAAiB,qBAAqB;AAAA,EACxC,IAAI;AAEJ,MAAI,aAAa,UAAU,QAAQ;AACjC,WAAO,UAAU,UAAU;AAAA,EAC7B;AAEA,QAAM,eAAe,UAAU,UAAU,SAAS,CAAC,KAAK;AACxD,QAAM,cACJ,eAAe,KAAK,IAAI,mBAAmB,aAAa,UAAU,SAAS,CAAC;AAC9E,SAAO,KAAK,IAAI,aAAa,cAAc;AAC7C;;;AChPO,SAAS,mBAAmB,UAA+B,CAAC,GAAkB;AACnF,QAAM;AAAA,IACJ,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,SAAS,aAAa,KAAK;AAAA,EAC7B,IAAI;AAGJ,MAAI;AACJ,MAAI;AACJ,MAAI,QAAwB;AAC5B,MAAI;AACJ,MAAI,aAAa;AACjB,MAAI;AACJ,MAAI,wBAAwB;AAG5B,QAAM,UAA6B;AAAA,IACjC,SAAS;AAAA,IACT,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAGA,QAAM,iBAAiB,oBAAI,IAAkB;AAC7C,QAAM,eAAe,oBAAI,IAA+B;AAGxD,WAAS,KAAK,OAAwB;AAEpC,YAAQ;AACR,YAAQ,gBAAgB,KAAK,IAAI;AAGjC,mBAAe,QAAQ,CAAC,YAAY;AAClC,UAAI;AACF,gBAAQ,KAAK;AAAA,MACf,SAAS,KAAK;AACZ,eAAO,MAAM,6BAA6B,GAAG;AAAA,MAC/C;AAAA,IACF,CAAC;AAGD,UAAM,WAAW,aAAa,IAAI,MAAM,IAAI;AAC5C,QAAI,UAAU;AACZ,eAAS,QAAQ,CAAC,YAAY;AAC5B,YAAI;AACF,kBAAQ,KAAK;AAAA,QACf,SAAS,KAAK;AACZ,iBAAO,MAAM,YAAY,MAAM,IAAI,aAAa,GAAG;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,iBAAe,SAAS,UAAkB,MAAiD;AACzF,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,UAAM,MAAM,GAAG,OAAO,OAAO,IAAI,QAAQ;AACzC,WAAO,MAAM,QAAQ,QAAQ,IAAI,IAAI;AAErC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,IAAI,MAAM,cAAc,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,IAChE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAGA,WAAS,cAAc,OAA2B;AAChD,QAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,GAAI;AAEtC,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,aAAO,MAAM,aAAa,KAAK,IAAI;AACnC,WAAK,IAAI;AAAA,IACX,SAAS,KAAK;AACZ,aAAO,MAAM,gCAAgC,GAAG;AAAA,IAClD;AAAA,EACF;AAGA,WAAS,oBAAoB,IAAuB;AAElD,OAAG,iBAAiB,WAAW,aAAa;AAG5C,UAAM,aAAa;AAAA,MACjB;AAAA,MAAe;AAAA,MAAU;AAAA,MAAkB;AAAA,MAC3C;AAAA,MAAqB;AAAA,MAAsB;AAAA,MAC3C;AAAA,MAAc;AAAA,MAAgB;AAAA,MAC9B;AAAA,MAAoB;AAAA,MAAoB;AAAA,MACxC;AAAA,MAA0B;AAAA,MAC1B;AAAA,MAAyB;AAAA,MACzB;AAAA,MAAyB;AAAA,MAAgB;AAAA,MACzC;AAAA,MAAe;AAAA,MAAkB;AAAA,MAAkB;AAAA,IACrD;AAEA,eAAW,QAAQ,CAAC,SAAS;AAC3B,SAAG,iBAAiB,MAAM,aAAa;AAAA,IACzC,CAAC;AAAA,EACH;AAGA,WAAS,oBAA0B;AACjC,QAAI,yBAAyB,CAAC,OAAQ;AAEtC,UAAM,aAAa,YAAY,cAAc,qBAAqB;AAClE,QAAI,cAAc,YAAY;AAC5B,aAAO,MAAM,gBAAgB,UAAU,YAAY;AACnD,cAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS,gBAAgB,UAAU;AAAA,QACnC,WAAW;AAAA,QACX,WAAW,KAAK,IAAI;AAAA,MACtB;AACA;AAAA,IACF;AAEA,UAAM,WAAW,uBAAuB,YAAY,WAAW;AAC/D;AACA,YAAQ;AAER,WAAO,KAAK,mBAAmB,QAAQ,eAAe,UAAU,GAAG;AACnE,YAAQ;AAER,uBAAmB,WAAW,MAAM;AAClC,UAAI,QAAQ;AACV,kBAAU,QAAQ,MAAM,EAAE,MAAM,CAAC,QAAQ;AACvC,iBAAO,MAAM,qBAAqB,GAAG;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,YAA2B;AAAA,IAC/B,MAAM,QAAQ,KAAqC;AACjD,eAAS;AACT,8BAAwB;AAGxB,UAAI,aAAa;AACf,oBAAY,MAAM;AAClB,sBAAc;AAAA,MAChB;AACA,UAAI,kBAAkB;AACpB,qBAAa,gBAAgB;AAC7B,2BAAmB;AAAA,MACrB;AAEA,cAAQ,aAAa,IAAI,iBAAiB;AAE1C,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,kBAAkB,KAAK,IAAI;AACjC,cAAM,MAAM,GAAG,IAAI,OAAO,iBAAiB,IAAI,KAAK,WAAW,IAAI,MAAM,eAAe,IAAI,UAAU,GAAG,IAAI,UAAU,WAAW,IAAI,OAAO,KAAK,EAAE;AAEpJ,eAAO,MAAM,kBAAkB,GAAG;AAClC,cAAM,KAAK,IAAI,YAAY,GAAG;AAE9B,WAAG,SAAS,MAAM;AAChB,gBAAM,iBAAiB,KAAK,IAAI,IAAI;AACpC,iBAAO,KAAK,gBAAgB,cAAc,IAAI;AAE9C,kBAAQ;AACR,kBAAQ;AACR,uBAAa;AACb,kBAAQ,cAAc,KAAK,IAAI;AAC/B,kBAAQ,UAAU;AAElB,8BAAoB,EAAE;AACtB,kBAAQ;AAAA,QACV;AAEA,WAAG,UAAU,MAAM;AACjB,cAAI,GAAG,eAAe,YAAY,QAAQ;AACxC,kBAAM,WAA2B;AAAA,cAC/B,MAAM;AAAA,cACN,SAAS;AAAA,cACT,WAAW;AAAA,cACX,WAAW,KAAK,IAAI;AAAA,YACtB;AACA,oBAAQ;AACR,oBAAQ,YAAY;AACpB,oBAAQ;AAER,gBAAI,CAAC,uBAAuB;AAC1B,gCAAkB;AAAA,YACpB;AAGA,gBAAI,eAAe,GAAG;AACpB,qBAAO,QAAQ;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAEA,sBAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IAEA,WAAW,cAAc,MAAY;AACnC,aAAO,KAAK,iBAAiB,EAAE,YAAY,CAAC;AAC5C,8BAAwB;AAExB,UAAI,kBAAkB;AACpB,qBAAa,gBAAgB;AAC7B,2BAAmB;AAAA,MACrB;AAEA,UAAI,aAAa;AACf,oBAAY,MAAM;AAClB,sBAAc;AAAA,MAChB;AAEA,cAAQ;AACR,mBAAa;AAAA,IACf;AAAA,IAEA,MAAM,KAAK,OAAiC;AAC1C,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAGA,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AACH,gBAAM,SAAS,QAAQ;AAAA,YACrB,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,QAAQ,MAAM;AAAA,YACd,SAAS,MAAM;AAAA,UACjB,CAAC;AACD;AAAA,QAEF,KAAK;AACH,gBAAM,SAAS,UAAU;AAAA,YACvB,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,QAAQ,MAAM;AAAA,YACd,QAAQ;AAAA,UACV,CAAC;AACD;AAAA,QAEF,KAAK;AACH,gBAAM,SAAS,UAAU;AAAA,YACvB,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,QAAQ,MAAM;AAAA,YACd,QAAQ;AAAA,UACV,CAAC;AACD;AAAA,QAEF,KAAK;AACH,gBAAM,SAAS,QAAQ;AAAA,YACrB,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,QAAQ,MAAM;AAAA,UAChB,CAAC;AACD;AAAA,QAEF,KAAK;AACH,gBAAM,SAAS,UAAU;AAAA,YACvB,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,UAAU,MAAM;AAAA,UAClB,CAAC;AACD;AAAA,QAEF,KAAK;AACH,gBAAM,SAAS,OAAO;AAAA,YACpB,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,QAAQ,MAAM;AAAA,YACd,MAAM,MAAM;AAAA,UACd,CAAC;AACD;AAAA,QAEF;AAEE,gBAAM,SAAS,SAAS;AAAA,YACtB,MAAM,MAAM;AAAA,YACZ,OAAO,MAAM;AAAA,YACb,SAAS,MAAM;AAAA,YACf,QAAQ,MAAM;AAAA,YACd,MAAM,MAAM;AAAA,UACd,CAAC;AAAA,MACL;AAEA,cAAQ;AAAA,IACV;AAAA,IAEA,MAAM,YAAY,SAAqC;AACrD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,YAAM,SAAS,QAAQ;AAAA,QACrB,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AAED,cAAQ;AAAA,IACV;AAAA,IAEA,UAAU,SAAoC;AAC5C,qBAAe,IAAI,OAAO;AAC1B,aAAO,MAAM,eAAe,OAAO,OAAO;AAAA,IAC5C;AAAA,IAEA,GAAG,WAAmB,SAAoC;AACxD,UAAI,CAAC,aAAa,IAAI,SAAS,GAAG;AAChC,qBAAa,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,MACvC;AACA,mBAAa,IAAI,SAAS,EAAG,IAAI,OAAO;AACxC,aAAO,MAAM;AACX,cAAM,WAAW,aAAa,IAAI,SAAS;AAC3C,YAAI,UAAU;AACZ,mBAAS,OAAO,OAAO;AACvB,cAAI,SAAS,SAAS,GAAG;AACvB,yBAAa,OAAO,SAAS;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAA2B;AACzB,aAAO;AAAA,IACT;AAAA,IAEA,aAAgC;AAC9B,aAAO,EAAE,GAAG,QAAQ;AAAA,IACtB;AAAA,IAEA,WAAuC;AACrC,aAAO;AAAA,IACT;AAAA,IAEA,aAAmB;AACjB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AACT;;;AFjQA,SAAS,oBACP,MACA,OACe;AAGf,SAAO,mBAAmB,EAAE,MAAM,CAAC;AACrC;AAOO,SAAS,QAAQ,SAAwC;AAC9D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AAGJ,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAyB,cAAc;AACrF,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAsB,IAAI;AAChE,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAwB,IAAI;AAC1D,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAgC,IAAI;AAC9D,QAAM,CAAC,SAAS,UAAU,QAAI,uBAA4B;AAAA,IACxD,SAAS;AAAA,IACT,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,CAAC;AAGD,QAAM,mBAAe,qBAA6B,IAAI;AACtD,QAAM,iBAAa,qBAAO,KAAK;AAC/B,QAAM,mBAAe,qBAAO,SAAS;AACrC,QAAM,iBAAa,qBAAO,OAAO;AACjC,QAAM,8BAA0B,qBAGtB,IAAI;AACd,QAAM,uBAAmB,qBAA6C,IAAI;AAG1E,8BAAU,MAAM;AACd,iBAAa,UAAU;AACvB,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,WAAW,OAAO,CAAC;AAGvB,8BAAU,MAAM;AACd,QAAI,OAAO,oBAAoB,UAAU;AACvC,mBAAa,UAAU;AAAA,IACzB,OAAO;AACL,mBAAa,UAAU;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,iBAAiB,KAAK,CAAC;AAG3B,QAAM,kBAAc,0BAAY,CAAC,UAAqB;AACpD,QAAI,CAAC,WAAW,QAAS;AAGzB,eAAW,CAAC,UAAU;AAAA,MACpB,GAAG;AAAA,MACH,kBAAkB,KAAK,mBAAmB;AAAA,MAC1C,eAAe,KAAK,IAAI;AAAA,IAC1B,EAAE;AAGF,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,cAAM,aAAa,MAAM,MAAM;AAC/B,YAAI,YAAY;AACd,qBAAW,UAAU;AACrB,cAAI,wBAAwB,SAAS;AACnC,oCAAwB,QAAQ,QAAQ,UAAU;AAClD,oCAAwB,UAAU;AAAA,UACpC;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,cAAM,OAAO,MAAM,MAAM;AACzB,YAAI,MAAM;AACR,yBAAe,IAAI;AACnB,qBAAW,KAAK,GAAG;AACnB,sBAAY,KAAK,YAAY,CAAC,CAAC;AAAA,QACjC;AACA;AAAA,MAEF,KAAK;AACH,YAAI,MAAM,SAAS;AACjB,sBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,MAAM,OAAQ,CAAC;AAAA,QACjD;AACA;AAAA,MAEF,KAAK;AACH,uBAAe,IAAI;AACnB,mBAAW,IAAI;AACf;AAAA,MAEF,KAAK;AACH,cAAM,WAAW,MAAM,MAAM;AAC7B,YAAI,UAAU;AACZ,gBAAM,iBAAiC;AAAA,YACrC,MAAM;AAAA,YACN,SAAS;AAAA,YACT,WAAW;AAAA,YACX,WAAW,KAAK,IAAI;AAAA,UACtB;AACA,mBAAS,cAAc;AACvB,qBAAW,UAAU,cAAc;AAAA,QACrC;AACA;AAAA,IACJ;AAGA,iBAAa,UAAU,KAAK;AAAA,EAC9B,GAAG,CAAC,CAAC;AAGL,QAAM,cAAU,0BAAY,YAA2B;AACrD,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,QAAI,CAAC,OAAO;AACV,YAAM,MAAsB;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW,KAAK,IAAI;AAAA,MACtB;AACA,eAAS,GAAG;AACZ,YAAM;AAAA,IACR;AAEA,uBAAmB,YAAY;AAE/B,QAAI;AAEF,YAAM,cAAc,UAAU,UAAU,WAAW;AAEnD,YAAM,UAAU,QAAQ;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB;AAAA,MACF,CAAC;AAED,yBAAmB,WAAW;AAC9B,eAAS,IAAI;AACb,iBAAW,UAAU,WAAW,CAAC;AACjC,2BAAqB,WAAW;AAGhC;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,iBAAiB;AACvB,yBAAmB,cAAc;AACjC,eAAS,cAAc;AACvB,iBAAW,UAAU,cAAc;AACnC,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,QAAQ,YAAY,SAAS,OAAO,aAAa,kBAAkB,CAAC;AAGxF,QAAM,iBAAa,0BAAY,MAAY;AACzC,UAAM,YAAY,aAAa;AAC/B,QAAI,WAAW;AACb,gBAAU,WAAW,IAAI;AAAA,IAC3B;AACA,uBAAmB,cAAc;AACjC,yBAAqB,cAAc;AAAA,EACrC,GAAG,CAAC,kBAAkB,CAAC;AAGvB,QAAM,gBAAY;AAAA,IAChB,OAAO,aAAwD;AAC7D,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AAEA,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,gCAAwB,UAAU,EAAE,SAAS,OAAO;AAEpD,kBACG,KAAK;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,MAAM;AAAA,QACR,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,kCAAwB,UAAU;AAClC,iBAAO,GAAG;AAAA,QACZ,CAAC;AAGH,mBAAW,MAAM;AACf,cAAI,wBAAwB,SAAS;AACnC,oCAAwB,UAAU;AAClC,mBAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,UAC7C;AAAA,QACF,GAAG,GAAK;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,MAAM;AAAA,EAChB;AAGA,QAAM,eAAW;AAAA,IACf,OAAO,QAA+B;AACpC,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AAEA,iBAAW,GAAG;AAEd,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,MAAM;AAAA,EAChB;AAGA,QAAM,kBAAc;AAAA,IAClB,OAAO,SAAiB,gBAA2C;AACjE,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AAEA,YAAM,UAAuB;AAAA,QAC3B,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,QAC5D,MAAM;AAAA,QACN;AAAA,QACA,MAAM,KAAK,IAAI;AAAA,QACf,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,MACF;AAGA,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC;AAExC,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,MACF,CAAC;AAED,iBAAW,CAAC,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,cAAc,KAAK,eAAe;AAAA,MACpC,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,OAAO,SAAS,MAAM;AAAA,EACzB;AAGA,QAAM,cAAU;AAAA,IACd,OAAO,WAAmC;AACxC,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AACA,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAEA,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,MAAM,SAAS,EAAE,OAAO,IAAI;AAAA,MAC9B,CAAC;AAED,qBAAe,IAAI;AACnB,iBAAW,IAAI;AAAA,IACjB;AAAA,IACA,CAAC,OAAO,SAAS,MAAM;AAAA,EACzB;AAGA,QAAM,kBAAc,0BAAY,MAAY;AAC1C,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,aAAa,CAAC,QAAS;AAG5B,QAAI,iBAAiB,SAAS;AAC5B,mBAAa,iBAAiB,OAAO;AAAA,IACvC;AAEA,cACG,KAAK;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AAGjB,qBAAiB,UAAU,WAAW,MAAM;AAC1C,iBAAW;AAAA,IACb,GAAG,GAAI;AAAA,EACT,GAAG,CAAC,OAAO,SAAS,MAAM,CAAC;AAG3B,QAAM,iBAAa,0BAAY,MAAY;AACzC,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,aAAa,CAAC,QAAS;AAE5B,QAAI,iBAAiB,SAAS;AAC5B,mBAAa,iBAAiB,OAAO;AACrC,uBAAiB,UAAU;AAAA,IAC7B;AAEA,cACG,KAAK;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnB,GAAG,CAAC,OAAO,SAAS,MAAM,CAAC;AAG3B,QAAM,SAAK;AAAA,IACT,CAAC,WAAmB,YAAqD;AACvE,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,WAAW;AACd,eAAO,MAAM;AAAA,QAAC;AAAA,MAChB;AACA,aAAO,UAAU,GAAG,WAAW,OAAO;AAAA,IACxC;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,iBAAa,0BAAY,MAAY;AACzC,aAAS,IAAI;AACb,iBAAa,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAGL,8BAAU,MAAM;AACd,eAAW,UAAU;AAErB,QAAI,aAAa;AACf,cAAQ,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1B;AAEA,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,UAAI,iBAAiB,SAAS;AAC5B,qBAAa,iBAAiB,OAAO;AAAA,MACvC;AACA,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,cAAc,oBAAoB;AAExC,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,EACF;AACF;;;AGjiBO,IAAM,mBAA+B;AACrC,IAAM,yBAAqC;AAC3C,IAAM,sBAAkC;AACxC,IAAM,mBAA+B;AACrC,IAAM,qBAAiC;AAGvC,IAAM,0BAAoC;AAC1C,IAAM,qBAA+B;AACrC,IAAM,sBAAgC;AACtC,IAAM,iBAA2B;AACjC,IAAM,gBAA0B;AAmEhC,IAAM,eAAyB;AAC/B,IAAM,aAAuB;AAC7B,IAAM,gBAA0B;AAChC,IAAM,qBAA+B;AACrC,IAAM,mBAA6B;AACnC,IAAM,oBAA8B;AACpC,IAAM,iBAA2B;AACjC,IAAM,eAAyB;AAa/B,IAAM,oBAAiC;AACvC,IAAM,kBAA+B;AACrC,IAAM,kBAA+B;AACrC,IAAM,qBAAkC;AAoBxC,IAAM,0BAAyC;AAC/C,IAAM,wBAAuC;AAC7C,IAAM,sBAAqC;AAC3C,IAAM,6BAA4C;AAClD,IAAM,oBAAmC;AACzC,IAAM,yBAAwC;AAC9C,IAAM,2BAA0C;AAChD,IAAM,qBAAoC;AAC1C,IAAM,uBAAsC;AAC5C,IAAM,wBAAuC;AAC7C,IAAM,gCAA+C;AACrD,IAAM,uBAAsC;AAC5C,IAAM,+BAA8C;AACpD,IAAM,mCAAkD;AACxD,IAAM,gCAA+C;AACrD,IAAM,8BAA6C;AACnD,IAAM,8BAA6C;AACnD,IAAM,4BAA2C;AACjD,IAAM,yBAAwC;AAC9C,IAAM,2BAA0C;AAChD,IAAM,2BAA0C;AAChD,IAAM,4BAA2C;AACjD,IAAM,oCAAmD;AACzD,IAAM,+BAA8C;AACpD,IAAM,uCAAsD;AAC5D,IAAM,4BAA2C;AACjD,IAAM,oCAAmD;AACzD,IAAM,yBAAwC;AAI9C,IAAM,0BAAyC;AAC/C,IAAM,2BAA0C;AAChD,IAAM,wBAAuC;AAC7C,IAAM,yBAAwC;AAC9C,IAAM,0BAAyC;AAC/C,IAAM,2BAA0C;AAChD,IAAM,0BAAyC;AAC/C,IAAM,2BAA0C;AAChD,IAAM,0BAAyC;AAC/C,IAAM,2BAA0C;AAChD,IAAM,8BAA6C;AACnD,IAAM,4BAA2C;AACjD,IAAM,2BAA0C;AAChD,IAAM,yBAAwC;AAC9C,IAAM,6BAA4C;AAIlD,IAAM,6BAA4C;AAClD,IAAM,8BAA6C;AACnD,IAAM,+BAA8C;AACpD,IAAM,4BAA2C;AACjD,IAAM,2BAA0C;AAChD,IAAM,qCAAoD;AAC1D,IAAM,sCAAqD;AAC3D,IAAM,uCAAsD;AAI5D,IAAM,iCAAgD;AACtD,IAAM,+BAA8C;AACpD,IAAM,gCAA+C;AACrD,IAAM,4BAA2C;AACjD,IAAM,mCAAkD;AACxD,IAAM,kCAAiD;AACvD,IAAM,8BAA6C;AACnD,IAAM,mCAAkD;AAIxD,IAAM,uBAAsC;AAC5C,IAAM,yBAAwC;AAI9C,IAAM,iCAAgD;AACtD,IAAM,+BAA8C;AACpD,IAAM,iCAAgD;AACtD,IAAM,iCAAgD;AACtD,IAAM,iCAAgD;AACtD,IAAM,kCAAiD;AAIvD,IAAM,yBAAwC;AAC9C,IAAM,iCAAgD;AAItD,IAAM,2BAA0C;AAChD,IAAM,0BAAyC;AAC/C,IAAM,4BAA2C;AAIjD,IAAM,oCAAmD;AACzD,IAAM,2CAA0D;AAIhE,IAAM,6BAA4C;AAIlD,IAAM,kCAAiD;AACvD,IAAM,qCAAoD;AAC1D,IAAM,mCAAkD;AACxD,IAAM,gCAA+C;AACrD,IAAM,wCAAuD;AAI7D,IAAM,mCAAkD;AACxD,IAAM,4BAA2C;AACjD,IAAM,4BAA2C;AACjD,IAAM,6BAA4C;AAClD,IAAM,2BAA0C;AAChD,IAAM,6BAA4C;AAClD,IAAM,0BAAyC;AAI/C,IAAM,uBAAsC;AAC5C,IAAM,8BAA6C;AAInD,IAAM,oBAAmC;AACzC,IAAM,oBAAmC;AAIzC,IAAM,6BAA4C;AAClD,IAAM,+BAA8C;AACpD,IAAM,6BAA4C;AAIlD,IAAM,2CAA0D;AAChE,IAAM,4CAA2D;AACjE,IAAM,4CAA2D;AACjE,IAAM,yCAAwD;AAC9D,IAAM,+BAA8C;AAqGpD,IAAM,uBAAsC;AAC5C,IAAM,oBAAmC;AACzC,IAAM,yBAAwC;AAC9C,IAAM,oBAAmC;AACzC,IAAM,sBAAqC;AAqC3C,IAAM,yBAAyC;AAC/C,IAAM,iCAAiD;AACvD,IAAM,sBAAsC;AAC5C,IAAM,sBAAsC;AAC5C,IAAM,sBAAsC;AAC5C,IAAM,yBAAyC;AAC/C,IAAM,2BAA2C;AACjD,IAAM,4BAA4C;AAClD,IAAM,yBAAyC;AAC/C,IAAM,wBAAwC;AAC9C,IAAM,wBAAwC;AAC9C,IAAM,wBAAwC;AAC9C,IAAM,wBAAwC;AAC9C,IAAM,qBAAqC;AAC3C,IAAM,wBAAwC;AAC9C,IAAM,gCAAgD;AACtD,IAAM,4BAA4C;AAClD,IAAM,yBAAyC;AAwI/C,IAAM,0BAA6C;AACnD,IAAM,wBAA2C;AACjD,IAAM,2BAA8C;AAmMpD,IAAM,mBAA+B;AACrC,IAAM,iBAA6B;AACnC,IAAM,iBAA6B;AACnC,IAAM,oBAAgC;AA2JtC,IAAM,aAAa;AAAA,EACxB,OAAO,EAAE,OAAO,SAAS,OAAO,eAAe,aAAa,sCAAsC;AAAA,EAClG,UAAU,EAAE,OAAO,YAAY,OAAO,kBAAkB,aAAa,2CAA2C;AAAA,EAChH,YAAY,EAAE,OAAO,cAAc,OAAO,oBAAoB,aAAa,uCAAuC;AAAA,EAClH,YAAY,EAAE,OAAO,cAAc,OAAO,oBAAoB,aAAa,uCAAuC;AACpH;AAYO,IAAM,iBAA4B;AAIlC,IAAM,oBAA+B;AAIrC,IAAM,sBAAiC;AAIvC,IAAM,sBAAiC;AA2FvC,IAAM,qCAAqC;AAC3C,IAAM,4BAA4B;AAClC,IAAM,iCAAiC;AACvC,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,iBAAiB;AAIvB,IAAM,4BAA4B;AAIlC,IAAM,2BAA2B;AACjC,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AACjC,IAAM,iCAAiC;AACvC,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;AACnC,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,6BAA6B;AAInC,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAC9B,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AAIhC,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AAIjC,IAAM,2BAA2B;AAIjC,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAI9B,IAAM,8BAA8B;AAIpC,IAAM,kBAAkB;","names":[]}
1
+ {"version":3,"sources":["../index.ts","../hooks/use-chat.ts","../transport/types.ts","../transport/sse.ts","../models/chat-models.ts"],"sourcesContent":["/**\n * @elqnt/chat\n *\n * Platform-agnostic chat SDK for React and React Native.\n * Uses POST + SSE for reliable real-time communication.\n *\n * @example Basic Usage\n * ```tsx\n * import { useChat } from \"@elqnt/chat/hooks\";\n *\n * function ChatComponent() {\n * const { connect, sendMessage, messages, isConnected } = useChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * userId: \"user-456\",\n * });\n *\n * useEffect(() => {\n * connect();\n * return () => disconnect();\n * }, []);\n *\n * return <ChatUI messages={messages} onSend={sendMessage} />;\n * }\n * ```\n *\n * @example With Custom Transport (React Native)\n * ```tsx\n * import { useChat } from \"@elqnt/chat/hooks\";\n * import { createFetchSSETransport } from \"@elqnt/chat/transport\";\n *\n * const transport = createFetchSSETransport();\n *\n * function App() {\n * const chat = useChat({\n * baseUrl: \"...\",\n * orgId: \"...\",\n * userId: \"...\",\n * transport,\n * });\n * }\n * ```\n *\n * ## Exports\n *\n * - `@elqnt/chat/hooks` - React hooks (useChat)\n * - `@elqnt/chat/api` - Low-level API functions\n * - `@elqnt/chat/models` - TypeScript types\n * - `@elqnt/chat/transport` - Transport adapters (SSE, fetch-SSE, WhatsApp)\n *\n * @packageDocumentation\n */\n\n// Re-export everything for convenience\nexport * from \"./hooks\";\nexport * from \"./models\";\n","\"use client\";\n\n/**\n * useChat Hook\n *\n * A unified React hook for chat functionality with support for\n * multiple transport types (SSE, fetch-based SSE, custom transports).\n *\n * @example Basic usage\n * ```tsx\n * function ChatComponent() {\n * const {\n * connect,\n * sendMessage,\n * messages,\n * isConnected,\n * } = useChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * userId: \"user-456\",\n * });\n *\n * useEffect(() => {\n * connect();\n * return () => disconnect();\n * }, []);\n *\n * return (\n * <div>\n * {messages.map(msg => <Message key={msg.id} {...msg} />)}\n * <input onSubmit={(content) => sendMessage(content)} />\n * </div>\n * );\n * }\n * ```\n *\n * @example With custom transport\n * ```tsx\n * import { createFetchSSETransport } from \"@elqnt/chat/transport\";\n *\n * const transport = createFetchSSETransport();\n *\n * function App() {\n * const chat = useChat({\n * baseUrl: \"...\",\n * orgId: \"...\",\n * userId: \"...\",\n * transport,\n * });\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Chat, ChatEvent, ChatMessage } from \"../models\";\nimport type {\n ChatTransport,\n TransportState,\n TransportError,\n ConnectionMetrics,\n RetryConfig,\n Unsubscribe,\n} from \"../transport/types\";\nimport { createSSETransport } from \"../transport/sse\";\n\n/**\n * Chat hook options\n */\nexport interface UseChatOptions {\n /** Base URL for the chat server (e.g., \"https://api.example.com/chat\") */\n baseUrl: string;\n /** Organization ID */\n orgId: string;\n /** User ID */\n userId: string;\n /** Client type for routing */\n clientType?: \"customer\" | \"humanAgent\" | \"observer\";\n /** Transport instance or type */\n transport?: ChatTransport | \"sse\" | \"sse-fetch\";\n /** Callback for all incoming events */\n onMessage?: (event: ChatEvent) => void;\n /** Callback for errors */\n onError?: (error: TransportError) => void;\n /** Callback when connection state changes */\n onConnectionChange?: (state: TransportState) => void;\n /** Auto-connect on mount */\n autoConnect?: boolean;\n /** Retry configuration */\n retryConfig?: RetryConfig;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Chat hook return type\n */\nexport interface UseChatReturn {\n // Connection\n /** Connect to the chat server */\n connect: () => Promise<void>;\n /** Disconnect from the server */\n disconnect: () => void;\n /** Current connection state */\n connectionState: TransportState;\n /** Whether currently connected */\n isConnected: boolean;\n\n // Chat operations\n /** Start a new chat session */\n startChat: (metadata?: Record<string, unknown>) => Promise<string>;\n /** Load an existing chat, returns the loaded chat */\n loadChat: (chatKey: string) => Promise<Chat>;\n /** Send a text message */\n sendMessage: (content: string, attachments?: unknown[]) => Promise<void>;\n /** Send a raw chat event (for custom event types) */\n sendEvent: (event: Omit<ChatEvent, \"timestamp\">) => Promise<void>;\n /** End the current chat */\n endChat: (reason?: string) => Promise<void>;\n\n // Typing indicators\n /** Signal that user is typing */\n startTyping: () => void;\n /** Signal that user stopped typing */\n stopTyping: () => void;\n\n // State\n /** Current chat object */\n currentChat: Chat | null;\n /** Current chat key */\n chatKey: string | null;\n /** Chat messages */\n messages: ChatMessage[];\n /** Current error */\n error: TransportError | null;\n /** Connection metrics */\n metrics: ConnectionMetrics;\n\n // Event subscription\n /** Subscribe to specific event type */\n on: (eventType: string, handler: (event: ChatEvent) => void) => Unsubscribe;\n /** Clear current error */\n clearError: () => void;\n}\n\n/**\n * Default transport factory\n */\nfunction getDefaultTransport(\n type: \"sse\" | \"sse-fetch\" | undefined,\n debug: boolean\n): ChatTransport {\n // For now, always use SSE. In the future, detect environment\n // and use fetch-based SSE for React Native\n return createSSETransport({ debug });\n}\n\n/**\n * useChat Hook\n *\n * Platform-agnostic chat hook with SSE transport support.\n */\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const {\n baseUrl,\n orgId,\n userId,\n clientType = \"customer\",\n transport: transportOption,\n onMessage,\n onError,\n onConnectionChange,\n autoConnect = false,\n retryConfig,\n debug = false,\n } = options;\n\n // State\n const [connectionState, setConnectionState] = useState<TransportState>(\"disconnected\");\n const [currentChat, setCurrentChat] = useState<Chat | null>(null);\n const [chatKey, setChatKey] = useState<string | null>(null);\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [error, setError] = useState<TransportError | null>(null);\n const [metrics, setMetrics] = useState<ConnectionMetrics>({\n latency: 0,\n messagesSent: 0,\n messagesReceived: 0,\n messagesQueued: 0,\n reconnectCount: 0,\n });\n\n // Refs\n const transportRef = useRef<ChatTransport | null>(null);\n const mountedRef = useRef(false);\n const onMessageRef = useRef(onMessage);\n const onErrorRef = useRef(onError);\n const typingTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Update callback refs\n useEffect(() => {\n onMessageRef.current = onMessage;\n onErrorRef.current = onError;\n }, [onMessage, onError]);\n\n // Initialize transport\n useEffect(() => {\n if (typeof transportOption === \"object\") {\n transportRef.current = transportOption;\n } else {\n transportRef.current = getDefaultTransport(\n transportOption as \"sse\" | \"sse-fetch\" | undefined,\n debug\n );\n }\n }, [transportOption, debug]);\n\n // Handle incoming events\n const handleEvent = useCallback((event: ChatEvent) => {\n if (!mountedRef.current) return;\n\n // Update metrics\n setMetrics((prev) => ({\n ...prev,\n messagesReceived: prev.messagesReceived + 1,\n lastMessageAt: Date.now(),\n }));\n\n // Handle specific event types\n switch (event.type) {\n case \"new_chat_created\":\n // Handle multi-tab sync when another tab creates a chat\n const newChatKey = event.data?.chatKey as string;\n if (newChatKey) {\n setChatKey(newChatKey);\n }\n break;\n\n case \"load_chat_response\":\n const chat = event.data?.chat as Chat;\n if (chat) {\n setCurrentChat(chat);\n setChatKey(chat.key);\n setMessages(chat.messages || []);\n }\n break;\n\n case \"message\":\n if (event.message) {\n setMessages((prev) => [...prev, event.message!]);\n }\n break;\n\n case \"chat_ended\":\n setCurrentChat(null);\n setChatKey(null);\n break;\n\n case \"error\":\n const errorMsg = event.data?.message as string;\n if (errorMsg) {\n const transportError: TransportError = {\n code: \"NETWORK_ERROR\",\n message: errorMsg,\n retryable: true,\n timestamp: Date.now(),\n };\n setError(transportError);\n onErrorRef.current?.(transportError);\n }\n break;\n }\n\n // Call user's onMessage handler\n onMessageRef.current?.(event);\n }, []);\n\n // Connect to the chat server\n const connect = useCallback(async (): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n if (!orgId) {\n const err: TransportError = {\n code: \"CONNECTION_FAILED\",\n message: \"orgId is required\",\n retryable: false,\n timestamp: Date.now(),\n };\n setError(err);\n throw err;\n }\n\n setConnectionState(\"connecting\");\n\n try {\n // Subscribe to events before connecting\n const unsubscribe = transport.onMessage(handleEvent);\n\n await transport.connect({\n baseUrl,\n orgId,\n userId,\n clientType,\n chatKey: chatKey || undefined,\n debug,\n });\n\n setConnectionState(\"connected\");\n setError(null);\n setMetrics(transport.getMetrics());\n onConnectionChange?.(\"connected\");\n\n // Return cleanup in case caller wants it\n return;\n } catch (err) {\n const transportError = err as TransportError;\n setConnectionState(\"disconnected\");\n setError(transportError);\n onErrorRef.current?.(transportError);\n throw err;\n }\n }, [baseUrl, orgId, userId, clientType, chatKey, debug, handleEvent, onConnectionChange]);\n\n // Disconnect from the server\n const disconnect = useCallback((): void => {\n const transport = transportRef.current;\n if (transport) {\n transport.disconnect(true);\n }\n setConnectionState(\"disconnected\");\n onConnectionChange?.(\"disconnected\");\n }, [onConnectionChange]);\n\n // Start a new chat\n const startChat = useCallback(\n async (metadata?: Record<string, unknown>): Promise<string> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n // Use direct HTTP call - no waiting for SSE events\n const response = await transport.createChat({\n orgId,\n userId,\n metadata,\n });\n\n // Update state with the new chat key\n setChatKey(response.chatKey);\n\n return response.chatKey;\n },\n [orgId, userId]\n );\n\n // Load an existing chat\n const loadChat = useCallback(\n async (key: string): Promise<Chat> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n // Use direct HTTP call - no waiting for SSE events\n const response = await transport.loadChatData({\n orgId,\n chatKey: key,\n userId,\n });\n\n // Update state directly from HTTP response\n setCurrentChat(response.chat);\n setChatKey(response.chat.key);\n setMessages(response.chat.messages || []);\n\n // Return the chat for callers that need it\n return response.chat;\n },\n [orgId, userId]\n );\n\n // Send a message\n const sendMessage = useCallback(\n async (content: string, attachments?: unknown[]): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n if (!chatKey) {\n throw new Error(\"No active chat\");\n }\n\n const message: ChatMessage = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n role: \"user\",\n content,\n time: Date.now(),\n status: \"sending\",\n senderId: userId,\n createdAt: Date.now(),\n attachments: attachments as ChatMessage[\"attachments\"],\n };\n\n // Optimistically add message\n setMessages((prev) => [...prev, message]);\n\n await transport.send({\n type: \"message\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n message,\n });\n\n setMetrics((prev) => ({\n ...prev,\n messagesSent: prev.messagesSent + 1,\n }));\n },\n [orgId, chatKey, userId]\n );\n\n // End the current chat\n const endChat = useCallback(\n async (reason?: string): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n if (!chatKey) {\n return;\n }\n\n await transport.send({\n type: \"end_chat\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n data: reason ? { reason } : undefined,\n });\n\n setCurrentChat(null);\n setChatKey(null);\n },\n [orgId, chatKey, userId]\n );\n\n // Send a raw chat event (for custom event types)\n const sendEvent = useCallback(\n async (event: Omit<ChatEvent, \"timestamp\">): Promise<void> => {\n const transport = transportRef.current;\n if (!transport) {\n throw new Error(\"Transport not initialized\");\n }\n\n await transport.send({\n ...event,\n timestamp: Date.now(),\n } as ChatEvent);\n },\n []\n );\n\n // Start typing indicator\n const startTyping = useCallback((): void => {\n const transport = transportRef.current;\n if (!transport || !chatKey) return;\n\n // Clear existing timeout\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n\n transport\n .send({\n type: \"typing\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n })\n .catch(() => {});\n\n // Auto-stop typing after 3 seconds\n typingTimeoutRef.current = setTimeout(() => {\n stopTyping();\n }, 3000);\n }, [orgId, chatKey, userId]);\n\n // Stop typing indicator\n const stopTyping = useCallback((): void => {\n const transport = transportRef.current;\n if (!transport || !chatKey) return;\n\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n typingTimeoutRef.current = null;\n }\n\n transport\n .send({\n type: \"stopped_typing\",\n orgId,\n chatKey,\n userId,\n timestamp: Date.now(),\n })\n .catch(() => {});\n }, [orgId, chatKey, userId]);\n\n // Subscribe to specific event type\n const on = useCallback(\n (eventType: string, handler: (event: ChatEvent) => void): Unsubscribe => {\n const transport = transportRef.current;\n if (!transport) {\n return () => {};\n }\n return transport.on(eventType, handler);\n },\n []\n );\n\n // Clear error\n const clearError = useCallback((): void => {\n setError(null);\n transportRef.current?.clearError();\n }, []);\n\n // Mount/unmount lifecycle\n useEffect(() => {\n mountedRef.current = true;\n\n if (autoConnect) {\n connect().catch(() => {});\n }\n\n return () => {\n mountedRef.current = false;\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n disconnect();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Computed state\n const isConnected = connectionState === \"connected\";\n\n return {\n // Connection\n connect,\n disconnect,\n connectionState,\n isConnected,\n\n // Chat operations\n startChat,\n loadChat,\n sendMessage,\n sendEvent,\n endChat,\n\n // Typing\n startTyping,\n stopTyping,\n\n // State\n currentChat,\n chatKey,\n messages,\n error,\n metrics,\n\n // Events\n on,\n clearError,\n };\n}\n","/**\n * Transport Abstraction Layer Types\n *\n * Platform-agnostic transport interfaces for chat communication.\n * Supports browser SSE, React Native fetch-based SSE, and extensible\n * transports like WhatsApp Business API.\n */\n\nimport type { Chat, ChatEvent, ChatMessage } from \"../models\";\n\n/**\n * Transport connection state\n */\nexport type TransportState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"reconnecting\";\n\n/**\n * Transport error with retry information\n */\nexport interface TransportError {\n code:\n | \"CONNECTION_FAILED\"\n | \"PARSE_ERROR\"\n | \"SEND_FAILED\"\n | \"TIMEOUT\"\n | \"NETWORK_ERROR\"\n | \"AUTH_FAILED\";\n message: string;\n retryable: boolean;\n timestamp: number;\n originalError?: unknown;\n}\n\n/**\n * Configuration for transport connection\n */\nexport interface TransportConfig {\n /** Base URL for the chat server */\n baseUrl: string;\n /** Organization ID */\n orgId: string;\n /** User ID for authentication */\n userId: string;\n /** Client type for routing */\n clientType: \"customer\" | \"humanAgent\" | \"observer\";\n /** Optional current chat key for reconnection */\n chatKey?: string;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Retry configuration for connection attempts\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n maxRetries?: number;\n /** Initial retry intervals in milliseconds */\n intervals?: number[];\n /** Multiplier for exponential backoff */\n backoffMultiplier?: number;\n /** Maximum backoff time in milliseconds */\n maxBackoffTime?: number;\n}\n\n/**\n * Connection metrics for monitoring\n */\nexport interface ConnectionMetrics {\n /** Round-trip latency in milliseconds */\n latency: number;\n /** Total messages sent */\n messagesSent: number;\n /** Total messages received */\n messagesReceived: number;\n /** Messages waiting to be sent */\n messagesQueued: number;\n /** Number of reconnection attempts */\n reconnectCount: number;\n /** Last error encountered */\n lastError?: TransportError;\n /** Timestamp when connection was established */\n connectedAt?: number;\n /** Timestamp of last message */\n lastMessageAt?: number;\n /** Current transport type */\n transportType?: string;\n}\n\n/**\n * Event handler function type\n */\nexport type EventHandler<T = ChatEvent> = (event: T) => void;\n\n/**\n * Unsubscribe function returned by event subscription\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Send message options\n */\nexport interface SendMessageOptions {\n /** Message content */\n content: string;\n /** Optional attachments */\n attachments?: unknown[];\n /** Optional message metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Create chat options\n */\nexport interface CreateChatOptions {\n /** Organization ID */\n orgId: string;\n /** User ID */\n userId: string;\n /** Optional chat metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Load chat options\n */\nexport interface LoadChatOptions {\n /** Organization ID */\n orgId: string;\n /** Chat key to load */\n chatKey: string;\n /** User ID */\n userId: string;\n}\n\n/**\n * End chat options\n */\nexport interface EndChatOptions {\n /** Organization ID */\n orgId: string;\n /** Chat key to end */\n chatKey: string;\n /** User ID */\n userId: string;\n /** Optional end reason */\n reason?: string;\n}\n\n/**\n * Response from creating a new chat\n */\nexport interface CreateChatResponse {\n /** The key of the created chat */\n chatKey: string;\n}\n\n/**\n * Response from loading a chat\n */\nexport interface LoadChatResponse {\n /** The loaded chat object */\n chat: Chat;\n /** Agent ID if applicable */\n agentId?: string;\n}\n\n/**\n * Core transport interface\n *\n * Implementations must handle:\n * - Connection lifecycle (connect, disconnect, reconnect)\n * - Message sending (POST requests)\n * - Event receiving (SSE stream)\n * - Error handling and recovery\n */\nexport interface ChatTransport {\n /**\n * Connect to the chat server\n * @param config - Transport configuration\n * @returns Promise that resolves when connected\n */\n connect(config: TransportConfig): Promise<void>;\n\n /**\n * Disconnect from the server\n * @param intentional - Whether disconnect was user-initiated\n */\n disconnect(intentional?: boolean): void;\n\n /**\n * Send a chat event to the server\n * @param event - Chat event to send\n */\n send(event: ChatEvent): Promise<void>;\n\n /**\n * Send a message in the current chat\n * @param message - Message to send\n */\n sendMessage(message: ChatMessage): Promise<void>;\n\n /**\n * Create a new chat and return the chat key directly\n * @param options - Create chat options\n * @returns Promise with the created chat key\n */\n createChat(options: CreateChatOptions): Promise<CreateChatResponse>;\n\n /**\n * Load an existing chat and return the chat data directly\n * @param options - Load chat options\n * @returns Promise with the loaded chat data\n */\n loadChatData(options: LoadChatOptions): Promise<LoadChatResponse>;\n\n /**\n * Subscribe to incoming events\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n onMessage(handler: EventHandler): Unsubscribe;\n\n /**\n * Subscribe to specific event type\n * @param eventType - Type of event to listen for\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on(eventType: string, handler: EventHandler): Unsubscribe;\n\n /**\n * Get current connection state\n */\n getState(): TransportState;\n\n /**\n * Get connection metrics\n */\n getMetrics(): ConnectionMetrics;\n\n /**\n * Get last error\n */\n getError(): TransportError | undefined;\n\n /**\n * Clear error state\n */\n clearError(): void;\n}\n\n/**\n * Transport factory function type\n */\nexport type TransportFactory = (config?: Partial<TransportConfig>) => ChatTransport;\n\n/**\n * Logger interface for transport debugging\n */\nexport interface TransportLogger {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n/**\n * Create a default logger\n * @param debug - Enable debug logging\n */\nexport function createLogger(debug: boolean = false): TransportLogger {\n return {\n debug: debug ? console.log.bind(console, \"[chat]\") : () => {},\n info: console.info.bind(console, \"[chat]\"),\n warn: console.warn.bind(console, \"[chat]\"),\n error: console.error.bind(console, \"[chat]\"),\n };\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxRetries: 10,\n intervals: [1000, 2000, 5000],\n backoffMultiplier: 1.5,\n maxBackoffTime: 30000,\n};\n\n/**\n * Calculate retry interval with exponential backoff\n * @param retryCount - Current retry attempt number\n * @param config - Retry configuration\n */\nexport function calculateRetryInterval(\n retryCount: number,\n config: RetryConfig = DEFAULT_RETRY_CONFIG\n): number {\n const {\n intervals = DEFAULT_RETRY_CONFIG.intervals,\n backoffMultiplier = DEFAULT_RETRY_CONFIG.backoffMultiplier,\n maxBackoffTime = DEFAULT_RETRY_CONFIG.maxBackoffTime,\n } = config;\n\n if (retryCount < intervals.length) {\n return intervals[retryCount];\n }\n\n const baseInterval = intervals[intervals.length - 1] || 5000;\n const backoffTime =\n baseInterval * Math.pow(backoffMultiplier, retryCount - intervals.length + 1);\n return Math.min(backoffTime, maxBackoffTime);\n}\n","/**\n * SSE Transport (Browser)\n *\n * Uses native EventSource for receiving server events and fetch POST for sending.\n * This is the default transport for browser environments.\n *\n * @example\n * ```typescript\n * import { createSSETransport } from \"@elqnt/chat/transport\";\n *\n * const transport = createSSETransport();\n * await transport.connect({ baseUrl, orgId, userId, clientType: \"customer\" });\n * ```\n */\n\nimport type { Chat, ChatEvent, ChatMessage } from \"../models\";\nimport type {\n ChatTransport,\n TransportConfig,\n TransportState,\n TransportError,\n ConnectionMetrics,\n EventHandler,\n Unsubscribe,\n RetryConfig,\n TransportLogger,\n CreateChatOptions,\n CreateChatResponse,\n LoadChatOptions,\n LoadChatResponse,\n} from \"./types\";\nimport { createLogger, calculateRetryInterval, DEFAULT_RETRY_CONFIG } from \"./types\";\n\n/**\n * SSE Transport options\n */\nexport interface SSETransportOptions {\n /** Retry configuration */\n retryConfig?: RetryConfig;\n /** Enable debug logging */\n debug?: boolean;\n /** Custom logger */\n logger?: TransportLogger;\n}\n\n/**\n * Create an SSE transport for browser environments\n */\nexport function createSSETransport(options: SSETransportOptions = {}): ChatTransport {\n const {\n retryConfig = DEFAULT_RETRY_CONFIG,\n debug = false,\n logger = createLogger(debug),\n } = options;\n\n // Internal state\n let eventSource: EventSource | undefined;\n let config: TransportConfig | undefined;\n let state: TransportState = \"disconnected\";\n let error: TransportError | undefined;\n let retryCount = 0;\n let reconnectTimeout: ReturnType<typeof setTimeout> | undefined;\n let intentionalDisconnect = false;\n\n // Metrics\n const metrics: ConnectionMetrics = {\n latency: 0,\n messagesSent: 0,\n messagesReceived: 0,\n messagesQueued: 0,\n reconnectCount: 0,\n transportType: \"sse\",\n };\n\n // Event handlers\n const globalHandlers = new Set<EventHandler>();\n const typeHandlers = new Map<string, Set<EventHandler>>();\n\n // Helper to emit events\n function emit(event: ChatEvent): void {\n // Update metrics\n metrics.messagesReceived++;\n metrics.lastMessageAt = Date.now();\n\n // Call global handlers\n globalHandlers.forEach((handler) => {\n try {\n handler(event);\n } catch (err) {\n logger.error(\"Error in message handler:\", err);\n }\n });\n\n // Call type-specific handlers\n const handlers = typeHandlers.get(event.type);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(event);\n } catch (err) {\n logger.error(`Error in ${event.type} handler:`, err);\n }\n });\n }\n }\n\n // REST API helper\n async function sendRest(endpoint: string, body: Record<string, unknown>): Promise<unknown> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n const url = `${config.baseUrl}/${endpoint}`;\n logger.debug(`POST ${endpoint}`, body);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`API error: ${response.status} - ${errorText}`);\n }\n\n const json = await response.json() as { success?: boolean; data?: unknown };\n\n // Backend wraps responses in { success: true, data: {...} }\n // Unwrap to return just the data\n if (json && typeof json === \"object\" && \"data\" in json) {\n return json.data;\n }\n\n return json;\n }\n\n // Handle SSE message\n function handleMessage(event: MessageEvent): void {\n if (!event.data || event.data === \"\") return;\n\n try {\n const data = JSON.parse(event.data) as ChatEvent;\n logger.debug(\"Received:\", data.type);\n emit(data);\n } catch (err) {\n logger.error(\"Failed to parse SSE message:\", err);\n }\n }\n\n // Setup SSE event listeners\n function setupEventListeners(es: EventSource): void {\n // Generic message handler\n es.addEventListener(\"message\", handleMessage);\n\n // Add handlers for known event types\n const eventTypes = [\n \"reconnected\", \"typing\", \"stopped_typing\", \"waiting\",\n \"waiting_for_agent\", \"human_agent_joined\", \"human_agent_left\",\n \"chat_ended\", \"chat_updated\", \"load_chat_response\",\n \"new_chat_created\", \"show_csat_survey\", \"csat_response\",\n \"user_suggested_actions\", \"agent_execution_started\",\n \"agent_execution_ended\", \"agent_context_update\",\n \"plan_pending_approval\", \"step_started\", \"step_completed\",\n \"step_failed\", \"plan_completed\", \"skills_changed\", \"summary_update\",\n ];\n\n eventTypes.forEach((type) => {\n es.addEventListener(type, handleMessage);\n });\n }\n\n // Schedule reconnect\n function scheduleReconnect(): void {\n if (intentionalDisconnect || !config) return;\n\n const maxRetries = retryConfig.maxRetries ?? DEFAULT_RETRY_CONFIG.maxRetries;\n if (retryCount >= maxRetries) {\n logger.error(`Max retries (${maxRetries}) exceeded`);\n error = {\n code: \"CONNECTION_FAILED\",\n message: `Max retries (${maxRetries}) exceeded`,\n retryable: false,\n timestamp: Date.now(),\n };\n return;\n }\n\n const interval = calculateRetryInterval(retryCount, retryConfig);\n retryCount++;\n metrics.reconnectCount++;\n\n logger.info(`Reconnecting in ${interval}ms (attempt ${retryCount})`);\n state = \"reconnecting\";\n\n reconnectTimeout = setTimeout(() => {\n if (config) {\n transport.connect(config).catch((err) => {\n logger.error(\"Reconnect failed:\", err);\n });\n }\n }, interval);\n }\n\n const transport: ChatTransport = {\n async connect(cfg: TransportConfig): Promise<void> {\n config = cfg;\n intentionalDisconnect = false;\n\n // Clean up existing connection\n if (eventSource) {\n eventSource.close();\n eventSource = undefined;\n }\n if (reconnectTimeout) {\n clearTimeout(reconnectTimeout);\n reconnectTimeout = undefined;\n }\n\n state = retryCount > 0 ? \"reconnecting\" : \"connecting\";\n\n return new Promise((resolve, reject) => {\n const connectionStart = Date.now();\n const url = `${cfg.baseUrl}/stream?orgId=${cfg.orgId}&userId=${cfg.userId}&clientType=${cfg.clientType}${cfg.chatKey ? `&chatId=${cfg.chatKey}` : \"\"}`;\n\n logger.debug(\"Connecting to:\", url);\n const es = new EventSource(url);\n\n es.onopen = () => {\n const connectionTime = Date.now() - connectionStart;\n logger.info(`Connected in ${connectionTime}ms`);\n\n state = \"connected\";\n error = undefined;\n retryCount = 0;\n metrics.connectedAt = Date.now();\n metrics.latency = connectionTime;\n\n setupEventListeners(es);\n resolve();\n };\n\n es.onerror = () => {\n if (es.readyState === EventSource.CLOSED) {\n const sseError: TransportError = {\n code: \"CONNECTION_FAILED\",\n message: \"SSE connection failed\",\n retryable: true,\n timestamp: Date.now(),\n };\n error = sseError;\n metrics.lastError = sseError;\n state = \"disconnected\";\n\n if (!intentionalDisconnect) {\n scheduleReconnect();\n }\n\n // Only reject if this is the initial connection attempt\n if (retryCount === 0) {\n reject(sseError);\n }\n }\n };\n\n eventSource = es;\n });\n },\n\n disconnect(intentional = true): void {\n logger.info(\"Disconnecting\", { intentional });\n intentionalDisconnect = intentional;\n\n if (reconnectTimeout) {\n clearTimeout(reconnectTimeout);\n reconnectTimeout = undefined;\n }\n\n if (eventSource) {\n eventSource.close();\n eventSource = undefined;\n }\n\n state = \"disconnected\";\n retryCount = 0;\n },\n\n async send(event: ChatEvent): Promise<void> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n // Map event types to REST endpoints\n switch (event.type) {\n case \"message\":\n await sendRest(\"send\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n message: event.message,\n });\n break;\n\n case \"typing\":\n await sendRest(\"typing\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n typing: true,\n });\n break;\n\n case \"stopped_typing\":\n await sendRest(\"typing\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n typing: false,\n });\n break;\n\n case \"load_chat\":\n // Deprecated: Use loadChatData() instead for direct response\n await sendRest(\"load\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n });\n break;\n\n case \"new_chat\":\n // Deprecated: Use createChat() instead for direct response\n await sendRest(\"create\", {\n orgId: event.orgId,\n userId: event.userId,\n metadata: event.data,\n });\n break;\n\n case \"end_chat\":\n await sendRest(\"end\", {\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n data: event.data,\n });\n break;\n\n default:\n // Generic event endpoint for other types\n await sendRest(\"event\", {\n type: event.type,\n orgId: event.orgId,\n chatKey: event.chatKey,\n userId: event.userId,\n data: event.data,\n });\n }\n\n metrics.messagesSent++;\n },\n\n async sendMessage(message: ChatMessage): Promise<void> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n await sendRest(\"send\", {\n orgId: config.orgId,\n chatKey: config.chatKey,\n userId: config.userId,\n message,\n });\n\n metrics.messagesSent++;\n },\n\n async createChat(options: CreateChatOptions): Promise<CreateChatResponse> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n const response = await sendRest(\"create\", {\n orgId: options.orgId,\n userId: options.userId,\n metadata: options.metadata,\n }) as { chatKey?: string };\n\n if (!response?.chatKey) {\n throw new Error(\"Failed to create chat: no chatKey returned\");\n }\n\n return { chatKey: response.chatKey };\n },\n\n async loadChatData(options: LoadChatOptions): Promise<LoadChatResponse> {\n if (!config) {\n throw new Error(\"Transport not connected\");\n }\n\n const response = await sendRest(\"load\", {\n orgId: options.orgId,\n chatKey: options.chatKey,\n userId: options.userId,\n }) as { chat?: unknown; agentId?: string };\n\n if (!response?.chat) {\n throw new Error(\"Failed to load chat: no chat data returned\");\n }\n\n return {\n chat: response.chat as Chat,\n agentId: response.agentId,\n };\n },\n\n onMessage(handler: EventHandler): Unsubscribe {\n globalHandlers.add(handler);\n return () => globalHandlers.delete(handler);\n },\n\n on(eventType: string, handler: EventHandler): Unsubscribe {\n if (!typeHandlers.has(eventType)) {\n typeHandlers.set(eventType, new Set());\n }\n typeHandlers.get(eventType)!.add(handler);\n return () => {\n const handlers = typeHandlers.get(eventType);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n typeHandlers.delete(eventType);\n }\n }\n };\n },\n\n getState(): TransportState {\n return state;\n },\n\n getMetrics(): ConnectionMetrics {\n return { ...metrics };\n },\n\n getError(): TransportError | undefined {\n return error;\n },\n\n clearError(): void {\n error = undefined;\n },\n };\n\n return transport;\n}\n","// Code generated by tygo. DO NOT EDIT.\nimport { KGNode } from \"@elqnt/kg\";\nimport { Variable } from \"@elqnt/types\";\nimport { ResponseMetadata, ProductNameTS } from \"@elqnt/types\";\nimport { DocumentAnalysisResult } from \"@elqnt/docs\";\n\n//////////\n// source: chat-models.go\n\nexport type ChatStatusTS = 'active' | 'disconnected' | 'abandoned' | 'closed' | 'archived';\nexport type ChatStatus = string;\nexport const ChatStatusActive: ChatStatus = \"active\";\nexport const ChatStatusDisconnected: ChatStatus = \"disconnected\";\nexport const ChatStatusAbandoned: ChatStatus = \"abandoned\";\nexport const ChatStatusClosed: ChatStatus = \"closed\";\nexport const ChatStatusArchived: ChatStatus = \"archived\";\nexport type ChatTypeTS = 'customer_support' | 'public_room' | 'private_room' | 'direct' | 'group';\nexport type ChatType = string;\nexport const ChatTypeCustomerSupport: ChatType = \"customer_support\"; // Existing customer support chats\nexport const ChatTypePublicRoom: ChatType = \"public_room\"; // Public collaboration room\nexport const ChatTypePrivateRoom: ChatType = \"private_room\"; // Private collaboration room\nexport const ChatTypeDirect: ChatType = \"direct\"; // 1-on-1 direct message\nexport const ChatTypeGroup: ChatType = \"group\"; // Group chat/room\nexport interface Chat {\n orgId: string;\n key: string;\n title: string;\n messages: ChatMessage[];\n lastUpdated: number /* int64 */;\n startTime: number /* int64 */;\n users: ChatUser[];\n status: ChatStatusTS;\n aiEngaged: boolean;\n humanAgentEngaged: boolean;\n isWaiting: boolean;\n isWaitingForAgent: boolean;\n callRequested?: boolean;\n callStarted?: boolean;\n userRating?: number /* int */;\n metadata?: { [key: string]: any};\n grading?: ChatGrading;\n flow?: ChatFlow;\n context?: ChatContext;\n csatSent?: boolean;\n csatSentTime?: number /* int64 */;\n csatResponse?: any /* agents.CSATResponse */;\n /**\n * Active skills for this chat session\n */\n activeSkills?: any /* agents.Skill */[];\n /**\n * OpenAI Responses API - stores the last response ID for conversation continuity\n */\n lastResponseId?: string;\n /**\n * AgentContext - reference to structured context stored in separate NATS KV bucket\n * Key format: {agentId}:{chatKey} in bucket agent-contexts-org-{orgId}\n */\n agentContextKey?: string;\n /**\n * Chat Pin\n */\n pinned?: boolean;\n /**\n * Collab-specific fields\n */\n chatType?: ChatTypeTS;\n description?: string;\n}\nexport interface ChatContext {\n memory: { [key: string]: any};\n turnCount: number /* int */;\n lastIntent: string;\n activeTopic: string;\n}\nexport interface ChatFlow {\n flowDefinitionId: string;\n flowInstanceId?: string;\n flowInstanceLastUpdated?: number /* int64 */;\n tools?: ChatTool[];\n}\nexport interface ChatTool {\n name: string;\n description: string;\n type: string; // function, action, data_query etc\n parameters?: { [key: string]: any};\n}\nexport type ChatRoleTS = 'user' | 'ai' | 'event' | 'humanAgent' | 'observer' | 'dataQuery' | 'system' | 'tool';\nexport type ChatRole = string;\nexport const ChatRoleUser: ChatRole = \"user\";\nexport const ChatRoleAI: ChatRole = \"ai\";\nexport const ChatRoleEvent: ChatRole = \"event\";\nexport const ChatRoleHumanAgent: ChatRole = \"humanAgent\";\nexport const ChatRoleObserver: ChatRole = \"observer\";\nexport const ChatRoleDataQuery: ChatRole = \"dataQuery\";\nexport const ChatRoleSystem: ChatRole = \"system\";\nexport const ChatRoleTool: ChatRole = \"tool\";\nexport interface ChatUser {\n id: string;\n role: ChatRoleTS;\n name: string;\n email: string;\n phone?: string;\n authProvider: string;\n authToken: string;\n metadata?: { [key: string]: any};\n}\nexport type AgentStatusTS = 'online' | 'away' | 'busy' | 'offline';\nexport type AgentStatus = string;\nexport const AgentStatusOnline: AgentStatus = \"online\";\nexport const AgentStatusAway: AgentStatus = \"away\";\nexport const AgentStatusBusy: AgentStatus = \"busy\";\nexport const AgentStatusOffline: AgentStatus = \"offline\";\n/**\n * AgentSession represents an active agent session stored in Redis\n */\nexport interface AgentSession {\n agentId: string;\n orgId: string;\n onlineSince: number /* int64 */; // Unix timestamp\n lastActivity: number /* int64 */; // Unix timestamp\n status: AgentStatusTS;\n chatsHandled: number /* int */;\n activeChats: string[]; // Chat keys currently handling\n userAgent?: string;\n ipAddress?: string;\n metadata?: { [key: string]: any};\n}\nexport type ChatEventType = string;\n/**\n * ** user events\n */\nexport const ChatEventTypeUserJoined: ChatEventType = \"user_joined\";\nexport const ChatEventTypeUserLeft: ChatEventType = \"user_left\";\nexport const ChatEventTypeTyping: ChatEventType = \"typing\";\nexport const ChatEventTypeStoppedTyping: ChatEventType = \"stopped_typing\";\nexport const ChatEventTypeRead: ChatEventType = \"read\";\nexport const ChatEventTypeDelivered: ChatEventType = \"delivered\";\nexport const ChatEventTypeReconnected: ChatEventType = \"reconnected\";\nexport const ChatEventTypeError: ChatEventType = \"error\";\nexport const ChatEventTypeWaiting: ChatEventType = \"waiting\";\nexport const ChatEventTypeLoadChat: ChatEventType = \"load_chat\";\nexport const ChatEventTypeLoadChatResponse: ChatEventType = \"load_chat_response\";\nexport const ChatEventTypeMessage: ChatEventType = \"message\";\nexport const ChatEventTypeWaitingForAgent: ChatEventType = \"waiting_for_agent\";\nexport const ChatEventTypeMessageStatusUpdate: ChatEventType = \"message_status_update\";\nexport const ChatEventTypeHumanAgentJoined: ChatEventType = \"human_agent_joined\";\nexport const ChatEventTypeHumanAgentLeft: ChatEventType = \"human_agent_left\";\nexport const ChatEventTypeObserverJoined: ChatEventType = \"observer_joined\";\nexport const ChatEventTypeObserverLeft: ChatEventType = \"observer_left\";\nexport const ChatEventTypeListChats: ChatEventType = \"list_chats\";\nexport const ChatEventTypeChatUpdated: ChatEventType = \"chat_updated\";\nexport const ChatEventTypeChatRemoved: ChatEventType = \"chat_removed\";\nexport const ChatEventTypeSyncMetadata: ChatEventType = \"sync_metadata\";\nexport const ChatEventTypeSyncMetadataResponse: ChatEventType = \"sync_metadata_response\";\nexport const ChatEventTypeSyncUserSession: ChatEventType = \"sync_user_session\";\nexport const ChatEventTypeSyncUserSessionResponse: ChatEventType = \"sync_user_session_response\";\nexport const ChatEventTypeClientAction: ChatEventType = \"client_action\";\nexport const ChatEventTypeClientActionCallback: ChatEventType = \"client_action_callback\";\nexport const ChatEventTypeBlockUser: ChatEventType = \"block_user\";\n/**\n * ** collab room management events\n */\nexport const ChatEventTypeCreateRoom: ChatEventType = \"create_room\";\nexport const ChatEventTypeRoomCreated: ChatEventType = \"room_created\";\nexport const ChatEventTypeJoinRoom: ChatEventType = \"join_room\";\nexport const ChatEventTypeLeaveRoom: ChatEventType = \"leave_room\";\nexport const ChatEventTypeDeleteRoom: ChatEventType = \"delete_room\";\nexport const ChatEventTypeRoomDeleted: ChatEventType = \"room_deleted\";\nexport const ChatEventTypeUpdateRoom: ChatEventType = \"update_room\";\nexport const ChatEventTypeRoomUpdated: ChatEventType = \"room_updated\";\nexport const ChatEventTypeInviteUser: ChatEventType = \"invite_user\";\nexport const ChatEventTypeUserInvited: ChatEventType = \"user_invited\";\nexport const ChatEventTypeRoomUserJoined: ChatEventType = \"room_user_joined\";\nexport const ChatEventTypeRoomUserLeft: ChatEventType = \"room_user_left\";\nexport const ChatEventTypeUserRemoved: ChatEventType = \"user_removed\";\nexport const ChatEventTypeListRooms: ChatEventType = \"list_rooms\";\nexport const ChatEventTypeRoomsResponse: ChatEventType = \"rooms_response\";\n/**\n * ** collab message events\n */\nexport const ChatEventTypeMessageEdited: ChatEventType = \"message_edited\";\nexport const ChatEventTypeMessageDeleted: ChatEventType = \"message_deleted\";\nexport const ChatEventTypeMessageReaction: ChatEventType = \"message_reaction\";\nexport const ChatEventTypeMessageReply: ChatEventType = \"message_reply\";\nexport const ChatEventTypeMentionUser: ChatEventType = \"mention_user\";\nexport const ChatEventTypeMessageEditedResponse: ChatEventType = \"message_edited_response\";\nexport const ChatEventTypeMessageDeletedResponse: ChatEventType = \"message_deleted_response\";\nexport const ChatEventTypeMessageReactionResponse: ChatEventType = \"message_reaction_response\";\n/**\n * ** collab user presence events\n */\nexport const ChatEventTypeUserPresenceStart: ChatEventType = \"user_presence_start\";\nexport const ChatEventTypeUserPresenceEnd: ChatEventType = \"user_presence_end\";\nexport const ChatEventTypeUserStatusChange: ChatEventType = \"user_status_change\";\nexport const ChatEventTypeUserActivity: ChatEventType = \"user_activity\";\nexport const ChatEventTypeUserPresenceChanged: ChatEventType = \"user_presence_changed\";\nexport const ChatEventTypeUserActivityUpdate: ChatEventType = \"user_activity_update\";\nexport const ChatEventTypeGetOnlineUsers: ChatEventType = \"get_online_users\";\nexport const ChatEventTypeOnlineUsersResponse: ChatEventType = \"online_users\";\n/**\n * ** shop assist events\n */\nexport const ChatEventTypeEndChat: ChatEventType = \"end_chat\";\nexport const ChatEventTypeChatEnded: ChatEventType = \"chat_ended\";\n/**\n * ** agent session events\n */\nexport const ChatEventTypeAgentSessionStart: ChatEventType = \"agent_session_start\";\nexport const ChatEventTypeAgentSessionEnd: ChatEventType = \"agent_session_end\";\nexport const ChatEventTypeAgentStatusChange: ChatEventType = \"agent_status_change\";\nexport const ChatEventTypeAgentActivityPing: ChatEventType = \"agent_activity_ping\";\nexport const ChatEventTypeAgentChatAssigned: ChatEventType = \"agent_chat_assigned\";\nexport const ChatEventTypeAgentChatCompleted: ChatEventType = \"agent_chat_completed\";\n/**\n * ** AI agents retrieval events\n */\nexport const ChatEventTypeGetAgents: ChatEventType = \"get_agents\";\nexport const ChatEventTypeGetAgentsResponse: ChatEventType = \"get_agents_response\";\n/**\n * ** CSAT events\n */\nexport const ChatEventTypeCSATRequest: ChatEventType = \"csat_request\"; // Internal: scheduler requests chat to send CSAT\nexport const ChatEventTypeCSATSurvey: ChatEventType = \"show_csat_survey\";\nexport const ChatEventTypeCSATResponse: ChatEventType = \"csat_response\";\n/**\n * ** User Suggested Actions events\n */\nexport const ChatEventTypeUserSuggestedActions: ChatEventType = \"user_suggested_actions\";\nexport const ChatEventTypeUserSuggestedActionSelected: ChatEventType = \"user_suggested_action_selected\";\n/**\n * ** Summary events\n */\nexport const ChatEventTypeSummaryUpdate: ChatEventType = \"summary_update\";\n/**\n * ** Agent Context events\n */\nexport const ChatEventTypeAgentContextUpdate: ChatEventType = \"agent_context_update\";\nexport const ChatEventTypeAgentExecutionStarted: ChatEventType = \"agent_execution_started\";\nexport const ChatEventTypeAgentExecutionEnded: ChatEventType = \"agent_execution_ended\";\nexport const ChatEventTypeLoadAgentContext: ChatEventType = \"load_agent_context\";\nexport const ChatEventTypeLoadAgentContextResponse: ChatEventType = \"load_agent_context_response\";\n/**\n * ** Plan → Approve → Execute events\n */\nexport const ChatEventTypePlanPendingApproval: ChatEventType = \"plan_pending_approval\";\nexport const ChatEventTypePlanApproved: ChatEventType = \"plan_approved\";\nexport const ChatEventTypePlanRejected: ChatEventType = \"plan_rejected\";\nexport const ChatEventTypePlanCompleted: ChatEventType = \"plan_completed\";\nexport const ChatEventTypeStepStarted: ChatEventType = \"step_started\";\nexport const ChatEventTypeStepCompleted: ChatEventType = \"step_completed\";\nexport const ChatEventTypeStepFailed: ChatEventType = \"step_failed\";\n/**\n * ** New Chat events\n */\nexport const ChatEventTypeNewChat: ChatEventType = \"new_chat\";\nexport const ChatEventTypeNewChatCreated: ChatEventType = \"new_chat_created\";\n/**\n * ** Heartbeat events\n */\nexport const ChatEventTypePing: ChatEventType = \"ping\";\nexport const ChatEventTypePong: ChatEventType = \"pong\";\n/**\n * ** Skill activation events\n */\nexport const ChatEventTypeSkillActivate: ChatEventType = \"skill_activate\";\nexport const ChatEventTypeSkillDeactivate: ChatEventType = \"skill_deactivate\";\nexport const ChatEventTypeSkillsChanged: ChatEventType = \"skills_changed\";\n/**\n * ** Attachment processing events (deferred document processing)\n */\nexport const ChatEventTypeAttachmentProcessingStarted: ChatEventType = \"attachment_processing_started\";\nexport const ChatEventTypeAttachmentProcessingProgress: ChatEventType = \"attachment_processing_progress\";\nexport const ChatEventTypeAttachmentProcessingComplete: ChatEventType = \"attachment_processing_complete\";\nexport const ChatEventTypeAttachmentProcessingError: ChatEventType = \"attachment_processing_error\";\nexport const ChatEventTypeRetryAttachment: ChatEventType = \"retry_attachment\";\nexport type ChatEventTypeTS =\n | \"message\"\n | \"user_joined\"\n | \"user_left\"\n | \"typing\"\n | \"stopped_typing\"\n | \"read\"\n | \"delivered\"\n | \"reconnected\"\n | \"error\"\n | \"message_status_update\"\n | \"load_chat\"\n | \"load_chat_response\"\n | \"waiting\"\n | \"waiting_for_agent\"\n | \"human_agent_joined\"\n | \"end_chat\"\n | \"chat_ended\"\n | \"human_agent_left\"\n | \"observer_joined\"\n | \"observer_left\"\n | \"list_chats\"\n | \"chat_updated\"\n | \"chat_removed\"\n | \"sync_metadata\"\n | \"sync_metadata_response\"\n | \"sync_user_session\"\n | \"sync_user_session_response\"\n | \"agent_session_start\"\n | \"agent_session_end\"\n | \"agent_status_change\"\n | \"agent_activity_ping\"\n | \"agent_chat_assigned\"\n | \"agent_chat_completed\"\n | \"client_action\"\n | \"client_action_callback\"\n | \"show_csat_survey\"\n | \"csat_response\"\n | \"user_suggested_actions\"\n | \"user_suggested_action_selected\"\n | \"summary_update\"\n | \"agent_context_update\"\n | \"agent_execution_started\"\n | \"agent_execution_ended\"\n | \"load_agent_context\"\n | \"load_agent_context_response\"\n | \"plan_pending_approval\"\n | \"plan_approved\"\n | \"plan_rejected\"\n | \"plan_completed\"\n | \"step_started\"\n | \"step_completed\"\n | \"step_failed\"\n | \"new_chat\"\n | \"new_chat_created\"\n | \"block_user\"\n | \"ping\"\n | \"pong\"\n | \"create_room\"\n | \"room_created\"\n | \"join_room\"\n | \"leave_room\"\n | \"delete_room\"\n | \"room_deleted\"\n | \"update_room\"\n | \"room_updated\"\n | \"invite_user\"\n | \"user_invited\"\n | \"room_user_joined\"\n | \"room_user_left\"\n | \"user_removed\"\n | \"list_rooms\"\n | \"rooms_response\"\n | \"message_edited\"\n | \"message_deleted\"\n | \"message_reaction\"\n | \"message_reply\"\n | \"mention_user\"\n | \"message_edited_response\"\n | \"message_deleted_response\"\n | \"message_reaction_response\"\n | \"user_presence_start\"\n | \"user_presence_end\"\n | \"user_status_change\"\n | \"user_activity\"\n | \"user_presence_changed\"\n | \"user_activity_update\"\n | \"get_online_users\"\n | \"online_users\"\n | \"get_agents\"\n | \"get_agents_response\"\n | \"skill_activate\"\n | \"skill_deactivate\"\n | \"skills_changed\"\n | \"attachment_processing_started\"\n | \"attachment_processing_progress\"\n | \"attachment_processing_complete\"\n | \"attachment_processing_error\"\n | \"retry_attachment\";\nexport type MessageStatus = string;\nexport const MessageStatusSending: MessageStatus = \"sending\";\nexport const MessageStatusSent: MessageStatus = \"sent\";\nexport const MessageStatusDelivered: MessageStatus = \"delivered\";\nexport const MessageStatusRead: MessageStatus = \"read\";\nexport const MessageStatusFailed: MessageStatus = \"failed\";\nexport type MessageStatusTS =\n | \"sending\"\n | \"sent\"\n | \"delivered\"\n | \"read\"\n | \"failed\";\n/**\n * EmojiReaction represents an emoji reaction to a message\n */\nexport interface EmojiReaction {\n emoji: string;\n count: number /* int */;\n users?: string[]; // List of user IDs who reacted\n}\n/**\n * Location represents geographical coordinates\n */\nexport interface Location {\n latitude: number /* float64 */;\n longitude: number /* float64 */;\n address?: string;\n}\n/**\n * AttachmentFile represents a file within an attachment\n */\nexport interface AttachmentFile {\n type: string;\n url: string;\n thumbnailUrl?: string;\n name?: string;\n size?: number /* int64 */;\n}\nexport type AttachmentType = string;\n/**\n * Attachment types for both user and system attachments\n */\nexport const AttachmentTypeDocument: AttachmentType = \"document\";\nexport const AttachmentTypeDocumentAnalysis: AttachmentType = \"document_analysis\";\nexport const AttachmentTypeImage: AttachmentType = \"image\";\nexport const AttachmentTypeAudio: AttachmentType = \"audio\";\nexport const AttachmentTypeVideo: AttachmentType = \"video\";\nexport const AttachmentTypeLocation: AttachmentType = \"location\";\nexport const AttachmentTypeReferences: AttachmentType = \"references\";\nexport const AttachmentTypeSubsections: AttachmentType = \"subsections\";\nexport const AttachmentTypeArticles: AttachmentType = \"articles\";\nexport const AttachmentTypeRecords: AttachmentType = \"records\";\nexport const AttachmentTypeActions: AttachmentType = \"actions\";\nexport const AttachmentTypeBullets: AttachmentType = \"bullets\";\nexport const AttachmentTypeSticker: AttachmentType = \"sticker\";\nexport const AttachmentTypeData: AttachmentType = \"data\";\nexport const AttachmentTypeKGNodes: AttachmentType = \"kgNodes\";\nexport const AttachmentTypeDocumentSources: AttachmentType = \"document_sources\";\nexport const AttachmentTypeSpreadsheet: AttachmentType = \"spreadsheet\"; // Excel, CSV files\nexport const AttachmentTypeDataFile: AttachmentType = \"data_file\"; // JSON, XML, YAML files\n\nexport type AttachmentTypeTS =\n | \"document\"\n | \"document_analysis\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"location\"\n | \"references\"\n | \"subsections\"\n | \"articles\"\n | \"records\"\n | \"actions\"\n | \"bullets\"\n | \"sticker\"\n | \"data\"\n | \"kgNodes\"\n | \"document_sources\"\n | \"spreadsheet\"\n | \"data_file\";\n\n/**\n * DocumentSource represents an aggregated document source with page references\n * Used to display source cards in chat responses after document search\n */\nexport interface DocumentSource {\n doc_id: string;\n title: string;\n url: string;\n page_numbers: number /* int */[];\n reference_count: number /* int */;\n bounding_regions?: any /* docs.BoundingRegion */[];\n page_infos?: any /* docs.PageInfo */[]; // Page dimensions for coordinate scaling\n}\n/**\n * Attachment represents any type of attachment to a message\n */\nexport interface Attachment {\n type: AttachmentTypeTS;\n documentAnalysis?: DocumentAnalysisResult;\n title?: string;\n url: string;\n files?: AttachmentFile[]; // Associated files\n location?: Location; // Location data if applicable\n data?: { [key: string]: Variable};\n kgNodes?: KGNode[];\n actions?: Action[];\n documentSources?: DocumentSource[];\n /**\n * Smart document processing fields\n */\n fileMetadata?: any /* docs.AttachmentFileMetadata */; // Client-side extracted file metadata\n processing?: any /* docs.ProcessingResult */; // Smart processing result\n}\nexport interface Action {\n id: string;\n title: string;\n icon?: string;\n description?: string;\n onAction?: () => void;\n}\n/**\n * ChatMessage represents the core message structure\n */\nexport interface ChatMessage {\n /**\n * Core fields\n */\n id: string;\n role: ChatRoleTS;\n content: string;\n time: number /* int64 */;\n status: MessageStatusTS;\n /**\n * Sender information\n */\n senderId: string;\n senderName?: string;\n /**\n * Timing\n */\n createdAt: number /* int64 */;\n updatedAt?: number /* int64 */;\n /**\n * Message relations\n */\n replyTo?: string;\n threadId?: string;\n mentions?: string[];\n /**\n * Attachments and reactions\n */\n attachments?: Attachment[];\n reactions?: EmojiReaction[];\n /**\n * Additional data\n */\n variables?: { [key: string]: Variable};\n /**\n * Tool call\n */\n name?: string;\n toolCallId?: string;\n toolCalls?: ToolCall[];\n /**\n * LLM usage\n */\n llmUsage?: LLMUsage;\n}\nexport interface ChatEvent {\n type: ChatEventTypeTS;\n orgId: string;\n chatKey: string;\n userId: string;\n timestamp: number /* int64 */;\n data?: { [key: string]: any};\n message?: ChatMessage;\n}\nexport interface ChatGrading {\n chatKey: string;\n grade: number /* int */;\n topic: string;\n summary: string;\n}\nexport interface ChatSession {\n id: string;\n status: ChatSessionStatus;\n user?: ChatUser;\n activeChatKey?: string;\n preferences?: ChatSessionPreferences;\n lastActivity: number /* int64 */;\n expiresAt: number /* int64 */;\n metadata?: { [key: string]: any};\n}\nexport type ChatSessionStatus = string;\nexport const ChatSessionStatusActive: ChatSessionStatus = \"active\";\nexport const ChatSessionStatusIdle: ChatSessionStatus = \"idle\";\nexport const ChatSessionStatusExpired: ChatSessionStatus = \"expired\";\nexport interface ChatSessionPreferences {\n language: string;\n theme: string;\n notifications: boolean;\n timeZone: string;\n messageDisplay: string; // compact/expanded\n autoTranslate: boolean;\n rateLimits?: ChatRateLimits;\n}\nexport interface ChatRateLimits {\n maxMessagesPerMinute: number /* int */;\n maxTokensPerDay: number /* int */;\n cooldownPeriod: number /* int */; // seconds\n}\n/**\n * ==========================\n * todo: move to common/llm\n */\nexport interface LLMConfig {\n Provider: string;\n Model: string;\n Temperature: number /* float64 */;\n MaxTokens: number /* int */;\n SystemPrompt: string;\n Tools: LLMTool[];\n Memory?: LLMMemoryConfig;\n}\nexport interface LLMMemoryConfig {\n MaxMessages: number /* int */;\n IncludeSystem: boolean;\n WindowSize: number /* int */; // Token window size\n Strategy: string; // e.g., \"sliding\", \"summarize\"\n}\nexport interface LLMTool {\n Name: string;\n Type: string;\n Function: LLMFunction;\n}\nexport interface LLMFunction {\n Name: string;\n Description: string;\n Parameters: any /* types.JSONSchema */;\n}\nexport interface ToolCall {\n Name: string;\n Arguments: { [key: string]: any};\n ID: string;\n Description: string;\n}\nexport interface LLMResponse {\n Content: string;\n ToolCalls: ToolCall[];\n Usage?: LLMUsage;\n ResponseId: string; // OpenAI Responses API - the response ID for conversation continuity\n}\nexport interface LLMUsage {\n inputTokens: number /* int64 */;\n outputTokens: number /* int64 */;\n totalTokens: number /* int64 */;\n}\n/**\n * ChatSummary represents lightweight chat information for caching and listing\n */\nexport interface ChatSummary {\n chatKey: string;\n title: string;\n userId?: string;\n status: ChatStatus;\n lastUpdated: number /* int64 */;\n waitingSince?: number /* int64 */; // Only populated for waiting chats\n pinned?: boolean;\n metadata?: { [key: string]: any};\n}\nexport interface GetChatRequest {\n orgId: string;\n chatKey: string;\n}\nexport interface GetChatResponse {\n chat?: Chat;\n metadata: ResponseMetadata;\n}\nexport interface ChatProductReference {\n id: string;\n title: string;\n price: number /* float64 */;\n image?: string;\n url?: string;\n}\n/**\n * Chat Archival Models\n */\nexport interface ChatArchivalRequest {\n orgId: string;\n chatKey: string;\n chat: Chat;\n}\nexport interface ChatArchivalResponse {\n success: boolean;\n error?: string;\n message?: string;\n}\n/**\n * Agent Session Request/Response Models\n */\nexport interface StartAgentSessionRequest {\n orgId: string;\n agentId: string;\n userAgent?: string;\n ipAddress?: string;\n}\nexport interface StartAgentSessionResponse {\n metadata: ResponseMetadata;\n}\nexport interface EndAgentSessionRequest {\n orgId: string;\n agentId: string;\n}\nexport interface EndAgentSessionResponse {\n metadata: ResponseMetadata;\n}\nexport interface UpdateAgentStatusRequest {\n orgId: string;\n agentId: string;\n status: AgentStatusTS;\n}\nexport interface UpdateAgentStatusResponse {\n metadata: ResponseMetadata;\n}\nexport interface UpdateAgentLastActivityRequest {\n orgId: string;\n agentId: string;\n}\nexport interface UpdateAgentLastActivityResponse {\n metadata: ResponseMetadata;\n}\nexport interface AssignChatToAgentRequest {\n orgId: string;\n agentId: string;\n chatKey: string;\n}\nexport interface AssignChatToAgentResponse {\n metadata: ResponseMetadata;\n}\nexport interface CompleteChatByAgentRequest {\n orgId: string;\n agentId: string;\n chatKey: string;\n}\nexport interface CompleteChatByAgentResponse {\n metadata: ResponseMetadata;\n}\nexport interface GetAgentSessionRequest {\n orgId: string;\n agentId: string;\n}\nexport interface GetAgentSessionResponse {\n session?: AgentSession;\n metadata: ResponseMetadata;\n}\nexport interface GetOnlineAgentsRequest {\n orgId: string;\n}\nexport interface GetOnlineAgentsResponse {\n sessions: AgentSession[];\n metadata: ResponseMetadata;\n}\nexport interface GetOnlineAgentCountRequest {\n orgId: string;\n}\nexport interface GetOnlineAgentCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\n/**\n * Queue-specific chat request/response types\n */\nexport interface GetQueueChatsRequest {\n orgId: string;\n queueId: string;\n}\nexport interface GetQueueChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\nexport interface GetQueueChatCountRequest {\n orgId: string;\n queueId: string;\n}\nexport interface GetQueueChatCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\nexport type UserStatusTS = 'online' | 'away' | 'busy' | 'offline';\nexport type UserStatus = string;\nexport const UserStatusOnline: UserStatus = \"online\";\nexport const UserStatusAway: UserStatus = \"away\";\nexport const UserStatusBusy: UserStatus = \"busy\";\nexport const UserStatusOffline: UserStatus = \"offline\";\n/**\n * UserSession for tracking online users\n */\nexport interface UserSession {\n orgId: string;\n userId: string;\n userName: string;\n status: UserStatusTS;\n onlineSince: number /* int64 */;\n lastActivity: number /* int64 */;\n}\n/**\n * User status update requests\n */\nexport interface UpdateUserStatusRequest {\n orgId: string;\n userId: string;\n status: UserStatusTS;\n}\nexport interface UpdateUserStatusResponse {\n metadata: ResponseMetadata;\n}\n/**\n * Get online users\n */\nexport interface GetOnlineUsersRequest {\n orgId: string;\n}\nexport interface GetOnlineUsersResponse {\n metadata: ResponseMetadata;\n users: UserSession[];\n}\n/**\n * Analytics Trigger Models\n */\nexport interface TriggerAnalyticsScanRequest {\n org_id?: string; // Optional: if empty, scans all orgs\n}\nexport interface TriggerAnalyticsScanResponse {\n metadata: ResponseMetadata;\n chats_archived: number /* int */;\n}\n/**\n * AttachmentProcessingStartedData is sent when attachment processing begins\n */\nexport interface AttachmentProcessingStartedData {\n attachmentId: string;\n fileName: string;\n strategy: string;\n}\n/**\n * AttachmentProcessingProgressData is sent during attachment processing\n */\nexport interface AttachmentProcessingProgressData {\n attachmentId: string;\n percent: number /* int */;\n stage: string;\n message: string;\n}\n/**\n * AttachmentProcessingCompleteData is sent when attachment processing completes\n */\nexport interface AttachmentProcessingCompleteData {\n attachmentId: string;\n result?: any /* docs.ProcessingResult */;\n}\n/**\n * AttachmentProcessingErrorData is sent when attachment processing fails\n */\nexport interface AttachmentProcessingErrorData {\n attachmentId: string;\n error: string;\n retryable: boolean;\n}\n/**\n * RetryAttachmentData is sent by frontend to retry a failed attachment\n */\nexport interface RetryAttachmentData {\n attachmentId: string;\n}\n\n//////////\n// source: chat-stats-models.go\n\n/**\n * Active chat requests/responses\n */\nexport interface GetActiveChatCountRequest {\n orgId: string;\n}\nexport interface GetActiveChatCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\nexport interface GetActiveChatsRequest {\n orgId: string;\n pastHours?: number /* float64 */; // 0 means all, 0.5 means past 30 min, 1 means past hour, etc.\n}\nexport interface GetActiveChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\n/**\n * Waiting for agent requests/responses\n */\nexport interface GetWaitingForAgentChatCountRequest {\n orgId: string;\n}\nexport interface GetWaitingForAgentChatCountResponse {\n count: number /* int */;\n metadata: ResponseMetadata;\n}\nexport interface GetWaitingForAgentChatsRequest {\n orgId: string;\n}\nexport interface GetWaitingForAgentChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\n/**\n * User chats requests/responses\n */\nexport interface GetUserChatsRequest {\n orgId: string;\n userId: string;\n limit?: number /* int */; // Number of chats to return (default 15)\n offset?: number /* int */; // Number of chats to skip (for pagination)\n}\nexport interface GetUserChatsResponse {\n chats: ChatSummary[];\n total: number /* int */; // Total number of chats for this user\n hasMore: boolean; // Whether there are more chats to load\n metadata: ResponseMetadata;\n}\n/**\n * Daily counter requests/responses\n */\nexport interface GetDailyChatCountRequest {\n orgId: string;\n date: string /* RFC3339 */;\n timezone: string;\n}\nexport interface GetDailyChatCountResponse {\n count: number /* int64 */;\n date: string;\n timezone: string;\n metadata: any /* types.ResponseMetadata */;\n}\n\n//////////\n// source: queue-models.go\n\n\n// Queue types\nexport const QueueTypes = {\n skill: { value: 'skill', label: 'Skill-based', description: 'Route by agent expertise and skills' },\n priority: { value: 'priority', label: 'Priority-based', description: 'Route by customer tier and urgency level' },\n department: { value: 'department', label: 'Department-based', description: 'Route by business function alignment' },\n complexity: { value: 'complexity', label: 'Complexity-based', description: 'Route by issue difficulty assessment' },\n} as const;\n\nexport type QueueTypeTS = keyof typeof QueueTypes;\nexport type QueueTypeOptionTS = typeof QueueTypes[QueueTypeTS];\n\n/**\n * QueueType represents the routing algorithm type\n */\nexport type QueueType = string;\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypeSkill: QueueType = \"skill\";\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypePriority: QueueType = \"priority\";\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypeDepartment: QueueType = \"department\";\n/**\n * Queue Type Constants - These are hardcoded routing algorithms, not admin-configurable\n */\nexport const QueueTypeComplexity: QueueType = \"complexity\";\n/**\n * AgentQueue represents an individual queue within a queue type\n */\nexport interface AgentQueue {\n id: string /* uuid */;\n orgId: string;\n type: QueueTypeTS; // \"skill\", \"priority\", etc.\n name: string; // 'technical_support', 'sales', etc. (snake_case for metadata matching)\n title: string; // 'Technical Support', 'Sales', etc. (human-readable display name)\n description: string;\n agentIds: string[]; // Agents assigned to this queue\n config: { [key: string]: any}; // Extensible configuration\n isActive: boolean;\n isDefault: boolean; // Default queue for unmatched chats\n createdAt: string /* RFC3339 */;\n updatedAt: string /* RFC3339 */;\n createdBy?: string;\n updatedBy?: string;\n}\n/**\n * GetAgentQueuesFilter represents filtering options for agent queues\n */\nexport interface GetAgentQueuesFilter {\n type?: QueueType;\n isActive?: boolean;\n}\n/**\n * Agent Queue Operations\n */\nexport interface CreateAgentQueueRequest {\n orgId: string;\n type: QueueType; // QueueTypeSkill, QueueTypePriority, etc.\n name: string; // 'technical_support', 'sales', etc. (snake_case)\n title: string; // 'Technical Support', 'Sales', etc. (human-readable)\n description: string;\n agentIds?: string[];\n config?: { [key: string]: any};\n isDefault?: boolean;\n createdBy?: string;\n updatedBy?: string;\n}\nexport interface CreateAgentQueueResponse {\n queue?: AgentQueue;\n metadata: any /* types.ResponseMetadata */;\n}\nexport interface GetAgentQueuesRequest {\n orgId: string;\n type?: QueueType; // Filter by queue type\n isActive?: boolean; // Filter by active status\n}\nexport interface GetAgentQueuesResponse {\n queues: (AgentQueue | undefined)[];\n metadata: any /* types.ResponseMetadata */;\n}\nexport interface UpdateAgentQueueRequest {\n orgId: string;\n id: string;\n type: QueueType; // QueueTypeSkill, QueueTypePriority, etc.\n name: string; // 'technical_support', 'sales', etc. (snake_case)\n title: string; // 'Technical Support', 'Sales', etc. (human-readable)\n description: string;\n agentIds?: string[];\n config?: { [key: string]: any};\n isDefault?: boolean;\n updatedBy?: string;\n}\nexport interface UpdateAgentQueueResponse {\n queue?: AgentQueue;\n metadata: any /* types.ResponseMetadata */;\n}\nexport interface DeleteAgentQueueRequest {\n orgId: string;\n id: string;\n}\nexport interface DeleteAgentQueueResponse {\n metadata: any /* types.ResponseMetadata */;\n}\n/**\n * ChatQueueInfo extends Chat with queue routing information\n */\nexport interface ChatQueueInfo {\n recommendedQueueId?: string /* uuid */;\n recommendedQueueName?: string;\n assignedQueueId?: string /* uuid */;\n assignedQueueName?: string;\n}\n\n//////////\n// source: subjects.go\n\nexport const GetWaitingForAgentChatCountSubject = \"chat.get_waiting_for_agent_chat_count\";\nexport const GetActiveChatCountSubject = \"chat.get_active_chat_count\";\nexport const GetWaitingForAgentChatsSubject = \"chat.get_waiting_for_agent_chats\";\nexport const GetActiveChatsSubject = \"chat.get_active_chats\";\nexport const GetUserChatsSubject = \"chat.get_user_chats\";\nexport const GetChatSubject = \"chat.get_chat\";\n/**\n * Chat Archival Subjects\n */\nexport const ChatArchiveSubjectPattern = \"chat.archive.%s.server\"; // %s = channel/product (e.g., shop-assist, gov-services)\n/**\n * Agent Session Subjects\n */\nexport const StartAgentSessionSubject = \"chat.agent_session.start\";\nexport const EndAgentSessionSubject = \"chat.agent_session.end\";\nexport const UpdateAgentStatusSubject = \"chat.agent_session.update_status\";\nexport const UpdateAgentLastActivitySubject = \"chat.agent_session.update_last_activity\";\nexport const AssignChatToAgentSubject = \"chat.agent_session.assign_chat\";\nexport const CompleteChatByAgentSubject = \"chat.agent_session.complete_chat\";\nexport const GetAgentSessionSubject = \"chat.agent_session.get\";\nexport const GetOnlineAgentsSubject = \"chat.agent_session.get_online_agents\";\nexport const GetOnlineAgentCountSubject = \"chat.agent_session.get_online_agent_count\";\n/**\n * Queue Management Subjects\n */\nexport const CreateAgentQueueSubject = \"chat.agent_queue.create\";\nexport const GetAgentQueuesSubject = \"chat.agent_queue.get\";\nexport const UpdateAgentQueueSubject = \"chat.agent_queue.update\";\nexport const DeleteAgentQueueSubject = \"chat.agent_queue.delete\";\n/**\n * Queue-specific Chat Subjects\n */\nexport const GetQueueChatsSubject = \"chat.queue.get_chats\";\nexport const GetQueueChatCountSubject = \"chat.queue.get_chat_count\";\n/**\n * Daily Counter Subjects\n */\nexport const GetDailyChatCountSubject = \"chat.get_daily_chat_count\";\n/**\n * User Status Subjects\n */\nexport const UpdateUserStatusSubject = \"chat.user.status.update\";\nexport const GetOnlineUsersSubject = \"chat.users.online.get\";\n/**\n * Analytics Trigger Subjects\n */\nexport const TriggerAnalyticsScanSubject = \"chat.analytics.trigger-scan\";\n/**\n * Org Setup Subject\n */\nexport const SetupOrgSubject = \"chat.org.setup\";\n"],"mappings":"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","names":["options"]}
package/dist/index.mjs CHANGED
@@ -93,7 +93,11 @@ function createSSETransport(options = {}) {
93
93
  const errorText = await response.text();
94
94
  throw new Error(`API error: ${response.status} - ${errorText}`);
95
95
  }
96
- return response.json();
96
+ const json = await response.json();
97
+ if (json && typeof json === "object" && "data" in json) {
98
+ return json.data;
99
+ }
100
+ return json;
97
101
  }
98
102
  function handleMessage(event) {
99
103
  if (!event.data || event.data === "") return;
@@ -302,6 +306,37 @@ function createSSETransport(options = {}) {
302
306
  });
303
307
  metrics.messagesSent++;
304
308
  },
309
+ async createChat(options2) {
310
+ if (!config) {
311
+ throw new Error("Transport not connected");
312
+ }
313
+ const response = await sendRest("create", {
314
+ orgId: options2.orgId,
315
+ userId: options2.userId,
316
+ metadata: options2.metadata
317
+ });
318
+ if (!response?.chatKey) {
319
+ throw new Error("Failed to create chat: no chatKey returned");
320
+ }
321
+ return { chatKey: response.chatKey };
322
+ },
323
+ async loadChatData(options2) {
324
+ if (!config) {
325
+ throw new Error("Transport not connected");
326
+ }
327
+ const response = await sendRest("load", {
328
+ orgId: options2.orgId,
329
+ chatKey: options2.chatKey,
330
+ userId: options2.userId
331
+ });
332
+ if (!response?.chat) {
333
+ throw new Error("Failed to load chat: no chat data returned");
334
+ }
335
+ return {
336
+ chat: response.chat,
337
+ agentId: response.agentId
338
+ };
339
+ },
305
340
  onMessage(handler) {
306
341
  globalHandlers.add(handler);
307
342
  return () => globalHandlers.delete(handler);
@@ -371,7 +406,6 @@ function useChat(options) {
371
406
  const mountedRef = useRef(false);
372
407
  const onMessageRef = useRef(onMessage);
373
408
  const onErrorRef = useRef(onError);
374
- const chatCreationResolverRef = useRef(null);
375
409
  const typingTimeoutRef = useRef(null);
376
410
  useEffect(() => {
377
411
  onMessageRef.current = onMessage;
@@ -399,10 +433,6 @@ function useChat(options) {
399
433
  const newChatKey = event.data?.chatKey;
400
434
  if (newChatKey) {
401
435
  setChatKey(newChatKey);
402
- if (chatCreationResolverRef.current) {
403
- chatCreationResolverRef.current.resolve(newChatKey);
404
- chatCreationResolverRef.current = null;
405
- }
406
436
  }
407
437
  break;
408
438
  case "load_chat_response":
@@ -491,26 +521,13 @@ function useChat(options) {
491
521
  if (!transport) {
492
522
  throw new Error("Transport not initialized");
493
523
  }
494
- return new Promise((resolve, reject) => {
495
- chatCreationResolverRef.current = { resolve, reject };
496
- transport.send({
497
- type: "new_chat",
498
- orgId,
499
- chatKey: "",
500
- userId,
501
- timestamp: Date.now(),
502
- data: metadata
503
- }).catch((err) => {
504
- chatCreationResolverRef.current = null;
505
- reject(err);
506
- });
507
- setTimeout(() => {
508
- if (chatCreationResolverRef.current) {
509
- chatCreationResolverRef.current = null;
510
- reject(new Error("Chat creation timed out"));
511
- }
512
- }, 3e4);
524
+ const response = await transport.createChat({
525
+ orgId,
526
+ userId,
527
+ metadata
513
528
  });
529
+ setChatKey(response.chatKey);
530
+ return response.chatKey;
514
531
  },
515
532
  [orgId, userId]
516
533
  );
@@ -520,14 +537,15 @@ function useChat(options) {
520
537
  if (!transport) {
521
538
  throw new Error("Transport not initialized");
522
539
  }
523
- setChatKey(key);
524
- await transport.send({
525
- type: "load_chat",
540
+ const response = await transport.loadChatData({
526
541
  orgId,
527
542
  chatKey: key,
528
- userId,
529
- timestamp: Date.now()
543
+ userId
530
544
  });
545
+ setCurrentChat(response.chat);
546
+ setChatKey(response.chat.key);
547
+ setMessages(response.chat.messages || []);
548
+ return response.chat;
531
549
  },
532
550
  [orgId, userId]
533
551
  );
@@ -588,6 +606,19 @@ function useChat(options) {
588
606
  },
589
607
  [orgId, chatKey, userId]
590
608
  );
609
+ const sendEvent = useCallback(
610
+ async (event) => {
611
+ const transport = transportRef.current;
612
+ if (!transport) {
613
+ throw new Error("Transport not initialized");
614
+ }
615
+ await transport.send({
616
+ ...event,
617
+ timestamp: Date.now()
618
+ });
619
+ },
620
+ []
621
+ );
591
622
  const startTyping = useCallback(() => {
592
623
  const transport = transportRef.current;
593
624
  if (!transport || !chatKey) return;
@@ -662,6 +693,7 @@ function useChat(options) {
662
693
  startChat,
663
694
  loadChat,
664
695
  sendMessage,
696
+ sendEvent,
665
697
  endChat,
666
698
  // Typing
667
699
  startTyping,