@veroai/chat 0.1.4 → 0.1.6

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.
@@ -221,11 +221,11 @@ var ChatApi = class {
221
221
  * List available agents
222
222
  */
223
223
  async listAgents() {
224
- const response = await fetch(`${this.apiUrl}/v1/agent-configurations`, {
224
+ const response = await fetch(`${this.apiUrl}/v1/chat/agents`, {
225
225
  headers: await this.getHeaders()
226
226
  });
227
227
  const data = await this.handleResponse(response);
228
- return data;
228
+ return data.agents;
229
229
  }
230
230
  // ============================================================================
231
231
  // Voice Rooms
@@ -604,16 +604,17 @@ var ChatClient = class extends EventEmitter {
604
604
  super();
605
605
  this.ws = null;
606
606
  this.config = config;
607
- this.tokenGetter = config.getToken || (() => config.token || null);
607
+ this.apiTokenGetter = config.getApiToken || config.getToken || (() => config.token || null);
608
+ this.wsTokenGetter = config.getWsToken || config.getToken || (() => config.token || null);
608
609
  this.api = new ChatApi({
609
610
  apiUrl: config.apiUrl,
610
- getToken: this.tokenGetter,
611
+ getToken: this.apiTokenGetter,
611
612
  apiKey: config.apiKey
612
613
  });
613
614
  if (config.wsUrl) {
614
615
  this.ws = new WebSocketManager({
615
616
  url: config.wsUrl,
616
- getToken: this.tokenGetter,
617
+ getToken: this.wsTokenGetter,
617
618
  autoReconnect: config.autoReconnect ?? true,
618
619
  reconnectInterval: config.reconnectInterval,
619
620
  maxReconnectAttempts: config.maxReconnectAttempts
@@ -902,5 +903,5 @@ var ChatClient = class extends EventEmitter {
902
903
  };
903
904
 
904
905
  export { ChatApi, ChatClient, WebSocketManager };
905
- //# sourceMappingURL=chunk-PQNJZUZM.js.map
906
- //# sourceMappingURL=chunk-PQNJZUZM.js.map
906
+ //# sourceMappingURL=chunk-DNNFF4LS.js.map
907
+ //# sourceMappingURL=chunk-DNNFF4LS.js.map
@@ -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-DNNFF4LS.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 PresenceStatus,\n AgentConfig,\n GenerateTokenOptions,\n GenerateTokenResult,\n} from '../types';\n\nexport interface ApiClientConfig {\n apiUrl: string;\n getToken: () => string | null | Promise<string | null>;\n /** API key for server-side token generation */\n apiKey?: string;\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 private apiKey?: string;\n\n constructor(config: ApiClientConfig) {\n this.apiUrl = config.apiUrl.replace(/\\/$/, '');\n this.getToken = config.getToken;\n this.apiKey = config.apiKey;\n }\n\n // ============================================================================\n // Token Generation (Server-side only)\n // ============================================================================\n\n /**\n * Generate a chat token for a user (server-side only)\n *\n * This method is used by client backends to generate tokens for their users.\n * Requires an API key to be configured.\n *\n * @example\n * ```typescript\n * // On your backend\n * const chatApi = new ChatApi({\n * apiUrl: 'https://chat-api.veroai.dev',\n * apiKey: process.env.VERO_API_KEY,\n * getToken: () => null, // Not needed for token generation\n * });\n *\n * const { token } = await chatApi.generateToken({\n * userId: user.id,\n * name: user.displayName,\n * avatar: user.avatarUrl,\n * });\n *\n * // Return token to your frontend\n * ```\n */\n async generateToken(options: GenerateTokenOptions): Promise<GenerateTokenResult> {\n if (!this.apiKey) {\n throw new Error('API key is required for token generation. Set apiKey in config.');\n }\n\n const response = await fetch(`${this.apiUrl}/v1/auth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n userId: options.userId,\n name: options.name,\n avatar: options.avatar,\n metadata: options.metadata,\n expiresIn: options.expiresIn,\n }),\n });\n\n return this.handleResponse<GenerateTokenResult>(response);\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 // 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/chat/agents`, {\n headers: await this.getHeaders(),\n });\n const data = await this.handleResponse<{ agents: AgentConfig[]; total: number }>(response);\n return data.agents;\n }\n\n // ============================================================================\n // Voice Rooms\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_name?: string;\n sender_avatar?: 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 senderName: raw.sender_name,\n senderAvatar: raw.sender_avatar,\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 AgentConfig,\n GenerateTokenOptions,\n GenerateTokenResult,\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 apiTokenGetter: () => string | null | Promise<string | null>;\n private wsTokenGetter: () => string | null | Promise<string | null>;\n\n constructor(config: ChatClientConfig) {\n super();\n this.config = config;\n\n // Create token getters\n // For API: prefer getApiToken, fall back to getToken, then static token\n this.apiTokenGetter = config.getApiToken || config.getToken || (() => config.token || null);\n // For WebSocket: prefer getWsToken, fall back to getToken, then static token\n this.wsTokenGetter = config.getWsToken || config.getToken || (() => config.token || null);\n\n // Initialize API client with API-specific token getter\n this.api = new ChatApi({\n apiUrl: config.apiUrl,\n getToken: this.apiTokenGetter,\n apiKey: config.apiKey,\n });\n\n // Initialize WebSocket with WebSocket-specific token getter\n if (config.wsUrl) {\n this.ws = new WebSocketManager({\n url: config.wsUrl,\n getToken: this.wsTokenGetter,\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 // Token Generation (Server-side only)\n // ============================================================================\n\n /**\n * Generate a chat token for a user (server-side only)\n *\n * This method is used by client backends to generate tokens for their users.\n * Requires an API key to be configured.\n *\n * @example\n * ```typescript\n * // On your backend\n * const chat = new ChatClient({\n * apiUrl: 'https://chat-api.veroai.dev',\n * apiKey: process.env.VERO_API_KEY,\n * });\n *\n * const { token, expiresAt } = await chat.generateToken({\n * userId: user.id,\n * name: user.displayName,\n * avatar: user.avatarUrl,\n * });\n *\n * // Return token to your frontend\n * ```\n */\n async generateToken(options: GenerateTokenOptions): Promise<GenerateTokenResult> {\n return this.api.generateToken(options);\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 // 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\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 voice 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 voice 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 Vero Voice\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 voice 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"]}
@@ -8,10 +8,22 @@ interface ChatClientConfig {
8
8
  apiUrl: string;
9
9
  /** WebSocket URL for real-time events (e.g., wss://ws.veroai.dev) */
10
10
  wsUrl?: string;
11
- /** Authentication token (JWT) */
11
+ /** Authentication token (JWT) - used for both API and WebSocket if separate tokens not provided */
12
12
  token?: string;
13
- /** Token getter function for dynamic token retrieval */
13
+ /** Token getter function for dynamic token retrieval - used for both API and WebSocket if separate getters not provided */
14
14
  getToken?: () => string | null | Promise<string | null>;
15
+ /**
16
+ * Token getter specifically for API calls
17
+ * Use this when your API server and WebSocket server use different auth tokens
18
+ * (e.g., API uses accessToken from your auth server, WebSocket uses chatToken from VeroAI)
19
+ */
20
+ getApiToken?: () => string | null | Promise<string | null>;
21
+ /**
22
+ * Token getter specifically for WebSocket connections
23
+ * Use this when your API server and WebSocket server use different auth tokens
24
+ * Falls back to getToken if not provided
25
+ */
26
+ getWsToken?: () => string | null | Promise<string | null>;
15
27
  /** API key for server-side token generation (use with generateToken) */
16
28
  apiKey?: string;
17
29
  /** Auto-connect to WebSocket on initialization */
@@ -154,9 +166,8 @@ interface AgentConfig {
154
166
  id: string;
155
167
  name: string;
156
168
  description?: string;
157
- jobRole?: string;
158
- systemPrompt?: string;
159
- isActive: boolean;
169
+ avatarUrl?: string;
170
+ model?: string;
160
171
  }
161
172
  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';
162
173
  interface WebSocketMessage<T = unknown> {
@@ -379,7 +390,8 @@ declare class ChatClient extends EventEmitter<ChatEvents> {
379
390
  private api;
380
391
  private ws;
381
392
  private config;
382
- private tokenGetter;
393
+ private apiTokenGetter;
394
+ private wsTokenGetter;
383
395
  constructor(config: ChatClientConfig);
384
396
  /**
385
397
  * Connect to WebSocket for real-time updates
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as ChatEvents, a as CallAction, b as CallType } from './client-DhKvlhe8.js';
2
- export { A as AgentConfig, c as ApiError, d as ApiResponse, e as CallEvent, f as ChatApi, g as ChatClient, h as ChatClientConfig, i as ChatUser, j as Conversation, k as ConversationType, l as CreateConversationParams, G as GenerateTokenOptions, m as GenerateTokenResult, n as GetMessagesParams, M as Message, o as MessageType, N as NewMessageEvent, P as PaginatedMessages, p as Participant, q as PresenceEvent, r as PresenceStatus, R as ReadReceipt, s as ReadReceiptEvent, t as RoomInfo, S as SendMessageParams, T as TypingEvent, U as User, u as UserPresence, W as WebSocketEventType, v as WebSocketMessage } from './client-DhKvlhe8.js';
1
+ import { C as ChatEvents, a as CallAction, b as CallType } from './client-DhAs0EwY.js';
2
+ export { A as AgentConfig, c as ApiError, d as ApiResponse, e as CallEvent, f as ChatApi, g as ChatClient, h as ChatClientConfig, i as ChatUser, j as Conversation, k as ConversationType, l as CreateConversationParams, G as GenerateTokenOptions, m as GenerateTokenResult, n as GetMessagesParams, M as Message, o as MessageType, N as NewMessageEvent, P as PaginatedMessages, p as Participant, q as PresenceEvent, r as PresenceStatus, R as ReadReceipt, s as ReadReceiptEvent, t as RoomInfo, S as SendMessageParams, T as TypingEvent, U as User, u as UserPresence, W as WebSocketEventType, v as WebSocketMessage } from './client-DhAs0EwY.js';
3
3
  import EventEmitter from 'eventemitter3';
4
4
 
5
5
  /**
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { ChatApi, ChatClient, WebSocketManager } from './chunk-PQNJZUZM.js';
1
+ export { ChatApi, ChatClient, WebSocketManager } from './chunk-DNNFF4LS.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
- import { g as ChatClient, j as Conversation, h as ChatClientConfig, M as Message, S as SendMessageParams, r as PresenceStatus } from '../client-DhKvlhe8.js';
3
+ import { g as ChatClient, j as Conversation, h as ChatClientConfig, M as Message, S as SendMessageParams, r as PresenceStatus } from '../client-DhAs0EwY.js';
4
4
  import 'eventemitter3';
5
5
 
6
6
  interface ChatContextValue {
@@ -1,4 +1,4 @@
1
- import { ChatClient } from '../chunk-PQNJZUZM.js';
1
+ import { ChatClient } from '../chunk-DNNFF4LS.js';
2
2
  import { createContext, useState, useRef, useEffect, useCallback, useContext } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veroai/chat",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "VeroAI Chat SDK - Real-time messaging with AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/index.ts","../src/websocket.ts","../src/client.ts"],"names":["EventEmitter"],"mappings":"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","file":"chunk-PQNJZUZM.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 PresenceStatus,\n AgentConfig,\n GenerateTokenOptions,\n GenerateTokenResult,\n} from '../types';\n\nexport interface ApiClientConfig {\n apiUrl: string;\n getToken: () => string | null | Promise<string | null>;\n /** API key for server-side token generation */\n apiKey?: string;\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 private apiKey?: string;\n\n constructor(config: ApiClientConfig) {\n this.apiUrl = config.apiUrl.replace(/\\/$/, '');\n this.getToken = config.getToken;\n this.apiKey = config.apiKey;\n }\n\n // ============================================================================\n // Token Generation (Server-side only)\n // ============================================================================\n\n /**\n * Generate a chat token for a user (server-side only)\n *\n * This method is used by client backends to generate tokens for their users.\n * Requires an API key to be configured.\n *\n * @example\n * ```typescript\n * // On your backend\n * const chatApi = new ChatApi({\n * apiUrl: 'https://chat-api.veroai.dev',\n * apiKey: process.env.VERO_API_KEY,\n * getToken: () => null, // Not needed for token generation\n * });\n *\n * const { token } = await chatApi.generateToken({\n * userId: user.id,\n * name: user.displayName,\n * avatar: user.avatarUrl,\n * });\n *\n * // Return token to your frontend\n * ```\n */\n async generateToken(options: GenerateTokenOptions): Promise<GenerateTokenResult> {\n if (!this.apiKey) {\n throw new Error('API key is required for token generation. Set apiKey in config.');\n }\n\n const response = await fetch(`${this.apiUrl}/v1/auth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n userId: options.userId,\n name: options.name,\n avatar: options.avatar,\n metadata: options.metadata,\n expiresIn: options.expiresIn,\n }),\n });\n\n return this.handleResponse<GenerateTokenResult>(response);\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 // 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\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_name?: string;\n sender_avatar?: 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 senderName: raw.sender_name,\n senderAvatar: raw.sender_avatar,\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 AgentConfig,\n GenerateTokenOptions,\n GenerateTokenResult,\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 apiKey: config.apiKey,\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 // Token Generation (Server-side only)\n // ============================================================================\n\n /**\n * Generate a chat token for a user (server-side only)\n *\n * This method is used by client backends to generate tokens for their users.\n * Requires an API key to be configured.\n *\n * @example\n * ```typescript\n * // On your backend\n * const chat = new ChatClient({\n * apiUrl: 'https://chat-api.veroai.dev',\n * apiKey: process.env.VERO_API_KEY,\n * });\n *\n * const { token, expiresAt } = await chat.generateToken({\n * userId: user.id,\n * name: user.displayName,\n * avatar: user.avatarUrl,\n * });\n *\n * // Return token to your frontend\n * ```\n */\n async generateToken(options: GenerateTokenOptions): Promise<GenerateTokenResult> {\n return this.api.generateToken(options);\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 // 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\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 voice 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 voice 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 Vero Voice\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 voice 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"]}