@alquimia-ai/tools 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/actions/alquimia.action.d.mts +3 -0
  2. package/dist/actions/alquimia.action.d.ts +3 -0
  3. package/dist/actions/alquimia.action.js +62 -0
  4. package/dist/actions/alquimia.action.js.map +1 -0
  5. package/dist/actions/alquimia.action.mjs +38 -0
  6. package/dist/actions/alquimia.action.mjs.map +1 -0
  7. package/dist/actions/baseApi.action.d.mts +20 -0
  8. package/dist/actions/baseApi.action.d.ts +20 -0
  9. package/dist/actions/baseApi.action.js +202 -0
  10. package/dist/actions/baseApi.action.js.map +1 -0
  11. package/dist/actions/baseApi.action.mjs +173 -0
  12. package/dist/actions/baseApi.action.mjs.map +1 -0
  13. package/dist/actions/index.d.mts +5 -0
  14. package/dist/actions/index.d.ts +5 -0
  15. package/dist/actions/index.js +236 -0
  16. package/dist/actions/index.js.map +1 -0
  17. package/dist/actions/index.mjs +205 -0
  18. package/dist/actions/index.mjs.map +1 -0
  19. package/dist/alquimia-sdk-DK0XLjol.d.mts +77 -0
  20. package/dist/alquimia-sdk-DK0XLjol.d.ts +77 -0
  21. package/dist/context/index.d.mts +22 -0
  22. package/dist/context/index.d.ts +22 -0
  23. package/dist/context/index.js +124 -0
  24. package/dist/context/index.js.map +1 -0
  25. package/dist/context/index.mjs +96 -0
  26. package/dist/context/index.mjs.map +1 -0
  27. package/dist/hooks/index.d.mts +54 -0
  28. package/dist/hooks/index.d.ts +54 -0
  29. package/dist/hooks/index.js +344 -0
  30. package/dist/hooks/index.js.map +1 -0
  31. package/dist/hooks/index.mjs +316 -0
  32. package/dist/hooks/index.mjs.map +1 -0
  33. package/dist/index.d.mts +14 -303
  34. package/dist/index.d.ts +14 -303
  35. package/dist/index.js +1143 -2448
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +1079 -2213
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/sdk/index.d.mts +74 -0
  40. package/dist/sdk/index.d.ts +74 -0
  41. package/dist/sdk/index.js +561 -0
  42. package/dist/sdk/index.js.map +1 -0
  43. package/dist/sdk/index.mjs +510 -0
  44. package/dist/sdk/index.mjs.map +1 -0
  45. package/dist/services/index.d.mts +26 -0
  46. package/dist/services/index.d.ts +26 -0
  47. package/dist/services/index.js +93 -0
  48. package/dist/services/index.js.map +1 -0
  49. package/dist/services/index.mjs +63 -0
  50. package/dist/services/index.mjs.map +1 -0
  51. package/dist/types/index.d.mts +105 -0
  52. package/dist/types/index.d.ts +105 -0
  53. package/dist/types/index.js +41 -0
  54. package/dist/types/index.js.map +1 -0
  55. package/dist/types/index.mjs +14 -0
  56. package/dist/types/index.mjs.map +1 -0
  57. package/dist/utils/index.d.mts +29 -0
  58. package/dist/utils/index.d.ts +29 -0
  59. package/dist/utils/index.js +170 -0
  60. package/dist/utils/index.js.map +1 -0
  61. package/dist/utils/index.mjs +133 -0
  62. package/dist/utils/index.mjs.map +1 -0
  63. package/package.json +42 -13
@@ -0,0 +1,344 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/hooks/index.ts
21
+ var hooks_exports = {};
22
+ __export(hooks_exports, {
23
+ useAlquimia: () => useAlquimia,
24
+ useRatings: () => useRatings
25
+ });
26
+ module.exports = __toCommonJS(hooks_exports);
27
+
28
+ // src/hooks/alquimia.hook.tsx
29
+ var import_react2 = require("react");
30
+
31
+ // src/context/session-context.tsx
32
+ var import_react = require("react");
33
+
34
+ // src/utils/utils.ts
35
+ function getCookies(name) {
36
+ if (typeof document === "undefined") return void 0;
37
+ const value = `; ${document.cookie}`;
38
+ const parts = value.split(`; ${name}=`);
39
+ if (parts.length === 2) return parts.pop()?.split(";").shift();
40
+ }
41
+ function parseConversationsMapCookie(cookieValue) {
42
+ try {
43
+ const decodedValue = decodeURIComponent(cookieValue);
44
+ return JSON.parse(decodedValue);
45
+ } catch (e) {
46
+ console.error("Error parsing conversations cookie:", e);
47
+ return {};
48
+ }
49
+ }
50
+ function getTopicSessionId(topicId) {
51
+ const conversationsStr = getCookies("alquimia-sessions") || "{}";
52
+ if (!conversationsStr) {
53
+ const sessionCookie = getCookies("alquimia-session");
54
+ return sessionCookie || "";
55
+ }
56
+ const conversationsMap = parseConversationsMapCookie(conversationsStr);
57
+ return conversationsMap[topicId] || "";
58
+ }
59
+ function createMessageId() {
60
+ return Math.floor(Math.random() * 1e6).toString();
61
+ }
62
+
63
+ // src/context/session-context.tsx
64
+ var import_idb = require("idb");
65
+ var import_jsx_runtime = require("react/jsx-runtime");
66
+ var initialState = {
67
+ sessionId: null,
68
+ characterizationData: null
69
+ };
70
+ var AlquimiaContext = (0, import_react.createContext)(null);
71
+ var useSessionContext = () => {
72
+ const context = (0, import_react.useContext)(AlquimiaContext);
73
+ if (!context) {
74
+ console.warn("useSessionContext must be used within a session provider. Returning default value.");
75
+ return {
76
+ userSessionState: initialState,
77
+ saveUserSession: null
78
+ };
79
+ }
80
+ return context;
81
+ };
82
+
83
+ // src/hooks/alquimia.hook.tsx
84
+ function useAlquimia(sdk) {
85
+ const [chunkReceived, setChunkReceived] = (0, import_react2.useState)("");
86
+ const [currentMessageIdChuncked, setCurrentMessageIdChuncked] = (0, import_react2.useState)("");
87
+ const [input, setInput] = (0, import_react2.useState)("");
88
+ const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
89
+ const [isMessageStreaming, setIsMessageStreaming] = (0, import_react2.useState)(false);
90
+ const [streamingMessageId, setStreamingMessageId] = (0, import_react2.useState)(null);
91
+ const [isAudioRecording, setIsAudioRecording] = (0, import_react2.useState)(false);
92
+ const [messageMetaData, setMessageMetaData] = (0, import_react2.useState)(null);
93
+ const [messages, setMessages] = (0, import_react2.useState)([]);
94
+ const [sessionId, setSessionId] = (0, import_react2.useState)(null);
95
+ const [activeTool, setActiveTool] = (0, import_react2.useState)(null);
96
+ const [lastRequest, setLastRequest] = (0, import_react2.useState)(null);
97
+ const { userSessionState, saveUserSession } = useSessionContext();
98
+ const shouldShowCharacterizationButton = sdk.getEnforceCharacterization() && !userSessionState?.characterizationData;
99
+ (0, import_react2.useEffect)(() => {
100
+ if (chunkReceived)
101
+ processMessageChunk(currentMessageIdChuncked, chunkReceived);
102
+ }, [chunkReceived]);
103
+ (0, import_react2.useEffect)(() => {
104
+ if (userSessionState?.characterizationData && sdk.getEnforceCharacterization()) {
105
+ sdk.withExtraData(userSessionState?.characterizationData);
106
+ }
107
+ }, [userSessionState]);
108
+ function cleanMessages() {
109
+ setMessages([]);
110
+ }
111
+ async function processMessageChunk(messageId, chunk, error_code, error_detail, additionalInfo) {
112
+ setMessages((currentMessages) => {
113
+ const messageIndex = currentMessages.findIndex(
114
+ (message) => message.id === messageId
115
+ );
116
+ if (messageIndex !== -1) {
117
+ const updatedMessages = [...currentMessages];
118
+ const updatedMessage = {
119
+ ...updatedMessages[messageIndex],
120
+ content: `${updatedMessages[messageIndex]?.content || ""}${chunk}`,
121
+ id: updatedMessages[messageIndex]?.id || "",
122
+ role: updatedMessages[messageIndex]?.role || "assistant",
123
+ error_code,
124
+ error_detail,
125
+ additionalInfo,
126
+ created_at: (/* @__PURE__ */ new Date()).getTime().toString()
127
+ };
128
+ updatedMessages[messageIndex] = updatedMessage;
129
+ return updatedMessages;
130
+ } else {
131
+ return [
132
+ ...currentMessages,
133
+ {
134
+ content: `${chunk}`,
135
+ role: "assistant",
136
+ id: messageId,
137
+ error_code,
138
+ error_detail,
139
+ created_at: (/* @__PURE__ */ new Date()).getTime().toString()
140
+ }
141
+ ];
142
+ }
143
+ });
144
+ }
145
+ async function handleSubmit(event, traceParentId, sessionId2, additionalInfo) {
146
+ setIsLoading(true);
147
+ event.preventDefault();
148
+ if (input) {
149
+ addUserMessage(input);
150
+ const messageId = createMessageId();
151
+ setCurrentMessageIdChuncked(messageId);
152
+ setStreamingMessageId(messageId);
153
+ await sendMessage(input, (chunk) => {
154
+ processMessageChunk(
155
+ messageId,
156
+ chunk?.data?.content || "",
157
+ chunk?.error_code,
158
+ chunk?.error_detail,
159
+ additionalInfo
160
+ );
161
+ }, traceParentId, sessionId2);
162
+ setInput("");
163
+ }
164
+ setIsLoading(false);
165
+ }
166
+ function handleInputChange(event) {
167
+ setInput(event.target.value);
168
+ }
169
+ function handleReplaceInput(input2) {
170
+ setInput(input2);
171
+ }
172
+ function populateMessages(messages2) {
173
+ setMessages(messages2);
174
+ }
175
+ function handleLoadingCancel() {
176
+ setIsLoading(false);
177
+ setIsMessageStreaming(false);
178
+ setInput("");
179
+ }
180
+ function addUserMessage(message) {
181
+ setMessages((prevMessages) => [
182
+ ...prevMessages,
183
+ {
184
+ content: message,
185
+ role: "user",
186
+ id: createMessageId(),
187
+ created_at: (/* @__PURE__ */ new Date()).getTime().toString()
188
+ }
189
+ ]);
190
+ }
191
+ function getCookie(name) {
192
+ const cookies = document.cookie.split(";");
193
+ for (let cookie of cookies) {
194
+ const [cookieName, cookieValue] = cookie.trim().split("=");
195
+ if (cookieName === name) {
196
+ return decodeURIComponent(cookieValue);
197
+ }
198
+ }
199
+ return null;
200
+ }
201
+ async function sendMessage(message, callBack, traceParentId, sessionId2) {
202
+ const conversationId = sessionId2 || getCookie("alquimia-session");
203
+ setIsMessageStreaming(true);
204
+ setActiveTool(null);
205
+ setLastRequest(message);
206
+ const response = await sdk.widthConversationId(conversationId || "").sendMessage(message, traceParentId);
207
+ const es = new EventSource(response.getUrlStream());
208
+ es.onmessage = (event) => {
209
+ const parsedData = JSON.parse(event.data);
210
+ if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {
211
+ setActiveTool({
212
+ tooler: parsedData.tooler
213
+ });
214
+ }
215
+ if (parsedData.error_code) {
216
+ callBack({
217
+ type: "error",
218
+ error_code: parsedData.error_code,
219
+ error_detail: parsedData.error_detail
220
+ });
221
+ }
222
+ if (parsedData.is_complete) {
223
+ setIsMessageStreaming(false);
224
+ setStreamingMessageId(null);
225
+ es.close();
226
+ } else {
227
+ callBack(parsedData.answer);
228
+ }
229
+ };
230
+ }
231
+ async function handleSaveCharacterization(translation) {
232
+ const conversationId = getCookie("alquimia-session");
233
+ if (!conversationId || !saveUserSession) return;
234
+ saveUserSession(conversationId, translation);
235
+ }
236
+ return {
237
+ activeTool,
238
+ cleanMessages,
239
+ createMessageId,
240
+ handleInputChange,
241
+ handleReplaceInput,
242
+ handleSubmit,
243
+ handleSaveCharacterization,
244
+ handleLoadingCancel,
245
+ input,
246
+ isLoading,
247
+ isMessageStreaming,
248
+ streamingMessageId,
249
+ isAudioRecording,
250
+ shouldShowCharacterizationButton,
251
+ lastRequest,
252
+ messageMetaData,
253
+ messages,
254
+ populateMessages,
255
+ processMessageChunk,
256
+ sendMessage,
257
+ sessionId,
258
+ setActiveTool,
259
+ setSessionId,
260
+ setLastRequest,
261
+ setIsAudioRecording
262
+ };
263
+ }
264
+
265
+ // src/hooks/useRatings.ts
266
+ var import_react3 = require("react");
267
+ var initialState2 = {
268
+ ratingStars: 0,
269
+ ratingThumbs: "",
270
+ ratingComment: ""
271
+ };
272
+ function ratingReducer(state, action) {
273
+ switch (action.type) {
274
+ case "SET_RATING_STARS":
275
+ return { ...state, ratingStars: action.payload };
276
+ case "SET_RATING_THUMBS":
277
+ return { ...state, ratingThumbs: action.payload };
278
+ case "SET_RATING_COMMENT":
279
+ return { ...state, ratingComment: action.payload };
280
+ default:
281
+ return state;
282
+ }
283
+ }
284
+ function useRatings({ assistantId, sendRating, topicId }) {
285
+ const [isLoading, setIsLoading] = (0, import_react3.useState)(false);
286
+ const [hasReviewed, setHasReviewed] = (0, import_react3.useState)(false);
287
+ const [state, dispatch] = (0, import_react3.useReducer)(ratingReducer, initialState2);
288
+ const setRatingStars = (rating) => {
289
+ dispatch({ type: "SET_RATING_STARS", payload: rating });
290
+ };
291
+ const setRatingThumbs = (rating) => {
292
+ dispatch({ type: "SET_RATING_THUMBS", payload: rating });
293
+ };
294
+ const setRatingComment = (comment) => {
295
+ dispatch({ type: "SET_RATING_COMMENT", payload: comment });
296
+ };
297
+ const thumbsScore = (value) => {
298
+ return value === "thumbsUp" ? 5 : value === "thumbsDown" ? 0 : 0;
299
+ };
300
+ const handleRate = async (key, value, onHandleRateSuccess) => {
301
+ setIsLoading(true);
302
+ const sessionId = getTopicSessionId(topicId);
303
+ const ratingObj = {
304
+ topicId: parseInt(topicId),
305
+ sessionId: sessionId || "",
306
+ assistantId,
307
+ score: key === "score" ? value : thumbsScore(value),
308
+ description: key === "description" ? value : state.ratingComment
309
+ };
310
+ try {
311
+ const response = await sendRating(ratingObj);
312
+ if (!response.success) {
313
+ setIsLoading(false);
314
+ onHandleRateSuccess(false, response.error.message);
315
+ return;
316
+ }
317
+ if (key === "score") {
318
+ setRatingStars(value);
319
+ } else if (key === "description") {
320
+ setRatingComment(value);
321
+ }
322
+ setHasReviewed(true);
323
+ setIsLoading(false);
324
+ onHandleRateSuccess(true);
325
+ } catch (err) {
326
+ setIsLoading(false);
327
+ onHandleRateSuccess(false, String(err));
328
+ }
329
+ };
330
+ return {
331
+ handleRate,
332
+ ratingStars: state.ratingStars,
333
+ ratingThumbs: state.ratingThumbs,
334
+ ratingComment: state.ratingComment,
335
+ isLoading,
336
+ hasReviewed
337
+ };
338
+ }
339
+ // Annotate the CommonJS export names for ESM import in node:
340
+ 0 && (module.exports = {
341
+ useAlquimia,
342
+ useRatings
343
+ });
344
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/alquimia.hook.tsx","../../src/context/session-context.tsx","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","import { Message } from \"ai\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlquimiaSDK } from \"../sdk\";\nimport { AIMessageChunk } from \"../types/type\";\nimport { useSessionContext } from \"../context/session-context\";\nimport { createMessageId } from \"../utils\";\nexport function useAlquimia(sdk: AlquimiaSDK) {\n const [chunkReceived, setChunkReceived] = useState<string>(\"\");\n const [currentMessageIdChuncked, setCurrentMessageIdChuncked] =\n useState<string>(\"\");\n const [input, setInput] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messageMetaData, setMessageMetaData] = useState<any>(null);\n const [messages, setMessages] = useState<\n (Message & { error_code?: string; error_detail?: string })[]\n >([]);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n const { userSessionState, saveUserSession } = useSessionContext();\n\n const shouldShowCharacterizationButton =\n sdk.getEnforceCharacterization() && !userSessionState?.characterizationData;\n\n useEffect(() => {\n if (chunkReceived)\n processMessageChunk(currentMessageIdChuncked, chunkReceived);\n }, [chunkReceived]);\n\n useEffect(() => {\n if (\n userSessionState?.characterizationData &&\n sdk.getEnforceCharacterization()\n ) {\n sdk.withExtraData(userSessionState?.characterizationData);\n }\n }, [userSessionState]);\n\n function cleanMessages() {\n setMessages([]);\n }\n async function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n additionalInfo?: string\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex(\n (message) => message.id === messageId\n );\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n\n const updatedMessage: Message & {\n error_code?: string;\n created_at?: string;\n error_detail?: string;\n additionalInfo?: string;\n } = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || \"\"}${chunk}`,\n id: updatedMessages[messageIndex]?.id || \"\",\n role: updatedMessages[messageIndex]?.role || \"assistant\",\n error_code,\n error_detail,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: \"assistant\",\n id: messageId,\n error_code,\n error_detail,\n created_at: new Date().getTime().toString(),\n },\n ];\n }\n });\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) {\n setIsLoading(true);\n event.preventDefault();\n \n if (input) {\n addUserMessage(input);\n const messageId = createMessageId();\n setCurrentMessageIdChuncked(messageId);\n setStreamingMessageId(messageId);\n await sendMessage(input, (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.data?.content || \"\",\n chunk?.error_code,\n chunk?.error_detail,\n additionalInfo\n );\n }, traceParentId, sessionId);\n setInput(\"\");\n }\n setIsLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: Message[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n setIsLoading(false);\n setIsMessageStreaming(false);\n setInput(\"\");\n }\n\n function addUserMessage(message: string) {\n setMessages((prevMessages: Message[]) => [\n ...prevMessages,\n {\n content: message,\n role: \"user\",\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(\";\");\n for (let cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split(\"=\");\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n const conversationId = sessionId || getCookie(\"alquimia-session\");\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n const response = await sdk.widthConversationId(conversationId || \"\").sendMessage(message, traceParentId);\n \n const es = new EventSource(response.getUrlStream())\n es.onmessage = (event: any) => {\n const parsedData = JSON.parse(event.data);\n\n if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {\n setActiveTool({\n tooler: parsedData.tooler,\n });\n }\n\n if (parsedData.error_code) {\n callBack({\n type: \"error\",\n error_code: parsedData.error_code,\n error_detail: parsedData.error_detail,\n });\n }\n\n if (parsedData.is_complete) {\n setIsMessageStreaming(false);\n setStreamingMessageId(null)\n es.close();\n } else {\n callBack(parsedData.answer);\n }\n };\n }\n\n async function handleSaveCharacterization(translation: Record<string, any>) {\n const conversationId = getCookie(\"alquimia-session\");\n if (!conversationId || !saveUserSession) return;\n saveUserSession(conversationId, translation);\n }\n\n return {\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSaveCharacterization,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageStreaming,\n streamingMessageId,\n isAudioRecording,\n shouldShowCharacterizationButton,\n lastRequest,\n messageMetaData,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n };\n}\n","import React, { createContext, useContext, useEffect, useReducer, ReactNode } from 'react';\nimport { characterizationReducer, CharacterizationState, CharacterizationAction } from '../reducer/characterization-reducer';\nimport { getCookies } from '../utils/utils';\nimport { openDB, IDBPDatabase } from 'idb';\n\ninterface SessionProviderProps {\n children: ReactNode;\n}\n\ninterface AlquimiaContextType {\n getSessionData: () => CharacterizationState;\n userSessionState?: CharacterizationState;\n saveUserSession: (id: string, data: any) => Promise<void>;\n}\n\nconst initialState: CharacterizationState = {\n sessionId: null,\n characterizationData: null,\n};\n\nconst AlquimiaContext = createContext<AlquimiaContextType | null>(null);\n\nexport const useSessionContext = () => {\n const context = useContext(AlquimiaContext);\n if (!context) {\n console.warn(\"useSessionContext must be used within a session provider. Returning default value.\");\n return {\n userSessionState: initialState,\n saveUserSession: null,\n };\n }\n return context;\n};\n\nexport const SessionProvider: React.FC<SessionProviderProps> = ({ children }) => {\n const [userSessionState, sessionDispatch] = useReducer(characterizationReducer, initialState);\n\n useEffect(() => {\n getSession();\n }, []);\n \n const getSession = async () => {\n const userCookie = await getCookies('alquimia-session') || '';\n \n const db = await openDB('alquimiaDB', 1, {\n upgrade(db: IDBPDatabase) {\n if (!db.objectStoreNames.contains('session')) {\n db.createObjectStore('session', { keyPath: 'key' });\n }\n },\n });\n \n const sessionIdEntry = await db.get('session', 'sessionId');\n const characterizationDataEntry = await db.get('session', 'characterizationData');\n const sessionDataMatchesCookie = sessionIdEntry?.value === userCookie;\n\n if (sessionIdEntry && characterizationDataEntry && sessionDataMatchesCookie) {\n sessionDispatch({\n type: 'SET_SESSION',\n payload: {\n sessionId: sessionIdEntry.value,\n characterizationData: characterizationDataEntry.value,\n },\n });\n }\n };\n\n const saveUserSession = async (id: string, data: any) => {\n const db = await openDB('alquimiaDB', 1);\n await db.put('session', { key: 'sessionId', value: id });\n await db.put('session', { key: 'characterizationData', value: data });\n\n sessionDispatch({\n type: 'SET_SESSION',\n payload: { sessionId: id, characterizationData: data },\n });\n };\n\n const getSessionData = () => {\n return userSessionState;\n }\n\n return (\n <AlquimiaContext.Provider value={{ userSessionState, getSessionData, saveUserSession }}>\n {children}\n </AlquimiaContext.Provider>\n );\n};","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["import_react","sessionId","input","messages","import_react","initialState"]}