@veroai/chat 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/index.ts","../src/websocket.ts","../src/client.ts"],"names":["EventEmitter"],"mappings":"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","file":"chunk-JI6KXOLF.js","sourcesContent":["/**\n * VeroAI Chat API Client\n *\n * HTTP client for the VeroAI Chat API\n */\n\nimport type {\n Conversation,\n CreateConversationParams,\n Message,\n SendMessageParams,\n GetMessagesParams,\n PaginatedMessages,\n User,\n UserPresence,\n PresenceStatus,\n AgentConfig,\n} from '../types';\n\nexport interface ApiClientConfig {\n apiUrl: string;\n getToken: () => string | null | Promise<string | null>;\n}\n\n/**\n * Chat API Client for HTTP requests\n */\nexport class ChatApi {\n private apiUrl: string;\n private getToken: () => string | null | Promise<string | null>;\n\n constructor(config: ApiClientConfig) {\n this.apiUrl = config.apiUrl.replace(/\\/$/, '');\n this.getToken = config.getToken;\n }\n\n private async getHeaders(): Promise<HeadersInit> {\n const token = await this.getToken();\n return {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n };\n }\n\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.error?.message || errorJson.message || errorText;\n } catch {\n errorMessage = errorText;\n }\n throw new Error(errorMessage);\n }\n return response.json();\n }\n\n // ============================================================================\n // Conversations\n // ============================================================================\n\n /**\n * List all conversations for the current user\n */\n async listConversations(): Promise<Conversation[]> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ conversations: RawConversation[] }>(response);\n return data.conversations.map(transformConversation);\n }\n\n /**\n * Get a specific conversation\n */\n async getConversation(conversationId: string): Promise<Conversation> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations/${conversationId}`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ conversation: RawConversation }>(response);\n return transformConversation(data.conversation);\n }\n\n /**\n * Create a new conversation\n */\n async createConversation(params: CreateConversationParams): Promise<Conversation> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations`, {\n method: 'POST',\n headers: await this.getHeaders(),\n body: JSON.stringify({\n type: params.type || 'direct',\n name: params.name,\n participant_ids: params.participantIds,\n agent_config_id: params.agentConfigId,\n metadata: params.metadata,\n }),\n });\n const data = await this.handleResponse<{ conversation: RawConversation }>(response);\n return transformConversation(data.conversation);\n }\n\n /**\n * Mark conversation as read\n */\n async markConversationRead(conversationId: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations/${conversationId}/read`, {\n method: 'POST',\n headers: await this.getHeaders(),\n });\n await this.handleResponse<void>(response);\n }\n\n /**\n * Leave a conversation\n */\n async leaveConversation(conversationId: string): Promise<void> {\n const response = await fetch(\n `${this.apiUrl}/v1/chat/conversations/${conversationId}/participants/me`,\n {\n method: 'DELETE',\n headers: await this.getHeaders(),\n }\n );\n await this.handleResponse<void>(response);\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n /**\n * Get messages for a conversation\n */\n async getMessages(conversationId: string, params?: GetMessagesParams): Promise<PaginatedMessages> {\n const searchParams = new URLSearchParams();\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.offset) searchParams.set('offset', String(params.offset));\n if (params?.before) searchParams.set('before', params.before);\n\n const url = `${this.apiUrl}/v1/chat/conversations/${conversationId}/messages?${searchParams}`;\n const response = await fetch(url, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<RawPaginatedMessages>(response);\n return {\n messages: data.messages.map(transformMessage),\n total: data.total,\n hasMore: data.has_more,\n limit: data.limit,\n offset: data.offset,\n };\n }\n\n /**\n * Send a message to a conversation\n */\n async sendMessage(conversationId: string, params: SendMessageParams): Promise<Message> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations/${conversationId}/messages`, {\n method: 'POST',\n headers: await this.getHeaders(),\n body: JSON.stringify({\n content: params.content,\n message_type: params.messageType || 'text',\n metadata: params.metadata,\n }),\n });\n const data = await this.handleResponse<{ message: RawMessage }>(response);\n return transformMessage(data.message);\n }\n\n // ============================================================================\n // Users\n // ============================================================================\n\n /**\n * List all users (contacts)\n */\n async listUsers(options?: { includeVirtual?: boolean }): Promise<User[]> {\n const searchParams = new URLSearchParams();\n if (options?.includeVirtual) searchParams.set('include_virtual', 'true');\n\n const url = `${this.apiUrl}/v1/chat/users?${searchParams}`;\n const response = await fetch(url, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ users: RawUser[] }>(response);\n return data.users.map(transformUser);\n }\n\n /**\n * Get online users\n */\n async getOnlineUsers(): Promise<User[]> {\n const response = await fetch(`${this.apiUrl}/v1/chat/users/online`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ users: RawUser[] }>(response);\n return data.users.map(transformUser);\n }\n\n /**\n * Get current user profile\n */\n async getCurrentUser(): Promise<User> {\n const response = await fetch(`${this.apiUrl}/v1/chat/users/me`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ user: RawUser }>(response);\n return transformUser(data.user);\n }\n\n /**\n * Get a specific user\n */\n async getUser(userId: string): Promise<User> {\n const response = await fetch(`${this.apiUrl}/v1/chat/users/${userId}`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ user: RawUser }>(response);\n return transformUser(data.user);\n }\n\n /**\n * Update current user's presence status\n */\n async updateStatus(status: PresenceStatus, statusMessage?: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}/v1/chat/users/me/status`, {\n method: 'PUT',\n headers: await this.getHeaders(),\n body: JSON.stringify({\n status,\n status_message: statusMessage,\n }),\n });\n await this.handleResponse<void>(response);\n }\n\n // ============================================================================\n // Agents\n // ============================================================================\n\n /**\n * Add agent to conversation\n */\n async addAgentToConversation(\n conversationId: string,\n agentConfigId: string,\n addAsParticipant = true\n ): Promise<void> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations/${conversationId}/agent`, {\n method: 'POST',\n headers: await this.getHeaders(),\n body: JSON.stringify({\n agent_config_id: agentConfigId,\n add_as_participant: addAsParticipant,\n }),\n });\n await this.handleResponse<void>(response);\n }\n\n /**\n * Remove agent from conversation\n */\n async removeAgentFromConversation(conversationId: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations/${conversationId}/agent`, {\n method: 'DELETE',\n headers: await this.getHeaders(),\n });\n await this.handleResponse<void>(response);\n }\n\n /**\n * Toggle agent enabled/disabled\n */\n async toggleAgent(conversationId: string, enabled: boolean): Promise<void> {\n const response = await fetch(`${this.apiUrl}/v1/chat/conversations/${conversationId}/agent`, {\n method: 'PATCH',\n headers: await this.getHeaders(),\n body: JSON.stringify({ enabled }),\n });\n await this.handleResponse<void>(response);\n }\n\n /**\n * List available agents\n */\n async listAgents(): Promise<AgentConfig[]> {\n const response = await fetch(`${this.apiUrl}/v1/agent-configurations`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<AgentConfig[]>(response);\n return data;\n }\n\n // ============================================================================\n // Voice Rooms (LiveKit)\n // ============================================================================\n\n /**\n * Create a new voice/video room\n */\n async createRoom(params: {\n name: string;\n emptyTimeout?: number;\n maxParticipants?: number;\n }): Promise<RoomInfo> {\n const response = await fetch(`${this.apiUrl}/v1/voice/rooms`, {\n method: 'POST',\n headers: await this.getHeaders(),\n body: JSON.stringify({\n name: params.name,\n empty_timeout: params.emptyTimeout,\n max_participants: params.maxParticipants,\n }),\n });\n const data = await this.handleResponse<{ room: RawRoomInfo }>(response);\n return transformRoomInfo(data.room);\n }\n\n /**\n * Join an existing room and get access token\n */\n async joinRoom(params: {\n roomName: string;\n participantName: string;\n canPublish?: boolean;\n canSubscribe?: boolean;\n }): Promise<RoomInfo> {\n const response = await fetch(\n `${this.apiUrl}/v1/voice/rooms/${encodeURIComponent(params.roomName)}/join`,\n {\n method: 'POST',\n headers: await this.getHeaders(),\n body: JSON.stringify({\n participant_name: params.participantName,\n can_publish: params.canPublish ?? true,\n can_subscribe: params.canSubscribe ?? true,\n }),\n }\n );\n const data = await this.handleResponse<RawJoinRoomResponse>(response);\n return {\n name: data.room_name,\n wsUrl: data.ws_url,\n token: data.token,\n };\n }\n\n /**\n * Get room token for an existing room\n * Convenience method for getting a token without creating\n */\n async getRoomToken(roomName: string, participantName: string): Promise<RoomInfo> {\n return this.joinRoom({ roomName, participantName });\n }\n}\n\n// ============================================================================\n// Raw API Types (snake_case from server)\n// ============================================================================\n\ninterface RawUser {\n id: string;\n email?: string;\n first_name?: string;\n last_name?: string;\n is_virtual?: boolean;\n agent_config_id?: string;\n status?: PresenceStatus;\n status_message?: string;\n last_seen?: string;\n created_at?: string;\n}\n\ninterface RawParticipant {\n user_id: string;\n role: 'admin' | 'member';\n is_active: boolean;\n joined_at?: string;\n last_seen?: string;\n user?: RawUser;\n}\n\ninterface RawConversation {\n id: string;\n name?: string;\n type: string;\n is_active: boolean;\n last_message_at?: string;\n agent_enabled?: boolean;\n agent_config_id?: string;\n participants?: RawParticipant[];\n unread_count?: number;\n metadata?: Record<string, unknown>;\n created_at?: string;\n updated_at?: string;\n}\n\ninterface RawReadReceipt {\n user_id: string;\n read_at?: string;\n}\n\ninterface RawMessage {\n id: string;\n conversation_id: string;\n content: string;\n message_type: string;\n sender_id?: string;\n sender?: RawUser;\n read_by?: RawReadReceipt[];\n metadata?: Record<string, unknown>;\n created_at?: string;\n edited_at?: string;\n}\n\ninterface RawPaginatedMessages {\n messages: RawMessage[];\n total: number;\n has_more: boolean;\n limit: number;\n offset: number;\n}\n\ninterface RawRoomInfo {\n id?: string;\n name: string;\n ws_url: string;\n token: string;\n}\n\ninterface RawJoinRoomResponse {\n room_name: string;\n ws_url: string;\n token: string;\n}\n\n// Exported room types\nexport interface RoomInfo {\n name: string;\n wsUrl: string;\n token: string;\n}\n\n// ============================================================================\n// Transform Functions (snake_case to camelCase)\n// ============================================================================\n\nfunction transformUser(raw: RawUser): User {\n return {\n id: raw.id,\n email: raw.email,\n firstName: raw.first_name,\n lastName: raw.last_name,\n isVirtual: raw.is_virtual,\n agentConfigId: raw.agent_config_id,\n status: raw.status,\n statusMessage: raw.status_message,\n lastSeen: raw.last_seen,\n createdAt: raw.created_at,\n };\n}\n\nfunction transformParticipant(raw: RawParticipant) {\n return {\n userId: raw.user_id,\n role: raw.role,\n isActive: raw.is_active,\n joinedAt: raw.joined_at,\n lastSeen: raw.last_seen,\n user: raw.user ? transformUser(raw.user) : undefined,\n };\n}\n\nfunction transformConversation(raw: RawConversation): Conversation {\n return {\n id: raw.id,\n name: raw.name,\n type: raw.type as Conversation['type'],\n isActive: raw.is_active,\n lastMessageAt: raw.last_message_at,\n agentEnabled: raw.agent_enabled,\n agentConfigId: raw.agent_config_id,\n participants: raw.participants?.map(transformParticipant),\n unreadCount: raw.unread_count,\n metadata: raw.metadata,\n createdAt: raw.created_at,\n updatedAt: raw.updated_at,\n };\n}\n\nfunction transformMessage(raw: RawMessage): Message {\n return {\n id: raw.id,\n conversationId: raw.conversation_id,\n content: raw.content,\n messageType: raw.message_type as Message['messageType'],\n senderId: raw.sender_id,\n sender: raw.sender ? transformUser(raw.sender) : undefined,\n readBy: raw.read_by?.map((r) => ({\n userId: r.user_id,\n readAt: r.read_at,\n })),\n metadata: raw.metadata,\n createdAt: raw.created_at,\n editedAt: raw.edited_at,\n };\n}\n\nfunction transformRoomInfo(raw: RawRoomInfo): RoomInfo {\n return {\n name: raw.name,\n wsUrl: raw.ws_url,\n token: raw.token,\n };\n}\n","/**\n * VeroAI Chat WebSocket Manager\n *\n * Handles WebSocket connection, reconnection, and message handling\n */\n\nimport EventEmitter from 'eventemitter3';\nimport type {\n ChatEvents,\n WebSocketMessage,\n NewMessageEvent,\n TypingEvent,\n PresenceEvent,\n ReadReceiptEvent,\n CallEvent,\n CallAction,\n CallType,\n Message,\n Conversation,\n Participant,\n} from './types';\n\nexport interface WebSocketConfig {\n url: string;\n getToken: () => string | null | Promise<string | null>;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n heartbeatInterval?: number;\n}\n\ntype ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';\n\n/**\n * WebSocket connection manager with auto-reconnect\n */\nexport class WebSocketManager extends EventEmitter<ChatEvents> {\n private config: Required<WebSocketConfig>;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pendingMessages: string[] = [];\n\n constructor(config: WebSocketConfig) {\n super();\n this.config = {\n url: config.url,\n getToken: config.getToken,\n autoReconnect: config.autoReconnect ?? true,\n reconnectInterval: config.reconnectInterval ?? 3000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n heartbeatInterval: config.heartbeatInterval ?? 30000,\n };\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n if (this.state === 'connecting' || this.state === 'connected') {\n return;\n }\n\n this.state = 'connecting';\n const token = await this.config.getToken();\n\n if (!token) {\n this.state = 'disconnected';\n throw new Error('No authentication token available');\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Build WebSocket URL with token\n const url = new URL(this.config.url);\n url.searchParams.set('token', token);\n\n this.ws = new WebSocket(url.toString());\n\n this.ws.onopen = () => {\n this.state = 'connected';\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.flushPendingMessages();\n this.emit('connected');\n resolve();\n };\n\n this.ws.onclose = (event) => {\n this.handleClose(event.reason);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error('WebSocket error');\n this.emit('error', error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n } catch (error) {\n this.state = 'disconnected';\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.config.autoReconnect = false;\n this.clearTimers();\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n\n this.state = 'disconnected';\n }\n\n /**\n * Send a message through the WebSocket\n */\n send(type: string, payload: unknown): void {\n const message = JSON.stringify({ type, payload, timestamp: new Date().toISOString() });\n\n if (this.isConnected()) {\n this.ws!.send(message);\n } else {\n // Queue message for when connection is restored\n this.pendingMessages.push(message);\n }\n }\n\n /**\n * Send typing indicator\n */\n sendTypingStart(conversationId: string): void {\n this.send('typing:start', { conversationId });\n }\n\n /**\n * Stop typing indicator\n */\n sendTypingStop(conversationId: string): void {\n this.send('typing:stop', { conversationId });\n }\n\n /**\n * Subscribe to a conversation for real-time updates\n */\n subscribeToConversation(conversationId: string): void {\n this.send('subscribe', { conversationId });\n }\n\n /**\n * Unsubscribe from a conversation\n */\n unsubscribeFromConversation(conversationId: string): void {\n this.send('unsubscribe', { conversationId });\n }\n\n /**\n * Update presence status\n */\n updatePresence(status: string, statusMessage?: string): void {\n this.send('presence:update', { status, statusMessage });\n }\n\n /**\n * Send call notification (ring, accept, reject, end)\n * Note: Actual WebRTC signaling is handled by LiveKit\n */\n sendCallNotification(\n conversationId: string,\n action: CallAction,\n callType?: CallType,\n roomName?: string\n ): void {\n this.send('call', { conversationId, action, callType, roomName });\n }\n\n private handleClose(reason?: string): void {\n this.stopHeartbeat();\n const wasConnected = this.state === 'connected';\n this.state = 'disconnected';\n this.ws = null;\n\n if (wasConnected) {\n this.emit('disconnected', reason);\n }\n\n // Attempt reconnection if enabled\n if (this.config.autoReconnect && this.reconnectAttempts < this.config.maxReconnectAttempts) {\n this.scheduleReconnect();\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) {\n return;\n }\n\n this.state = 'reconnecting';\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectInterval * Math.pow(1.5, this.reconnectAttempts - 1),\n 30000 // Max 30 seconds\n );\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n try {\n await this.connect();\n } catch (error) {\n // Connect will handle scheduling next reconnect\n }\n }, delay);\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WebSocketMessage;\n\n switch (message.type) {\n case 'message:new':\n this.emit('message:new', message.payload as NewMessageEvent);\n break;\n\n case 'message:updated':\n this.emit('message:updated', message.payload as Message);\n break;\n\n case 'message:deleted': {\n const { messageId, conversationId } = message.payload as {\n messageId: string;\n conversationId: string;\n };\n this.emit('message:deleted', messageId, conversationId);\n break;\n }\n\n case 'conversation:created':\n this.emit('conversation:created', message.payload as Conversation);\n break;\n\n case 'conversation:updated':\n this.emit('conversation:updated', message.payload as Conversation);\n break;\n\n case 'participant:joined': {\n const { conversationId, participant } = message.payload as {\n conversationId: string;\n participant: Participant;\n };\n this.emit('participant:joined', conversationId, participant);\n break;\n }\n\n case 'participant:left': {\n const payload = message.payload as { conversationId: string; userId: string };\n this.emit('participant:left', payload.conversationId, payload.userId);\n break;\n }\n\n case 'presence:updated':\n this.emit('presence:updated', message.payload as PresenceEvent);\n break;\n\n case 'typing:start':\n this.emit('typing:start', message.payload as TypingEvent);\n break;\n\n case 'typing:stop':\n this.emit('typing:stop', message.payload as TypingEvent);\n break;\n\n case 'read:receipt':\n this.emit('read:receipt', message.payload as ReadReceiptEvent);\n break;\n\n case 'call:ring':\n this.emit('call:ring', message.payload as CallEvent);\n break;\n\n case 'call:accept':\n this.emit('call:accept', message.payload as CallEvent);\n break;\n\n case 'call:reject':\n this.emit('call:reject', message.payload as CallEvent);\n break;\n\n case 'call:end':\n this.emit('call:end', message.payload as CallEvent);\n break;\n }\n } catch (error) {\n console.error('[ChatWS] Failed to parse message:', error);\n }\n }\n\n private flushPendingMessages(): void {\n while (this.pendingMessages.length > 0 && this.isConnected()) {\n const message = this.pendingMessages.shift();\n if (message) {\n this.ws!.send(message);\n }\n }\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.isConnected()) {\n this.send('ping', {});\n }\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private clearTimers(): void {\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","/**\n * VeroAI Chat Client\n *\n * Main entry point for the Chat SDK - combines HTTP API and WebSocket\n */\n\nimport EventEmitter from 'eventemitter3';\nimport { ChatApi, type RoomInfo } from './api';\nimport { WebSocketManager } from './websocket';\nimport type {\n ChatClientConfig,\n ChatEvents,\n Conversation,\n CreateConversationParams,\n Message,\n SendMessageParams,\n GetMessagesParams,\n PaginatedMessages,\n User,\n PresenceStatus,\n AgentConfig,\n} from './types';\n\n/**\n * VeroAI Chat Client\n *\n * Provides a unified interface for chat functionality:\n * - HTTP API for CRUD operations\n * - WebSocket for real-time events\n *\n * @example\n * ```typescript\n * const chat = new ChatClient({\n * apiUrl: 'https://api.veroai.dev',\n * wsUrl: 'wss://ws.veroai.dev',\n * token: 'your-jwt-token',\n * });\n *\n * // Connect to real-time events\n * await chat.connect();\n *\n * // Listen for new messages\n * chat.on('message:new', ({ message, conversationId }) => {\n * console.log('New message:', message);\n * });\n *\n * // Send a message\n * await chat.sendMessage(conversationId, { content: 'Hello!' });\n * ```\n */\nexport class ChatClient extends EventEmitter<ChatEvents> {\n private api: ChatApi;\n private ws: WebSocketManager | null = null;\n private config: ChatClientConfig;\n private tokenGetter: () => string | null | Promise<string | null>;\n\n constructor(config: ChatClientConfig) {\n super();\n this.config = config;\n\n // Create token getter\n this.tokenGetter = config.getToken || (() => config.token || null);\n\n // Initialize API client\n this.api = new ChatApi({\n apiUrl: config.apiUrl,\n getToken: this.tokenGetter,\n });\n\n // Initialize WebSocket if URL provided\n if (config.wsUrl) {\n this.ws = new WebSocketManager({\n url: config.wsUrl,\n getToken: this.tokenGetter,\n autoReconnect: config.autoReconnect ?? true,\n reconnectInterval: config.reconnectInterval,\n maxReconnectAttempts: config.maxReconnectAttempts,\n });\n\n // Forward WebSocket events\n this.forwardWebSocketEvents();\n }\n\n // Auto-connect if enabled\n if (config.autoConnect && config.wsUrl) {\n this.connect().catch((error) => {\n console.error('[ChatClient] Auto-connect failed:', error);\n });\n }\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n /**\n * Connect to WebSocket for real-time updates\n */\n async connect(): Promise<void> {\n if (!this.ws) {\n throw new Error('WebSocket URL not configured');\n }\n await this.ws.connect();\n }\n\n /**\n * Disconnect from WebSocket\n */\n disconnect(): void {\n this.ws?.disconnect();\n }\n\n /**\n * Check if WebSocket is connected\n */\n isConnected(): boolean {\n return this.ws?.isConnected() ?? false;\n }\n\n /**\n * Update authentication token\n */\n setToken(token: string): void {\n this.config.token = token;\n }\n\n // ============================================================================\n // Conversations\n // ============================================================================\n\n /**\n * List all conversations for the current user\n */\n async listConversations(): Promise<Conversation[]> {\n return this.api.listConversations();\n }\n\n /**\n * Get a specific conversation\n */\n async getConversation(conversationId: string): Promise<Conversation> {\n return this.api.getConversation(conversationId);\n }\n\n /**\n * Create a new conversation\n */\n async createConversation(params: CreateConversationParams): Promise<Conversation> {\n const conversation = await this.api.createConversation(params);\n\n // Subscribe to real-time updates for new conversation\n if (this.ws?.isConnected()) {\n this.ws.subscribeToConversation(conversation.id);\n }\n\n return conversation;\n }\n\n /**\n * Mark conversation as read\n */\n async markConversationRead(conversationId: string): Promise<void> {\n return this.api.markConversationRead(conversationId);\n }\n\n /**\n * Leave a conversation\n */\n async leaveConversation(conversationId: string): Promise<void> {\n // Unsubscribe from real-time updates\n if (this.ws?.isConnected()) {\n this.ws.unsubscribeFromConversation(conversationId);\n }\n\n return this.api.leaveConversation(conversationId);\n }\n\n /**\n * Subscribe to real-time updates for a conversation\n */\n subscribeToConversation(conversationId: string): void {\n this.ws?.subscribeToConversation(conversationId);\n }\n\n /**\n * Unsubscribe from real-time updates for a conversation\n */\n unsubscribeFromConversation(conversationId: string): void {\n this.ws?.unsubscribeFromConversation(conversationId);\n }\n\n // ============================================================================\n // Messages\n // ============================================================================\n\n /**\n * Get messages for a conversation\n */\n async getMessages(conversationId: string, params?: GetMessagesParams): Promise<PaginatedMessages> {\n return this.api.getMessages(conversationId, params);\n }\n\n /**\n * Send a message to a conversation\n */\n async sendMessage(conversationId: string, params: SendMessageParams): Promise<Message> {\n return this.api.sendMessage(conversationId, params);\n }\n\n /**\n * Send a text message (convenience method)\n */\n async send(conversationId: string, content: string): Promise<Message> {\n return this.sendMessage(conversationId, { content });\n }\n\n // ============================================================================\n // Typing Indicators\n // ============================================================================\n\n /**\n * Send typing start indicator\n */\n sendTypingStart(conversationId: string): void {\n this.ws?.sendTypingStart(conversationId);\n }\n\n /**\n * Send typing stop indicator\n */\n sendTypingStop(conversationId: string): void {\n this.ws?.sendTypingStop(conversationId);\n }\n\n // ============================================================================\n // Users & Presence\n // ============================================================================\n\n /**\n * List all users (contacts)\n */\n async listUsers(options?: { includeVirtual?: boolean }): Promise<User[]> {\n return this.api.listUsers(options);\n }\n\n /**\n * Get online users\n */\n async getOnlineUsers(): Promise<User[]> {\n return this.api.getOnlineUsers();\n }\n\n /**\n * Get current user profile\n */\n async getCurrentUser(): Promise<User> {\n return this.api.getCurrentUser();\n }\n\n /**\n * Get a specific user\n */\n async getUser(userId: string): Promise<User> {\n return this.api.getUser(userId);\n }\n\n /**\n * Update current user's presence status\n */\n async updateStatus(status: PresenceStatus, statusMessage?: string): Promise<void> {\n // Update via HTTP API\n await this.api.updateStatus(status, statusMessage);\n\n // Also notify via WebSocket for real-time propagation\n this.ws?.updatePresence(status, statusMessage);\n }\n\n // ============================================================================\n // Agents\n // ============================================================================\n\n /**\n * Add agent to conversation\n */\n async addAgentToConversation(\n conversationId: string,\n agentConfigId: string,\n addAsParticipant = true\n ): Promise<void> {\n return this.api.addAgentToConversation(conversationId, agentConfigId, addAsParticipant);\n }\n\n /**\n * Remove agent from conversation\n */\n async removeAgentFromConversation(conversationId: string): Promise<void> {\n return this.api.removeAgentFromConversation(conversationId);\n }\n\n /**\n * Toggle agent enabled/disabled\n */\n async toggleAgent(conversationId: string, enabled: boolean): Promise<void> {\n return this.api.toggleAgent(conversationId, enabled);\n }\n\n /**\n * List available agents\n */\n async listAgents(): Promise<AgentConfig[]> {\n return this.api.listAgents();\n }\n\n // ============================================================================\n // Voice/Video Calls (LiveKit)\n // ============================================================================\n\n /**\n * Create a new voice/video room\n *\n * @example\n * ```typescript\n * const room = await chat.createRoom({ name: `call-${conversationId}` });\n * // Use room.wsUrl and room.token with LiveKit client\n * ```\n */\n async createRoom(params: {\n name: string;\n emptyTimeout?: number;\n maxParticipants?: number;\n }): Promise<RoomInfo> {\n return this.api.createRoom(params);\n }\n\n /**\n * Join an existing room and get access token\n *\n * @example\n * ```typescript\n * const room = await chat.joinRoom({\n * roomName: `call-${conversationId}`,\n * participantName: 'John Doe',\n * });\n * // Connect to room using LiveKit client SDK with room.wsUrl and room.token\n * ```\n */\n async joinRoom(params: {\n roomName: string;\n participantName: string;\n canPublish?: boolean;\n canSubscribe?: boolean;\n }): Promise<RoomInfo> {\n return this.api.joinRoom(params);\n }\n\n /**\n * Initiate a call in a conversation\n * This notifies other participants that you're calling\n *\n * @example\n * ```typescript\n * // Start a video call\n * const room = await chat.startCall(conversationId, 'video');\n * // room contains { name, wsUrl, token } for LiveKit\n * ```\n */\n async startCall(\n conversationId: string,\n callType: 'audio' | 'video' = 'audio'\n ): Promise<RoomInfo> {\n // Create room\n const roomName = `call-${conversationId}-${Date.now()}`;\n const room = await this.api.createRoom({ name: roomName });\n\n // Notify other participants via WebSocket\n this.ws?.sendCallNotification(conversationId, 'ring', callType, roomName);\n\n return room;\n }\n\n /**\n * Accept an incoming call\n *\n * @example\n * ```typescript\n * chat.on('call:ring', async ({ conversationId, roomName, callType }) => {\n * const room = await chat.acceptCall(conversationId, roomName);\n * // Connect to room using LiveKit client SDK\n * });\n * ```\n */\n async acceptCall(\n conversationId: string,\n roomName: string,\n participantName: string\n ): Promise<RoomInfo> {\n const room = await this.api.joinRoom({ roomName, participantName });\n\n // Notify caller that we accepted\n this.ws?.sendCallNotification(conversationId, 'accept', undefined, roomName);\n\n return room;\n }\n\n /**\n * Reject an incoming call\n */\n rejectCall(conversationId: string): void {\n this.ws?.sendCallNotification(conversationId, 'reject');\n }\n\n /**\n * End an ongoing call\n */\n endCall(conversationId: string): void {\n this.ws?.sendCallNotification(conversationId, 'end');\n }\n\n // ============================================================================\n // Internal\n // ============================================================================\n\n private forwardWebSocketEvents(): void {\n if (!this.ws) return;\n\n // Forward all events from WebSocket manager to ChatClient\n this.ws.on('connected', () => this.emit('connected'));\n this.ws.on('disconnected', (reason) => this.emit('disconnected', reason));\n this.ws.on('error', (error) => this.emit('error', error));\n this.ws.on('message:new', (event) => this.emit('message:new', event));\n this.ws.on('message:updated', (msg) => this.emit('message:updated', msg));\n this.ws.on('message:deleted', (msgId, convId) => this.emit('message:deleted', msgId, convId));\n this.ws.on('conversation:created', (conv) => this.emit('conversation:created', conv));\n this.ws.on('conversation:updated', (conv) => this.emit('conversation:updated', conv));\n this.ws.on('participant:joined', (convId, p) => this.emit('participant:joined', convId, p));\n this.ws.on('participant:left', (convId, userId) => this.emit('participant:left', convId, userId));\n this.ws.on('presence:updated', (event) => this.emit('presence:updated', event));\n this.ws.on('typing:start', (event) => this.emit('typing:start', event));\n this.ws.on('typing:stop', (event) => this.emit('typing:stop', event));\n this.ws.on('read:receipt', (event) => this.emit('read:receipt', event));\n this.ws.on('call:ring', (event) => this.emit('call:ring', event));\n this.ws.on('call:accept', (event) => this.emit('call:accept', event));\n this.ws.on('call:reject', (event) => this.emit('call:reject', event));\n this.ws.on('call:end', (event) => this.emit('call:end', event));\n }\n}\n"]}
@@ -0,0 +1,502 @@
1
+ import EventEmitter from 'eventemitter3';
2
+
3
+ /**
4
+ * VeroAI Chat SDK Types
5
+ */
6
+ interface ChatClientConfig {
7
+ /** VeroAI API URL (e.g., https://api.veroai.dev) */
8
+ apiUrl: string;
9
+ /** WebSocket URL for real-time events (e.g., wss://ws.veroai.dev) */
10
+ wsUrl?: string;
11
+ /** Authentication token (JWT) */
12
+ token?: string;
13
+ /** Token getter function for dynamic token retrieval */
14
+ getToken?: () => string | null | Promise<string | null>;
15
+ /** Auto-connect to WebSocket on initialization */
16
+ autoConnect?: boolean;
17
+ /** Auto-reconnect on disconnect */
18
+ autoReconnect?: boolean;
19
+ /** Reconnect interval in ms */
20
+ reconnectInterval?: number;
21
+ /** Max reconnect attempts */
22
+ maxReconnectAttempts?: number;
23
+ }
24
+ interface User {
25
+ id: string;
26
+ email?: string;
27
+ firstName?: string;
28
+ lastName?: string;
29
+ isVirtual?: boolean;
30
+ agentConfigId?: string;
31
+ status?: PresenceStatus;
32
+ statusMessage?: string;
33
+ lastSeen?: string;
34
+ createdAt?: string;
35
+ }
36
+ type PresenceStatus = 'online' | 'away' | 'busy' | 'offline';
37
+ interface UserPresence {
38
+ userId: string;
39
+ status: PresenceStatus;
40
+ statusMessage?: string;
41
+ lastSeen?: string;
42
+ metadata?: Record<string, unknown>;
43
+ }
44
+ type ConversationType = 'direct' | 'group' | 'channel' | 'support';
45
+ interface Conversation {
46
+ id: string;
47
+ name?: string;
48
+ type: ConversationType;
49
+ isActive: boolean;
50
+ lastMessageAt?: string;
51
+ agentEnabled?: boolean;
52
+ agentConfigId?: string;
53
+ participants?: Participant[];
54
+ unreadCount?: number;
55
+ metadata?: Record<string, unknown>;
56
+ createdAt?: string;
57
+ updatedAt?: string;
58
+ }
59
+ interface Participant {
60
+ userId: string;
61
+ role: 'admin' | 'member';
62
+ isActive: boolean;
63
+ joinedAt?: string;
64
+ lastSeen?: string;
65
+ user?: User;
66
+ }
67
+ interface CreateConversationParams {
68
+ type?: ConversationType;
69
+ name?: string;
70
+ participantIds: string[];
71
+ agentConfigId?: string;
72
+ metadata?: Record<string, unknown>;
73
+ }
74
+ type MessageType = 'text' | 'system' | 'agent' | 'file' | 'call';
75
+ interface Message {
76
+ id: string;
77
+ conversationId: string;
78
+ content: string;
79
+ messageType: MessageType;
80
+ senderId?: string;
81
+ sender?: User;
82
+ readBy?: ReadReceipt[];
83
+ metadata?: Record<string, unknown>;
84
+ createdAt?: string;
85
+ editedAt?: string;
86
+ }
87
+ interface ReadReceipt {
88
+ userId: string;
89
+ readAt?: string;
90
+ }
91
+ interface SendMessageParams {
92
+ content: string;
93
+ messageType?: MessageType;
94
+ metadata?: Record<string, unknown>;
95
+ }
96
+ interface GetMessagesParams {
97
+ limit?: number;
98
+ offset?: number;
99
+ before?: string;
100
+ }
101
+ interface PaginatedMessages {
102
+ messages: Message[];
103
+ total: number;
104
+ hasMore: boolean;
105
+ limit: number;
106
+ offset: number;
107
+ }
108
+ interface AgentConfig {
109
+ id: string;
110
+ name: string;
111
+ description?: string;
112
+ jobRole?: string;
113
+ systemPrompt?: string;
114
+ isActive: boolean;
115
+ }
116
+ type WebSocketEventType = 'connected' | 'disconnected' | 'error' | 'message' | 'message:new' | 'message:updated' | 'message:deleted' | 'conversation:created' | 'conversation:updated' | 'participant:joined' | 'participant:left' | 'presence:updated' | 'typing:start' | 'typing:stop' | 'read:receipt' | 'call:ring' | 'call:accept' | 'call:reject' | 'call:end';
117
+ interface WebSocketMessage<T = unknown> {
118
+ type: WebSocketEventType;
119
+ payload: T;
120
+ timestamp: string;
121
+ }
122
+ interface NewMessageEvent {
123
+ message: Message;
124
+ conversationId: string;
125
+ }
126
+ interface TypingEvent {
127
+ conversationId: string;
128
+ userId: string;
129
+ userName?: string;
130
+ }
131
+ interface PresenceEvent {
132
+ userId: string;
133
+ status: PresenceStatus;
134
+ statusMessage?: string;
135
+ }
136
+ interface ReadReceiptEvent {
137
+ conversationId: string;
138
+ messageId: string;
139
+ userId: string;
140
+ readAt: string;
141
+ }
142
+ type CallAction = 'ring' | 'accept' | 'reject' | 'end';
143
+ type CallType = 'audio' | 'video';
144
+ interface CallEvent {
145
+ conversationId: string;
146
+ userId: string;
147
+ action: CallAction;
148
+ callType?: CallType;
149
+ roomName?: string;
150
+ }
151
+ interface ApiError {
152
+ code: string;
153
+ message: string;
154
+ }
155
+ interface ApiResponse<T> {
156
+ data?: T;
157
+ error?: ApiError;
158
+ }
159
+ interface ChatEvents {
160
+ connected: () => void;
161
+ disconnected: (reason?: string) => void;
162
+ error: (error: Error) => void;
163
+ 'message:new': (event: NewMessageEvent) => void;
164
+ 'message:updated': (message: Message) => void;
165
+ 'message:deleted': (messageId: string, conversationId: string) => void;
166
+ 'conversation:created': (conversation: Conversation) => void;
167
+ 'conversation:updated': (conversation: Conversation) => void;
168
+ 'participant:joined': (conversationId: string, participant: Participant) => void;
169
+ 'participant:left': (conversationId: string, userId: string) => void;
170
+ 'presence:updated': (event: PresenceEvent) => void;
171
+ 'typing:start': (event: TypingEvent) => void;
172
+ 'typing:stop': (event: TypingEvent) => void;
173
+ 'read:receipt': (event: ReadReceiptEvent) => void;
174
+ 'call:ring': (event: CallEvent) => void;
175
+ 'call:accept': (event: CallEvent) => void;
176
+ 'call:reject': (event: CallEvent) => void;
177
+ 'call:end': (event: CallEvent) => void;
178
+ }
179
+
180
+ /**
181
+ * VeroAI Chat API Client
182
+ *
183
+ * HTTP client for the VeroAI Chat API
184
+ */
185
+
186
+ interface ApiClientConfig {
187
+ apiUrl: string;
188
+ getToken: () => string | null | Promise<string | null>;
189
+ }
190
+ /**
191
+ * Chat API Client for HTTP requests
192
+ */
193
+ declare class ChatApi {
194
+ private apiUrl;
195
+ private getToken;
196
+ constructor(config: ApiClientConfig);
197
+ private getHeaders;
198
+ private handleResponse;
199
+ /**
200
+ * List all conversations for the current user
201
+ */
202
+ listConversations(): Promise<Conversation[]>;
203
+ /**
204
+ * Get a specific conversation
205
+ */
206
+ getConversation(conversationId: string): Promise<Conversation>;
207
+ /**
208
+ * Create a new conversation
209
+ */
210
+ createConversation(params: CreateConversationParams): Promise<Conversation>;
211
+ /**
212
+ * Mark conversation as read
213
+ */
214
+ markConversationRead(conversationId: string): Promise<void>;
215
+ /**
216
+ * Leave a conversation
217
+ */
218
+ leaveConversation(conversationId: string): Promise<void>;
219
+ /**
220
+ * Get messages for a conversation
221
+ */
222
+ getMessages(conversationId: string, params?: GetMessagesParams): Promise<PaginatedMessages>;
223
+ /**
224
+ * Send a message to a conversation
225
+ */
226
+ sendMessage(conversationId: string, params: SendMessageParams): Promise<Message>;
227
+ /**
228
+ * List all users (contacts)
229
+ */
230
+ listUsers(options?: {
231
+ includeVirtual?: boolean;
232
+ }): Promise<User[]>;
233
+ /**
234
+ * Get online users
235
+ */
236
+ getOnlineUsers(): Promise<User[]>;
237
+ /**
238
+ * Get current user profile
239
+ */
240
+ getCurrentUser(): Promise<User>;
241
+ /**
242
+ * Get a specific user
243
+ */
244
+ getUser(userId: string): Promise<User>;
245
+ /**
246
+ * Update current user's presence status
247
+ */
248
+ updateStatus(status: PresenceStatus, statusMessage?: string): Promise<void>;
249
+ /**
250
+ * Add agent to conversation
251
+ */
252
+ addAgentToConversation(conversationId: string, agentConfigId: string, addAsParticipant?: boolean): Promise<void>;
253
+ /**
254
+ * Remove agent from conversation
255
+ */
256
+ removeAgentFromConversation(conversationId: string): Promise<void>;
257
+ /**
258
+ * Toggle agent enabled/disabled
259
+ */
260
+ toggleAgent(conversationId: string, enabled: boolean): Promise<void>;
261
+ /**
262
+ * List available agents
263
+ */
264
+ listAgents(): Promise<AgentConfig[]>;
265
+ /**
266
+ * Create a new voice/video room
267
+ */
268
+ createRoom(params: {
269
+ name: string;
270
+ emptyTimeout?: number;
271
+ maxParticipants?: number;
272
+ }): Promise<RoomInfo>;
273
+ /**
274
+ * Join an existing room and get access token
275
+ */
276
+ joinRoom(params: {
277
+ roomName: string;
278
+ participantName: string;
279
+ canPublish?: boolean;
280
+ canSubscribe?: boolean;
281
+ }): Promise<RoomInfo>;
282
+ /**
283
+ * Get room token for an existing room
284
+ * Convenience method for getting a token without creating
285
+ */
286
+ getRoomToken(roomName: string, participantName: string): Promise<RoomInfo>;
287
+ }
288
+ interface RoomInfo {
289
+ name: string;
290
+ wsUrl: string;
291
+ token: string;
292
+ }
293
+
294
+ /**
295
+ * VeroAI Chat Client
296
+ *
297
+ * Main entry point for the Chat SDK - combines HTTP API and WebSocket
298
+ */
299
+
300
+ /**
301
+ * VeroAI Chat Client
302
+ *
303
+ * Provides a unified interface for chat functionality:
304
+ * - HTTP API for CRUD operations
305
+ * - WebSocket for real-time events
306
+ *
307
+ * @example
308
+ * ```typescript
309
+ * const chat = new ChatClient({
310
+ * apiUrl: 'https://api.veroai.dev',
311
+ * wsUrl: 'wss://ws.veroai.dev',
312
+ * token: 'your-jwt-token',
313
+ * });
314
+ *
315
+ * // Connect to real-time events
316
+ * await chat.connect();
317
+ *
318
+ * // Listen for new messages
319
+ * chat.on('message:new', ({ message, conversationId }) => {
320
+ * console.log('New message:', message);
321
+ * });
322
+ *
323
+ * // Send a message
324
+ * await chat.sendMessage(conversationId, { content: 'Hello!' });
325
+ * ```
326
+ */
327
+ declare class ChatClient extends EventEmitter<ChatEvents> {
328
+ private api;
329
+ private ws;
330
+ private config;
331
+ private tokenGetter;
332
+ constructor(config: ChatClientConfig);
333
+ /**
334
+ * Connect to WebSocket for real-time updates
335
+ */
336
+ connect(): Promise<void>;
337
+ /**
338
+ * Disconnect from WebSocket
339
+ */
340
+ disconnect(): void;
341
+ /**
342
+ * Check if WebSocket is connected
343
+ */
344
+ isConnected(): boolean;
345
+ /**
346
+ * Update authentication token
347
+ */
348
+ setToken(token: string): void;
349
+ /**
350
+ * List all conversations for the current user
351
+ */
352
+ listConversations(): Promise<Conversation[]>;
353
+ /**
354
+ * Get a specific conversation
355
+ */
356
+ getConversation(conversationId: string): Promise<Conversation>;
357
+ /**
358
+ * Create a new conversation
359
+ */
360
+ createConversation(params: CreateConversationParams): Promise<Conversation>;
361
+ /**
362
+ * Mark conversation as read
363
+ */
364
+ markConversationRead(conversationId: string): Promise<void>;
365
+ /**
366
+ * Leave a conversation
367
+ */
368
+ leaveConversation(conversationId: string): Promise<void>;
369
+ /**
370
+ * Subscribe to real-time updates for a conversation
371
+ */
372
+ subscribeToConversation(conversationId: string): void;
373
+ /**
374
+ * Unsubscribe from real-time updates for a conversation
375
+ */
376
+ unsubscribeFromConversation(conversationId: string): void;
377
+ /**
378
+ * Get messages for a conversation
379
+ */
380
+ getMessages(conversationId: string, params?: GetMessagesParams): Promise<PaginatedMessages>;
381
+ /**
382
+ * Send a message to a conversation
383
+ */
384
+ sendMessage(conversationId: string, params: SendMessageParams): Promise<Message>;
385
+ /**
386
+ * Send a text message (convenience method)
387
+ */
388
+ send(conversationId: string, content: string): Promise<Message>;
389
+ /**
390
+ * Send typing start indicator
391
+ */
392
+ sendTypingStart(conversationId: string): void;
393
+ /**
394
+ * Send typing stop indicator
395
+ */
396
+ sendTypingStop(conversationId: string): void;
397
+ /**
398
+ * List all users (contacts)
399
+ */
400
+ listUsers(options?: {
401
+ includeVirtual?: boolean;
402
+ }): Promise<User[]>;
403
+ /**
404
+ * Get online users
405
+ */
406
+ getOnlineUsers(): Promise<User[]>;
407
+ /**
408
+ * Get current user profile
409
+ */
410
+ getCurrentUser(): Promise<User>;
411
+ /**
412
+ * Get a specific user
413
+ */
414
+ getUser(userId: string): Promise<User>;
415
+ /**
416
+ * Update current user's presence status
417
+ */
418
+ updateStatus(status: PresenceStatus, statusMessage?: string): Promise<void>;
419
+ /**
420
+ * Add agent to conversation
421
+ */
422
+ addAgentToConversation(conversationId: string, agentConfigId: string, addAsParticipant?: boolean): Promise<void>;
423
+ /**
424
+ * Remove agent from conversation
425
+ */
426
+ removeAgentFromConversation(conversationId: string): Promise<void>;
427
+ /**
428
+ * Toggle agent enabled/disabled
429
+ */
430
+ toggleAgent(conversationId: string, enabled: boolean): Promise<void>;
431
+ /**
432
+ * List available agents
433
+ */
434
+ listAgents(): Promise<AgentConfig[]>;
435
+ /**
436
+ * Create a new voice/video room
437
+ *
438
+ * @example
439
+ * ```typescript
440
+ * const room = await chat.createRoom({ name: `call-${conversationId}` });
441
+ * // Use room.wsUrl and room.token with LiveKit client
442
+ * ```
443
+ */
444
+ createRoom(params: {
445
+ name: string;
446
+ emptyTimeout?: number;
447
+ maxParticipants?: number;
448
+ }): Promise<RoomInfo>;
449
+ /**
450
+ * Join an existing room and get access token
451
+ *
452
+ * @example
453
+ * ```typescript
454
+ * const room = await chat.joinRoom({
455
+ * roomName: `call-${conversationId}`,
456
+ * participantName: 'John Doe',
457
+ * });
458
+ * // Connect to room using LiveKit client SDK with room.wsUrl and room.token
459
+ * ```
460
+ */
461
+ joinRoom(params: {
462
+ roomName: string;
463
+ participantName: string;
464
+ canPublish?: boolean;
465
+ canSubscribe?: boolean;
466
+ }): Promise<RoomInfo>;
467
+ /**
468
+ * Initiate a call in a conversation
469
+ * This notifies other participants that you're calling
470
+ *
471
+ * @example
472
+ * ```typescript
473
+ * // Start a video call
474
+ * const room = await chat.startCall(conversationId, 'video');
475
+ * // room contains { name, wsUrl, token } for LiveKit
476
+ * ```
477
+ */
478
+ startCall(conversationId: string, callType?: 'audio' | 'video'): Promise<RoomInfo>;
479
+ /**
480
+ * Accept an incoming call
481
+ *
482
+ * @example
483
+ * ```typescript
484
+ * chat.on('call:ring', async ({ conversationId, roomName, callType }) => {
485
+ * const room = await chat.acceptCall(conversationId, roomName);
486
+ * // Connect to room using LiveKit client SDK
487
+ * });
488
+ * ```
489
+ */
490
+ acceptCall(conversationId: string, roomName: string, participantName: string): Promise<RoomInfo>;
491
+ /**
492
+ * Reject an incoming call
493
+ */
494
+ rejectCall(conversationId: string): void;
495
+ /**
496
+ * End an ongoing call
497
+ */
498
+ endCall(conversationId: string): void;
499
+ private forwardWebSocketEvents;
500
+ }
501
+
502
+ export { type AgentConfig as A, type ChatEvents as C, type GetMessagesParams as G, type Message as M, type NewMessageEvent as N, type PaginatedMessages as P, type ReadReceipt as R, type SendMessageParams as S, type TypingEvent as T, type User as U, type WebSocketEventType as W, type CallAction as a, type CallType as b, type ApiError as c, type ApiResponse as d, type CallEvent as e, ChatApi as f, ChatClient as g, type ChatClientConfig as h, type Conversation as i, type ConversationType as j, type CreateConversationParams as k, type MessageType as l, type Participant as m, type PresenceEvent as n, type PresenceStatus as o, type ReadReceiptEvent as p, type RoomInfo as q, type UserPresence as r, type WebSocketMessage as s };