@elqnt/chat 2.0.7 → 3.0.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.
- package/README.md +386 -0
- package/dist/api/index.d.mts +308 -0
- package/dist/api/index.d.ts +308 -0
- package/dist/api/index.js +220 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +183 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +78 -0
- package/dist/hooks/index.d.ts +78 -0
- package/dist/hooks/index.js +709 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +683 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +4 -109
- package/dist/index.d.ts +4 -109
- package/dist/index.js +699 -3607
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +690 -3584
- package/dist/index.mjs.map +1 -1
- package/dist/models/index.d.mts +76 -6
- package/dist/models/index.d.ts +76 -6
- package/dist/models/index.js +21 -0
- package/dist/models/index.js.map +1 -1
- package/dist/models/index.mjs +14 -0
- package/dist/models/index.mjs.map +1 -1
- package/dist/transport/index.d.mts +243 -0
- package/dist/transport/index.d.ts +243 -0
- package/dist/transport/index.js +875 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/index.mjs +843 -0
- package/dist/transport/index.mjs.map +1 -0
- package/dist/types-BB5nRdZs.d.mts +222 -0
- package/dist/types-CNvuxtcv.d.ts +222 -0
- package/package.json +32 -40
- package/dist/hooks/use-websocket-chat-admin.d.mts +0 -17
- package/dist/hooks/use-websocket-chat-admin.d.ts +0 -17
- package/dist/hooks/use-websocket-chat-admin.js +0 -1196
- package/dist/hooks/use-websocket-chat-admin.js.map +0 -1
- package/dist/hooks/use-websocket-chat-admin.mjs +0 -1172
- package/dist/hooks/use-websocket-chat-admin.mjs.map +0 -1
- package/dist/hooks/use-websocket-chat-base.d.mts +0 -81
- package/dist/hooks/use-websocket-chat-base.d.ts +0 -81
- package/dist/hooks/use-websocket-chat-base.js +0 -1025
- package/dist/hooks/use-websocket-chat-base.js.map +0 -1
- package/dist/hooks/use-websocket-chat-base.mjs +0 -1001
- package/dist/hooks/use-websocket-chat-base.mjs.map +0 -1
- package/dist/hooks/use-websocket-chat-customer.d.mts +0 -24
- package/dist/hooks/use-websocket-chat-customer.d.ts +0 -24
- package/dist/hooks/use-websocket-chat-customer.js +0 -1092
- package/dist/hooks/use-websocket-chat-customer.js.map +0 -1
- package/dist/hooks/use-websocket-chat-customer.mjs +0 -1068
- package/dist/hooks/use-websocket-chat-customer.mjs.map +0 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// api/index.ts
|
|
4
|
+
import { browserApiRequest } from "@elqnt/api-client/browser";
|
|
5
|
+
|
|
6
|
+
// api/stream-api.ts
|
|
7
|
+
async function streamFetch(url, body) {
|
|
8
|
+
const response = await fetch(url, {
|
|
9
|
+
method: "POST",
|
|
10
|
+
headers: { "Content-Type": "application/json" },
|
|
11
|
+
body: JSON.stringify(body)
|
|
12
|
+
});
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
const errorText = await response.text();
|
|
15
|
+
return {
|
|
16
|
+
success: false,
|
|
17
|
+
error: `API error: ${response.status} - ${errorText}`
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const data = await response.json();
|
|
21
|
+
return { success: true, data };
|
|
22
|
+
}
|
|
23
|
+
async function createChat(options) {
|
|
24
|
+
const { baseUrl, orgId, userId, metadata } = options;
|
|
25
|
+
const result = await streamFetch(
|
|
26
|
+
`${baseUrl}/create`,
|
|
27
|
+
{ orgId, userId, metadata }
|
|
28
|
+
);
|
|
29
|
+
if (!result.success || !result.data?.chatKey) {
|
|
30
|
+
throw new Error(result.error || "Failed to create chat");
|
|
31
|
+
}
|
|
32
|
+
return result.data.chatKey;
|
|
33
|
+
}
|
|
34
|
+
async function sendChatMessage(options) {
|
|
35
|
+
const { baseUrl, orgId, chatKey, userId, content, attachments, metadata } = options;
|
|
36
|
+
const message = {
|
|
37
|
+
id: `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
38
|
+
role: "user",
|
|
39
|
+
content,
|
|
40
|
+
time: Date.now(),
|
|
41
|
+
status: "sending",
|
|
42
|
+
senderId: userId,
|
|
43
|
+
createdAt: Date.now(),
|
|
44
|
+
attachments
|
|
45
|
+
};
|
|
46
|
+
const result = await streamFetch(`${baseUrl}/send`, {
|
|
47
|
+
orgId,
|
|
48
|
+
chatKey,
|
|
49
|
+
userId,
|
|
50
|
+
message,
|
|
51
|
+
metadata
|
|
52
|
+
});
|
|
53
|
+
if (!result.success) {
|
|
54
|
+
throw new Error(result.error || "Failed to send message");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function loadChat(options) {
|
|
58
|
+
const { baseUrl, orgId, chatKey, userId } = options;
|
|
59
|
+
const result = await streamFetch(`${baseUrl}/load`, {
|
|
60
|
+
orgId,
|
|
61
|
+
chatKey,
|
|
62
|
+
userId
|
|
63
|
+
});
|
|
64
|
+
if (!result.success || !result.data?.chat) {
|
|
65
|
+
throw new Error(result.error || "Failed to load chat");
|
|
66
|
+
}
|
|
67
|
+
return result.data.chat;
|
|
68
|
+
}
|
|
69
|
+
async function endChat(options) {
|
|
70
|
+
const { baseUrl, orgId, chatKey, userId, reason } = options;
|
|
71
|
+
const result = await streamFetch(`${baseUrl}/end`, {
|
|
72
|
+
orgId,
|
|
73
|
+
chatKey,
|
|
74
|
+
userId,
|
|
75
|
+
data: reason ? { reason } : void 0
|
|
76
|
+
});
|
|
77
|
+
if (!result.success) {
|
|
78
|
+
throw new Error(result.error || "Failed to end chat");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function sendTypingIndicator(options) {
|
|
82
|
+
const { baseUrl, orgId, chatKey, userId, typing } = options;
|
|
83
|
+
const result = await streamFetch(`${baseUrl}/typing`, {
|
|
84
|
+
orgId,
|
|
85
|
+
chatKey,
|
|
86
|
+
userId,
|
|
87
|
+
typing
|
|
88
|
+
});
|
|
89
|
+
if (!result.success) {
|
|
90
|
+
throw new Error(result.error || "Failed to send typing indicator");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function sendEvent(options) {
|
|
94
|
+
const { baseUrl, orgId, chatKey, userId, type, data } = options;
|
|
95
|
+
const result = await streamFetch(`${baseUrl}/event`, {
|
|
96
|
+
type,
|
|
97
|
+
orgId,
|
|
98
|
+
chatKey,
|
|
99
|
+
userId,
|
|
100
|
+
data
|
|
101
|
+
});
|
|
102
|
+
if (!result.success) {
|
|
103
|
+
throw new Error(result.error || "Failed to send event");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// api/index.ts
|
|
108
|
+
async function getChatHistoryApi(options) {
|
|
109
|
+
return browserApiRequest("/api/v1/chats", {
|
|
110
|
+
method: "POST",
|
|
111
|
+
body: {
|
|
112
|
+
limit: options.limit || 15,
|
|
113
|
+
offset: options.offset || 0,
|
|
114
|
+
...options.skipCache ? { skipCache: true } : {}
|
|
115
|
+
},
|
|
116
|
+
...options
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async function getChatApi(chatKey, options) {
|
|
120
|
+
return browserApiRequest(`/api/v1/chats/${chatKey}`, {
|
|
121
|
+
method: "GET",
|
|
122
|
+
...options
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async function updateChatApi(chatKey, updates, options) {
|
|
126
|
+
return browserApiRequest(`/api/v1/chats/${chatKey}`, {
|
|
127
|
+
method: "PATCH",
|
|
128
|
+
body: updates,
|
|
129
|
+
...options
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function deleteChatApi(chatKey, options) {
|
|
133
|
+
return browserApiRequest(`/api/v1/chats/${chatKey}`, {
|
|
134
|
+
method: "DELETE",
|
|
135
|
+
...options
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async function getActiveChatsCountApi(options) {
|
|
139
|
+
return browserApiRequest("/api/v1/chats/active/count", {
|
|
140
|
+
method: "GET",
|
|
141
|
+
...options
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async function getActiveChatsApi(options) {
|
|
145
|
+
const params = new URLSearchParams();
|
|
146
|
+
if (options.pastHours) params.set("pastHours", String(options.pastHours));
|
|
147
|
+
const queryString = params.toString();
|
|
148
|
+
return browserApiRequest(`/api/v1/chats/active${queryString ? `?${queryString}` : ""}`, {
|
|
149
|
+
method: "GET",
|
|
150
|
+
...options
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async function updateProjectChatTitleApi(projectId, chatKey, title, options) {
|
|
154
|
+
return browserApiRequest(`/api/v1/projects/${projectId}/chats/${chatKey}/title`, {
|
|
155
|
+
method: "PUT",
|
|
156
|
+
body: { title },
|
|
157
|
+
...options
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async function addChatToProjectApi(projectId, chatKey, options) {
|
|
161
|
+
return browserApiRequest(`/api/v1/projects/${projectId}/chats`, {
|
|
162
|
+
method: "POST",
|
|
163
|
+
body: { chatKey },
|
|
164
|
+
...options
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
export {
|
|
168
|
+
addChatToProjectApi,
|
|
169
|
+
createChat,
|
|
170
|
+
deleteChatApi,
|
|
171
|
+
endChat,
|
|
172
|
+
getActiveChatsApi,
|
|
173
|
+
getActiveChatsCountApi,
|
|
174
|
+
getChatApi,
|
|
175
|
+
getChatHistoryApi,
|
|
176
|
+
loadChat,
|
|
177
|
+
sendChatMessage,
|
|
178
|
+
sendEvent,
|
|
179
|
+
sendTypingIndicator,
|
|
180
|
+
updateChatApi,
|
|
181
|
+
updateProjectChatTitleApi
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../api/index.ts","../../api/stream-api.ts"],"sourcesContent":["/**\n * Chat API\n *\n * API functions for chat operations.\n *\n * ## Browser API (uses @elqnt/api-client)\n * ```typescript\n * import { getChatHistoryApi, getChatApi } from \"@elqnt/chat/api\";\n *\n * const history = await getChatHistoryApi({ baseUrl, orgId, limit: 10 });\n * const chat = await getChatApi(chatKey, { baseUrl, orgId });\n * ```\n *\n * ## Stream API (direct HTTP calls)\n * ```typescript\n * import { createChat, sendChatMessage, loadChat } from \"@elqnt/chat/api\";\n *\n * const chatKey = await createChat({ baseUrl, orgId, userId });\n * await sendChatMessage({ baseUrl, orgId, chatKey, userId, content: \"Hello!\" });\n * ```\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type { ResponseMetadata } from \"@elqnt/types\";\nimport type { ChatSummary, Chat } from \"../models\";\n\n// Re-export types from models\nexport type { ChatSummary, Chat } from \"../models\";\n\n// Re-export stream API functions\nexport {\n createChat,\n sendChatMessage,\n loadChat,\n endChat,\n sendTypingIndicator,\n sendEvent,\n} from \"./stream-api\";\n\nexport type {\n StreamApiOptions,\n StreamApiResponse,\n CreateChatApiOptions,\n CreateChatResponseData,\n SendMessageApiOptions,\n LoadChatApiOptions,\n LoadChatResponseData,\n EndChatApiOptions,\n TypingApiOptions,\n SendEventApiOptions,\n} from \"./stream-api\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatHistoryResponse {\n chats: ChatSummary[];\n total: number;\n hasMore: boolean;\n metadata: ResponseMetadata;\n}\n\nexport interface ChatResponse {\n chat: ChatSummary;\n metadata: ResponseMetadata;\n}\n\nexport interface UpdateChatResponse {\n chatKey: string;\n title: string;\n pinned: boolean;\n metadata: ResponseMetadata;\n}\n\nexport interface ActiveChatsResponse {\n chats: ChatSummary[];\n metadata: ResponseMetadata;\n}\n\nexport interface ActiveChatsCountResponse {\n count: number;\n metadata: ResponseMetadata;\n}\n\n// =============================================================================\n// CHAT HISTORY\n// =============================================================================\n\nexport async function getChatHistoryApi(\n options: ApiClientOptions & { limit?: number; offset?: number; skipCache?: boolean }\n): Promise<ApiResponse<ChatHistoryResponse>> {\n return browserApiRequest(\"/api/v1/chats\", {\n method: \"POST\",\n body: {\n limit: options.limit || 15,\n offset: options.offset || 0,\n ...(options.skipCache ? { skipCache: true } : {}),\n },\n ...options,\n });\n}\n\nexport async function getChatApi(\n chatKey: string,\n options: ApiClientOptions\n): Promise<ApiResponse<ChatResponse>> {\n return browserApiRequest(`/api/v1/chats/${chatKey}`, {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function updateChatApi(\n chatKey: string,\n updates: { title?: string; pinned?: boolean },\n options: ApiClientOptions\n): Promise<ApiResponse<UpdateChatResponse>> {\n return browserApiRequest(`/api/v1/chats/${chatKey}`, {\n method: \"PATCH\",\n body: updates,\n ...options,\n });\n}\n\nexport async function deleteChatApi(\n chatKey: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(`/api/v1/chats/${chatKey}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n// =============================================================================\n// ACTIVE CHATS\n// =============================================================================\n\nexport async function getActiveChatsCountApi(\n options: ApiClientOptions\n): Promise<ApiResponse<ActiveChatsCountResponse>> {\n return browserApiRequest(\"/api/v1/chats/active/count\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function getActiveChatsApi(\n options: ApiClientOptions & { pastHours?: number }\n): Promise<ApiResponse<ActiveChatsResponse>> {\n const params = new URLSearchParams();\n if (options.pastHours) params.set(\"pastHours\", String(options.pastHours));\n const queryString = params.toString();\n return browserApiRequest(`/api/v1/chats/active${queryString ? `?${queryString}` : \"\"}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n// =============================================================================\n// PROJECT CHATS\n// =============================================================================\n\nexport async function updateProjectChatTitleApi(\n projectId: string,\n chatKey: string,\n title: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(`/api/v1/projects/${projectId}/chats/${chatKey}/title`, {\n method: \"PUT\",\n body: { title },\n ...options,\n });\n}\n\nexport async function addChatToProjectApi(\n projectId: string,\n chatKey: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(`/api/v1/projects/${projectId}/chats`, {\n method: \"POST\",\n body: { chatKey },\n ...options,\n });\n}\n","/**\n * Stream API\n *\n * Low-level functions for chat streaming operations.\n * These are used internally by the transport layer but can also\n * be used directly for custom implementations.\n *\n * @example\n * ```typescript\n * import { createChat, sendChatMessage, loadChat } from \"@elqnt/chat/api\";\n *\n * // Create a new chat\n * const chatKey = await createChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * userId: \"user-456\",\n * });\n *\n * // Send a message\n * await sendChatMessage({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey,\n * userId: \"user-456\",\n * content: \"Hello!\",\n * });\n * ```\n */\n\nimport type { Chat, ChatMessage } from \"../models\";\n\n/**\n * Base options for all stream API calls\n */\nexport interface StreamApiOptions {\n /** Base URL for the chat server */\n baseUrl: string;\n /** Organization ID */\n orgId: string;\n /** User ID */\n userId: string;\n}\n\n/**\n * Response from stream API calls\n */\nexport interface StreamApiResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\n/**\n * Create chat options\n */\nexport interface CreateChatApiOptions extends StreamApiOptions {\n /** Optional metadata for the new chat */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Create chat response data\n */\nexport interface CreateChatResponseData {\n chatKey: string;\n}\n\n/**\n * Send message options\n */\nexport interface SendMessageApiOptions extends StreamApiOptions {\n /** Chat key */\n chatKey: string;\n /** Message content */\n content: string;\n /** Optional attachments */\n attachments?: unknown[];\n /** Optional message metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Load chat options\n */\nexport interface LoadChatApiOptions extends StreamApiOptions {\n /** Chat key to load */\n chatKey: string;\n}\n\n/**\n * Load chat response data\n */\nexport interface LoadChatResponseData {\n chat: Chat;\n}\n\n/**\n * End chat options\n */\nexport interface EndChatApiOptions extends StreamApiOptions {\n /** Chat key to end */\n chatKey: string;\n /** Optional end reason */\n reason?: string;\n}\n\n/**\n * Typing indicator options\n */\nexport interface TypingApiOptions extends StreamApiOptions {\n /** Chat key */\n chatKey: string;\n /** Whether user is typing */\n typing: boolean;\n}\n\n/**\n * Generic event options\n */\nexport interface SendEventApiOptions extends StreamApiOptions {\n /** Chat key */\n chatKey: string;\n /** Event type */\n type: string;\n /** Event data */\n data?: Record<string, unknown>;\n}\n\n/**\n * Internal fetch helper\n */\nasync function streamFetch<T>(\n url: string,\n body: Record<string, unknown>\n): Promise<StreamApiResponse<T>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n success: false,\n error: `API error: ${response.status} - ${errorText}`,\n };\n }\n\n const data = await response.json();\n return { success: true, data };\n}\n\n/**\n * Create a new chat session\n *\n * @param options - Create chat options\n * @returns Chat key of the created chat\n *\n * @example\n * ```typescript\n * const chatKey = await createChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * userId: \"user-456\",\n * metadata: { source: \"website\" },\n * });\n * ```\n */\nexport async function createChat(\n options: CreateChatApiOptions\n): Promise<string> {\n const { baseUrl, orgId, userId, metadata } = options;\n\n const result = await streamFetch<CreateChatResponseData>(\n `${baseUrl}/create`,\n { orgId, userId, metadata }\n );\n\n if (!result.success || !result.data?.chatKey) {\n throw new Error(result.error || \"Failed to create chat\");\n }\n\n return result.data.chatKey;\n}\n\n/**\n * Send a message in a chat\n *\n * @param options - Send message options\n *\n * @example\n * ```typescript\n * await sendChatMessage({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey: \"chat-789\",\n * userId: \"user-456\",\n * content: \"Hello!\",\n * });\n * ```\n */\nexport async function sendChatMessage(\n options: SendMessageApiOptions\n): Promise<void> {\n const { baseUrl, orgId, chatKey, userId, content, attachments, metadata } =\n options;\n\n const message: Partial<ChatMessage> = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n role: \"user\",\n content,\n time: Date.now(),\n status: \"sending\",\n senderId: userId,\n createdAt: Date.now(),\n attachments: attachments as ChatMessage[\"attachments\"],\n };\n\n const result = await streamFetch(`${baseUrl}/send`, {\n orgId,\n chatKey,\n userId,\n message,\n metadata,\n });\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to send message\");\n }\n}\n\n/**\n * Load an existing chat\n *\n * @param options - Load chat options\n * @returns The loaded chat object\n *\n * @example\n * ```typescript\n * const chat = await loadChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey: \"chat-789\",\n * userId: \"user-456\",\n * });\n * ```\n */\nexport async function loadChat(options: LoadChatApiOptions): Promise<Chat> {\n const { baseUrl, orgId, chatKey, userId } = options;\n\n const result = await streamFetch<LoadChatResponseData>(`${baseUrl}/load`, {\n orgId,\n chatKey,\n userId,\n });\n\n if (!result.success || !result.data?.chat) {\n throw new Error(result.error || \"Failed to load chat\");\n }\n\n return result.data.chat;\n}\n\n/**\n * End a chat session\n *\n * @param options - End chat options\n *\n * @example\n * ```typescript\n * await endChat({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey: \"chat-789\",\n * userId: \"user-456\",\n * reason: \"User closed chat\",\n * });\n * ```\n */\nexport async function endChat(options: EndChatApiOptions): Promise<void> {\n const { baseUrl, orgId, chatKey, userId, reason } = options;\n\n const result = await streamFetch(`${baseUrl}/end`, {\n orgId,\n chatKey,\n userId,\n data: reason ? { reason } : undefined,\n });\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to end chat\");\n }\n}\n\n/**\n * Send typing indicator\n *\n * @param options - Typing indicator options\n *\n * @example\n * ```typescript\n * // User started typing\n * await sendTypingIndicator({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey: \"chat-789\",\n * userId: \"user-456\",\n * typing: true,\n * });\n *\n * // User stopped typing\n * await sendTypingIndicator({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey: \"chat-789\",\n * userId: \"user-456\",\n * typing: false,\n * });\n * ```\n */\nexport async function sendTypingIndicator(\n options: TypingApiOptions\n): Promise<void> {\n const { baseUrl, orgId, chatKey, userId, typing } = options;\n\n const result = await streamFetch(`${baseUrl}/typing`, {\n orgId,\n chatKey,\n userId,\n typing,\n });\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to send typing indicator\");\n }\n}\n\n/**\n * Send a generic event\n *\n * @param options - Event options\n *\n * @example\n * ```typescript\n * await sendEvent({\n * baseUrl: \"https://api.example.com/chat\",\n * orgId: \"org-123\",\n * chatKey: \"chat-789\",\n * userId: \"user-456\",\n * type: \"skill_activate\",\n * data: { skillId: \"research\" },\n * });\n * ```\n */\nexport async function sendEvent(options: SendEventApiOptions): Promise<void> {\n const { baseUrl, orgId, chatKey, userId, type, data } = options;\n\n const result = await streamFetch(`${baseUrl}/event`, {\n type,\n orgId,\n chatKey,\n userId,\n data,\n });\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to send event\");\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ChatEvent, Chat, ChatMessage } from '../models/index.mjs';
|
|
2
|
+
import { C as ChatTransport, e as TransportError, g as TransportState, R as RetryConfig, b as ConnectionMetrics, U as Unsubscribe } from '../types-BB5nRdZs.mjs';
|
|
3
|
+
import '@elqnt/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Chat hook options
|
|
7
|
+
*/
|
|
8
|
+
interface UseChatOptions {
|
|
9
|
+
/** Base URL for the chat server (e.g., "https://api.example.com/chat") */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/** Organization ID */
|
|
12
|
+
orgId: string;
|
|
13
|
+
/** User ID */
|
|
14
|
+
userId: string;
|
|
15
|
+
/** Client type for routing */
|
|
16
|
+
clientType?: "customer" | "humanAgent" | "observer";
|
|
17
|
+
/** Transport instance or type */
|
|
18
|
+
transport?: ChatTransport | "sse" | "sse-fetch";
|
|
19
|
+
/** Callback for all incoming events */
|
|
20
|
+
onMessage?: (event: ChatEvent) => void;
|
|
21
|
+
/** Callback for errors */
|
|
22
|
+
onError?: (error: TransportError) => void;
|
|
23
|
+
/** Callback when connection state changes */
|
|
24
|
+
onConnectionChange?: (state: TransportState) => void;
|
|
25
|
+
/** Auto-connect on mount */
|
|
26
|
+
autoConnect?: boolean;
|
|
27
|
+
/** Retry configuration */
|
|
28
|
+
retryConfig?: RetryConfig;
|
|
29
|
+
/** Enable debug logging */
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Chat hook return type
|
|
34
|
+
*/
|
|
35
|
+
interface UseChatReturn {
|
|
36
|
+
/** Connect to the chat server */
|
|
37
|
+
connect: () => Promise<void>;
|
|
38
|
+
/** Disconnect from the server */
|
|
39
|
+
disconnect: () => void;
|
|
40
|
+
/** Current connection state */
|
|
41
|
+
connectionState: TransportState;
|
|
42
|
+
/** Whether currently connected */
|
|
43
|
+
isConnected: boolean;
|
|
44
|
+
/** Start a new chat session */
|
|
45
|
+
startChat: (metadata?: Record<string, unknown>) => Promise<string>;
|
|
46
|
+
/** Load an existing chat */
|
|
47
|
+
loadChat: (chatKey: string) => Promise<void>;
|
|
48
|
+
/** Send a text message */
|
|
49
|
+
sendMessage: (content: string, attachments?: unknown[]) => Promise<void>;
|
|
50
|
+
/** End the current chat */
|
|
51
|
+
endChat: (reason?: string) => Promise<void>;
|
|
52
|
+
/** Signal that user is typing */
|
|
53
|
+
startTyping: () => void;
|
|
54
|
+
/** Signal that user stopped typing */
|
|
55
|
+
stopTyping: () => void;
|
|
56
|
+
/** Current chat object */
|
|
57
|
+
currentChat: Chat | null;
|
|
58
|
+
/** Current chat key */
|
|
59
|
+
chatKey: string | null;
|
|
60
|
+
/** Chat messages */
|
|
61
|
+
messages: ChatMessage[];
|
|
62
|
+
/** Current error */
|
|
63
|
+
error: TransportError | null;
|
|
64
|
+
/** Connection metrics */
|
|
65
|
+
metrics: ConnectionMetrics;
|
|
66
|
+
/** Subscribe to specific event type */
|
|
67
|
+
on: (eventType: string, handler: (event: ChatEvent) => void) => Unsubscribe;
|
|
68
|
+
/** Clear current error */
|
|
69
|
+
clearError: () => void;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* useChat Hook
|
|
73
|
+
*
|
|
74
|
+
* Platform-agnostic chat hook with SSE transport support.
|
|
75
|
+
*/
|
|
76
|
+
declare function useChat(options: UseChatOptions): UseChatReturn;
|
|
77
|
+
|
|
78
|
+
export { type UseChatOptions, type UseChatReturn, useChat };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ChatEvent, Chat, ChatMessage } from '../models/index.js';
|
|
2
|
+
import { C as ChatTransport, e as TransportError, g as TransportState, R as RetryConfig, b as ConnectionMetrics, U as Unsubscribe } from '../types-CNvuxtcv.js';
|
|
3
|
+
import '@elqnt/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Chat hook options
|
|
7
|
+
*/
|
|
8
|
+
interface UseChatOptions {
|
|
9
|
+
/** Base URL for the chat server (e.g., "https://api.example.com/chat") */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/** Organization ID */
|
|
12
|
+
orgId: string;
|
|
13
|
+
/** User ID */
|
|
14
|
+
userId: string;
|
|
15
|
+
/** Client type for routing */
|
|
16
|
+
clientType?: "customer" | "humanAgent" | "observer";
|
|
17
|
+
/** Transport instance or type */
|
|
18
|
+
transport?: ChatTransport | "sse" | "sse-fetch";
|
|
19
|
+
/** Callback for all incoming events */
|
|
20
|
+
onMessage?: (event: ChatEvent) => void;
|
|
21
|
+
/** Callback for errors */
|
|
22
|
+
onError?: (error: TransportError) => void;
|
|
23
|
+
/** Callback when connection state changes */
|
|
24
|
+
onConnectionChange?: (state: TransportState) => void;
|
|
25
|
+
/** Auto-connect on mount */
|
|
26
|
+
autoConnect?: boolean;
|
|
27
|
+
/** Retry configuration */
|
|
28
|
+
retryConfig?: RetryConfig;
|
|
29
|
+
/** Enable debug logging */
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Chat hook return type
|
|
34
|
+
*/
|
|
35
|
+
interface UseChatReturn {
|
|
36
|
+
/** Connect to the chat server */
|
|
37
|
+
connect: () => Promise<void>;
|
|
38
|
+
/** Disconnect from the server */
|
|
39
|
+
disconnect: () => void;
|
|
40
|
+
/** Current connection state */
|
|
41
|
+
connectionState: TransportState;
|
|
42
|
+
/** Whether currently connected */
|
|
43
|
+
isConnected: boolean;
|
|
44
|
+
/** Start a new chat session */
|
|
45
|
+
startChat: (metadata?: Record<string, unknown>) => Promise<string>;
|
|
46
|
+
/** Load an existing chat */
|
|
47
|
+
loadChat: (chatKey: string) => Promise<void>;
|
|
48
|
+
/** Send a text message */
|
|
49
|
+
sendMessage: (content: string, attachments?: unknown[]) => Promise<void>;
|
|
50
|
+
/** End the current chat */
|
|
51
|
+
endChat: (reason?: string) => Promise<void>;
|
|
52
|
+
/** Signal that user is typing */
|
|
53
|
+
startTyping: () => void;
|
|
54
|
+
/** Signal that user stopped typing */
|
|
55
|
+
stopTyping: () => void;
|
|
56
|
+
/** Current chat object */
|
|
57
|
+
currentChat: Chat | null;
|
|
58
|
+
/** Current chat key */
|
|
59
|
+
chatKey: string | null;
|
|
60
|
+
/** Chat messages */
|
|
61
|
+
messages: ChatMessage[];
|
|
62
|
+
/** Current error */
|
|
63
|
+
error: TransportError | null;
|
|
64
|
+
/** Connection metrics */
|
|
65
|
+
metrics: ConnectionMetrics;
|
|
66
|
+
/** Subscribe to specific event type */
|
|
67
|
+
on: (eventType: string, handler: (event: ChatEvent) => void) => Unsubscribe;
|
|
68
|
+
/** Clear current error */
|
|
69
|
+
clearError: () => void;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* useChat Hook
|
|
73
|
+
*
|
|
74
|
+
* Platform-agnostic chat hook with SSE transport support.
|
|
75
|
+
*/
|
|
76
|
+
declare function useChat(options: UseChatOptions): UseChatReturn;
|
|
77
|
+
|
|
78
|
+
export { type UseChatOptions, type UseChatReturn, useChat };
|